[PATCH 1/2] cpukit/aarch64: Keep state across context switch
Kinsey Moore
kinsey.moore at oarcorp.com
Fri Feb 25 23:33:07 UTC 2022
If a task migrates to a newly turned-up CPU as the first task it
executes, no guarantees are made about whether interrupts are enabled
and it is possible for a task to change interrupt enable states during
the migration. This preserves interrupt state across context switches.
---
cpukit/score/cpu/aarch64/cpu_asm.S | 4 ++++
cpukit/score/cpu/aarch64/include/rtems/score/cpu.h | 7 ++++---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/cpukit/score/cpu/aarch64/cpu_asm.S b/cpukit/score/cpu/aarch64/cpu_asm.S
index 2379698336..4234b428aa 100644
--- a/cpukit/score/cpu/aarch64/cpu_asm.S
+++ b/cpukit/score/cpu/aarch64/cpu_asm.S
@@ -83,6 +83,8 @@ DEFINE_FUNCTION_AARCH64(_CPU_Context_switch)
stp fp, lr, [x0, #0x50]
mov x4, sp
str x4, [x0, #0x60]
+ mrs x5, daif
+ str x5, [x0, #0x78]
#ifdef AARCH64_MULTILIB_VFP
add x5, x0, #AARCH64_CONTEXT_CONTROL_D8_OFFSET
@@ -151,6 +153,8 @@ DEFINE_FUNCTION_AARCH64(_CPU_Context_switch)
ldp fp, lr, [x1, #0x50]
ldr x4, [x1, #0x60]
mov sp, x4
+ ldr x5, [x1, #0x78]
+ msr daif, x5
ret
/*
diff --git a/cpukit/score/cpu/aarch64/include/rtems/score/cpu.h b/cpukit/score/cpu/aarch64/include/rtems/score/cpu.h
index e1d9f0a5c2..2f252bf2f4 100644
--- a/cpukit/score/cpu/aarch64/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/aarch64/include/rtems/score/cpu.h
@@ -127,16 +127,16 @@
#define AARCH64_CONTEXT_CONTROL_THREAD_ID_OFFSET 0x70
#ifdef AARCH64_MULTILIB_VFP
- #define AARCH64_CONTEXT_CONTROL_D8_OFFSET 0x78
+ #define AARCH64_CONTEXT_CONTROL_D8_OFFSET 0x80
#endif
#define AARCH64_CONTEXT_CONTROL_ISR_DISPATCH_DISABLE 0x68
#ifdef RTEMS_SMP
#if defined(AARCH64_MULTILIB_VFP)
- #define AARCH64_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 0xb8
+ #define AARCH64_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 0xc0
#else
- #define AARCH64_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 0x78
+ #define AARCH64_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 0x80
#endif
#endif
@@ -174,6 +174,7 @@ typedef struct {
uint64_t register_sp;
uint64_t isr_dispatch_disable;
uint64_t thread_id;
+ uint64_t daif;
#ifdef AARCH64_MULTILIB_VFP
uint64_t register_d8;
uint64_t register_d9;
--
2.30.2
More information about the devel
mailing list