diff options
author | Srinath Parvathaneni <srinath.parvathaneni@arm.com> | 2023-03-03 13:12:18 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@arm.com> | 2023-03-03 13:27:31 +0000 |
commit | 1d3d2ba54bf7fb7f47510b70cc71489b293ff60d (patch) | |
tree | 1ce309a5e32ab02319275c71974fe0db55331c68 /newlib/libc | |
parent | b782dcb2b363974da249c94adedd95d218d89bef (diff) | |
download | newlib-1d3d2ba54bf7fb7f47510b70cc71489b293ff60d.zip newlib-1d3d2ba54bf7fb7f47510b70cc71489b293ff60d.tar.gz newlib-1d3d2ba54bf7fb7f47510b70cc71489b293ff60d.tar.bz2 |
arm: Restrict processor mode change when in hypervisor mode
If a CPU implements EL2 as its highest exception level then programs
using newlib may start in hypervisor mode. In that state it is not
trivial to switch into the various EL1 modes to configure the
individual exception stacks, so do not try.
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/sys/arm/crt0.S | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S index 121246c..90d5be3 100644 --- a/newlib/libc/sys/arm/crt0.S +++ b/newlib/libc/sys/arm/crt0.S @@ -122,10 +122,10 @@ * +-----+ <- SP_svc of getting in and out of secure state are not as * | | simple as writing to the CPSR mode bits. * | IRQ | -= 0x2000 - Mode switch via CPSR is not allowed once in -* | | non-privileged mode, so we take care not to enter -* ^ +-----+ <- SP_und "User" to set up its SP, and also skip most -* s | | operations if already in that mode. -* t | UND | -= 0x1000 +* | | non-privileged mode or in hypervisor mode, so we +* ^ +-----+ <- SP_und take care not to enter "User" or "Hypervisor" mode +* s | | to set up its SP, and also skip most operations if +* t | UND | -= 0x1000 already in these modes. * a | | Input parameters: * c +-----+ <- SP_und - sp - Initialized SP * k | | - r2 - May contain SL value from semihosting @@ -150,9 +150,9 @@ /* Following code is compatible for both ARM and Thumb ISA. */ mrs r4, CPSR mov r3, sp /* Save input SP value. */ - /* Test mode bits - in User of all are 0. */ - tst r4, #(CPSR_M_MASK) - /* "eq" means r4 AND #0x0F is 0. */ + ands r1, r4, #(CPSR_M_MASK) + beq .Lskip_cpu_modes + cmp r1, #(CPSR_M_HYP) beq .Lskip_cpu_modes /* FIQ mode, interrupts disabled. */ |