root/arch/arm64/net/bpf_timed_may_goto.S
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2025 Puranjay Mohan <puranjay@kernel.org> */

#include <linux/linkage.h>

SYM_FUNC_START(arch_bpf_timed_may_goto)
        /* Allocate stack space and emit frame record */
        stp     x29, x30, [sp, #-64]!
        mov     x29, sp

        /* Save BPF registers R0 - R5 (x8, x0-x4)*/
        stp     x8, x0, [sp, #16]
        stp     x1, x2, [sp, #32]
        stp     x3, x4, [sp, #48]

        /*
         * Stack depth was passed in BPF_REG_AX (x9), add it to the BPF_FP
         * (x25) to get the pointer to count and timestamp and pass it as the
         * first argument in x0.
         *
         * Before generating the call to arch_bpf_timed_may_goto, the verifier
         * generates a load instruction using FP, i.e. REG_AX = *(u64 *)(FP -
         * stack_off_cnt), so BPF_REG_FP (x25) is always set up by the arm64
         * jit in this case.
         */
        add     x0, x9, x25
        bl      bpf_check_timed_may_goto
        /* BPF_REG_AX(x9) will be stored into count, so move return value to it. */
        mov     x9, x0

        /* Restore BPF registers R0 - R5 (x8, x0-x4) */
        ldp     x8, x0, [sp, #16]
        ldp     x1, x2, [sp, #32]
        ldp     x3, x4, [sp, #48]

        /* Restore FP and LR */
        ldp     x29, x30, [sp], #64

        ret
SYM_FUNC_END(arch_bpf_timed_may_goto)