seL4/include
Indan Zupancic 717cf90201 Aarch64: Drop ISBs in enableFpu/disableFpu
Doing an ISB is very expensive, about ~30 cycles on some CPUs,
so try to avoid them if possible.

For the writes to (most) system registers to be observed, a
'Context Synchronization event' needs to occur (see ARM DDI 0487
M.a §D24.1.2.2 / pD24-8367).

The kernel is not doing any FPU operations after disabling the FPU,
so there is never a need for an ISB there. Returning to user space
counts as a 'Context Synchronization event' and ensures the FPU enable
or disable has completed when user space starts executing.

An ISB after enabling the FPU is only needed in case the FPU was
disabled for the kernel and the kernel wants to do FPU operations
like saving or restoring the FPU state. The ISB ensures that the
FPU enable system register write is finished before FPU using
instructions are executed.

For Aarch64 non-HYP it is possible to disable the FPU for user space
(EL0), but keep it enabled for the kernel (EL1). This is done by
setting CPACR_EL1.FPEN to 1, which the code actually already did.

Aarch64 with virtualisation enabled is more complicated and needs
higher level changes to achieve the same, which aren't done here,
the change is limited to removing the ISB in disableFpu().

This partially fixes issue #1569.

Signed-off-by: Indan Zupancic <indan@nul.nu>
2025-12-19 00:57:04 +00: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 Aarch64: Drop ISBs in enableFpu/disableFpu 2025-12-19 00:57:04 +00:00
benchmark benchmark: config opt. name to enable log buffer 2022-03-31 08:56:06 +11:00
drivers Add support for the Banana Pi BPI-F3 2025-11-27 20:01:07 +01:00
fastpath reply: do not assume replyObject NULL invariant 2025-02-10 15:53:08 +11:00
kernel Disable clock sync test on QEMU RISC-V 2025-11-20 16:24:55 +11:00
machine machine: move setIRQTrigger into interrupt.h 2025-10-10 14:36:43 +11:00
model FPU: ksCurFPUOwner instead of ksActiveFPUState 2025-07-24 16:44:08 +10:00
object thread_ctrl: Remove unused flags 2025-08-01 12:38:52 +01: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 util: provide FNSPEC for __unreachable 2025-10-10 14:36:43 +11:00