nuttx/arch/arm/include
Marco Casaroli 50a735bf86 libs/libc/machine/arm: Relocate FDPIC function descriptors.
A function pointer under FDPIC is not a code address.  Because each
PT_LOAD segment is placed independently, a pointer has to carry the data
base its callee will need, so it is a two-word descriptor: the entry
point, and the base to install in the PIC register before branching.
R_ARM_FUNCDESC_VALUE says "the thing you are patching is such a
descriptor", and R_ARM_FUNCDESC says "manufacture one and give me its
address".

Both need state a relocation cannot carry.  A descriptor's second word is
the *object's* data base, from DT_PLTGOT, and R_ARM_FUNCDESC carves
descriptors from a pool whose cursor has to survive from one relocation
to the next.  up_relocate() is handed only a relocation, a resolved
symbol and an address to patch.

arch_data is the existing channel for exactly this -- RISC-V already uses
it to remember a HI20 relocation while its LO12 partner is processed --
but nothing has ever put loader state into it: it is declared zeroed and
written only by up_relocate() itself.  So ARCH_ELFDATA_INIT and
ARCH_ELFDATA_FINI are added, seeding the block from the loadinfo before
the relocation loop and reading the cursor back after.  Both default to
nothing, so an architecture that does not define them is unaffected, and
RISC-V's use of arch_data is untouched.  libelf_relocatedyn() walks both
dynamic tables under one arch_data, so the cursor spans the whole object.

The addend handling is the part that is easy to get wrong.  REL format
keeps the addend in place, in the word about to become the entry point,
and a pointer to a static function is referenced through its *section*
symbol -- the value is the section base and the offset, including the
Thumb bit, is entirely in the addend.  Dropping it yields an even address
and the core faults trying to execute it as ARM code.

The GOT written into a descriptor is the loading object's own, even for
an imported function, which is what makes a callback work: when the base
firmware's qsort() calls back into a module's comparison function, the
module needs its own data base in the PIC register.

libelf_relocatedyn()'s imported-symbol path needed a change to suit.  It
stores the resolved address directly and never calls up_relocate(), which
cannot produce a two-word descriptor, so under FDPIC the resolved value
now goes through up_relocate() and the relocation type decides what to
write.

Implemented for armv7-m and armv8-m, the profiles FDPIC targets; the
other ARM variants gain the arch_data block but no new relocations.
Built and booted mps3-an547:picostest and lm3s6965-ek:qemu-nxflat, the
ELF PIC and NXFLAT users of this code, both unchanged.

Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
2026-09-13 16:03:32 -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
stm32c5 arch/arm/stm32c5: Add STM32C562 architecture support 2026-08-27 01:07:10 +08: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/arm/stm32f4: add STM32F412CG chip selection 2026-09-01 17:40:30 +08:00
stm32f7 arch/arm/stm32f7: use common Kconfig symbols 2026-08-18 09:34:58 +08:00
stm32g0 arm/stm32g0: Add USB device controller support 2026-08-22 11:09:08 +08:00
stm32g4 !arch/stm32: move stm32g4 to its own directory 2026-06-24 14:54:44 -03:00
stm32h5 arch/arm: define SecureFault for STM32H5/L5/U5 2026-08-27 01:06:44 +08:00
stm32h7 arch/arm: add initial STM32H7R/S family support 2026-08-23 11:03:16 +08: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/arm: define SecureFault for STM32H5/L5/U5 2026-08-27 01:06:44 +08:00
stm32n6 !arch/stm32n6: unify non-standard hardware definition prefixes 2026-06-11 22:51:35 -03:00
stm32u0 arch/arm: add stm32u0 support 2026-08-18 15:00:15 +02:00
stm32u3 arch/arm/stm32u3: Add STM32U3C5 architecture support 2026-08-23 11:03:03 +08:00
stm32u5 arch/arm/stm32: Generalize Cortex-M33 heap support 2026-08-27 01:07:10 +08: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 Remove exra whitespace from files (#189) 2020-01-31 09:24:49 -06:00
arch.h binfmt, arch/arm: Add the CONFIG_FDPIC option and the ABI header. 2026-09-08 16:31:16 -03: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 libs/libc/machine/arm: Relocate FDPIC function descriptors. 2026-09-13 16:03:32 -03: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
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