[coreboot-gerrit] New patch to review for coreboot: [WIP] arch/riscv: Better trap handling diagnostics
Jonathan Neuschäfer (j.neuschaefer@gmx.net)
gerrit at coreboot.org
Mon Aug 1 23:05:58 CEST 2016
Jonathan Neuschäfer (j.neuschaefer at gmx.net) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/16016
-gerrit
commit 9bd8814c73599b25f027b6a955dd3a330ff20148
Author: Jonathan Neuschäfer <j.neuschaefer at gmx.net>
Date: Mon Aug 1 19:42:27 2016 +0200
[WIP] arch/riscv: Better trap handling diagnostics
WIP: By now I should probably move the diagnistic prints into a
function.
Change-Id: I57032f958c88ea83a420e93b459df4f620799d84
Signed-off-by: Jonathan Neuschäfer <j.neuschaefer at gmx.net>
---
src/arch/riscv/trap_handler.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/arch/riscv/trap_handler.c b/src/arch/riscv/trap_handler.c
index 193be61..afb02de 100644
--- a/src/arch/riscv/trap_handler.c
+++ b/src/arch/riscv/trap_handler.c
@@ -84,11 +84,24 @@ void handle_supervisor_call(trapframe *tf) {
asm volatile("j supervisor_call_return");
}
+static const char *mstatus_to_previous_mode(uintptr_t ms)
+{
+ switch (ms & MSTATUS_MPP) {
+ case 0x00000000: return "user";
+ case 0x00000800: return "supervisor";
+ case 0x00001000: return "hypervisor";
+ case 0x00001800: return "machine";
+ }
+
+ return "unknown";
+}
+
void trap_handler(trapframe *tf) {
write_csr(mscratch, tf);
uintptr_t cause;
void *epc;
void *badAddr;
+ const char *previous_mode;
// extract cause
asm("csrr %0, mcause" : "=r"(cause));
@@ -99,6 +112,8 @@ void trap_handler(trapframe *tf) {
// extract bad address
asm("csrr %0, mbadaddr" : "=r"(badAddr));
+ previous_mode = mstatus_to_previous_mode(read_csr(mstatus));
+
switch(cause) {
case 0:
printk(BIOS_DEBUG, "Trap: Instruction address misaligned\n");
@@ -107,23 +122,28 @@ void trap_handler(trapframe *tf) {
printk(BIOS_DEBUG, "Trap: Instruction access fault\n");
printk(BIOS_DEBUG, "Bad instruction pc: %p\n", epc);
printk(BIOS_DEBUG, "Address: %p\n", badAddr);
+ printk(BIOS_DEBUG, "Previous mode: %s\n", previous_mode);
break;
case 2:
printk(BIOS_DEBUG, "Trap: Illegal instruction\n");
printk(BIOS_DEBUG, "Bad instruction pc: %p\n", epc);
printk(BIOS_DEBUG, "Address: %p\n", badAddr);
+ printk(BIOS_DEBUG, "Previous mode: %s\n", previous_mode);
break;
case 3:
printk(BIOS_DEBUG, "Trap: Breakpoint\n");
+ printk(BIOS_DEBUG, "Bad instruction pc: %p\n", epc);
break;
case 4:
printk(BIOS_DEBUG, "Trap: Load address misaligned\n");
+ printk(BIOS_DEBUG, "Previous mode: %s\n", previous_mode);
handle_misaligned_load(tf);
break;
case 5:
printk(BIOS_DEBUG, "Trap: Load access fault\n");
printk(BIOS_DEBUG, "Bad instruction pc: %p\n", epc);
printk(BIOS_DEBUG, "Load Address: %p\n", badAddr);
+ printk(BIOS_DEBUG, "Previous mode: %s\n", previous_mode);
break;
case 6:
printk(BIOS_DEBUG, "Trap: Store address misaligned\n");
@@ -135,6 +155,7 @@ void trap_handler(trapframe *tf) {
printk(BIOS_DEBUG, "Trap: Store access fault\n");
printk(BIOS_DEBUG, "Bad instruction pc: %p\n", epc);
printk(BIOS_DEBUG, "Store Address: %p\n", badAddr);
+ printk(BIOS_DEBUG, "Previous mode: %s\n", previous_mode);
break;
case 8:
printk(BIOS_DEBUG, "Trap: Environment call from U-mode\n");
More information about the coreboot-gerrit
mailing list