mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
LoongArch: BPF: Introduce emit_store_stack_imm64() helper
Introduce a helper to store 64-bit immediate on the trampoline stack. The helper will be used in the next patch. Also refactor the existing code to use this helper. Tested-by: Vincent Li <vincent.mc.li@gmail.com> Reviewed-by: Menglong Dong <menglong8.dong@gmail.com> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
parent
c9ebe2016d
commit
6ef04707e8
|
|
@ -344,6 +344,12 @@ static int emit_bpf_tail_call(struct jit_ctx *ctx, int insn)
|
|||
#undef jmp_offset
|
||||
}
|
||||
|
||||
static void emit_store_stack_imm64(struct jit_ctx *ctx, int reg, int stack_off, u64 imm64)
|
||||
{
|
||||
move_imm(ctx, reg, imm64, false);
|
||||
emit_insn(ctx, std, reg, LOONGARCH_GPR_FP, stack_off);
|
||||
}
|
||||
|
||||
static int emit_atomic_rmw(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||
{
|
||||
const u8 t1 = LOONGARCH_GPR_T1;
|
||||
|
|
@ -1676,12 +1682,11 @@ static int invoke_bpf_prog(struct jit_ctx *ctx, struct bpf_tramp_link *l,
|
|||
struct bpf_prog *p = l->link.prog;
|
||||
int cookie_off = offsetof(struct bpf_tramp_run_ctx, bpf_cookie);
|
||||
|
||||
if (l->cookie) {
|
||||
move_imm(ctx, LOONGARCH_GPR_T1, l->cookie, false);
|
||||
emit_insn(ctx, std, LOONGARCH_GPR_T1, LOONGARCH_GPR_FP, -run_ctx_off + cookie_off);
|
||||
} else {
|
||||
if (l->cookie)
|
||||
emit_store_stack_imm64(ctx, LOONGARCH_GPR_T1,
|
||||
-run_ctx_off + cookie_off, l->cookie);
|
||||
else
|
||||
emit_insn(ctx, std, LOONGARCH_GPR_ZERO, LOONGARCH_GPR_FP, -run_ctx_off + cookie_off);
|
||||
}
|
||||
|
||||
/* arg1: prog */
|
||||
move_imm(ctx, LOONGARCH_GPR_A0, (const s64)p, false);
|
||||
|
|
@ -1920,14 +1925,11 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
|
|||
emit_insn(ctx, std, LOONGARCH_GPR_S1, LOONGARCH_GPR_FP, -sreg_off);
|
||||
|
||||
/* store ip address of the traced function */
|
||||
if (flags & BPF_TRAMP_F_IP_ARG) {
|
||||
move_imm(ctx, LOONGARCH_GPR_T1, (const s64)func_addr, false);
|
||||
emit_insn(ctx, std, LOONGARCH_GPR_T1, LOONGARCH_GPR_FP, -ip_off);
|
||||
}
|
||||
if (flags & BPF_TRAMP_F_IP_ARG)
|
||||
emit_store_stack_imm64(ctx, LOONGARCH_GPR_T1, -ip_off, (u64)func_addr);
|
||||
|
||||
/* store arg regs count */
|
||||
move_imm(ctx, LOONGARCH_GPR_T1, nr_arg_slots, false);
|
||||
emit_insn(ctx, std, LOONGARCH_GPR_T1, LOONGARCH_GPR_FP, -nregs_off);
|
||||
emit_store_stack_imm64(ctx, LOONGARCH_GPR_T1, -nregs_off, nr_arg_slots);
|
||||
|
||||
store_args(ctx, nr_arg_slots, args_off);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user