summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/powerpc/ppc-context-validate.S
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/powerpc/ppc-context-validate.S')
-rw-r--r--cpukit/score/cpu/powerpc/ppc-context-validate.S165
1 files changed, 91 insertions, 74 deletions
diff --git a/cpukit/score/cpu/powerpc/ppc-context-validate.S b/cpukit/score/cpu/powerpc/ppc-context-validate.S
index b34438a361..523707b157 100644
--- a/cpukit/score/cpu/powerpc/ppc-context-validate.S
+++ b/cpukit/score/cpu/powerpc/ppc-context-validate.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -20,8 +20,8 @@
#include <rtems/score/cpu.h>
#define LR_OFFSET 8
-#define CR_OFFSET 12
-#define OFFSET(i) ((i) * PPC_GPR_SIZE + 16)
+#define CR_OFFSET 16
+#define OFFSET(i) ((i) * PPC_GPR_SIZE + 32)
#define GPR14_OFFSET OFFSET(0)
#define GPR15_OFFSET OFFSET(1)
#define GPR16_OFFSET OFFSET(2)
@@ -100,29 +100,29 @@
_CPU_Context_validate:
/* Save */
- stwu r1, -FRAME_SIZE(r1)
+ PPC_REG_STORE_UPDATE r1, -FRAME_SIZE(r1)
mflr r4
- stw r4, LR_OFFSET(r1)
+ PPC_REG_STORE r4, LR_OFFSET(r1)
mfcr r4
stw r4, CR_OFFSET(r1)
- stw r14, GPR14_OFFSET(r1)
- stw r15, GPR15_OFFSET(r1)
- stw r16, GPR16_OFFSET(r1)
- stw r17, GPR17_OFFSET(r1)
- stw r18, GPR18_OFFSET(r1)
- stw r19, GPR19_OFFSET(r1)
- stw r20, GPR20_OFFSET(r1)
- stw r21, GPR21_OFFSET(r1)
- stw r22, GPR22_OFFSET(r1)
- stw r23, GPR23_OFFSET(r1)
- stw r24, GPR24_OFFSET(r1)
- stw r25, GPR25_OFFSET(r1)
- stw r26, GPR26_OFFSET(r1)
- stw r27, GPR27_OFFSET(r1)
- stw r28, GPR28_OFFSET(r1)
- stw r29, GPR29_OFFSET(r1)
- stw r30, GPR30_OFFSET(r1)
- stw r31, GPR31_OFFSET(r1)
+ PPC_REG_STORE r14, GPR14_OFFSET(r1)
+ PPC_REG_STORE r15, GPR15_OFFSET(r1)
+ PPC_REG_STORE r16, GPR16_OFFSET(r1)
+ PPC_REG_STORE r17, GPR17_OFFSET(r1)
+ PPC_REG_STORE r18, GPR18_OFFSET(r1)
+ PPC_REG_STORE r19, GPR19_OFFSET(r1)
+ PPC_REG_STORE r20, GPR20_OFFSET(r1)
+ PPC_REG_STORE r21, GPR21_OFFSET(r1)
+ PPC_REG_STORE r22, GPR22_OFFSET(r1)
+ PPC_REG_STORE r23, GPR23_OFFSET(r1)
+ PPC_REG_STORE r24, GPR24_OFFSET(r1)
+ PPC_REG_STORE r25, GPR25_OFFSET(r1)
+ PPC_REG_STORE r26, GPR26_OFFSET(r1)
+ PPC_REG_STORE r27, GPR27_OFFSET(r1)
+ PPC_REG_STORE r28, GPR28_OFFSET(r1)
+ PPC_REG_STORE r29, GPR29_OFFSET(r1)
+ PPC_REG_STORE r30, GPR30_OFFSET(r1)
+ PPC_REG_STORE r31, GPR31_OFFSET(r1)
#ifdef PPC_MULTILIB_FPU
stfd f14, F14_OFFSET(r1)
@@ -218,8 +218,12 @@ _CPU_Context_validate:
addi r26, r3, 21
addi r27, r3, 22
- /* GPR28 contains the GPR2 pattern */
+ /* GPR28 contains the TP pattern */
+#ifdef __powerpc64__
+ xor r28, r13, r3
+#else
xor r28, r2, r3
+#endif
/* GPR29 and CR are equal most of the time */
addi r29, r3, 24
@@ -330,101 +334,114 @@ check:
cmpw r4, r29
bne restore
addi r4, r3, 1
- cmpw r4, r5
+ PPC_REG_CMP r4, r5
bne restore
addi r4, r3, 2
- cmpw r4, r6
+ PPC_REG_CMP r4, r6
bne restore
addi r4, r3, 3
- cmpw r4, r7
+ PPC_REG_CMP r4, r7
bne restore
addi r4, r3, 4
- cmpw r4, r8
+ PPC_REG_CMP r4, r8
bne restore
addi r4, r3, 5
- cmpw r4, r9
+ PPC_REG_CMP r4, r9
bne restore
addi r4, r3, 6
- cmpw r4, r10
+ PPC_REG_CMP r4, r10
bne restore
addi r4, r3, 7
- cmpw r4, r11
+ PPC_REG_CMP r4, r11
bne restore
addi r4, r3, 8
- cmpw r4, r12
- bne restore
+ PPC_REG_CMP r4, r12
+ bne restore
+#ifdef __powerpc64__
+ lis r4, .TOC.@highest
+ ori r4, r4, .TOC.@higher
+ rldicr r4, r4, 32, 31
+ oris r4, r4, .TOC.@h
+ ori r4, r4, .TOC.@l
+ PPC_REG_CMP r4, r2
+#else
lis r4, _SDA_BASE_@h
ori r4, r4, _SDA_BASE_@l
- cmpw r4, r13
+ PPC_REG_CMP r4, r13
+#endif
bne restore
addi r4, r3, 9
- cmpw r4, r14
+ PPC_REG_CMP r4, r14
bne restore
addi r4, r3, 10
- cmpw r4, r15
+ PPC_REG_CMP r4, r15
bne restore
addi r4, r3, 11
- cmpw r4, r16
+ PPC_REG_CMP r4, r16
bne restore
addi r4, r3, 12
- cmpw r4, r17
+ PPC_REG_CMP r4, r17
bne restore
addi r4, r3, 13
- cmpw r4, r18
+ PPC_REG_CMP r4, r18
bne restore
addi r4, r3, 14
- cmpw r4, r19
+ PPC_REG_CMP r4, r19
bne restore
addi r4, r3, 15
- cmpw r4, r20
+ PPC_REG_CMP r4, r20
bne restore
addi r4, r3, 16
- cmpw r4, r21
+ PPC_REG_CMP r4, r21
bne restore
addi r4, r3, 17
- cmpw r4, r22
+ PPC_REG_CMP r4, r22
bne restore
addi r4, r3, 18
- cmpw r4, r23
+ PPC_REG_CMP r4, r23
bne restore
addi r4, r3, 19
- cmpw r4, r24
+ PPC_REG_CMP r4, r24
bne restore
addi r4, r3, 20
- cmpw r4, r25
+ PPC_REG_CMP r4, r25
bne restore
addi r4, r3, 21
- cmpw r4, r26
+ PPC_REG_CMP r4, r26
bne restore
addi r4, r3, 22
- cmpw r4, r27
+ PPC_REG_CMP r4, r27
bne restore
+#ifdef __powerpc64__
+ xor r4, r13, r3
+#else
xor r4, r2, r3
- cmpw r4, r28
+#endif
+ PPC_REG_CMP r4, r28
bne restore
addi r4, r3, 24
- cmpw r4, r29
+ PPC_REG_CMP r4, r29
bne restore
mfmsr r4
xor r4, r4, r3
- cmpw r4, r30
+ PPC_REG_CMP r4, r30
bne restore
addi r4, r3, 25
mflr r5
- cmpw r4, r5
+ PPC_REG_CMP r4, r5
bne restore
addi r4, r3, 26
mfctr r5
- cmpw r4, r5
+ PPC_REG_CMP r4, r5
bne restore
rlwinm r4, r3, 0, 25, 2
mfxer r5
cmpw r4, r5
bne restore
addi r4, r3, 28
- cmpw r4, r0
+ PPC_REG_CMP r4, r0
bne restore
- cmpw r31, r1
+ PPC_REG_CMP r31, r1
bne restore
#ifdef PPC_MULTILIB_FPU
@@ -614,27 +631,27 @@ restore:
lfd f14, F14_OFFSET(r1)
#endif
- lwz r31, GPR31_OFFSET(r1)
- lwz r30, GPR30_OFFSET(r1)
- lwz r29, GPR29_OFFSET(r1)
- lwz r28, GPR28_OFFSET(r1)
- lwz r27, GPR27_OFFSET(r1)
- lwz r26, GPR26_OFFSET(r1)
- lwz r25, GPR25_OFFSET(r1)
- lwz r24, GPR24_OFFSET(r1)
- lwz r23, GPR23_OFFSET(r1)
- lwz r22, GPR22_OFFSET(r1)
- lwz r21, GPR21_OFFSET(r1)
- lwz r20, GPR20_OFFSET(r1)
- lwz r19, GPR19_OFFSET(r1)
- lwz r18, GPR18_OFFSET(r1)
- lwz r17, GPR17_OFFSET(r1)
- lwz r16, GPR16_OFFSET(r1)
- lwz r15, GPR15_OFFSET(r1)
- lwz r14, GPR14_OFFSET(r1)
+ PPC_REG_LOAD r31, GPR31_OFFSET(r1)
+ PPC_REG_LOAD r30, GPR30_OFFSET(r1)
+ PPC_REG_LOAD r29, GPR29_OFFSET(r1)
+ PPC_REG_LOAD r28, GPR28_OFFSET(r1)
+ PPC_REG_LOAD r27, GPR27_OFFSET(r1)
+ PPC_REG_LOAD r26, GPR26_OFFSET(r1)
+ PPC_REG_LOAD r25, GPR25_OFFSET(r1)
+ PPC_REG_LOAD r24, GPR24_OFFSET(r1)
+ PPC_REG_LOAD r23, GPR23_OFFSET(r1)
+ PPC_REG_LOAD r22, GPR22_OFFSET(r1)
+ PPC_REG_LOAD r21, GPR21_OFFSET(r1)
+ PPC_REG_LOAD r20, GPR20_OFFSET(r1)
+ PPC_REG_LOAD r19, GPR19_OFFSET(r1)
+ PPC_REG_LOAD r18, GPR18_OFFSET(r1)
+ PPC_REG_LOAD r17, GPR17_OFFSET(r1)
+ PPC_REG_LOAD r16, GPR16_OFFSET(r1)
+ PPC_REG_LOAD r15, GPR15_OFFSET(r1)
+ PPC_REG_LOAD r14, GPR14_OFFSET(r1)
lwz r4, CR_OFFSET(r1)
mtcr r4
- lwz r4, LR_OFFSET(r1)
+ PPC_REG_LOAD r4, LR_OFFSET(r1)
mtlr r4
addi r1, r1, FRAME_SIZE
blr