Index: sys/arch/arm/arm32/fault.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/arm32/fault.c,v retrieving revision 1.116 diff -u -p -r1.116 fault.c --- sys/arch/arm/arm32/fault.c 1 Feb 2021 19:31:34 -0000 1.116 +++ sys/arch/arm/arm32/fault.c 7 Feb 2021 15:12:01 -0000 @@ -810,6 +810,10 @@ prefetch_abort_handler(trapframe_t *tf) struct pcb *pcb __diagused; struct vm_map *map; vaddr_t fault_pc, va; + static struct last_fault { + pmap_t lf_pm; + vaddr_t lf_pc; + } lfs[MAXCPUS] __diagused; ksiginfo_t ksi; int error, user; @@ -881,6 +885,16 @@ prefetch_abort_handler(trapframe_t *tf) goto do_trapsignal; } + /* Unaligned PCs are bad. */ + if (__predict_false((fault_pc & 3) != 0)) { + KSI_INIT_TRAP(&ksi); + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + ksi.ksi_addr = (uint32_t *)(intptr_t) fault_pc; + ksi.ksi_trap = fault_pc; + goto do_trapsignal; + } + map = &l->l_proc->p_vmspace->vm_map; va = trunc_page(fault_pc); @@ -890,6 +904,11 @@ prefetch_abort_handler(trapframe_t *tf) #if defined(DEBUG) && !defined(MULTIPROCESSOR) last_fault_code = -1; #endif + struct last_fault *lf = &lfs[cpu_index(curcpu())]; + KASSERTMSG(map->pmap != lf->lf_pm || va != lf->lf_pc, "pmap %p va %lx", map->pmap, va); + lf->lf_pc = va; + lf->lf_pm = map->pmap; + if (pmap_fault_fixup(map->pmap, va, VM_PROT_READ|VM_PROT_EXECUTE, 1)) { UVMHIST_LOG (maphist, " <- emulated", 0, 0, 0, 0); goto out;