From 1e37bf30f9927d6c55fd91a294f8695cad23eef2 Mon Sep 17 00:00:00 2001 From: Richard Campbell Date: Fri, 30 Jul 2021 12:45:12 -0700 Subject: [PATCH] Adjusted location within ucontext of saved/restored FP regs for compatibility --- arch/aarch64/defs.h | 2 +- arch/aarch64/getcontext.S | 9 +++++---- arch/aarch64/include/libucontext/bits.h | 3 +-- arch/aarch64/setcontext.S | 9 +++++---- arch/aarch64/swapcontext.S | 9 +++++---- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/arch/aarch64/defs.h b/arch/aarch64/defs.h index 1282f56..5398adc 100644 --- a/arch/aarch64/defs.h +++ b/arch/aarch64/defs.h @@ -9,7 +9,7 @@ #define SP_OFFSET 432 #define PC_OFFSET 440 #define PSTATE_OFFSET 448 -#define D8_OFFSET 456 +#define FPSIMD_CONTEXT_OFFSET 464 #ifndef FPSIMD_MAGIC # define FPSIMD_MAGIC 0x46508001 diff --git a/arch/aarch64/getcontext.S b/arch/aarch64/getcontext.S index a4a8bfa..37390a6 100644 --- a/arch/aarch64/getcontext.S +++ b/arch/aarch64/getcontext.S @@ -50,10 +50,11 @@ PROC_NAME(libucontext_getcontext): /* save pstate */ str xzr, [x0, #PSTATE_OFFSET] - stp d8, d9, [x0, #D8_OFFSET + 0] - stp d10, d11, [x0, #D8_OFFSET + 16] - stp d12, d13, [x0, #D8_OFFSET + 32] - stp d14, d15, [x0, #D8_OFFSET + 48] + add x2, x0, #FPSIMD_CONTEXT_OFFSET + stp q8, q9, [x2, #144] + stp q10, q11, [x2, #176] + stp q12, q13, [x2, #208] + stp q14, q15, [x2, #240] mov x0, #0 ret diff --git a/arch/aarch64/include/libucontext/bits.h b/arch/aarch64/include/libucontext/bits.h index 0bc0563..e249448 100644 --- a/arch/aarch64/include/libucontext/bits.h +++ b/arch/aarch64/include/libucontext/bits.h @@ -14,8 +14,7 @@ typedef struct sigcontext { unsigned long fault_address; unsigned long regs[31]; unsigned long sp, pc, pstate; - unsigned long d8_through_d15[8]; - long double __reserved[252]; + long double __reserved[256]; } libucontext_mcontext_t; typedef struct { diff --git a/arch/aarch64/setcontext.S b/arch/aarch64/setcontext.S index cbe1ddc..f348360 100644 --- a/arch/aarch64/setcontext.S +++ b/arch/aarch64/setcontext.S @@ -33,10 +33,11 @@ PROC_NAME(libucontext_setcontext): ldr x2, [x0, #SP_OFFSET] mov sp, x2 - ldp d8, d9, [x0, #D8_OFFSET + 0] - ldp d10, d11, [x0, #D8_OFFSET + 16] - ldp d12, d13, [x0, #D8_OFFSET + 32] - ldp d14, d15, [x0, #D8_OFFSET + 48] + add x2, x0, #FPSIMD_CONTEXT_OFFSET + ldp q8, q9, [x2, #144] + ldp q10, q11, [x2, #176] + ldp q12, q13, [x2, #208] + ldp q14, q15, [x2, #240] /* save current program counter in link register */ ldr x16, [x0, #PC_OFFSET] diff --git a/arch/aarch64/swapcontext.S b/arch/aarch64/swapcontext.S index e90f7f1..fc587e3 100644 --- a/arch/aarch64/swapcontext.S +++ b/arch/aarch64/swapcontext.S @@ -49,10 +49,11 @@ PROC_NAME(libucontext_swapcontext): /* save pstate */ str xzr, [x0, #PSTATE_OFFSET] - stp d8, d9, [x0, #D8_OFFSET + 0] - stp d10, d11, [x0, #D8_OFFSET + 16] - stp d12, d13, [x0, #D8_OFFSET + 32] - stp d14, d15, [x0, #D8_OFFSET + 48] + add x2, x0, #FPSIMD_CONTEXT_OFFSET + stp q8, q9, [x2, #144] + stp q10, q11, [x2, #176] + stp q12, q13, [x2, #208] + stp q14, q15, [x2, #240] /* context to swap to is in x1 so... we move to x0 and call setcontext */ /* store our link register in x28 */