• Björn Töpel's avatar
    bpf, riscv: clear target register high 32-bits for and/or/xor on ALU32 · fe121ee5
    Björn Töpel authored
    When using 32-bit subregisters (ALU32), the RISC-V JIT would not clear
    the high 32-bits of the target register and therefore generate
    incorrect code.
    
    E.g., in the following code:
    
      $ cat test.c
      unsigned int f(unsigned long long a,
      	       unsigned int b)
      {
      	return (unsigned int)a & b;
      }
    
      $ clang-9 -target bpf -O2 -emit-llvm -S test.c -o - | \
      	llc-9 -mattr=+alu32 -mcpu=v3
      	.text
      	.file	"test.c"
      	.globl	f
      	.p2align	3
      	.type	f,@function
      f:
      	r0 = r1
      	w0 &= w2
      	exit
      .Lfunc_end0:
      	.size	f, .Lfunc_end0-f
    
    The JIT would not clear the high 32-bits of r0 after the
    and-operation, which in this case might give an incorrect return
    value.
    
    After this patch, that is not the case, and the upper 32-bits are
    cleared.
    Reported-by: default avatarJiong Wang <jiong.wang@netronome.com>
    Fixes: 2353ecc6 ("bpf, riscv: add BPF JIT for RV64G")
    Signed-off-by: default avatarBjörn Töpel <bjorn.topel@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    fe121ee5
bpf_jit_comp.c 38.1 KB