seL4/include
Indan Zupancic 77f5fab0a0 Aarch32, FPU: Init fpexc with FPU enabled
On 32-bit ARM the fpexc system register is set by loadFpuState,
which includes the FPU enable/disable bit FPEXC_EN_BIT. This
register is part of the usercontext and needs to be initialised
correctly, otherwise the FPU will be disabled by loadFpuState.

Before, this bug was hidden because the FPU was enabled lazily
after a trap. This bug just caused one extra FPU trap at first
FPU use for each task: The first handleFPUFault would fail to
enable the FPU, causing another FPU trap when user space gets
restarted.

On the second FPU fault, switchLocalFpuOwner calls enableFpu first
and then calls saveFpuState because ksActiveFPUState is set to the
current task's FPU state. Then it gets saved with FPEXC_EN_BIT set
and the task can continue with the FPU actually enabled.

This also means that with the old code, the initial FPEXC state
of each task was equal to the previous active FPU task's.

Signed-off-by: Indan Zupancic <indan@nul.nu>
2025-07-24 16:44:08 +10:00
..
32/mode Bump minimum CMake version 2025-02-26 17:11:57 +11:00
64/mode Bump minimum CMake version 2025-02-26 17:11:57 +11:00
api treewide: typo fixes 2025-04-14 12:05:16 +10:00
arch Aarch32, FPU: Init fpexc with FPU enabled 2025-07-24 16:44:08 +10:00
benchmark benchmark: config opt. name to enable log buffer 2022-03-31 08:56:06 +11:00
drivers am335x,omap3,bcm2836: SGI unsupported 2025-07-07 08:50:47 +10:00
fastpath reply: do not assume replyObject NULL invariant 2025-02-10 15:53:08 +11:00
kernel Domain: Save FPU state when changing domain 2025-07-24 16:44:08 +10:00
machine FPU: Rename fpuThreadDelete to fpuRelease 2025-07-24 16:44:08 +10:00
model FPU: ksCurFPUOwner instead of ksActiveFPUState 2025-07-24 16:44:08 +10:00
object Add seL4_TCB_SetFlags Syscall 2025-07-24 16:44:08 +10:00
plat treewide: typo fixes 2025-04-14 12:05:16 +10:00
smp arm: Add new APIs for generating SGIs 2025-07-07 08:50:47 +10:00
api.h replacing all ifndef with pargma once 2020-03-23 11:04:46 +11:00
assert.h debug: use c99 standard instead of gcc extensions 2023-11-16 12:09:52 +00:00
basic_types.h boot: document region types 2023-04-12 15:07:02 +10:00
bootinfo.h boot: Remove constant BI_FRAME_SIZE_BITS 2023-08-23 15:10:32 +02:00
compound_types.h trivial: remove superfluous empty lines 2021-09-27 23:09:09 +10:00
config.h libsel4: Fix name for AARCH64_VSPACE_S2_START_L1 2021-09-06 08:08:54 +10:00
hardware.h boot: simplify boot code recycling 2023-08-13 09:04:26 +10:00
linker.h replacing all ifndef with pargma once 2020-03-23 11:04:46 +11:00
machine.h re-use existing functions to avoid redundancy 2022-09-15 11:25:04 +02:00
object.h trivial: remove duplicate headers 2022-02-05 15:30:25 +11:00
stdarg.h trivial: remove superfluous empty lines 2021-09-27 23:09:09 +10:00
stdint.h print 64-bit integers on 32-bits systems fully 2021-11-26 06:01:11 +01:00
string.h trivial: remove superfluous empty lines 2021-09-27 23:09:09 +10:00
types.h trivial: remove superfluous empty lines 2021-09-27 23:09:09 +10:00
util.h utils: wrap config_set for verification 2025-03-28 10:53:48 +11:00