lkml.org 
[lkml]   [2022]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 046/230] bpf, arm64: Use emit_addr_mov_i64() for BPF_PSEUDO_FUNC
    Date
    From: Hou Tao <houtao1@huawei.com>

    [ Upstream commit e4a41c2c1fa916547e63440c73a51a5eb06247af ]

    The following error is reported when running "./test_progs -t for_each"
    under arm64:

    bpf_jit: multi-func JIT bug 58 != 56
    [...]
    JIT doesn't support bpf-to-bpf calls

    The root cause is the size of BPF_PSEUDO_FUNC instruction increases
    from 2 to 3 after the address of called bpf-function is settled and
    there are two bpf-to-bpf calls in test_pkt_access. The generated
    instructions are shown below:

    0x48: 21 00 C0 D2 movz x1, #0x1, lsl #32
    0x4c: 21 00 80 F2 movk x1, #0x1

    0x48: E1 3F C0 92 movn x1, #0x1ff, lsl #32
    0x4c: 41 FE A2 F2 movk x1, #0x17f2, lsl #16
    0x50: 81 70 9F F2 movk x1, #0xfb84

    Fixing it by using emit_addr_mov_i64() for BPF_PSEUDO_FUNC, so
    the size of jited image will not change.

    Fixes: 69c087ba6225 ("bpf: Add bpf_for_each_map_elem() helper")
    Signed-off-by: Hou Tao <houtao1@huawei.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20211231151018.3781550-1-houtao1@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/net/bpf_jit_comp.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
    index 95439bbe5df8..4895b4d7e150 100644
    --- a/arch/arm64/net/bpf_jit_comp.c
    +++ b/arch/arm64/net/bpf_jit_comp.c
    @@ -788,7 +788,10 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
    u64 imm64;

    imm64 = (u64)insn1.imm << 32 | (u32)imm;
    - emit_a64_mov_i64(dst, imm64, ctx);
    + if (bpf_pseudo_func(insn))
    + emit_addr_mov_i64(dst, imm64, ctx);
    + else
    + emit_a64_mov_i64(dst, imm64, ctx);

    return 1;
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-11 11:46    [W:4.069 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site