Commit baa49d81 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/pseries: hvcall stack frame overhead



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: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221127124942.1665522-6-npiggin@gmail.com
parent bc067736
Loading
Loading
Loading
Loading
+20 −18
Original line number Diff line number Diff line
@@ -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)