Restore stvec to its original value
This commit is contained in:
parent
19dbb857c8
commit
62bd702929
71
JOURNAL.md
71
JOURNAL.md
@ -3460,3 +3460,74 @@ Let's try to cause an interrupt with the normal CLINT:
|
|||||||
No interrupts seem to arrive at the SIP register.
|
No interrupts seem to arrive at the SIP register.
|
||||||
|
|
||||||
Let's set the stvec to zero, so it causes a machine exception.
|
Let's set the stvec to zero, so it causes a machine exception.
|
||||||
|
|
||||||
|
# 2024-08-21
|
||||||
|
|
||||||
|
I tried with the new bitstream (ox_u55c_46619ef4.bit) setting the stvec to zero
|
||||||
|
and I can see the OpenSBI handler stopping, probably due to the jump to zero
|
||||||
|
address:
|
||||||
|
|
||||||
|
Boot HART MIDELEG : 0x0000000000000222
|
||||||
|
Boot HART MEDELEG : 0x000000000000b109
|
||||||
|
><E
|
||||||
|
><E<><Ed><Ee><Eb><Eu><Eg><E_><Eu><Ea><Er><Et><E>><E
|
||||||
|
><E><E>Core: 11 devices, 8 uclasses, devicetree: board
|
||||||
|
Loading Environment from nowhere... OK
|
||||||
|
In: serial,usbkbd
|
||||||
|
Out: serial,vidconsole
|
||||||
|
Err: serial,vidconsole
|
||||||
|
No working controllers found
|
||||||
|
Net: No ethernet found.
|
||||||
|
Working FDT set to c0000000
|
||||||
|
Hit any key to stop autoboot: 0
|
||||||
|
|
||||||
|
Device 0: unknown device
|
||||||
|
|
||||||
|
Device 1: unknown device
|
||||||
|
scanning bus for devices...
|
||||||
|
|
||||||
|
Device 0: unknown device
|
||||||
|
starting USB...
|
||||||
|
No working controllers found
|
||||||
|
No ethernet found.
|
||||||
|
No ethernet found.
|
||||||
|
=> exception sregs
|
||||||
|
stvec : 0x00000000af6f4400
|
||||||
|
sie : 0x0000000000000000
|
||||||
|
sip : 0x0000000000000000
|
||||||
|
sstatus : 0x8000000200006000
|
||||||
|
=> exception enable
|
||||||
|
=> exception sregs
|
||||||
|
stvec : 0x0000000000000000
|
||||||
|
sie : 0x0000000000000222
|
||||||
|
sip : 0x0000000000000000
|
||||||
|
sstatus : 0x8000000200006002
|
||||||
|
=> mw 0x40014000 0xffffffff # Disable clock interrupt
|
||||||
|
=> md 0x40801000 1 # Show pending interrupts (should be 0x10)
|
||||||
|
40801000: 00000010 ....
|
||||||
|
=> mw 0x40802000 0x10 # Enable interrupt for source 4 (timer)
|
||||||
|
=> mw 0x40800010 0xff # Make source 4 priority large
|
||||||
|
<i
|
||||||
|
sbi_trap_error: hart0: trap0: unhandled local interrupt (error -1000)
|
||||||
|
|
||||||
|
sbi_trap_error: hart0: trap0: mcause=0x800000000000000b mtval=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: mepc=0x00000000af71df28 mstatus=0x8000000a00006802
|
||||||
|
sbi_trap_error: hart0: trap0: ra=0x00000000af71df28 sp=0x00000000aeed2b00
|
||||||
|
sbi_trap_error: hart0: trap0: gp=0x00000000aeed2dd0 tp=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: s0=0x00000000af7cca38 s1=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: a0=0x0000000000000000 a1=0x0000000000000002
|
||||||
|
sbi_trap_error: hart0: trap0: a2=0x0000000000000008 a3=0x0000000000000004
|
||||||
|
sbi_trap_error: hart0: trap0: a4=0xffffffffffffffff a5=0x0000000040800014
|
||||||
|
sbi_trap_error: hart0: trap0: a6=0x0000000000000008 a7=0x00000000af794b08
|
||||||
|
sbi_trap_error: hart0: trap0: s2=0x0000000000000000 s3=0x00000000aeed4b90
|
||||||
|
sbi_trap_error: hart0: trap0: s4=0x0000000000000003 s5=0x00000000af7f7754
|
||||||
|
sbi_trap_error: hart0: trap0: s6=0x0000000000000000 s7=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: s8=0x0000000000000000 s9=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: s10=0x00000000aeed4bc0 s11=0x0000000000000000
|
||||||
|
sbi_trap_error: hart0: trap0: t0=0x00000000aeed2ac0 t1=0x0000000000000039
|
||||||
|
sbi_trap_error: hart0: trap0: t2=0x3b3d74696e695f64 t3=0x0000000000000010
|
||||||
|
sbi_trap_error: hart0: trap0: t4=0x0000000000000000 t5=0x61745f746f6f627b
|
||||||
|
sbi_trap_error: hart0: trap0: t6=0x00000000aeed2aa0
|
||||||
|
|
||||||
|
Let's revert the stvec to its original value and try again and see if we can see
|
||||||
|
the delegation properly being handed to the supervisor handler.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
diff --git a/cmd/riscv/exception.c b/cmd/riscv/exception.c
|
diff --git a/cmd/riscv/exception.c b/cmd/riscv/exception.c
|
||||||
index f38f454a0b..9bc554b0aa 100644
|
index f38f454a0b..9de4effe47 100644
|
||||||
--- a/cmd/riscv/exception.c
|
--- a/cmd/riscv/exception.c
|
||||||
+++ b/cmd/riscv/exception.c
|
+++ b/cmd/riscv/exception.c
|
||||||
@@ -56,6 +56,41 @@ static int do_undefined(struct cmd_tbl *cmdtp, int flag, int argc,
|
@@ -56,6 +56,40 @@ static int do_undefined(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +33,6 @@ index f38f454a0b..9bc554b0aa 100644
|
|||||||
+ asm volatile (
|
+ asm volatile (
|
||||||
+ "csrsi sstatus, 2\n" /* Enable SIE */
|
+ "csrsi sstatus, 2\n" /* Enable SIE */
|
||||||
+ "csrs sie, %0\n" /* Enable selected interrupts */
|
+ "csrs sie, %0\n" /* Enable selected interrupts */
|
||||||
+ "csrwi stvec, 0\n" /* Redirect trap handler to NULL */
|
|
||||||
+ : /* no output */
|
+ : /* no output */
|
||||||
+ : "r" (which)
|
+ : "r" (which)
|
||||||
+ );
|
+ );
|
||||||
@ -44,7 +43,7 @@ index f38f454a0b..9bc554b0aa 100644
|
|||||||
static struct cmd_tbl cmd_sub[] = {
|
static struct cmd_tbl cmd_sub[] = {
|
||||||
U_BOOT_CMD_MKENT(compressed, CONFIG_SYS_MAXARGS, 1, do_compressed,
|
U_BOOT_CMD_MKENT(compressed, CONFIG_SYS_MAXARGS, 1, do_compressed,
|
||||||
"", ""),
|
"", ""),
|
||||||
@@ -67,6 +102,10 @@ static struct cmd_tbl cmd_sub[] = {
|
@@ -67,6 +101,10 @@ static struct cmd_tbl cmd_sub[] = {
|
||||||
"", ""),
|
"", ""),
|
||||||
U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
|
U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined,
|
||||||
"", ""),
|
"", ""),
|
||||||
@ -55,7 +54,7 @@ index f38f454a0b..9bc554b0aa 100644
|
|||||||
};
|
};
|
||||||
|
|
||||||
static char exception_help_text[] =
|
static char exception_help_text[] =
|
||||||
@@ -77,6 +116,8 @@ static char exception_help_text[] =
|
@@ -77,6 +115,8 @@ static char exception_help_text[] =
|
||||||
" ialign16 - 16 bit aligned instruction\n"
|
" ialign16 - 16 bit aligned instruction\n"
|
||||||
" undefined - illegal instruction\n"
|
" undefined - illegal instruction\n"
|
||||||
" unaligned - load address misaligned\n"
|
" unaligned - load address misaligned\n"
|
||||||
|
Loading…
Reference in New Issue
Block a user