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]

Reply via email to