| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- /* 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 (x7, x0-x4)*/
- stp x7, 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 (x7, x0-x4) */
- ldp x7, 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)
|