From 9f21318b107dc5122703191246863eaa1ac0a5cf Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Wed, 17 Jul 2019 13:28:11 -0400 Subject: [PATCH] Arm64 Fix Rtl*Context (#25745) Fix issues related to save restore of FPCR/FPSR/V0/V31 There were several bugs in the assembly causing FPCR/FPSR to overwrite V0 on RtlCaptureContext. Then restore from V0 on RtlRestoreContext --- src/pal/src/arch/arm64/asmconstants.h | 4 ++-- src/pal/src/arch/arm64/context2.S | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pal/src/arch/arm64/asmconstants.h b/src/pal/src/arch/arm64/asmconstants.h index b2bf744..08502ed 100644 --- a/src/pal/src/arch/arm64/asmconstants.h +++ b/src/pal/src/arch/arm64/asmconstants.h @@ -88,8 +88,8 @@ #define CONTEXT_V29 CONTEXT_V28+16 #define CONTEXT_V30 CONTEXT_V29+16 #define CONTEXT_V31 CONTEXT_V30+16 -#define CONTEXT_FLOAT_CONTROL_OFFSET CONTEXT_V31 +#define CONTEXT_FLOAT_CONTROL_OFFSET CONTEXT_V31+16 #define CONTEXT_Fpcr 0 -#define CONTEXT_Fpsr CONTEXT_Fpcr+4 +#define CONTEXT_Fpsr CONTEXT_Fpcr+8 #endif diff --git a/src/pal/src/arch/arm64/context2.S b/src/pal/src/arch/arm64/context2.S index 64a19c9..7b165c2 100644 --- a/src/pal/src/arch/arm64/context2.S +++ b/src/pal/src/arch/arm64/context2.S @@ -99,9 +99,8 @@ LOCAL_LABEL(Done_CONTEXT_INTEGER): add x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET mrs x1, fpcr mrs x2, fpsr - sub x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET stp x1, x2, [x0, CONTEXT_Fpcr] - sub x0, x0, CONTEXT_NEON_OFFSET + sub x0, x0, CONTEXT_FLOAT_CONTROL_OFFSET + CONTEXT_NEON_OFFSET LOCAL_LABEL(Done_CONTEXT_FLOATING_POINT): @@ -173,10 +172,11 @@ LOCAL_LABEL(Restore_CONTEXT_FLOATING_POINT): ldp q26, q27, [x16, CONTEXT_V26] ldp q28, q29, [x16, CONTEXT_V28] ldp q30, q31, [x16, CONTEXT_V30] + add x16, x16, CONTEXT_FLOAT_CONTROL_OFFSET ldp x1, x2, [x16, CONTEXT_Fpcr] msr fpcr, x1 msr fpsr, x2 - sub x16, x16, CONTEXT_NEON_OFFSET + sub x16, x16, CONTEXT_FLOAT_CONTROL_OFFSET + CONTEXT_NEON_OFFSET LOCAL_LABEL(No_Restore_CONTEXT_FLOATING_POINT): tbz w17, #CONTEXT_INTEGER_BIT, LOCAL_LABEL(No_Restore_CONTEXT_INTEGER) -- 2.7.4