diff options
author | Ming-Yi Lai <ming-yi.lai@mediatek.com> | 2024-01-10 14:16:31 +0800 |
---|---|---|
committer | Ming-Yi Lai <ming-yi.lai@mediatek.com> | 2024-02-15 13:11:05 +0800 |
commit | a22754478850d6cbaf501a29ff8b4f04cfe46366 (patch) | |
tree | 516be96d45af30b4bce429f9aa116f3fd86241b3 | |
parent | 36019deb26a8f7519c18c9668fa6559142aa11b8 (diff) | |
download | pk-a22754478850d6cbaf501a29ff8b4f04cfe46366.zip pk-a22754478850d6cbaf501a29ff8b4f04cfe46366.tar.gz pk-a22754478850d6cbaf501a29ff8b4f04cfe46366.tar.bz2 |
Zicfilp: Handle software check exception -- landing pad fault
-rw-r--r-- | machine/mentry.S | 3 | ||||
-rw-r--r-- | machine/minit.c | 3 | ||||
-rw-r--r-- | pk/handlers.c | 16 |
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]); |