forked from Imagelibrary/rtems
powerpc: Fix AltiVec VSCR save/restore
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user