[rtems commit] powerpc: Fix AltiVec VSCR save/restore
Sebastian Huber
sebh at rtems.org
Tue Jan 20 13:02:41 UTC 2015
Module: rtems
Branch: master
Commit: 60d39b66e0660de4849a17885813d26a2bc374e7
Changeset: http://git.rtems.org/rtems/commit/?id=60d39b66e0660de4849a17885813d26a2bc374e7
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Tue Jan 20 14:01:50 2015 +0100
powerpc: Fix AltiVec VSCR save/restore
---
c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h | 10 ++++++----
cpukit/score/cpu/powerpc/ppc-context-validate.S | 10 +++++-----
cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S | 8 ++++----
cpukit/score/cpu/powerpc/rtems/score/cpu.h | 5 ++++-
4 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h
index 86bd0f1..f45c833 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors.h
@@ -147,8 +147,8 @@ extern "C" {
#define PPC_EXC_GPR_OFFSET(gpr) ((gpr) * PPC_GPR_SIZE + 36)
#define PPC_EXC_VECTOR_PROLOGUE_OFFSET PPC_EXC_GPR_OFFSET(4)
#if defined(PPC_MULTILIB_ALTIVEC) && defined(PPC_MULTILIB_FPU)
- #define PPC_EXC_VSCR_OFFSET 168
- #define PPC_EXC_VRSAVE_OFFSET 172
+ #define PPC_EXC_VRSAVE_OFFSET 168
+ #define PPC_EXC_VSCR_OFFSET 172
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
#define PPC_EXC_FR_OFFSET(f) ((f) * 8 + 688)
#define PPC_EXC_FPSCR_OFFSET 944
@@ -159,8 +159,8 @@ extern "C" {
#define PPC_EXC_MIN_FPSCR_OFFSET 528
#define PPC_EXC_MINIMAL_FRAME_SIZE 544
#elif defined(PPC_MULTILIB_ALTIVEC)
- #define PPC_EXC_VSCR_OFFSET 168
- #define PPC_EXC_VRSAVE_OFFSET 172
+ #define PPC_EXC_VRSAVE_OFFSET 168
+ #define PPC_EXC_VSCR_OFFSET 172
#define PPC_EXC_VR_OFFSET(v) ((v) * 16 + 176)
#define PPC_EXC_FRAME_SIZE 688
#define PPC_EXC_MIN_VSCR_OFFSET 92
@@ -304,7 +304,9 @@ typedef struct {
PPC_GPR_TYPE GPR12;
uint32_t EARLY_INSTANT;
#ifdef PPC_MULTILIB_ALTIVEC
+ /* This field must take stvewx/lvewx requirements into account */
uint32_t VSCR;
+
uint8_t V0[16];
uint8_t V1[16];
uint8_t V2[16];
diff --git a/cpukit/score/cpu/powerpc/ppc-context-validate.S b/cpukit/score/cpu/powerpc/ppc-context-validate.S
index 0e64cc5..b34438a 100644
--- a/cpukit/score/cpu/powerpc/ppc-context-validate.S
+++ b/cpukit/score/cpu/powerpc/ppc-context-validate.S
@@ -85,9 +85,9 @@
#define V31_OFFSET VOFFSET(11)
#define VTMP_OFFSET VOFFSET(12)
#define VTMP2_OFFSET VOFFSET(13)
- #define VSCR_OFFSET VOFFSET(14)
- #define VRSAVE_OFFSET (VSCR_OFFSET + 4)
- #define ALTIVECEND (VRSAVE_OFFSET + 4)
+ #define VRSAVE_OFFSET VOFFSET(14)
+ #define VSCR_OFFSET (VOFFSET(14) + 12)
+ #define ALTIVECEND VOFFSET(15)
#else
#define ALTIVECEND FPUEND
#endif
@@ -510,9 +510,9 @@ check:
li r4, VTMP_OFFSET
stvx v0, r1, r4
mfvscr v0
- li r4, VTMP2_OFFSET
+ li r4, VTMP2_OFFSET + 12
stvewx v0, r1, r4
- lwz r4, VTMP2_OFFSET(r1)
+ lwz r4, VTMP2_OFFSET + 12(r1)
lwz r5, VSCR_OFFSET(r1)
cmpw r5, r4
bne restore
diff --git a/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S b/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
index 17bcb92..d0c2159 100644
--- a/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
+++ b/cpukit/score/cpu/powerpc/ppc-context-volatile-clobber.S
@@ -80,15 +80,15 @@ _CPU_Context_volatile_clobber:
/* Negate VSCR[SAT] bit */
mfvscr v0
- li r3, 16
+ li r3, 28
stvewx v0, r1, r3
- lwz r0, 16(r1)
+ lwz r0, 28(r1)
nor r3, r0, r0
rlwinm r0, r0, 0, 0, 30
rlwinm r3, r3, 0, 31, 31
or r0, r3, r0
- stw r0, 16(r1)
- li r3, 16
+ stw r0, 28(r1)
+ li r3, 28
lvewx v0, r1, r3
mtvscr v0
diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
index 98aa4e4..c305c77 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
@@ -1197,8 +1197,11 @@ typedef struct {
uint32_t reserved_for_alignment;
#endif
#ifdef PPC_MULTILIB_ALTIVEC
- uint32_t VSCR;
uint32_t VRSAVE;
+
+ /* This field must take stvewx/lvewx requirements into account */
+ uint32_t VSCR;
+
uint8_t V0[16];
uint8_t V1[16];
uint8_t V2[16];
More information about the vc
mailing list