Commit ea645cfd authored by Hengqi Chen's avatar Hengqi Chen Committed by Huacai Chen
Browse files

LoongArch: BPF: Make trampoline size stable



When attach fentry/fexit BPF programs, __arch_prepare_bpf_trampoline()
is called twice with different `struct bpf_tramp_image *im`:

    bpf_trampoline_update()
        -> arch_bpf_trampoline_size()
            -> __arch_prepare_bpf_trampoline()
        -> arch_prepare_bpf_trampoline()
            -> __arch_prepare_bpf_trampoline()

Use move_imm() will emit unstable instruction sequences, so let's use
move_addr() instead to prevent subtle bugs.

(I observed this while debugging other issues with printk.)

Cc: stable@vger.kernel.org
Tested-by: default avatarVincent Li <vincent.mc.li@gmail.com>
Signed-off-by: default avatarHengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent a04731cb
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1595,7 +1595,7 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i
		orig_call += LOONGARCH_BPF_FENTRY_NBYTES;

	if (flags & BPF_TRAMP_F_CALL_ORIG) {
		move_imm(ctx, LOONGARCH_GPR_A0, (const s64)im, false);
		move_addr(ctx, LOONGARCH_GPR_A0, (const u64)im);
		ret = emit_call(ctx, (const u64)__bpf_tramp_enter);
		if (ret)
			return ret;
@@ -1645,7 +1645,7 @@ static int __arch_prepare_bpf_trampoline(struct jit_ctx *ctx, struct bpf_tramp_i

	if (flags & BPF_TRAMP_F_CALL_ORIG) {
		im->ip_epilogue = ctx->ro_image + ctx->idx;
		move_imm(ctx, LOONGARCH_GPR_A0, (const s64)im, false);
		move_addr(ctx, LOONGARCH_GPR_A0, (const u64)im);
		ret = emit_call(ctx, (const u64)__bpf_tramp_exit);
		if (ret)
			goto out;