aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMing-Yi Lai <ming-yi.lai@mediatek.com>2024-01-10 14:16:31 +0800
committerMing-Yi Lai <ming-yi.lai@mediatek.com>2024-02-15 13:11:05 +0800
commita22754478850d6cbaf501a29ff8b4f04cfe46366 (patch)
tree516be96d45af30b4bce429f9aa116f3fd86241b3
parent36019deb26a8f7519c18c9668fa6559142aa11b8 (diff)
downloadpk-a22754478850d6cbaf501a29ff8b4f04cfe46366.zip
pk-a22754478850d6cbaf501a29ff8b4f04cfe46366.tar.gz
pk-a22754478850d6cbaf501a29ff8b4f04cfe46366.tar.bz2
Zicfilp: Handle software check exception -- landing pad fault
-rw-r--r--machine/mentry.S3
-rw-r--r--machine/minit.c3
-rw-r--r--pk/handlers.c16
3 files changed, 21 insertions, 1 deletions
diff --git a/machine/mentry.S b/machine/mentry.S
index 93c9991..9fa60ca 100644
--- a/machine/mentry.S
+++ b/machine/mentry.S
@@ -29,6 +29,9 @@ trap_table:
/* 13 */ .dc.a __trap_from_machine_mode
/* 14 */ .dc.a bad_trap
/* 15 */ .dc.a bad_trap
+ /* 16 */ .dc.a bad_trap
+ /* 17 */ .dc.a bad_trap
+ /* 18 */ .dc.a bad_trap
.option norvc
.section .text.init,"ax",@progbits
diff --git a/machine/minit.c b/machine/minit.c
index e6677e9..9b907bf 100644
--- a/machine/minit.c
+++ b/machine/minit.c
@@ -78,7 +78,8 @@ static void delegate_traps()
(1U << CAUSE_BREAKPOINT) |
(1U << CAUSE_LOAD_PAGE_FAULT) |
(1U << CAUSE_STORE_PAGE_FAULT) |
- (1U << CAUSE_USER_ECALL);
+ (1U << CAUSE_USER_ECALL) |
+ (1U << CAUSE_SOFTWARE_CHECK_FAULT);
write_csr(mideleg, interrupts);
write_csr(medeleg, exceptions);
diff --git a/pk/handlers.c b/pk/handlers.c
index 4b4abaf..2932d94 100644
--- a/pk/handlers.c
+++ b/pk/handlers.c
@@ -90,6 +90,21 @@ static void handle_interrupt(trapframe_t* tf)
clear_csr(sip, SIP_SSIP);
}
+static void handle_software_check_fault(trapframe_t* tf)
+{
+ dump_tf(tf);
+
+ const uint64_t stval = read_csr(stval);
+ switch (stval) {
+ case LANDING_PAD_FAULT:
+ panic("Invalid landing pad!");
+ break;
+ default:
+ panic("Software check fault: unhandled stval: %d", stval);
+ break;
+ }
+}
+
void handle_trap(trapframe_t* tf)
{
if ((intptr_t)tf->cause < 0)
@@ -110,6 +125,7 @@ void handle_trap(trapframe_t* tf)
[CAUSE_MISALIGNED_STORE] = handle_misaligned_store,
[CAUSE_LOAD_PAGE_FAULT] = handle_fault_load,
[CAUSE_STORE_PAGE_FAULT] = handle_fault_store,
+ [CAUSE_SOFTWARE_CHECK_FAULT] = handle_software_check_fault,
};
kassert(tf->cause < ARRAY_SIZE(trap_handlers) && trap_handlers[tf->cause]);