Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/arm/trap-v6.c
Show First 20 Lines • Show All 281 Lines • ▼ Show 20 Lines | abort_handler(struct trapframe *tf, int prefetch) | ||||
uint32_t fsr; | uint32_t fsr; | ||||
struct ksig ksig; | struct ksig ksig; | ||||
struct proc *p; | struct proc *p; | ||||
struct pcb *pcb; | struct pcb *pcb; | ||||
struct vm_map *map; | struct vm_map *map; | ||||
struct vmspace *vm; | struct vmspace *vm; | ||||
vm_prot_t ftype; | vm_prot_t ftype; | ||||
bool usermode; | bool usermode; | ||||
int bp_harden; | int bp_harden, ucode; | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
void *onfault; | void *onfault; | ||||
#endif | #endif | ||||
VM_CNT_INC(v_trap); | VM_CNT_INC(v_trap); | ||||
td = curthread; | td = curthread; | ||||
fsr = (prefetch) ? cp15_ifsr_get(): cp15_dfsr_get(); | fsr = (prefetch) ? cp15_ifsr_get(): cp15_dfsr_get(); | ||||
▲ Show 20 Lines • Show All 193 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
onfault = pcb->pcb_onfault; | onfault = pcb->pcb_onfault; | ||||
pcb->pcb_onfault = NULL; | pcb->pcb_onfault = NULL; | ||||
#endif | #endif | ||||
/* Fault in the page. */ | /* Fault in the page. */ | ||||
rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); | rv = vm_fault_trap(map, va, ftype, VM_FAULT_NORMAL, &ksig.sig, | ||||
&ucode); | |||||
ksig.code = ucode; | |||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
pcb->pcb_onfault = onfault; | pcb->pcb_onfault = onfault; | ||||
#endif | #endif | ||||
if (__predict_true(rv == KERN_SUCCESS)) | if (__predict_true(rv == KERN_SUCCESS)) | ||||
goto out; | goto out; | ||||
nogo: | nogo: | ||||
if (!usermode) { | if (!usermode) { | ||||
if (td->td_intr_nesting_level == 0 && | if (td->td_intr_nesting_level == 0 && | ||||
pcb->pcb_onfault != NULL) { | pcb->pcb_onfault != NULL) { | ||||
tf->tf_r0 = rv; | tf->tf_r0 = rv; | ||||
tf->tf_pc = (int)pcb->pcb_onfault; | tf->tf_pc = (int)pcb->pcb_onfault; | ||||
return; | return; | ||||
} | } | ||||
CTR2(KTR_TRAP, "%s: vm_fault() failed with %d", __func__, rv); | CTR2(KTR_TRAP, "%s: vm_fault() failed with %d", __func__, rv); | ||||
abort_fatal(tf, idx, fsr, far, prefetch, td, &ksig); | abort_fatal(tf, idx, fsr, far, prefetch, td, &ksig); | ||||
return; | return; | ||||
} | } | ||||
ksig.sig = SIGSEGV; | |||||
ksig.code = (rv == KERN_PROTECTION_FAILURE) ? SEGV_ACCERR : SEGV_MAPERR; | |||||
ksig.addr = far; | ksig.addr = far; | ||||
do_trapsignal: | do_trapsignal: | ||||
call_trapsignal(td, ksig.sig, ksig.code, ksig.addr); | call_trapsignal(td, ksig.sig, ksig.code, ksig.addr); | ||||
out: | out: | ||||
if (usermode) | if (usermode) | ||||
userret(td, tf); | userret(td, tf); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 135 Lines • Show Last 20 Lines |