Add BTI exceptions
We could hit these when executing code marked as using BTI but jumps to a non-branch target instruction. Sponsored by: Arm Ltd Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D39450
This commit is contained in:
@@ -864,7 +864,7 @@ sctlr_set:
|
||||
.quad (SCTLR_LSMAOE | SCTLR_nTLSMD | SCTLR_UCI | SCTLR_SPAN | \
|
||||
SCTLR_nTWE | SCTLR_nTWI | SCTLR_UCT | SCTLR_DZE | \
|
||||
SCTLR_I | SCTLR_SED | SCTLR_SA0 | SCTLR_SA | SCTLR_C | \
|
||||
SCTLR_M | SCTLR_CP15BEN)
|
||||
SCTLR_M | SCTLR_CP15BEN | SCTLR_BT1 | SCTLR_BT0)
|
||||
sctlr_clear:
|
||||
/* Bits to clear */
|
||||
.quad (SCTLR_EE | SCTLR_E0E | SCTLR_IESB | SCTLR_WXN | SCTLR_UMA | \
|
||||
|
||||
@@ -559,6 +559,11 @@ do_el1h_sync(struct thread *td, struct trapframe *frame)
|
||||
panic("Undefined instruction: %08x",
|
||||
*(uint32_t *)frame->tf_elr);
|
||||
break;
|
||||
case EXCP_BTI:
|
||||
print_registers(frame);
|
||||
print_gp_register("far", far);
|
||||
panic("Branch Target exception");
|
||||
break;
|
||||
default:
|
||||
print_registers(frame);
|
||||
print_gp_register("far", far);
|
||||
@@ -699,6 +704,11 @@ do_el0_sync(struct thread *td, struct trapframe *frame)
|
||||
(void *)frame->tf_elr, exception);
|
||||
userret(td, frame);
|
||||
break;
|
||||
case EXCP_BTI:
|
||||
call_trapsignal(td, SIGILL, ILL_ILLOPC, (void *)frame->tf_elr,
|
||||
exception);
|
||||
userret(td, frame);
|
||||
break;
|
||||
default:
|
||||
call_trapsignal(td, SIGBUS, BUS_OBJERR, (void *)frame->tf_elr,
|
||||
exception);
|
||||
|
||||
@@ -408,6 +408,7 @@
|
||||
#define EXCP_UNKNOWN 0x00 /* Unkwn exception */
|
||||
#define EXCP_TRAP_WFI_WFE 0x01 /* Trapped WFI or WFE */
|
||||
#define EXCP_FP_SIMD 0x07 /* VFP/SIMD trap */
|
||||
#define EXCP_BTI 0x0d /* Branch Target Exception */
|
||||
#define EXCP_ILL_STATE 0x0e /* Illegal execution state */
|
||||
#define EXCP_SVC32 0x11 /* SVC trap for AArch32 */
|
||||
#define EXCP_SVC64 0x15 /* SVC trap for AArch64 */
|
||||
|
||||
Reference in New Issue
Block a user