diff options
author | marcel <marcel@FreeBSD.org> | 2009-10-21 18:38:02 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2009-10-21 18:38:02 +0000 |
commit | 51bb720939567fa381c6a03839b51f9c80bc67ef (patch) | |
tree | 9665f89431ede73407ae0ad11ebcc8198166085e /sys/vm/vm_extern.h | |
parent | 5598d561ce3ef08a3a8c5d518ca09e28883ff050 (diff) | |
download | FreeBSD-src-51bb720939567fa381c6a03839b51f9c80bc67ef.zip FreeBSD-src-51bb720939567fa381c6a03839b51f9c80bc67ef.tar.gz |
o Introduce vm_sync_icache() for making the I-cache coherent with
the memory or D-cache, depending on the semantics of the platform.
vm_sync_icache() is basically a wrapper around pmap_sync_icache(),
that translates the vm_map_t argumument to pmap_t.
o Introduce pmap_sync_icache() to all PMAP implementation. For powerpc
it replaces the pmap_page_executable() function, added to solve
the I-cache problem in uiomove_fromphys().
o In proc_rwmem() call vm_sync_icache() when writing to a page that
has execute permissions. This assures that when breakpoints are
written, the I-cache will be coherent and the process will actually
hit the breakpoint.
o This also fixes the Book-E PMAP implementation that was missing
necessary locking while trying to deal with the I-cache coherency
in pmap_enter() (read: mmu_booke_enter_locked).
The key property of this change is that the I-cache is made coherent
*after* writes have been done. Doing it in the PMAP layer when adding
or changing a mapping means that the I-cache is made coherent *before*
any writes happen. The difference is key when the I-cache prefetches.
Diffstat (limited to 'sys/vm/vm_extern.h')
-rw-r--r-- | sys/vm/vm_extern.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h index 65b6c8e..ff48983 100644 --- a/sys/vm/vm_extern.h +++ b/sys/vm/vm_extern.h @@ -63,6 +63,7 @@ int vm_forkproc(struct thread *, struct proc *, struct thread *, struct vmspace void vm_waitproc(struct proc *); int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, objtype_t, void *, vm_ooffset_t); void vm_set_page_size(void); +void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t); struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t); struct vmspace *vmspace_fork(struct vmspace *, vm_ooffset_t *); int vmspace_exec(struct proc *, vm_offset_t, vm_offset_t); |