41 lines
1.1 KiB
ArmAsm
41 lines
1.1 KiB
ArmAsm
/* 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)
|