Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/arm64/trap.c
Show First 20 Lines • Show All 255 Lines • ▼ Show 20 Lines | #endif | ||||
pcb = td->td_pcb; | pcb = td->td_pcb; | ||||
p = td->td_proc; | p = td->td_proc; | ||||
if (lower) | if (lower) | ||||
map = &p->p_vmspace->vm_map; | map = &p->p_vmspace->vm_map; | ||||
else { | else { | ||||
intr_enable(); | intr_enable(); | ||||
/* We received a TBI/PAC/etc. fault from the kernel */ | |||||
if (!ADDR_IS_CANONICAL(far)) | |||||
goto bad_far; | |||||
/* The top bit tells us which range to use */ | /* The top bit tells us which range to use */ | ||||
if (far >= VM_MAXUSER_ADDRESS) { | if (ADDR_IS_KERNEL(far)) { | ||||
map = kernel_map; | map = kernel_map; | ||||
} else { | } else { | ||||
map = &p->p_vmspace->vm_map; | map = &p->p_vmspace->vm_map; | ||||
if (map == NULL) | if (map == NULL) | ||||
map = kernel_map; | map = kernel_map; | ||||
} | } | ||||
} | } | ||||
Show All 27 Lines | default: | ||||
ftype = (esr & ISS_DATA_WnR) == 0 ? VM_PROT_READ : | ftype = (esr & ISS_DATA_WnR) == 0 ? VM_PROT_READ : | ||||
VM_PROT_WRITE; | VM_PROT_WRITE; | ||||
break; | break; | ||||
} | } | ||||
/* Fault in the page. */ | /* Fault in the page. */ | ||||
error = vm_fault_trap(map, far, ftype, VM_FAULT_NORMAL, &sig, &ucode); | error = vm_fault_trap(map, far, ftype, VM_FAULT_NORMAL, &sig, &ucode); | ||||
if (error != KERN_SUCCESS) { | if (error != KERN_SUCCESS) { | ||||
bad_far: | |||||
if (lower) { | if (lower) { | ||||
call_trapsignal(td, sig, ucode, (void *)far, | call_trapsignal(td, sig, ucode, (void *)far, | ||||
ESR_ELx_EXCEPTION(esr)); | ESR_ELx_EXCEPTION(esr)); | ||||
} else { | } else { | ||||
if (td->td_intr_nesting_level == 0 && | if (td->td_intr_nesting_level == 0 && | ||||
pcb->pcb_onfault != 0) { | pcb->pcb_onfault != 0) { | ||||
frame->tf_x[0] = error; | frame->tf_x[0] = error; | ||||
frame->tf_elr = pcb->pcb_onfault; | frame->tf_elr = pcb->pcb_onfault; | ||||
▲ Show 20 Lines • Show All 297 Lines • Show Last 20 Lines |