nealef opened a new issue, #10898:
URL: https://github.com/apache/nuttx/issues/10898
I have been investigating signal handling in NuttX for SEGV/BUS/… for
armv7-m. I have got some PoC code written (for a backlevel NuttX) that, while
I’m in the interrupt handler, will schedule a signal handler. However, when it
returns from the interrupt in `exception_common` and the next instruction is
executed:
```
343 bx r14
/* And return */
(gdb) p $r14
$1 = 0xfffffffd
(gdb) stepi
up_sigdeliver () at armv7-m/up_sigdeliver.c:74
74 struct tcb_s *rtcb = this_task();
(gdb) bt
#0 up_sigdeliver () at armv7-m/up_sigdeliver.c:74
#1 <signal handler called>
```
I get a hardfault with a cfault of 0x1 (instruction access violation) and an
hfault of 0x40000000 (“FORCED”):
```
[ 9.439000] [12] up_hardfault: IRQ: 3 regs: 0xc0327078
[ 9.439000] [12] up_hardfault: BASEPRI: 00000080 PRIMASK: 00000000
IPSR: 00000003 CONTROL: 00000001
[ 9.439000] [12] up_hardfault: CFAULTS: 00000001 HFAULTS: 40000000
DFAULTS: 0000000b BFAULTADDR: 00000000 AFAULTS: 00000000
```
In the interrupt handler I thought I was clearing/acknowledging the
interrupt in the correct way in `up_memfault`:
```
uint32_t cfsr = getreg32(NVIC_CFAULTS);
uint32_t *mfsr = (uintptr_t) NVIC_CFAULTS;
:
*mfsr |= cfsr; /* Acknowledge interrupt */
```
I have looked through the ARM-7M Architecture Reference but I can’t work out
what the proper way of exiting the handler is (assuming this is the root cause
of the problem).
--
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]