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; | |||||
#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(); | ||||
#if __ARM_ARCH >= 7 | #if __ARM_ARCH >= 7 | ||||
far = (prefetch) ? cp15_ifar_get() : cp15_dfar_get(); | far = (prefetch) ? cp15_ifar_get() : cp15_dfar_get(); | ||||
#else | #else | ||||
far = (prefetch) ? TRAPF_PC(tf) : cp15_dfar_get(); | far = (prefetch) ? TRAPF_PC(tf) : cp15_dfar_get(); | ||||
#endif | #endif | ||||
idx = FSR_TO_FAULT(fsr); | idx = FSR_TO_FAULT(fsr); | ||||
usermode = TRAPF_USERMODE(tf); /* Abort came from user mode? */ | usermode = TRAPF_USERMODE(tf); /* Abort came from user mode? */ | ||||
/* | |||||
* Apply BP hardening by flushing the branch prediction cache | |||||
* for prefaults on kernel addresses. | |||||
*/ | |||||
if (__predict_false(prefetch && far > VM_MAXUSER_ADDRESS && | |||||
(idx == FAULT_TRAN_L2 || idx == FAULT_PERM_L2))) { | |||||
bp_harden = PCPU_GET(bp_harden_kind); | |||||
if (bp_harden == PCPU_BP_HARDEN_KIND_BPIALL) | |||||
_CP15_BPIALL(); | |||||
else if (bp_harden == PCPU_BP_HARDEN_KIND_ICIALLU) | |||||
_CP15_ICIALLU(); | |||||
} | |||||
if (usermode) | if (usermode) | ||||
td->td_frame = tf; | td->td_frame = tf; | ||||
CTR6(KTR_TRAP, "%s: fsr %#x (idx %u) far %#x prefetch %u usermode %d", | CTR6(KTR_TRAP, "%s: fsr %#x (idx %u) far %#x prefetch %u usermode %d", | ||||
__func__, fsr, idx, far, prefetch, usermode); | __func__, fsr, idx, far, prefetch, usermode); | ||||
/* | /* | ||||
* Firstly, handle aborts that are not directly related to mapping. | * Firstly, handle aborts that are not directly related to mapping. | ||||
▲ Show 20 Lines • Show All 334 Lines • Show Last 20 Lines |