XuNeo opened a new pull request, #17684:
URL: https://github.com/apache/nuttx/pull/17684

   ## Summary
   
   Fix wrong irq number got from getipsr() when optimization level is changed 
to above O2.
   
   When compiling with O2 optimization, the compiler optimizes the code
   in a way that causes irq variable to be corrupted. The getipsr()
   function reads IPSR into r0, but the subsequent inline assembly that
   sets FPSCR also uses r0 without declaring it as clobbered. This causes
   the compiler to reuse r0 for the immediate value (0x40000), overwriting
   the IRQ number read from IPSR.
   
   The issue manifests as:
   - getipsr() correctly reads IPSR (e.g., 0xf for IRQ 15)
   - Compiler optimizes and reuses r0 for ARM_FPSCR_LTPSIZE_NONE (0x40000)
   - irq variable gets the wrong value 0x40000 instead of actual IRQ number
   - This leads to assertion failures in irq_dispatch due to invalid IRQ
   
   Root cause analysis from disassembly:
     mrs r0, IPSR          ; Read IPSR to r0
     mov.w r0, #262144     ; Compiler overwrites r0 with 0x40000!
     vmsr fpscr, r0        ; Set FPSCR
     str r0, [sp, #4]      ; Store corrupted 0x40000 as irq
     ...
     ldr r0, [sp, #4]      ; Load corrupted value
     bl irq_dispatch       ; Call with wrong IRQ number 0x40000
   
   Fix by adding r0 to the clobber list in the inline assembly, which
   forces the compiler to save irq value before using r0 for FPSCR setup.
   
   This issue only occurs at O2 optimization level and affects ARMv8-M
   architecture with FPU enabled.
   
   ## Impact
   
   Now it works with DEBUG_FULLOPT.
   
   ## Testing
   1.
   ```
   cmake -Bbuild -GNinja -DBOARD_CONFIG=mps3-an547:nsh nuttx
   ```
   
   2.
   menuconfig to enable `DEBUG_FULLOPT`
   ```
   ninja -C build
   ```
   
   3.
   ```
   qemu-system-arm -M mps3-an547 -m 2G -nographic -kernel build/nuttx
   ```
   
   Before
   ```
   irq_unexpected_isr: ERROR irq: 262144
   dump_assert_info: Current Version: NuttX  12.11.0 28da499a7e2 Dec 26 2025 
10:55:24 arm
   dump_assert_info: Assertion failed panic: at file: 
/sched/irq/irq_unexpectedisr.c:56 task: Idle_Task process: Kernel 0x413d
   up_dump_register: R0: 01001a40 R1: 00000038 R2: 000205bb  R3: 00000007
   up_dump_register: R4: 00040000 R5: 01000ecc R6: 01000fa8  FP: 00000000
   up_dump_register: R8: 000205bb SB: 00020fac SL: 00000038 R11: 00000003
   up_dump_register: IP: 00000002 SP: 01000ad0 LR: 000047a1  PC: 000047a1
   up_dump_register: xPSR: 6000000f BASEPRI: 00000080 CONTROL: 00000000
   up_dump_register: EXC_RETURN: 00000000
   dump_stackinfo: IRQ Stack:
   dump_stackinfo:   base: 0x1000400
   dump_stackinfo:   size: 00002048
   dump_stackinfo:     sp: 0x1000ad0
   stack_dump: 0x1000ab0: 000212c0 01000ad0 01000ecc 01000fa8 01000400 01003684 
00000ff0 00004899
   stack_dump: 0x1000ad0: 00000254 00000038 01000f78 000210ad 0000413d 00000000 
00000000 00000000
   stack_dump: 0x1000af0: 01000ecc 01001a40 000205bb 00020fac 00000038 7474754e 
00000058 00003021
   stack_dump: 0x1000b10: deadbeef 01000bc8 dead00ef 00020fab deadbeef deadbeef 
32313434 dead3236
   stack_dump: 0x1000b30: deadbeef deadbeef 2e323100 302e3131 deadbe00 01000ba4 
000044b1 38320000
   stack_dump: 0x1000b50: 39346164 65376139 65442032 36322063 32303220 30312035 
3a35353a 00003432
   stack_dump: 0x1000b70: 01000bc0 00008791 deadbeef 00020f99 6d7261ef 00000000 
00009b5d 00009b1d
   stack_dump: 0x1000b90: 00002ff1 0000000a 00000003 00040000 000044b1 00000000 
00000000 00000001
   stack_dump: 0x1000bb0: 00000000 00000000 00000000 00002af7 0000000a 000044d3 
e0001000 0000447b
   stack_dump: 0x1000bd0: 00040000 00000000 00000000 01004678 7ffffff0 60000000 
80000000 0000038d
   stack_dump: 0x1000bf0: 00000000 00040000 00000000 ffffffed 00000000 00000000 
00000000 00000000
   dump_stacks: ERROR: Stack pointer 1004674 is not within the stack
   dump_stackinfo: User Stack:
   dump_stackinfo:   base: 0x1003684
   dump_stackinfo:   size: 00004080
   stack_dump: 0x10045b4: 01000144 000003e8 00000000 00000009 7ffffff0 7ffffff0 
60000008 00000002
   stack_dump: 0x10045d4: 00002cbd 0000a1f6 21000200 00000000 00000000 00000000 
00000000 00000000
   stack_dump: 0x10045f4: 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000
   stack_dump: 0x1004614: 00000000 00000000 00000000 00040000 00000000 0000a189 
01000ec4 00000000
   stack_dump: 0x1004634: 01000ecc 00000000 01000fa8 00008393 01002678 000042bb 
01004674 001fb98c
   stack_dump: 0x1004654: 00000000 00000000 00000000 00000000 00000000 000002c3 
00000000 00000000
   stack_dump: 0x1004674: 00000000 00000000 00000000 00000000 00000000 00000000 
00000000 00000000
   dump_tasks:    PID GROUP PRI POLICY   TYPE    NPX STATE   EVENT      SIGMASK 
         STACKBASE  STACKSIZE      USED   FILLED    COMMAND
   dump_tasks:   ----   --- --- -------- ------- --- ------- ---------- 
---------------- 0x1000400      2048       636    31.0%    irq
   dump_task:       0     0   0 FIFO     Kthread -   Running            
0000000000000000 0x1003684      4080       192     4.7%    Idle_Task
   ```
   
   After, works as normal.
   
   


-- 
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