Hello, Paul Burton wrote: > The function prototype used to call JITed eBPF code (ie. the type of the > struct bpf_prog bpf_func field) returns an unsigned int. The MIPS n64 > ABI that MIPS64 kernels target defines that 32 bit integers should > always be sign extended when passed in registers as either arguments or > return values. > > This means that when returning any value which may not already be sign > extended (ie. of type REG_64BIT or REG_32BIT_ZERO_EX) we need to perform > that sign extension in order to comply with the n64 ABI. Without this we > see strange looking test failures from test_bpf.ko, such as: > > test_bpf: #65 ALU64_MOV_X: > dst = 4294967295 jited:1 ret -1 != -1 FAIL (1 times) > > Although the return value printed matches the expected value, this is > only because printf is only examining the least significant 32 bits of > the 64 bit register value we returned. The register holding the expected > value is sign extended whilst the v0 register was set to a zero extended > value by our JITed code, so when compared by a conditional branch > instruction the values are not equal. > > We already handle this when the return value register is of type > REG_32BIT_ZERO_EX, so simply extend this to also cover REG_64BIT. > > Signed-off-by: Paul Burton <paul.burton@xxxxxxxx> > Fixes: b6bd53f9c4e8 ("MIPS: Add missing file for eBPF JIT.") > Cc: stable@xxxxxxxxxxxxxxx # v4.13+ Series applied to mips-next. Thanks, Paul [ This message was auto-generated; if you believe anything is incorrect then please email paul.burton@xxxxxxxx to report it. ]