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/arm | |
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/arm')
-rw-r--r-- | sys/arm/arm/pmap.c | 10 | ||||
-rw-r--r-- | sys/arm/mv/mv_machdep.c | 2 |
2 files changed, 9 insertions, 3 deletions
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index 5e55f8e..3b70a41 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -2863,14 +2863,14 @@ pmap_kenter_internal(vm_offset_t va, vm_offset_t pa, int flags) if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa))) { vm_page_lock_queues(); if (!TAILQ_EMPTY(&m->md.pv_list) || m->md.pv_kva) { - /* release vm_page lock for pv_entry UMA */ + /* release vm_page lock for pv_entry UMA */ vm_page_unlock_queues(); if ((pve = pmap_get_pv_entry()) == NULL) panic("pmap_kenter_internal: no pv entries"); vm_page_lock_queues(); PMAP_LOCK(pmap_kernel()); pmap_enter_pv(m, pve, pmap_kernel(), va, - PVF_WRITE | PVF_UNMAN); + PVF_WRITE | PVF_UNMAN); pmap_fix_cache(m, pmap_kernel(), va); PMAP_UNLOCK(pmap_kernel()); } else { @@ -4567,6 +4567,12 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr) } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c index 2dc20ce..c348e24 100644 --- a/sys/arm/mv/mv_machdep.c +++ b/sys/arm/mv/mv_machdep.c @@ -408,7 +408,7 @@ initarm(void *mdp, void *unused __unused) availmem_regions_sz = i; } else { /* Fall back to hardcoded boothowto flags and metadata. */ - boothowto = RB_VERBOSE | RB_SINGLE; + boothowto = 0; // RB_VERBOSE | RB_SINGLE; lastaddr = fake_preload_metadata(); /* |