powerpc/ps3: Fix lv1 hcall assembly for ELFv2 calling convention
authorNicholas Piggin <npiggin@gmail.com>
Wed, 27 Dec 2023 07:24:03 +0000 (17:24 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 21 Feb 2024 12:14:52 +0000 (23:14 +1100)
Stack-passed parameters begin at a different offset in the caller's
stack in the ELFv2 ABI.

Reported-by: Geoff Levand <geoff@infradead.org>
Fixes: 8c5fa3b5c4df ("powerpc/64: Make ELFv2 the default for big-endian builds")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Tested-by: Geoff Levand <geoff@infradead.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20231227072405.63751-2-npiggin@gmail.com
arch/powerpc/include/asm/ppc_asm.h
arch/powerpc/platforms/ps3/hvcall.S

index e7792aa135105ab00f7a563c0520b093845eb330..041ee25955205744854618cbdfd9fdf1c199f7ca 100644 (file)
 
 #ifdef CONFIG_PPC64_ELF_ABI_V2
 #define STK_GOT                24
-#define __STK_PARAM(i) (32 + ((i)-3)*8)
+#define STK_PARAM_AREA 32
 #else
 #define STK_GOT                40
-#define __STK_PARAM(i) (48 + ((i)-3)*8)
+#define STK_PARAM_AREA 48
 #endif
+
+#define __STK_PARAM(i) (STK_PARAM_AREA + ((i)-3)*8)
 #define STK_PARAM(i)   __STK_PARAM(__REG_##i)
 
 #ifdef CONFIG_PPC64_ELF_ABI_V2
index 509e30ad01bb430319bf8ebc6d5ffc9bb9146669..59ea569debf472b33aa12f14fcb606b7adfa9adc 100644 (file)
@@ -714,7 +714,7 @@ _GLOBAL(_##API_NAME)                                \
        std     r4, 0(r11);                     \
        ld      r11, -16(r1);                   \
        std     r5, 0(r11);                     \
-       ld      r11, 48+8*8(r1);                \
+       ld      r11, STK_PARAM_AREA+8*8(r1);    \
        std     r6, 0(r11);                     \
                                                \
        ld      r0, 16(r1);                     \
@@ -746,22 +746,22 @@ _GLOBAL(_##API_NAME)                              \
        mflr    r0;                             \
        std     r0, 16(r1);                     \
                                                \
-       std     r10, 48+8*7(r1);                \
+       std     r10, STK_PARAM_AREA+8*7(r1);    \
                                                \
        li      r11, API_NUMBER;                \
        lv1call;                                \
                                                \
-       ld      r11, 48+8*7(r1);                \
+       ld      r11, STK_PARAM_AREA+8*7(r1);    \
        std     r4, 0(r11);                     \
-       ld      r11, 48+8*8(r1);                \
+       ld      r11, STK_PARAM_AREA+8*8(r1);    \
        std     r5, 0(r11);                     \
-       ld      r11, 48+8*9(r1);                \
+       ld      r11, STK_PARAM_AREA+8*9(r1);    \
        std     r6, 0(r11);                     \
-       ld      r11, 48+8*10(r1);               \
+       ld      r11, STK_PARAM_AREA+8*10(r1);   \
        std     r7, 0(r11);                     \
-       ld      r11, 48+8*11(r1);               \
+       ld      r11, STK_PARAM_AREA+8*11(r1);   \
        std     r8, 0(r11);                     \
-       ld      r11, 48+8*12(r1);               \
+       ld      r11, STK_PARAM_AREA+8*12(r1);   \
        std     r9, 0(r11);                     \
                                                \
        ld      r0, 16(r1);                     \
@@ -777,7 +777,7 @@ _GLOBAL(_##API_NAME)                                \
        li      r11, API_NUMBER;                \
        lv1call;                                \
                                                \
-       ld      r11, 48+8*8(r1);                \
+       ld      r11, STK_PARAM_AREA+8*8(r1);    \
        std     r4, 0(r11);                     \
                                                \
        ld      r0, 16(r1);                     \