Index: sys/arm/arm/pmap-v6.c =================================================================== --- sys/arm/arm/pmap-v6.c +++ sys/arm/arm/pmap-v6.c @@ -234,7 +234,6 @@ static int pmap_enter_locked(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, u_int); -static vm_paddr_t pmap_extract_locked(pmap_t pmap, vm_offset_t va); static void pmap_alloc_l1(pmap_t); static void pmap_free_l1(pmap_t); @@ -3360,7 +3359,7 @@ return (pa); } -static vm_paddr_t +vm_paddr_t pmap_extract_locked(pmap_t pmap, vm_offset_t va) { struct l2_dtable *l2; Index: sys/arm/arm/pmap.c =================================================================== --- sys/arm/arm/pmap.c +++ sys/arm/arm/pmap.c @@ -201,7 +201,6 @@ static int pmap_enter_locked(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, u_int); -static vm_paddr_t pmap_extract_locked(pmap_t pmap, vm_offset_t va); static void pmap_fix_cache(struct vm_page *, pmap_t, vm_offset_t); static void pmap_alloc_l1(pmap_t); static void pmap_free_l1(pmap_t); @@ -3623,7 +3622,7 @@ return (pa); } -static vm_paddr_t +vm_paddr_t pmap_extract_locked(pmap_t pmap, vm_offset_t va) { struct l2_dtable *l2; Index: sys/arm/arm/sys_machdep.c =================================================================== --- sys/arm/arm/sys_machdep.c +++ sys/arm/arm/sys_machdep.c @@ -37,11 +37,17 @@ #include #include #include +#include +#include #include #include #include #include +#include +#include +#include + #include #ifndef _SYS_SYSPROTO_H_ @@ -59,12 +65,43 @@ arm32_sync_icache(struct thread *td, void *args) { struct arm_sync_icache_args ua; + ksiginfo_t ksi; + uintptr_t addr; + pmap_t pmap; + size_t len, plen; int error; if ((error = copyin(args, &ua, sizeof(ua))) != 0) return (error); - cpu_icache_sync_range(ua.addr, ua.len); + if (ua.len > 0) { + addr = ua.addr; + len = ua.len; + + pmap = vmspace_pmap(td->td_proc->p_vmspace); + + PMAP_LOCK(pmap); + while (len > 0) { + plen = PAGE_SIZE - (addr & PAGE_MASK); + plen = MIN(plen, len); + + if (pmap_extract_locked(pmap, addr) != 0) + cpu_icache_sync_range(addr, plen); + else { + ksiginfo_init_trap(&ksi); + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = TRAP_BRKPT; + ksi.ksi_addr = (u_int32_t *)addr; + trapsignal(td, &ksi); + PMAP_UNLOCK(pmap); + return (0); + } + + addr += plen; + len -= plen; + } + PMAP_UNLOCK(pmap); + } td->td_retval[0] = 0; return (0); Index: sys/arm/include/pmap.h =================================================================== --- sys/arm/include/pmap.h +++ sys/arm/include/pmap.h @@ -253,6 +253,7 @@ void pmap_bootstrap(vm_offset_t firstaddr, struct pv_addr *l1pt); int pmap_change_attr(vm_offset_t, vm_size_t, int); +vm_paddr_t pmap_extract_locked(pmap_t pmap, vm_offset_t va); void pmap_kenter(vm_offset_t va, vm_paddr_t pa); void pmap_kenter_nocache(vm_offset_t va, vm_paddr_t pa); void pmap_kenter_device(vm_offset_t va, vm_paddr_t pa);