xref: /linux/arch/powerpc/net/bpf_timed_may_goto.S (revision 3d5e48944e824bddc20d7b874e784f7b279636fe)
1*b55b6b9aSSaket Kumar Bhaskar/* SPDX-License-Identifier: GPL-2.0 */
2*b55b6b9aSSaket Kumar Bhaskar/* Copyright (c) 2025 IBM Corporation, Saket Kumar Bhaskar <skb99@linux.ibm.com> */
3*b55b6b9aSSaket Kumar Bhaskar
4*b55b6b9aSSaket Kumar Bhaskar#include <linux/linkage.h>
5*b55b6b9aSSaket Kumar Bhaskar#include <asm/ppc_asm.h>
6*b55b6b9aSSaket Kumar Bhaskar
7*b55b6b9aSSaket Kumar Bhaskar/*
8*b55b6b9aSSaket Kumar Bhaskar * arch_bpf_timed_may_goto() trampoline for powerpc64
9*b55b6b9aSSaket Kumar Bhaskar *
10*b55b6b9aSSaket Kumar Bhaskar * Custom BPF convention (verifier/JIT):
11*b55b6b9aSSaket Kumar Bhaskar *	- input:  stack offset in BPF_REG_AX (r12)
12*b55b6b9aSSaket Kumar Bhaskar *	- output: updated count in BPF_REG_AX (r12)
13*b55b6b9aSSaket Kumar Bhaskar *
14*b55b6b9aSSaket Kumar Bhaskar * Call bpf_check_timed_may_goto(ptr) with normal powerpc64 ABI:
15*b55b6b9aSSaket Kumar Bhaskar * 	- r3 = ptr, return in r3
16*b55b6b9aSSaket Kumar Bhaskar *
17*b55b6b9aSSaket Kumar Bhaskar * Preserve BPF regs R0-R5 (mapping: r8, r3-r7).
18*b55b6b9aSSaket Kumar Bhaskar */
19*b55b6b9aSSaket Kumar Bhaskar
20*b55b6b9aSSaket Kumar BhaskarSYM_FUNC_START(arch_bpf_timed_may_goto)
21*b55b6b9aSSaket Kumar Bhaskar	/* Prologue: save LR, allocate frame */
22*b55b6b9aSSaket Kumar Bhaskar	mflr    r0
23*b55b6b9aSSaket Kumar Bhaskar	std     r0, 16(r1)
24*b55b6b9aSSaket Kumar Bhaskar	stdu    r1, -112(r1)
25*b55b6b9aSSaket Kumar Bhaskar
26*b55b6b9aSSaket Kumar Bhaskar	/* Save BPF registers R0 - R5 (r8, r3-r7) */
27*b55b6b9aSSaket Kumar Bhaskar	std     r3, 32(r1)
28*b55b6b9aSSaket Kumar Bhaskar	std     r4, 40(r1)
29*b55b6b9aSSaket Kumar Bhaskar	std     r5, 48(r1)
30*b55b6b9aSSaket Kumar Bhaskar	std     r6, 56(r1)
31*b55b6b9aSSaket Kumar Bhaskar	std     r7, 64(r1)
32*b55b6b9aSSaket Kumar Bhaskar	std     r8, 72(r1)
33*b55b6b9aSSaket Kumar Bhaskar
34*b55b6b9aSSaket Kumar Bhaskar	/*
35*b55b6b9aSSaket Kumar Bhaskar	 * r3 = BPF_REG_FP + BPF_REG_AX
36*b55b6b9aSSaket Kumar Bhaskar	 * BPF_REG_FP is r31; BPF_REG_AX is r12 (stack offset in bytes).
37*b55b6b9aSSaket Kumar Bhaskar	 */
38*b55b6b9aSSaket Kumar Bhaskar	add     r3, r31, r12
39*b55b6b9aSSaket Kumar Bhaskar	bl      bpf_check_timed_may_goto
40*b55b6b9aSSaket Kumar Bhaskar
41*b55b6b9aSSaket Kumar Bhaskar	/* Put return value back into AX */
42*b55b6b9aSSaket Kumar Bhaskar	mr      r12, r3
43*b55b6b9aSSaket Kumar Bhaskar
44*b55b6b9aSSaket Kumar Bhaskar	/* Restore BPF registers R0 - R5 (r8, r3-r7) */
45*b55b6b9aSSaket Kumar Bhaskar	ld      r3, 32(r1)
46*b55b6b9aSSaket Kumar Bhaskar	ld      r4, 40(r1)
47*b55b6b9aSSaket Kumar Bhaskar	ld      r5, 48(r1)
48*b55b6b9aSSaket Kumar Bhaskar	ld      r6, 56(r1)
49*b55b6b9aSSaket Kumar Bhaskar	ld      r7, 64(r1)
50*b55b6b9aSSaket Kumar Bhaskar	ld      r8, 72(r1)
51*b55b6b9aSSaket Kumar Bhaskar
52*b55b6b9aSSaket Kumar Bhaskar	/* Epilogue: pop frame, restore LR, return */
53*b55b6b9aSSaket Kumar Bhaskar	addi    r1, r1, 112
54*b55b6b9aSSaket Kumar Bhaskar	ld      r0, 16(r1)
55*b55b6b9aSSaket Kumar Bhaskar	mtlr    r0
56*b55b6b9aSSaket Kumar Bhaskar	blr
57*b55b6b9aSSaket Kumar BhaskarSYM_FUNC_END(arch_bpf_timed_may_goto)
58