fdcavalcanti opened a new pull request, #15835:
URL: https://github.com/apache/nuttx/pull/15835
## Summary
This PR moves the boundary check when `CONFIG_ARCH_INTERRUPTSTACK>15` to
inside the backtrace function.
Also updated the backtrace function to check the interrupt stack boundaries,
allowing for future support of backtrace from IRQ.
## Impact
Impact on user: NO.
Impact on build: NO.
Impact on hardware: Only RISC-V devices affected.
Impact on documentation: NO.
Impact on security: NO.
Impact on compatibility: NO.
## Testing
This was tested with two different test cases:
1. Using default ARCH_INTERRUPTSTACK=2048
2. ARCH_INTERRUPTSTACK=0 and CONFIG_INIT_STACKSIZE=4096.
Also ran a full CI test internally on all Espressif RISC-V devices and had
no issues.
### Building
1. ./tools/configure.sh rv-virt:nsh
2. CONFIG_SCHED_BACKTRACE=y
3. CONFIG_FRAME_POINTER=y
4. Enable test app
5. make
About 4: Built a test app to validate and force an exception.
Task exception: simply do *p = 0; inside a simple test program.
IRQ exception: set up an interrupt handler and trigger the IRQ. Inside the
interrupt routine, do *p = 0;.
### Running
Run with QEMU:
`qemu-system-riscv32 -semihosting -M virt,aclint=on -cpu rv32 -bios none
-kernel nuttx -nographic`
Call backtrace test app: `nsh> backtrace irq`
### Results
First test result with default `CONFIG_ARCH_INTERRUPSTACK=2048`.
```
nsh> backtrace irq
riscv_exception: EXCEPTION: Store/AMO access fault. MCAUSE: 00000007, EPC:
8001a37e, MTVAL: 00000000
riscv_exception: PANIC!!! Exception = 00000007
dump_assert_info: Current Version: NuttX 10.4.0 3c5e236ba9 Feb 13 2025
06:44:15 risc-v
dump_assert_info: Assertion failed panic: at file: :0 task: backtrace
process: backtrace 0x8001a3c6
up_dump_register: EPC: 8001a37e
up_dump_register: A0: 00000013 A1: 80034f34 A2: 00000000 A3: 80000003
up_dump_register: A4: 8002f678 A5: 02000000 A6: 00000000 A7: 00000000
up_dump_register: T0: 00000000 T1: 00000000 T2: 00000000 T3: 00000000
up_dump_register: T4: 00000000 T5: 00000000 T6: 00000000
up_dump_register: S0: 80034d58 S1: 80032000 S2: 00000013 S3: 80032000
up_dump_register: S4: 00000000 S5: 00000000 S6: 00000000 S7: 00000000
up_dump_register: S8: 00000000 S9: 00000000 S10: 00000000 S11: 00000000
up_dump_register: SP: 80034d48 FP: 80034d58 TP: 00000000 RA: 800009a6
dump_stackinfo: User Stack:
dump_stackinfo: base: 0x80034138
dump_stackinfo: size: 00004040
dump_stackinfo: sp: 0x80034d48
stack_dump: 0x80034d28: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034d48: deadbeef deadbeef deadbeef 80034d68 deadbeef
deadbeef 80034d98 80000688
stack_dump: 0x80034d68: deadbeef deadbeef deadbeef 80034f34 deadbeef
deadbeef 00000000 800350c0
stack_dump: 0x80034d88: 80000003 8001a446 80034da8 80000630 80000003
8001a446 80034f34 80000162
stack_dump: 0x80034da8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034dc8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034de8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e08: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e28: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e48: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e68: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e88: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ea8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ec8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ee8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034f08: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034f28: deadbeef deadbeef deadbeef 8001a446 8001a43e
800350c0 deadbeef 00000000
stack_dump: 0x80034f48: 00000000 00000000 00000000 800350d0 00000000
00000013 8001a370 00000000
stack_dump: 0x80034f68: 00000000 00000001 02000000 00000000 00000000
80034118 00000000 00000000
stack_dump: 0x80034f88: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80034fa8: 00000000 00000000 00000000 00003880 00000000
00000000 00000000 00000000
stack_dump: 0x80034fc8: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80034fe8: 00000000 00000000 00000000 00003880 00000000
00000000 00000000 00000000
stack_dump: 0x80035008: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035028: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035048: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035068: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035088: 00000000 00000000 00000098 8001a370 800350c0
80013e46 00000000 00000000
stack_dump: 0x800350a8: 00000000 00000000 80034118 00000000 800350d0
8001a438 80033cf0 8001a3c6
stack_dump: 0x800350c8: 800350f0 80004e40 00000000 00000000 00000002
80034118 00000000 00000000
stack_dump: 0x800350e8: 80035100 80001936 00000000 00000000 00000000
00000000 00000000 00000000
sched_dumpstack: backtrace| 2: 0x800226ba 0x80017696 0x800142ce 0x80007152
0x800009a6 0x80000688 0x80000630 0x80000162
sched_dumpstack: backtrace| 2: 0xdeadbeef 0x8001a37e 0x80034d68
dump_tasks: PID GROUP PRI POLICY TYPE NPX STATE EVENT SIGMASK
STACKBASE STACKSIZE USED FILLED COMMAND
dump_task: 0 0 0 FIFO Kthread - Ready
0000000000000000 0x80031a50 2032 1372 67.5% Idle_Task
dump_task: 1 1 100 RR Task - Waiting Semaphore
0000000000000000 0x800329d8 4040 2316 57.3% nsh_main
dump_task: 2 2 255 RR Task - Running
0000000000000000 0x80034138 4040 2836 70.1% backtrace irq
sched_dumpstack: backtrace| 0: 0x80007442 0x80032230 0x800005c4 0x80000048
sched_dumpstack: backtrace| 1: 0x800073ea 0x8001480a 0x8001481e 0x8000935e
0x80007d56 0x80008a98 0x80008b32 0x80007726
sched_dumpstack: backtrace| 1: 0x80007542 0x800074fe 0x80004e40 0x80001936
sched_dumpstack: backtrace| 2: 0x800226ba 0x80017696 0x80013f1a 0x80014632
0x8001430a 0x80007152 0x800009a6 0x80000688
sched_dumpstack: backtrace| 2: 0x80000630 0x80000162 0xdeadbeef 0x8001a37e
0x80034d68
```
Saving this to a file and running btdecode on it:
```
$ ./tools/btdecode.sh riscv-none-elf-addr2line bt
Backtrace for task 2:
0x80022852: sched_backtrace at sched_backtrace.c:106
0x800177e0: sched_dumpstack at sched_dumpstack.c:71
0x8001439a: dump_assert_info at assert.c:717
(inlined by) _assert at assert.c:897
0x80007188: riscv_exception at riscv_exception.c:135
0x800009cc: irq_dispatch at irq_dispatch.c:160
0x80000688: riscv_doirq at riscv_doirq.c:102
0x80000630: riscv_dispatch_irq at qemu_rv_irq_dispatch.c:140
0x80000166: return_from_exception at riscv_exception_common.S:238
0x8002fd58: _sbss at ??:?
Backtrace dump for all tasks:
Backtrace for task 2:
0x80022852: sched_backtrace at sched_backtrace.c:106
0x800177e0: sched_dumpstack at sched_dumpstack.c:71
0x80013ff2: dump_backtrace at assert.c:451
0x8001477c: nxsched_foreach at sched_foreach.c:69 (discriminator 2)
0x8001442c: dump_fatal_info at assert.c:769
(inlined by) _assert at assert.c:904
0x80007188: riscv_exception at riscv_exception.c:135
0x800009cc: irq_dispatch at irq_dispatch.c:160
0x80000688: riscv_doirq at riscv_doirq.c:102
Backtrace for task 1:
0x80007420: sys_call0 at syscall.h:161
(inlined by) up_switch_context at riscv_switchcontext.c:85
0x80014954: nxsched_waitpid at sched_waitpid.c:165
0x80014968: waitpid at sched_waitpid.c:618
0x80009394: nsh_builtin at nsh_builtin.c:166
0x80007d8c: nsh_execute at nsh_parse.c:552
0x80008ace: nsh_parse_command at nsh_parse.c:2791
0x80008b68: nsh_parse at nsh_parse.c:2980
0x8000775c: nsh_session at nsh_session.c:248
0x80007578: nsh_consolemain at nsh_consolemain.c:81
0x80007534: nsh_main at nsh_main.c:82
0x80004e66: nxtask_startup at task_startup.c:72 (discriminator 1)
0x8000195c: nxtask_start at task_start.c:75
Backtrace for task 0:
0x80007478: up_idle at riscv_idle.c:77
0x80032c50: ?? ??:0
0x800005c4: qemu_rv_start at qemu_rv_start.c:233 (discriminator 1)
0x80000048: _init at qemu_rv_head.S:90
```
Now here's the output with CONFIG_ARCH_INTERRUPT_STACK=0:
```
nsh> backtrace irq
riscv_exception: EXCEPTION: Store/AMO access fault. MCAUSE: 00000007, EPC:
8001a37e, MTVAL: 00000000
riscv_exception: PANIC!!! Exception = 00000007
dump_assert_info: Current Version: NuttX 10.4.0 3c5e236ba9 Feb 13 2025
06:44:15 risc-v
dump_assert_info: Assertion failed panic: at file: :0 task: backtrace
process: backtrace 0x8001a3c6
up_dump_register: EPC: 8001a37e
up_dump_register: A0: 00000013 A1: 80034f34 A2: 00000000 A3: 80000003
up_dump_register: A4: 8002f678 A5: 02000000 A6: 00000000 A7: 00000000
up_dump_register: T0: 00000000 T1: 00000000 T2: 00000000 T3: 00000000
up_dump_register: T4: 00000000 T5: 00000000 T6: 00000000
up_dump_register: S0: 80034d58 S1: 80032000 S2: 00000013 S3: 80032000
up_dump_register: S4: 00000000 S5: 00000000 S6: 00000000 S7: 00000000
up_dump_register: S8: 00000000 S9: 00000000 S10: 00000000 S11: 00000000
up_dump_register: SP: 80034d48 FP: 80034d58 TP: 00000000 RA: 800009a6
dump_stackinfo: User Stack:
dump_stackinfo: base: 0x80034138
dump_stackinfo: size: 00004040
dump_stackinfo: sp: 0x80034d48
stack_dump: 0x80034d28: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034d48: deadbeef deadbeef deadbeef 80034d68 deadbeef
deadbeef 80034d98 80000688
stack_dump: 0x80034d68: deadbeef deadbeef deadbeef 80034f34 deadbeef
deadbeef 00000000 800350c0
stack_dump: 0x80034d88: 80000003 8001a446 80034da8 80000630 80000003
8001a446 80034f34 80000162
stack_dump: 0x80034da8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034dc8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034de8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e08: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e28: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e48: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e68: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034e88: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ea8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ec8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034ee8: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034f08: deadbeef deadbeef deadbeef deadbeef deadbeef
deadbeef deadbeef deadbeef
stack_dump: 0x80034f28: deadbeef deadbeef deadbeef 8001a446 8001a43e
800350c0 deadbeef 00000000
stack_dump: 0x80034f48: 00000000 00000000 00000000 800350d0 00000000
00000013 8001a370 00000000
stack_dump: 0x80034f68: 00000000 00000001 02000000 00000000 00000000
80034118 00000000 00000000
stack_dump: 0x80034f88: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80034fa8: 00000000 00000000 00000000 00003880 00000000
00000000 00000000 00000000
stack_dump: 0x80034fc8: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80034fe8: 00000000 00000000 00000000 00003880 00000000
00000000 00000000 00000000
stack_dump: 0x80035008: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035028: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035048: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035068: 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
stack_dump: 0x80035088: 00000000 00000000 00000098 8001a370 800350c0
80013e46 00000000 00000000
stack_dump: 0x800350a8: 00000000 00000000 80034118 00000000 800350d0
8001a438 80033cf0 8001a3c6
stack_dump: 0x800350c8: 800350f0 80004e40 00000000 00000000 00000002
80034118 00000000 00000000
stack_dump: 0x800350e8: 80035100 80001936 00000000 00000000 00000000
00000000 00000000 00000000
sched_dumpstack: backtrace| 2: 0x800226ba 0x80017696 0x800142ce 0x80007152
0x800009a6 0x80000688 0x80000630 0x80000162
sched_dumpstack: backtrace| 2: 0xdeadbeef 0x8001a37e 0x80034d68
dump_tasks: PID GROUP PRI POLICY TYPE NPX STATE EVENT SIGMASK
STACKBASE STACKSIZE USED FILLED COMMAND
dump_task: 0 0 0 FIFO Kthread - Ready
0000000000000000 0x80031a50 2032 1372 67.5% Idle_Task
dump_task: 1 1 100 RR Task - Waiting Semaphore
0000000000000000 0x800329d8 4040 2316 57.3% nsh_main
dump_task: 2 2 255 RR Task - Running
0000000000000000 0x80034138 4040 2836 70.1% backtrace irq
sched_dumpstack: backtrace| 0: 0x80007442 0x80032230 0x800005c4 0x80000048
sched_dumpstack: backtrace| 1: 0x800073ea 0x8001480a 0x8001481e 0x8000935e
0x80007d56 0x80008a98 0x80008b32 0x80007726
sched_dumpstack: backtrace| 1: 0x80007542 0x800074fe 0x80004e40 0x80001936
sched_dumpstack: backtrace| 2: 0x800226ba 0x80017696 0x80013f1a 0x80014632
0x8001430a 0x80007152 0x800009a6 0x80000688
sched_dumpstack: backtrace| 2: 0x80000630 0x80000162 0xdeadbeef 0x8001a37e
0x80034d68
```
And the `btdecode`:
```
$ ./tools/btdecode.sh riscv-none-elf-addr2line bt
Backtrace for task 2:
0x800226ba: sched_backtrace at sched_backtrace.c:106
0x80017696: sched_dumpstack at sched_dumpstack.c:71
0x800142ce: dump_assert_info at assert.c:717
(inlined by) _assert at assert.c:897
0x80007152: riscv_exception at riscv_exception.c:135
0x800009a6: irq_dispatch at irq_dispatch.c:160
0x80000688: riscv_doirq at riscv_doirq.c:102
0x80000630: riscv_dispatch_irq at qemu_rv_irq_dispatch.c:140
0x80000162: exception_common at riscv_exception_common.S:231
0xdeadbeef: ?? ??:0
0x8001a37e: assert_on_interrupt_handler at backtrace_qemu_main.c:110
0x80034d68: ?? ??:0
Backtrace dump for all tasks:
Backtrace for task 2:
0x800226ba: sched_backtrace at sched_backtrace.c:106
0x80017696: sched_dumpstack at sched_dumpstack.c:71
0x80013f1a: dump_backtrace at assert.c:451
0x80014632: nxsched_foreach at sched_foreach.c:69 (discriminator 2)
0x8001430a: dump_fatal_info at assert.c:769
(inlined by) _assert at assert.c:904
0x80007152: riscv_exception at riscv_exception.c:135
0x800009a6: irq_dispatch at irq_dispatch.c:160
0x80000688: riscv_doirq at riscv_doirq.c:102
Backtrace for task 1:
0x800073ea: sys_call0 at syscall.h:161
(inlined by) up_switch_context at riscv_switchcontext.c:85
0x8001480a: nxsched_waitpid at sched_waitpid.c:165
0x8001481e: waitpid at sched_waitpid.c:618
0x8000935e: nsh_builtin at nsh_builtin.c:166
0x80007d56: nsh_execute at nsh_parse.c:552
0x80008a98: nsh_parse_command at nsh_parse.c:2791
0x80008b32: nsh_parse at nsh_parse.c:2980
0x80007726: nsh_session at nsh_session.c:248
0x80007542: nsh_consolemain at nsh_consolemain.c:81
0x800074fe: nsh_main at nsh_main.c:82
0x80004e40: nxtask_startup at task_startup.c:72 (discriminator 1)
0x80001936: nxtask_start at task_start.c:75
Backtrace for task 0:
0x80007442: up_idle at riscv_idle.c:77
0x80032230: ?? ??:0
0x800005c4: qemu_rv_start at qemu_rv_start.c:233 (discriminator 1)
0x80000048: _init at qemu_rv_head.S:90
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]