Skip to content

Commit

Permalink
powerpc/pseries: hvcall stack frame overhead
Browse files Browse the repository at this point in the history
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
  • Loading branch information
npiggin authored and mpe committed Dec 2, 2022
1 parent bc06773 commit baa49d8
Showing 1 changed file with 20 additions and 18 deletions.
38 changes: 20 additions & 18 deletions arch/powerpc/platforms/pseries/hvCall.S
Original file line number Diff line number Diff line change
Expand Up @@ -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; \
Expand All @@ -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

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit baa49d8

Please sign in to comment.