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