Re: [PATCH v4 3/3] arm: Enable FPU for M-profile
Torbjorn SVENSSON <[email protected]> Thu, 25 Jun 2026 21:08:36 +0200
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
On 2026-06-24 21:58, Christophe Lyon wrote: > Before using the FPU, we must grant access to it. This helps when > running the GCC testsuite on a simulator where FPU access is not > granted by default. > > This patch grants full access, we may want to consider granting only > unprivileged access later. > > While updating crt0.S, include arm-acle-compat.h and stop using > __ARM_ARCH_7A__. > > 2026-05-29 Christophe Lyon <[email protected]> > > * libgloss/arm/cpu-init/rdimon-aem-m.S: Enable full FPU access on > M-profile. > * libgloss/arm/crt0.S: Call _rdimon_hw_init_hook for M profile > too. > --- > libgloss/arm/cpu-init/rdimon-aem-m.S | 29 +++++++++++++++++++++++++++- > libgloss/arm/crt0.S | 9 +++------ > 2 files changed, 31 insertions(+), 7 deletions(-) > > diff --git a/libgloss/arm/cpu-init/rdimon-aem-m.S b/libgloss/arm/cpu-init/rdimon-aem-m.S > index 611849077..c495efc2d 100644 > --- a/libgloss/arm/cpu-init/rdimon-aem-m.S > +++ b/libgloss/arm/cpu-init/rdimon-aem-m.S > @@ -28,9 +28,36 @@ > We define a hardfault handler, required to prevent the simulator > from entering into an infinite loop. This handler is located at > address 0xc by default when linking with mprofile-mps2.specs which > - uses --section-start=.hardfault_handler_addr=0xc. */ > + uses --section-start=.hardfault_handler_addr=0xc. > + > + Enable the FPU when __ARM_FP is set. */ > > #if (__ARM_ARCH_PROFILE == 'M') > + .syntax unified > + .thumb > + > + @ CPU Initialisation > + .globl _rdimon_hw_init_hook > + .type _rdimon_hw_init_hook, %function > + > +_rdimon_hw_init_hook: > + /* Enable FPU for M-profile only . */ > +#if __ARM_FP > + /* Read CPACR */ > + ldr r0, =0xE000ED88 > + ldr r1, [R0] > + /* Enable full access to CP10 and CP11. */ > + orr r1, r1, #(0xFF << 20) > + str r1, [R0] > +#if __ARM_ARCH >= 800 > + ldr r0, =0xE002ED88 > + str r1, [R0] Is this okay to do? Are we sure that this rdimon-aem-m.S is never included in a non-secure application? What happens if it is included in a non-secure application, secure fault? Kind regards, Torbjörn > +#endif > + dsb > + isb > +#endif > + bx lr > + > /* On M-profile, call abort in case of hardfault: this causes the > simulator to abort execution instead of going into an infinite > loop. */ > diff --git a/libgloss/arm/crt0.S b/libgloss/arm/crt0.S > index b9e768007..cad002d2b 100644 > --- a/libgloss/arm/crt0.S > +++ b/libgloss/arm/crt0.S > @@ -1,6 +1,7 @@ > #include "newlib.h" > #include "arm.h" > #include "swi.h" > +#include "arm-acle-compat.h" > > /* ANSI concatenation macros. */ > #define CONCAT(a, b) CONCAT2(a, b) > @@ -250,12 +251,8 @@ > FUNC_START _start > FN_EH_START > > - /* __ARM_ARCH_PROFILE is defined from GCC 4.8 onwards, however __ARM_ARCH_7A > - has been defined since 4.2 onwards, which is when v7-a support was added > - and hence 'A' profile support was added in the compiler. Allow for this > - file to be built with older compilers. We only call this for A profile > - cores. */ > -#if defined (__ARM_ARCH_7A__) || (__ARM_ARCH_PROFILE == 'A') > + /* We only call this for A and M profile cores. */ > +#if (__ARM_ARCH_PROFILE == 'A') || (__ARM_ARCH_PROFILE == 'M') > /* The init hook does not use the stack and is called before the stack has been set up. */ > #ifdef ARM_RDI_MONITOR > bl _rdimon_hw_init_hook