Re: [PATCH bpf-next v4 03/13] bpf: Wire up JIT support for 16-byte kfunc returns

Eduard Zingerman <[email protected]>
Newsgroups org.kernel.vger.bpf
Message-ID <[email protected]>
On Mon, 2026-08-10 at 17:09 -0700, Yonghong Song wrote:
> LLVM 23 returns an __int128, or a struct/union larger than 8 bytes and no
> larger than 16 bytes, in the BPF R0:R2 register pair. The previous patch
> taught the verifier about that convention; wire up the JIT side so that the
> second half of the return value actually lands in R2.
> 
> A kfunc returning more than 8 bytes hands the second half of the result
> back in RDX, the native x86-64 ABI's second return register. BPF R0 maps to
> RAX so it needs no move, but BPF R2 maps to RSI, so emit a RDX->RSI move
> after a BPF_PSEUDO_KFUNC_CALL whose function model reports ret_size > 8.
> 
> Placing the second return half into R2 is possible on any JIT, but it needs
> architecture-specific JIT work. Rather than requiring every JIT to
> implement it at once, add a bpf_jit_supports_kfunc_ret_reg_pair()
> capability, defaulting to false in the generic core; an architecture opts
> in once its JIT handles the R0:R2 pair, and the remaining ones are left for
> future work. The verifier enforces it in bpf_add_kfunc_call(), rejecting a
> kfunc whose return is larger than 8 bytes with -EOPNOTSUPP when the JIT
> lacks the capability. Only x86, arm64 and riscv are supported so far.
> 
> On arm64 and riscv the native second return register is already BPF R2 (x1
> in bpf2a64[] and a1 in regmap[] respectively), so the value is in the R0:R2
> register pair on return with no extra move, unlike x86 (RDX->RSI). This has
> been tested on x86 and arm64. The riscv path is expected to work by the
> same register-mapping reasoning as arm64 but has not been tested.
> 
> bpf_add_kfunc_call() also rejects a kfunc that is marked KF_FASTCALL and
> returns more than 8 bytes. The bpf_fastcall contract implemented by
> mark_fastcall_pattern_for_call() assumes a call clobbers R0 plus the
> registers holding its arguments, so a return in the R0:R2 pair would
> clobber an R2 the caller expects the fastcall pattern to preserve. Such
> a kfunc is rejected with -EOPNOTSUPP as well.
> 
> Signed-off-by: Yonghong Song <[email protected]>
> ---

Acked-by: Eduard Zingerman <[email protected]>

...
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.