pulehui wrote: > > A kernel function will expect the uint to be sign-extended, not > > zero-extended. > > I suspect riscv bpf jit will do sign-extension. @pulehui can confirm. This > may be true for 32-bit subregisters, but I am not sure whether this is true > for full register or not.
Sorry for late. riscv64 will do sign-extension for 'unsigned int' and riscv64 bpf JIT will do the same. We need to explicitly zero-extend it. But I don't have problems with ‘unsigned int‘ **before this patch**. ``` void bpf_kfunc_call_test4(unsigned int a) __ksym; int kfunc_call_test4(struct __sk_buff *skb) { unsigned int a = xxx; bpf_kfunc_call_test4(a); } ``` if a = 2147483647(0x7FFFFFFFU, bit 31 is 0), it will be a mov insn. It will be valid 'unsigned int' in kfunc after sign-extension. ``` 0: b7 01 00 00 ff ff ff 7f r1 = 0x7fffffff 1: 85 10 00 00 ff ff ff ff call -0x1 ``` but if a = 4294967294(0xFFFFFFFEU, bit 31 is 1), it will be a ld_imm64 insn. And it also be valid 'unsigned int' in kfunc. ``` 0: 18 01 00 00 fe ff ff ff 00 00 00 00 00 00 00 00 r1 = 0xfffffffe ll 2: 85 10 00 00 ff ff ff ff call -0x1 ``` But **after this patch**, the two numbers get the same result as before this patch. I don't see ld_imm64 becoming a mov instruction, as well as explicit zero extension for 'unsigned int'. Is that expected? https://github.com/llvm/llvm-project/pull/84874 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits