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:
Andrew Turner
2023-04-05 13:28:46 +01:00
parent d61f9bfb0e
commit 450f731b7f
3 changed files with 12 additions and 1 deletions
+1 -1
View File
@@ -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 | \
+10
View File
@@ -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);
+1
View File
@@ -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 */