kernel/arm: check for PXN and alignment fault in page fault handler
Change-Id: I2a863b57b1252343c9c029d1bb5af8d328558576 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5620 Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
parent
72274d4a8d
commit
3bfbf2fb53
@ -25,5 +25,10 @@
|
||||
#define CPSR_I 0x80
|
||||
|
||||
#define FSR_WNR 0x800
|
||||
#define FSR_LPAE 0x200
|
||||
|
||||
#define FSR_FS_ALIGNMENT_FAULT 0x01
|
||||
#define FSR_FS_PERMISSION_FAULT_L1 0x0d
|
||||
#define FSR_FS_PERMISSION_FAULT_L2 0x0f
|
||||
|
||||
#endif /* _SYSTEM_ARCH_ARM_DEFS_H */
|
||||
|
@ -328,6 +328,12 @@ arch_arm_page_fault(struct iframe *frame, addr_t far, uint32 fsr, bool isWrite,
|
||||
panic("page fault in debugger without fault handler! Touching "
|
||||
"address %p from pc %p\n", (void *)far, (void *)frame->pc);
|
||||
return;
|
||||
} else if (isExec && !isUser && (far < KERNEL_BASE) &&
|
||||
(((fsr & 0x060f) == FSR_FS_PERMISSION_FAULT_L1) || ((fsr & 0x060f) == FSR_FS_PERMISSION_FAULT_L2))) {
|
||||
panic("PXN violation trying to execute user-mapped address 0x%08" B_PRIxADDR " from kernel mode\n",
|
||||
far);
|
||||
} else if (!isExec && ((fsr & 0x060f) == FSR_FS_ALIGNMENT_FAULT)) {
|
||||
panic("unhandled alignment exception\n");
|
||||
} else if ((frame->spsr & CPSR_I) != 0) {
|
||||
// interrupts disabled
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user