This call may use the min size stack frame. The scratch space used is
in the caller's parameter area frame, not this function's frame.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/platforms/pseries/hvCall.S | 38 +++++++++++++------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/hvCall.S 
b/arch/powerpc/platforms/pseries/hvCall.S
index 762eb15d3bd4..783c16ad648b 100644
--- a/arch/powerpc/platforms/pseries/hvCall.S
+++ b/arch/powerpc/platforms/pseries/hvCall.S
@@ -27,7 +27,9 @@ hcall_tracepoint_refcount:
 
 /*
  * precall must preserve all registers.  use unused STK_PARAM()
- * areas to save snapshots and opcode.
+ * areas to save snapshots and opcode. STK_PARAM() in the caller's
+ * frame will be available even on ELFv2 because these are all
+ * variadic functions.
  */
 #define HCALL_INST_PRECALL(FIRST_REG)                          \
        mflr    r0;                                             \
@@ -41,29 +43,29 @@ hcall_tracepoint_refcount:
        std     r10,STK_PARAM(R10)(r1);                         \
        std     r0,16(r1);                                      \
        addi    r4,r1,STK_PARAM(FIRST_REG);                     \
-       stdu    r1,-STACK_FRAME_OVERHEAD(r1);                   \
+       stdu    r1,-STACK_FRAME_MIN_SIZE(r1);                   \
        bl      __trace_hcall_entry;                            \
-       ld      r3,STACK_FRAME_OVERHEAD+STK_PARAM(R3)(r1);      \
-       ld      r4,STACK_FRAME_OVERHEAD+STK_PARAM(R4)(r1);      \
-       ld      r5,STACK_FRAME_OVERHEAD+STK_PARAM(R5)(r1);      \
-       ld      r6,STACK_FRAME_OVERHEAD+STK_PARAM(R6)(r1);      \
-       ld      r7,STACK_FRAME_OVERHEAD+STK_PARAM(R7)(r1);      \
-       ld      r8,STACK_FRAME_OVERHEAD+STK_PARAM(R8)(r1);      \
-       ld      r9,STACK_FRAME_OVERHEAD+STK_PARAM(R9)(r1);      \
-       ld      r10,STACK_FRAME_OVERHEAD+STK_PARAM(R10)(r1)
+       ld      r3,STACK_FRAME_MIN_SIZE+STK_PARAM(R3)(r1);      \
+       ld      r4,STACK_FRAME_MIN_SIZE+STK_PARAM(R4)(r1);      \
+       ld      r5,STACK_FRAME_MIN_SIZE+STK_PARAM(R5)(r1);      \
+       ld      r6,STACK_FRAME_MIN_SIZE+STK_PARAM(R6)(r1);      \
+       ld      r7,STACK_FRAME_MIN_SIZE+STK_PARAM(R7)(r1);      \
+       ld      r8,STACK_FRAME_MIN_SIZE+STK_PARAM(R8)(r1);      \
+       ld      r9,STACK_FRAME_MIN_SIZE+STK_PARAM(R9)(r1);      \
+       ld      r10,STACK_FRAME_MIN_SIZE+STK_PARAM(R10)(r1)
 
 /*
  * postcall is performed immediately before function return which
  * allows liberal use of volatile registers.
  */
 #define __HCALL_INST_POSTCALL                                  \
-       ld      r0,STACK_FRAME_OVERHEAD+STK_PARAM(R3)(r1);      \
-       std     r3,STACK_FRAME_OVERHEAD+STK_PARAM(R3)(r1);      \
+       ld      r0,STACK_FRAME_MIN_SIZE+STK_PARAM(R3)(r1);      \
+       std     r3,STACK_FRAME_MIN_SIZE+STK_PARAM(R3)(r1);      \
        mr      r4,r3;                                          \
        mr      r3,r0;                                          \
        bl      __trace_hcall_exit;                             \
-       ld      r0,STACK_FRAME_OVERHEAD+16(r1);                 \
-       addi    r1,r1,STACK_FRAME_OVERHEAD;                     \
+       ld      r0,STACK_FRAME_MIN_SIZE+16(r1);                 \
+       addi    r1,r1,STACK_FRAME_MIN_SIZE;                     \
        ld      r3,STK_PARAM(R3)(r1);                           \
        mtlr    r0
 
@@ -303,14 +305,14 @@ plpar_hcall9_trace:
        mr      r7,r8
        mr      r8,r9
        mr      r9,r10
-       ld      r10,STACK_FRAME_OVERHEAD+STK_PARAM(R11)(r1)
-       ld      r11,STACK_FRAME_OVERHEAD+STK_PARAM(R12)(r1)
-       ld      r12,STACK_FRAME_OVERHEAD+STK_PARAM(R13)(r1)
+       ld      r10,STACK_FRAME_MIN_SIZE+STK_PARAM(R11)(r1)
+       ld      r11,STACK_FRAME_MIN_SIZE+STK_PARAM(R12)(r1)
+       ld      r12,STACK_FRAME_MIN_SIZE+STK_PARAM(R13)(r1)
 
        HVSC
 
        mr      r0,r12
-       ld      r12,STACK_FRAME_OVERHEAD+STK_PARAM(R4)(r1)
+       ld      r12,STACK_FRAME_MIN_SIZE+STK_PARAM(R4)(r1)
        std     r4,0(r12)
        std     r5,8(r12)
        std     r6,16(r12)
-- 
2.37.2

Reply via email to