Skip to content

Commit a506b60

Browse files
Yonghong SongKernel Patches Daemon
authored andcommitted
Documentation/bpf: Document up to 16-byte kfunc return values in R0:R2
kfuncs may now return a value larger than 8 bytes and up to 16 bytes (a scalar-only struct or union, or an __int128), passed back in the R0:R2 register pair. Add a kfunc return-value section documenting this, including that a struct or union up to 8 bytes is returned in R0 alone, which struct and union members are accepted, that the R0:R2 register pair requires JIT support (bpf_jit_supports_kfunc_ret_reg_pair()), and that a return value larger than 16 bytes is unsupported. Also note that the same convention applies to BPF subprogram returns, and document the consequence for a global subprogram: it must assign both halves of a register-pair return, since an unassigned R2 may be left holding a pointer argument and is then rejected as a leak. Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
1 parent 7fced74 commit a506b60

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

Documentation/bpf/kfuncs.rst

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,68 @@ is also covered by this recovery. A kfunc handed an arena pointer may
575575
therefore access up to ``GUARD_SZ / 2`` past it without bounds-checking
576576
against the arena. Larger accesses must verify the range explicitly.
577577

578+
2.9 kfunc Return Values
579+
-----------------------
580+
581+
A kfunc may return a scalar, a pointer, or a small struct or union by
582+
value. A scalar or pointer of up to 8 bytes is returned in R0, as usual.
583+
584+
A struct or union returned by value must be composed only of scalars
585+
(recursively), where a scalar is an integer or an enum; arrays of scalars are
586+
allowed as members. Its bytes are handed back to the program as the raw
587+
contents of R0 (and R2), so a pointer field would be laundered into a scalar
588+
and escape the verifier's pointer provenance and reference tracking. A struct
589+
or union with a pointer member is therefore rejected at load time, and so is
590+
one with a floating-point member, which the ABI may not return in R0:R2 at
591+
all.
592+
593+
A kfunc may also return a value larger than 8 bytes and up to 16 bytes -- a
594+
scalar-only struct or union, or an ``__int128``. Such a value is returned
595+
in the register pair R0:R2, matching the convention LLVM uses for the BPF
596+
target: the first 8 bytes in R0 and the second 8 bytes in R2. A struct or
597+
union of 8 bytes or less is returned in R0 alone.
598+
599+
::
600+
601+
struct bpf_pair { __u64 a, b; }; /* 16 bytes */
602+
603+
__bpf_kfunc struct bpf_pair bpf_kfunc_get_pair(void)
604+
{
605+
struct bpf_pair p = { .a = 1, .b = 2 };
606+
607+
return p; /* p.a in R0, p.b in R2 */
608+
}
609+
610+
Returning a value in the R0:R2 pair requires the JIT to place the second
611+
half of the return value into R2, which not every architecture supports
612+
right now. A kfunc with a return value larger than 8 bytes is therefore
613+
rejected at load time on a JIT that does not advertise this capability (see
614+
``bpf_jit_supports_kfunc_ret_reg_pair()``), and such a program is never run
615+
by the interpreter. A return value larger than 16 bytes is not supported.
616+
617+
The same R0:R2 convention applies to a BPF subprogram, global or static,
618+
that returns an ``__int128`` or a struct or union larger than 8 bytes. Such a
619+
program also requires the JIT, since the interpreter propagates only R0 out
620+
of a subprogram. A global subprogram is verified in isolation, so its
621+
by-value struct or union return is restricted to scalars just like a kfunc's;
622+
a static subprogram is verified inline and has no such restriction. The main
623+
program cannot return more than 8 bytes, as its return value is the program's
624+
exit code.
625+
626+
A global subprogram must leave a scalar in *every* register of the pair, so
627+
both halves of the returned value have to be assigned. Leaving the upper half
628+
uninitialized is not merely untidy: the compiler is then free to leave R2
629+
holding whatever it happened to hold, which for a subprogram taking a pointer
630+
argument is typically that pointer. Handing the caller an unknown scalar built
631+
from a pointer is a leak, so the verifier rejects it with::
632+
633+
At subprogram exit the register R2 is not a scalar value (...)
634+
635+
Initialize the whole return value, for example ``struct pair p = {};``, to
636+
avoid this. A static subprogram is exempt: it is verified inline, so an
637+
unassigned R2 is simply passed back to the caller as uninitialized and only a
638+
caller that reads it fails.
639+
578640
.. _BPF_kfunc_lifecycle_expectations:
579641

580642
3. kfunc lifecycle expectations

0 commit comments

Comments
 (0)