[PATCH bpf-next] riscv, bpf: Fix missing sign-ext for signed 1-byte and 2-byte kfunc args

Pu Lehui pulehui at huawei.com
Wed Sep 23 07:42:19 PDT 2026


Sorry for the noise. That was an accidental send—this patch has already 
been merged.

On 2026/9/23 22:41, Pu Lehui wrote:
> From: Pu Lehui <pulehui at huawei.com>
> 
> On RV64, the ABI requires sign-extension for signed 1-byte and 2-byte
> kfunc args. However, the RV64 JIT currently does not perform
> sign-extension for such kfunc args.
> 
> Before commit 7ce090afbf72 ("bpf: Infer zext_dst based on static
> register liveness analysis"), state pruning could potentially omit
> zero-extension of 32-bit subregisters, which inadvertently masked the
> above issue by making the args appear as if they had been properly
> sign-extended. After that commit, the problem is exposed, causing the
> kfunc_call/kfunc_call_test4 selftest to fail.
> 
> Fix this by extending the existing sign-extension logic to handle signed
> 1-byte and 2-byte kfunc args as well.
> 
> Fixes: 443574b03387 ("riscv, bpf: Fix kfunc parameters incompatibility between bpf and riscv abi")
> Signed-off-by: Pu Lehui <pulehui at huawei.com>
> ---
>   arch/riscv/net/bpf_jit_comp64.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/riscv/net/bpf_jit_comp64.c b/arch/riscv/net/bpf_jit_comp64.c
> index 2504df1fa111..74efe4b138d2 100644
> --- a/arch/riscv/net/bpf_jit_comp64.c
> +++ b/arch/riscv/net/bpf_jit_comp64.c
> @@ -1823,9 +1823,10 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
>   
>   			for (idx = 0; idx < fm->nr_args; idx++) {
>   				u8 reg = bpf_to_rv_reg(BPF_REG_1 + idx, ctx);
> +				bool sign = fm->arg_flags[idx] & BTF_FMODEL_SIGNED_ARG;
>   
> -				if (fm->arg_size[idx] == sizeof(int))
> -					emit_sextw(reg, reg, ctx);
> +				if (sign_extend(reg, reg, fm->arg_size[idx], sign, ctx))
> +					return -EINVAL;
>   			}
>   		}
>   



More information about the linux-riscv mailing list