• Xu Kuohai's avatar
    bpf, arm64: Fix bpf trampoline instruction endianness · aada4766
    Xu Kuohai authored
    The sparse tool complains as follows:
    
    arch/arm64/net/bpf_jit_comp.c:1684:16:
    	warning: incorrect type in assignment (different base types)
    arch/arm64/net/bpf_jit_comp.c:1684:16:
    	expected unsigned int [usertype] *branch
    arch/arm64/net/bpf_jit_comp.c:1684:16:
    	got restricted __le32 [usertype] *
    arch/arm64/net/bpf_jit_comp.c:1700:52:
    	error: subtraction of different types can't work (different base
    	types)
    arch/arm64/net/bpf_jit_comp.c:1734:29:
    	warning: incorrect type in assignment (different base types)
    arch/arm64/net/bpf_jit_comp.c:1734:29:
    	expected unsigned int [usertype] *
    arch/arm64/net/bpf_jit_comp.c:1734:29:
    	got restricted __le32 [usertype] *
    arch/arm64/net/bpf_jit_comp.c:1918:52:
    	error: subtraction of different types can't work (different base
    	types)
    
    This is because the variable branch in function invoke_bpf_prog and the
    variable branches in function prepare_trampoline are defined as type
    u32 *, which conflicts with ctx->image's type __le32 *, so sparse complains
    when assignment or arithmetic operation are performed on these two
    variables and ctx->image.
    
    Since arm64 instructions are always little-endian, change the type of
    these two variables to __le32 * and call cpu_to_le32() to convert
    instruction to little-endian before writing it to memory. This is also
    in line with emit() which internally does cpu_to_le32(), too.
    
    Fixes: efc9909f ("bpf, arm64: Add bpf trampoline for arm64")
    Reported-by: default avatarkernel test robot <lkp@intel.com>
    Signed-off-by: default avatarXu Kuohai <xukuohai@huawei.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
    Link: https://lore.kernel.org/bpf/20220808040735.1232002-1-xukuohai@huawei.com
    aada4766
bpf_jit_comp.c 57.9 KB