[OpenBIOS] [PATCH v3 1/3] ppc: Adjust call_elf() and CIF prologues and epilogues for ppc64
Andreas Färber
andreas.faerber at web.de
Sun Dec 19 23:37:32 CET 2010
Respect differing register widths and stack frame ABI differences.
Fix of_client_callback stack alignment for both ppc and ppc64.
v3:
* Introduced DATA_LONG() macro, suggested by Alex.
Cc: Alexander Graf <agraf at suse.de>
Signed-off-by: Andreas Färber <andreas.faerber at web.de>
---
arch/ppc/qemu/start.S | 181 +++++++++++++++++++++++--------------------
include/arch/ppc/asmdefs.h | 2 +
2 files changed, 99 insertions(+), 84 deletions(-)
diff --git a/arch/ppc/qemu/start.S b/arch/ppc/qemu/start.S
index 4b25650..088df1e 100644
--- a/arch/ppc/qemu/start.S
+++ b/arch/ppc/qemu/start.S
@@ -179,6 +179,9 @@
#undef stl
#undef ll
+#define ULONG_SIZE 4
+#define STACKFRAME_MINSIZE 16
+
#else /* !CONFIG_PPC_64BITSUPPORT */
#ifdef __powerpc64__
@@ -471,16 +474,16 @@ GLOBL(_entry):
*/
.data
saved_stack:
- .long 0
+ DATA_LONG(0)
.previous
/* void call_elf( arg1, arg2, entry ) */
_GLOBAL(call_elf):
mflr r0
- stwu r1,-16(r1)
- stw r0,20(r1)
+ PPC_STLU r1, -STACKFRAME_MINSIZE(r1)
+ PPC_STL r0, (STACKFRAME_MINSIZE + PPC_LR_STKOFF)(r1)
mtlr r5
LOAD_REG_IMMEDIATE(r8, saved_stack) // save our stack pointer
- stw r1,0(r8)
+ PPC_STL r1,0(r8)
mfsdr1 r1
addi r1, r1, -32768 /* - 32 KiB exception stack */
addis r1, r1, -1 /* - 64 KiB stack */
@@ -488,137 +491,147 @@ _GLOBAL(call_elf):
li r6,0 // r6 = address of client program arguments (unused)
li r7,0 // r7 = length of client program arguments (unused)
li r0,MSR_FP | MSR_ME | MSR_DR | MSR_IR
- mtmsr r0
+ MTMSRD(r0)
blrl
LOAD_REG_IMMEDIATE(r8, saved_stack) // restore stack pointer
mr r1,r8
- lwz r0,20(r1)
+ PPC_LL r0, (STACKFRAME_MINSIZE + PPC_LR_STKOFF)(r1)
mtlr r0
- addi r1,r1,16
+ addi r1, r1, STACKFRAME_MINSIZE
// XXX: should restore r12-r31 etc..
// we should not really come here though
blr
-#define SAVE_SPACE 140
+#ifdef __powerpc64__
+#define STKOFF STACKFRAME_MINSIZE
+#define SAVE_SPACE 320
+#else
+#define STKOFF 8
+#define SAVE_SPACE 144
+#endif
GLOBL(of_client_callback):
- stwu r1, -12(r1)
+#ifdef CONFIG_PPC64
+ PPC_STLU r1, -(STACKFRAME_MINSIZE + 16)(r1)
+#else
+ PPC_STLU r1, -STACKFRAME_MINSIZE(r1) /* fits within alignment */
+#endif
/* save r4 */
- stw r4, 8(r1)
+ PPC_STL r4, STKOFF(r1)
/* save lr */
mflr r4
- stw r4, 4(r1)
+ PPC_STL r4, PPC_LR_STKOFF(r1)
/* restore OF stack */
LOAD_REG_IMMEDIATE(r4, saved_stack)
- lwz r4,0(r4)
+ PPC_LL r4, 0(r4)
- stwu r4,-SAVE_SPACE(r4)
- stw r1,8(r4) // save caller stack
+ PPC_STLU r4,-SAVE_SPACE(r4)
+ PPC_STL r1,(STKOFF)(r4) // save caller stack
mr r1,r4
- stw r2,12(r1)
- stw r0,16(r1)
+ PPC_STL r2, (STKOFF + 1 * ULONG_SIZE)(r1)
+ PPC_STL r0, (STKOFF + 2 * ULONG_SIZE)(r1)
/* save ctr, cr and xer */
mfctr r2
- stw r2,20(r1)
+ PPC_STL r2, (STKOFF + 3 * ULONG_SIZE)(r1)
mfcr r2
- stw r2,24(r1)
+ PPC_STL r2, (STKOFF + 4 * ULONG_SIZE)(r1)
mfxer r2
- stw r2,28(r1)
+ PPC_STL r2, (STKOFF + 5 * ULONG_SIZE)(r1)
/* save r5 - r31 */
- stw r5, 32(r1)
- stw r6,36(r1)
- stw r7,40(r1)
- stw r8,44(r1)
- stw r9,48(r1)
- stw r10,52(r1)
- stw r11,56(r1)
- stw r12,60(r1)
- stw r13,64(r1)
- stw r14,68(r1)
- stw r15,72(r1)
- stw r16,76(r1)
- stw r17,80(r1)
- stw r18,84(r1)
- stw r19,88(r1)
- stw r20,92(r1)
- stw r21,96(r1)
- stw r22,100(r1)
- stw r23,104(r1)
- stw r24,108(r1)
- stw r25,112(r1)
- stw r26,116(r1)
- stw r27,120(r1)
- stw r28,124(r1)
- stw r29,128(r1)
- stw r30,132(r1)
- stw r31,136(r1)
-
- bl of_client_interface
+ PPC_STL r5, (STKOFF + 6 * ULONG_SIZE)(r1)
+ PPC_STL r6, (STKOFF + 7 * ULONG_SIZE)(r1)
+ PPC_STL r7, (STKOFF + 8 * ULONG_SIZE)(r1)
+ PPC_STL r8, (STKOFF + 9 * ULONG_SIZE)(r1)
+ PPC_STL r9, (STKOFF + 10 * ULONG_SIZE)(r1)
+ PPC_STL r10, (STKOFF + 11 * ULONG_SIZE)(r1)
+ PPC_STL r11, (STKOFF + 12 * ULONG_SIZE)(r1)
+ PPC_STL r12, (STKOFF + 13 * ULONG_SIZE)(r1)
+ PPC_STL r13, (STKOFF + 14 * ULONG_SIZE)(r1)
+ PPC_STL r14, (STKOFF + 15 * ULONG_SIZE)(r1)
+ PPC_STL r15, (STKOFF + 16 * ULONG_SIZE)(r1)
+ PPC_STL r16, (STKOFF + 17 * ULONG_SIZE)(r1)
+ PPC_STL r17, (STKOFF + 18 * ULONG_SIZE)(r1)
+ PPC_STL r18, (STKOFF + 19 * ULONG_SIZE)(r1)
+ PPC_STL r19, (STKOFF + 20 * ULONG_SIZE)(r1)
+ PPC_STL r20, (STKOFF + 21 * ULONG_SIZE)(r1)
+ PPC_STL r21, (STKOFF + 22 * ULONG_SIZE)(r1)
+ PPC_STL r22, (STKOFF + 23 * ULONG_SIZE)(r1)
+ PPC_STL r23, (STKOFF + 24 * ULONG_SIZE)(r1)
+ PPC_STL r24, (STKOFF + 25 * ULONG_SIZE)(r1)
+ PPC_STL r25, (STKOFF + 26 * ULONG_SIZE)(r1)
+ PPC_STL r26, (STKOFF + 27 * ULONG_SIZE)(r1)
+ PPC_STL r27, (STKOFF + 28 * ULONG_SIZE)(r1)
+ PPC_STL r28, (STKOFF + 29 * ULONG_SIZE)(r1)
+ PPC_STL r29, (STKOFF + 30 * ULONG_SIZE)(r1)
+ PPC_STL r30, (STKOFF + 31 * ULONG_SIZE)(r1)
+ PPC_STL r31, (STKOFF + 32 * ULONG_SIZE)(r1)
+
+ bl BRANCH_LABEL(of_client_interface)
/* restore r5 - r31 */
- lwz r5,32(r1)
- lwz r6,36(r1)
- lwz r7,40(r1)
- lwz r8,44(r1)
- lwz r9,48(r1)
- lwz r10,52(r1)
- lwz r11,56(r1)
- lwz r12,60(r1)
- lwz r13,64(r1)
- lwz r14,68(r1)
- lwz r15,72(r1)
- lwz r16,76(r1)
- lwz r17,80(r1)
- lwz r18,84(r1)
- lwz r19,88(r1)
- lwz r20,92(r1)
- lwz r21,96(r1)
- lwz r22,100(r1)
- lwz r23,104(r1)
- lwz r24,108(r1)
- lwz r25,112(r1)
- lwz r26,116(r1)
- lwz r27,120(r1)
- lwz r28,124(r1)
- lwz r29,128(r1)
- lwz r30,132(r1)
- lwz r31,136(r1)
+ PPC_LL r5, (STKOFF + 6 * ULONG_SIZE)(r1)
+ PPC_LL r6, (STKOFF + 7 * ULONG_SIZE)(r1)
+ PPC_LL r7, (STKOFF + 8 * ULONG_SIZE)(r1)
+ PPC_LL r8, (STKOFF + 9 * ULONG_SIZE)(r1)
+ PPC_LL r9, (STKOFF + 10 * ULONG_SIZE)(r1)
+ PPC_LL r10, (STKOFF + 11 * ULONG_SIZE)(r1)
+ PPC_LL r11, (STKOFF + 12 * ULONG_SIZE)(r1)
+ PPC_LL r12, (STKOFF + 13 * ULONG_SIZE)(r1)
+ PPC_LL r13, (STKOFF + 14 * ULONG_SIZE)(r1)
+ PPC_LL r14, (STKOFF + 15 * ULONG_SIZE)(r1)
+ PPC_LL r15, (STKOFF + 16 * ULONG_SIZE)(r1)
+ PPC_LL r16, (STKOFF + 17 * ULONG_SIZE)(r1)
+ PPC_LL r17, (STKOFF + 18 * ULONG_SIZE)(r1)
+ PPC_LL r18, (STKOFF + 19 * ULONG_SIZE)(r1)
+ PPC_LL r19, (STKOFF + 20 * ULONG_SIZE)(r1)
+ PPC_LL r20, (STKOFF + 21 * ULONG_SIZE)(r1)
+ PPC_LL r21, (STKOFF + 22 * ULONG_SIZE)(r1)
+ PPC_LL r22, (STKOFF + 23 * ULONG_SIZE)(r1)
+ PPC_LL r23, (STKOFF + 24 * ULONG_SIZE)(r1)
+ PPC_LL r24, (STKOFF + 25 * ULONG_SIZE)(r1)
+ PPC_LL r25, (STKOFF + 26 * ULONG_SIZE)(r1)
+ PPC_LL r26, (STKOFF + 27 * ULONG_SIZE)(r1)
+ PPC_LL r27, (STKOFF + 28 * ULONG_SIZE)(r1)
+ PPC_LL r28, (STKOFF + 29 * ULONG_SIZE)(r1)
+ PPC_LL r29, (STKOFF + 30 * ULONG_SIZE)(r1)
+ PPC_LL r30, (STKOFF + 31 * ULONG_SIZE)(r1)
+ PPC_LL r31, (STKOFF + 32 * ULONG_SIZE)(r1)
/* restore ctr, cr and xer */
- lwz r2,20(r1)
+ PPC_LL r2, (STKOFF + 3 * ULONG_SIZE)(r1)
mtctr r2
- lwz r2,24(r1)
+ PPC_LL r2, (STKOFF + 4 * ULONG_SIZE)(r1)
mtcr r2
- lwz r2,28(r1)
+ PPC_LL r2, (STKOFF + 5 * ULONG_SIZE)(r1)
mtxer r2
/* restore r0 and r2 */
- lwz r2,12(r1)
- lwz r0,16(r1)
+ PPC_LL r2, (STKOFF + 1 * ULONG_SIZE)(r1)
+ PPC_LL r0, (STKOFF + 2 * ULONG_SIZE)(r1)
/* restore caller stack */
- lwz r1,8(r1)
+ PPC_LL r1, (STKOFF)(r1)
- lwz r4, 4(r1)
+ PPC_LL r4, PPC_LR_STKOFF(r1)
mtlr r4
- lwz r4, 8(r1)
- lwz r1, 0(r1)
+ PPC_LL r4, STKOFF(r1)
+ PPC_LL r1, 0(r1)
blr
diff --git a/include/arch/ppc/asmdefs.h b/include/arch/ppc/asmdefs.h
index e20e8ee..3b3cad4 100644
--- a/include/arch/ppc/asmdefs.h
+++ b/include/arch/ppc/asmdefs.h
@@ -105,6 +105,7 @@
#define PPC_STLU stdu
#define RFI rfid
#define MTMSRD(r) mtmsrd r
+#define DATA_LONG(x) .quad x
#define BRANCH_LABEL(name) . ## name
#define PPC_LR_STKOFF 16
#else
@@ -113,6 +114,7 @@
#define PPC_STLU stwu
#define RFI rfi
#define MTMSRD(r) mtmsr r
+#define DATA_LONG(x) .long x
#define BRANCH_LABEL(name) name
#define PPC_LR_STKOFF 4
#endif
--
1.7.3.4
More information about the OpenBIOS
mailing list