OSDN Git Service

powerpc/pseries: hvcall stack frame overhead
authorNicholas Piggin <npiggin@gmail.com>
Sun, 27 Nov 2022 12:49:30 +0000 (22:49 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 2 Dec 2022 06:54:07 +0000 (17:54 +1100)
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 <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221127124942.1665522-6-npiggin@gmail.com
arch/powerpc/platforms/pseries/hvCall.S

index 762eb15..783c16a 100644 (file)
@@ -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)