linux/Documentation/bpf
Puranjay Mohan bb5bad6a78
bpf, arm64: Convert struct_ops arena arguments in the trampoline
Implement the struct_ops arena argument conversion on arm64. save_args()
receives the arena base from bpf_tramp_arena_base() and consults the
btf_func_model argument flags as it copies each native argument into the
BPF ctx, routing a marked argument through x10 with the low half of the
base materialized once into x11:

  sub w10, wsrc, w11    /* truncate and clear the upper 32 bits */
  str x10, [sp, #slot]

A nullable argument tests the full 64-bit kernel pointer first:

  mov x10, xsrc
  cbz x10, 1f
  sub w10, w10, w11
1:
  str x10, [sp, #slot]

The 32-bit subtraction is sufficient since (u32)(kaddr - base) ==
(u32)kaddr - (u32)base, and it clears the upper half as the JITs require
of arena pointer registers. Stack-passed arguments already reload
through x10, so only the subtraction (and the NULL test) is inserted
there.

The register loop now walks arguments rather than registers so that the
per-argument flags line up with the slots a multi-slot argument occupies;
the sequence of stores is otherwise unchanged. bpf_tramp_arena_base()
returns a base only for a single-program struct_ops indirect trampoline,
so a tracing trampoline emits exactly what it did before and never
touches x11. The size probe reruns the same emission with the same model
and nodes, so the image size matches by construction.

Conversion must never reach the original function, which takes kernel
addresses. That holds because BPF_TRAMP_F_INDIRECT is incompatible with
BPF_TRAMP_F_CALL_ORIG, so pass 0 rather than the base to the call-origin
save_args() and assert the flag combination the same way x86 does,
rather than leaving the invariant to a comment.

With both the kfunc and struct_ops directions implemented, flip
bpf_jit_supports_arena_args() on for arm64 and drop the x86-64-only
qualifier from the kfunc documentation.

Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Reviewed-by: Xu Kuohai <xukuohai@huawei.com>
Link: https://lore.kernel.org/bpf/20260813190356.335181-5-puranjay@kernel.org
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
2026-08-14 05:55:02 +02:00
..
libbpf docs/bpf: add missing fsession attach type to docs 2026-04-12 12:42:38 -07:00
standardization bpf, doc: Improve wording of docs 2025-06-11 12:30:41 -07:00
bpf_design_QA.rst docs/bpf: Add documentation for new instructions 2023-07-27 18:54:17 -07:00
bpf_devel_QA.rst docs/bpf: Document BPF_STRICT_BUILD=0 to tolerate test build failures 2026-07-07 18:09:39 +02:00
bpf_iterators.rst docs: bpf: Fix bullet point formatting warning 2025-05-13 08:53:02 -07:00
bpf_licensing.rst
bpf_prog_run.rst bpf: Update BPF_PROG_RUN documentation 2025-12-31 13:45:26 -08:00
btf.rst Documentation/bpf: Update btf doc with updated vlen, kind sizes 2026-04-20 17:52:48 -07:00
clang-notes.rst bpf, docs: Explain helper functions 2023-03-10 13:02:00 -08:00
classic_vs_extended.rst
cpumasks.rst bpf: Add bpf_cpumask_weight() kfunc 2023-12-09 21:37:33 -08:00
drgn.rst docs/bpf: add missing fsession attach type to docs 2026-04-12 12:42:38 -07:00
faq.rst
fs_kfuncs.rst Documentation/bpf: Add documentation for filesystem kfuncs 2023-12-01 16:21:03 -08:00
graph_ds_impl.rst Documentation: Fix typos 2023-08-18 11:29:03 -06:00
helpers.rst
index.rst Documentation/bpf: Add BPF signing and enforcement doc 2026-07-08 20:05:16 +02:00
kfuncs.rst bpf, arm64: Convert struct_ops arena arguments in the trampoline 2026-08-14 05:55:02 +02:00
linux-notes.rst bpf, docs: Move linux-notes.rst to root bpf docs tree 2023-08-30 16:35:44 +02:00
llvm_reloc.rst docs/bpf: Fix "file doesn't exist" warnings in {llvm_reloc,btf}.rst 2023-09-01 15:56:48 +02:00
map_array.rst docs: bpf: map_array: Specify BPF_MAP_TYPE_PERCPU_ARRAY value size limit 2025-11-25 14:32:00 -08:00
map_bloom_filter.rst docs/bpf: Document BPF_MAP_TYPE_BLOOM_FILTER 2022-11-23 22:47:32 +01:00
map_cgroup_storage.rst Remove duplicate words inside documentation 2022-09-27 13:21:43 -06:00
map_cgrp_storage.rst docs/bpf: Add documentation for new cgroup local storage 2022-10-25 23:19:20 -07:00
map_cpumap.rst docs/bpf: Fix sphinx warnings for cpumap 2022-11-23 22:38:53 +01:00
map_devmap.rst docs/bpf: Fix sphinx warnings for devmap 2022-11-23 22:40:27 +01:00
map_hash.rst bpf: Adjust free target to avoid global starvation of LRU map 2025-06-18 18:50:14 -07:00
map_lpm_trie.rst bpf: Replace bpf_lpm_trie_key 0-length array with flexible array 2024-02-29 22:52:43 +01:00
map_lru_hash_update.dot Documentation/bpf: Refresh map_lru_hash_update.dot for rqspinlock 2026-06-07 18:46:13 -07:00
map_of_maps.rst docs/bpf: Fix sphinx warnings in BPF map docs 2022-11-24 01:05:04 +01:00
map_queue_stack.rst docs/bpf: Fix sphinx warnings in BPF map docs 2022-11-24 01:05:04 +01:00
map_sk_storage.rst docs/bpf: Reword docs for BPF_MAP_TYPE_SK_STORAGE 2022-12-14 18:35:41 +01:00
map_sockmap.rst sock: Remove ->sendpage*() in favour of sendmsg(MSG_SPLICE_PAGES) 2023-06-24 15:50:13 -07:00
map_xskmap.rst Documentation: bpf: correct spelling 2023-01-28 12:22:20 -08:00
maps.rst bpf, docs: Fix final bpf docs build failure 2023-03-02 22:36:10 -08:00
other.rst bpf, documentation: Add graph documentation for non-owning refs 2023-02-13 19:40:53 -08:00
prog_cgroup_sockopt.rst bpf: Document EFAULT changes for sockopt 2023-05-13 16:55:46 -07:00
prog_cgroup_sysctl.rst
prog_flow_dissector.rst docs/bpf: update out-of-date doc in BPF flow dissector 2023-09-13 14:22:57 -07:00
prog_lsm.rst lsm: move hook comments docs to security/security.c 2023-04-28 11:58:34 -04:00
prog_sk_lookup.rst
programs.rst docs/bpf: Add table of BPF program types to libbpf docs 2022-11-23 13:31:20 -08:00
redirect.rst bpf, docs: DEVMAPs and XDP_REDIRECT 2022-11-18 23:16:31 +01:00
ringbuf.rst Documentation: bpf: correct spelling 2023-01-28 12:22:20 -08:00
s390.rst
signing.rst Documentation/bpf: Add BPF signing and enforcement doc 2026-07-08 20:05:16 +02:00
syscall_api.rst
test_debug.rst
verifier.rst bpf: disable and remove registers chain based liveness 2025-09-19 09:27:23 -07:00