nuttx/arch/arm/include
Marco Casaroli 608d1e269a arch/arm: Build fork() children from the caller's syscall frame on armv7-a.
In a kernel build the cloning primitives are reached through a system call,
and armv7-a dispatches one by re-pointing the caller's own exception frame at
dispatch_syscall() and switching to the task's kernel stack.  The snapshot the
entry point in fork.S takes for itself therefore describes the kernel-side
stub, and the frames below it are on a stack the child gets no copy of:  a
child built from that snapshot resumes at a kernel address with a stack
pointer into its own user stack.  It faulted with a prefetch abort at PC 0 on
qemu-armv7a:knsh, which is why the fork family had never been run there.

Record what the caller was actually doing instead.  arm_syscall() stores the
exception frame of the outermost system call in xcp.sregs, mirroring
riscv_swint.c, and arm_fork() chooses where the caller's registers live:

  arm_fork_syscall()  when a user stack pointer is saved, rebuilding the child
                      from xcp.sregs so that it returns from the very same SVC
                      as the parent, in the same mode, on its own stack and
                      with no inherited system call nesting;
  arm_fork_direct()   otherwise -- the flat build, a kernel thread in any
                      build, and a build without a kernel stack, where the
                      call is dispatched on the caller's own stack so the
                      caller's frames are copied along with the kernel-side
                      ones.

Note that the discriminator is xcp.ustkptr rather than TCB_FLAG_SYSCALL.  On
armv7-a the caller is the task that runs the kernel side of its own system
call, so being in a system call is not by itself a reason to distrust the
snapshot; the switch to the kernel stack is.  Because arm_syscall() has
already re-pointed the frame by the time arm_fork() runs, the caller's PC,
CPSR and SP come from where arm_syscall() put them -- syscall[0].sysreturn,
syscall[0].cpsr and ustkptr -- and the rest from the frame itself.

Nothing selects the primitives on an ARM kernel build yet, so this commit
changes no configuration; it is what the next one needs to be correct.

Assisted-by: Claude Code:claude-opus-5
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
2026-08-10 08:57:30 -03:00
..
a1x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
am67 arch/arm/am67: Add support for TI AM67 chips. 2026-05-28 14:16:03 +02:00
am335x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
arm !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv6-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv7-a arch/arm: Build fork() children from the caller's syscall frame on armv7-a. 2026-08-10 08:57:30 -03:00
armv7-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv7-r !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv8-m !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
armv8-r !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
at32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
c5471 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
csk6 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
cxd32xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
cxd56xx !boards: Remove NSH_ARCHINIT and board_app_initialize 2026-05-02 18:36:46 +08:00
dm320 style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
efm32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
eoss3 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
fvp-v8r-aarch32 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
gd32f4 style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
goldfish arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
ht32f491x3 ht32f491x3/esk32: add docs and flash helpers 2026-03-30 09:48:16 +08:00
imx1 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
imx6 arm/imx6: Fix IMX_IRQ definitions 2026-04-10 10:28:39 +08:00
imx9 imx9: imx95 fix uSDHC IRQ naming to match NuttX USDHC convention 2026-03-24 15:39:07 +08:00
imxrt arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
kinetis style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
kl arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lc823450 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc17xx_40xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc31xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc43xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc54xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
lpc214x arch/lpc214x: Fix LPC214x to work again 2026-07-01 03:00:43 +08:00
lpc2378 arch/arm: Fix LPC2378 to work again 2026-06-30 03:28:12 +08:00
max326xx arch/arm/max326xx: add max32690 global control bit definitions 2025-02-11 12:27:10 -03:00
mcx-nxxx arch/mcx-nxxx: Add support for NXP MCX-N236 CPU 2025-02-22 16:12:06 -03:00
moxart arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
mps arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
mx8mp style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
nrf52 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nrf53 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nrf91 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
nuc1xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
phy62xx !arch/stm32f0l0g0: move stm32c0 and finalize the directory split 2026-06-24 14:54:44 -03:00
qemu arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
ra4 arch/ra4: Add support for Renesas RA4M1 MCU 2025-02-25 13:14:48 -03:00
rp23xx arch/arm/rp23xx: fix irq priority levels 2025-04-22 20:59:42 -03:00
rp2040 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
rtl8720f arch/arm: add Realtek RTL8721Dx and RTL8720F (Ameba WHC) support 2026-07-01 09:18:06 -03:00
rtl8721dx arch/arm: add Realtek RTL8721Dx and RTL8720F (Ameba WHC) support 2026-07-01 09:18:06 -03:00
rtl8721f arch/arm/rtl8721f: bring up minimal NSH (P1) 2026-07-30 17:04:14 +08:00
s32k1xx arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
s32k3xx style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
sam34 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
sama5 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samd2l2 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samd5e5 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
samv7 arch/arm/samv7: enable USART peripherals for SAMx7xJ series 2025-09-18 11:05:56 +02:00
stm32c0 !arch/stm32f0l0g0: move stm32c0 and finalize the directory split 2026-06-24 14:54:44 -03:00
stm32f0 !arch/stm32f0l0g0: move stm32f0 to its own directory 2026-06-24 14:54:44 -03:00
stm32f1 !arch/stm32: move stm32f1 to its own directory 2026-06-24 14:54:44 -03:00
stm32f2 !arch/stm32: move stm32f2 to its own directory 2026-06-24 14:54:44 -03:00
stm32f3 !arch/stm32: move stm32f3 to its own directory 2026-06-24 14:54:44 -03:00
stm32f4 !arch/stm32: move stm32f4 to its own directory 2026-06-24 14:54:44 -03:00
stm32f7 !arch/stm32f7: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32g0 !arch/stm32f0l0g0: move stm32g0 to its own directory 2026-06-24 14:54:44 -03:00
stm32g4 !arch/stm32: move stm32g4 to its own directory 2026-06-24 14:54:44 -03:00
stm32h5 !arch/stm32h5: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32h7 !arch/stm32h7: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32l0 !arch/stm32f0l0g0: move stm32l0 to its own directory 2026-06-24 14:54:44 -03:00
stm32l1 !arch/stm32: move stm32l1 and finalize the directory split 2026-06-24 14:54:44 -03:00
stm32l4 !arch/stm32l4: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32l5 !arch/stm32l5: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32n6 !arch/stm32n6: unify non-standard hardware definition prefixes 2026-06-11 22:51:35 -03:00
stm32u5 !arch/stm32u5: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32wb !arch/stm32wb: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
stm32wl5 !arch/stm32wl5: use common STM32 Kconfig symbols 2026-06-14 11:35:31 -03:00
str71x arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
tiva arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
tlsr82 !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
tms570 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
xmc4 arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
.gitignore
arch.h !arch/arm: Use r9 as the PIC base register. 2026-08-06 01:38:23 +08:00
barriers.h arch/arm:use UP_DSB, UP_DMB, UP_ISB as barrier standard API 2025-01-20 20:13:07 +08:00
elf.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
inttypes.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
irq.h arch: rename STACK_ALIGNMENT to STACKFRAME_ALIGN across all architectures 2026-01-22 15:37:24 +08:00
limits.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
setjmp.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
spinlock.h arm/memory_barrier: fix build warning on GCC14 2025-02-18 09:04:54 -05:00
stdarg.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
syscall.h arch/arm: migrate to SPDX identifier 2024-12-06 09:25:23 +08:00
types.h armv7/8m: fix regresion from https://github.com/apache/nuttx/pull/14881 2024-12-09 12:20:13 +08:00