mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 06:44:49 +01:00
bpf, riscv: introduce emit_store_stack_imm64() for trampoline
Introduce a helper to store 64-bit immediate on the trampoline stack with a help of a register. Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn> Tested-by: Björn Töpel <bjorn@kernel.org> Acked-by: Björn Töpel <bjorn@kernel.org> Link: https://lore.kernel.org/r/20260208053311.698352-2-dongml2@chinatelecom.cn Signed-off-by: Alexei Starovoitov <ast@kernel.org> Reviewed-by: Pu Lehui <pulehui@huawei.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
2669dde7a8
commit
93fd420d71
1 changed files with 14 additions and 11 deletions
|
|
@ -926,6 +926,14 @@ static void restore_stack_args(int nr_stack_args, int args_off, int stk_arg_off,
|
|||
}
|
||||
}
|
||||
|
||||
static void emit_store_stack_imm64(u8 reg, int stack_off, u64 imm64,
|
||||
struct rv_jit_context *ctx)
|
||||
{
|
||||
/* Load imm64 into reg and store it at [FP + stack_off]. */
|
||||
emit_imm(reg, (s64)imm64, ctx);
|
||||
emit_sd(RV_REG_FP, stack_off, reg, ctx);
|
||||
}
|
||||
|
||||
static int invoke_bpf_prog(struct bpf_tramp_link *l, int args_off, int retval_off,
|
||||
int run_ctx_off, bool save_ret, struct rv_jit_context *ctx)
|
||||
{
|
||||
|
|
@ -933,12 +941,10 @@ static int invoke_bpf_prog(struct bpf_tramp_link *l, int args_off, int retval_of
|
|||
struct bpf_prog *p = l->link.prog;
|
||||
int cookie_off = offsetof(struct bpf_tramp_run_ctx, bpf_cookie);
|
||||
|
||||
if (l->cookie) {
|
||||
emit_imm(RV_REG_T1, l->cookie, ctx);
|
||||
emit_sd(RV_REG_FP, -run_ctx_off + cookie_off, RV_REG_T1, ctx);
|
||||
} else {
|
||||
if (l->cookie)
|
||||
emit_store_stack_imm64(RV_REG_T1, -run_ctx_off + cookie_off, l->cookie, ctx);
|
||||
else
|
||||
emit_sd(RV_REG_FP, -run_ctx_off + cookie_off, RV_REG_ZERO, ctx);
|
||||
}
|
||||
|
||||
/* arg1: prog */
|
||||
emit_imm(RV_REG_A0, (const s64)p, ctx);
|
||||
|
|
@ -1123,13 +1129,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
|||
emit_sd(RV_REG_FP, -sreg_off, RV_REG_S1, ctx);
|
||||
|
||||
/* store ip address of the traced function */
|
||||
if (flags & BPF_TRAMP_F_IP_ARG) {
|
||||
emit_imm(RV_REG_T1, (const s64)func_addr, ctx);
|
||||
emit_sd(RV_REG_FP, -ip_off, RV_REG_T1, ctx);
|
||||
}
|
||||
if (flags & BPF_TRAMP_F_IP_ARG)
|
||||
emit_store_stack_imm64(RV_REG_T1, -ip_off, (u64)func_addr, ctx);
|
||||
|
||||
emit_li(RV_REG_T1, nr_arg_slots, ctx);
|
||||
emit_sd(RV_REG_FP, -nregs_off, RV_REG_T1, ctx);
|
||||
emit_store_stack_imm64(RV_REG_T1, -nregs_off, nr_arg_slots, ctx);
|
||||
|
||||
store_args(nr_arg_slots, args_off, ctx);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue