]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Test access from RO map from xdp_store_bytes
authorPaul Chaignon <paul.chaignon@gmail.com>
Sat, 31 Jan 2026 16:09:02 +0000 (17:09 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 31 Jan 2026 21:49:43 +0000 (13:49 -0800)
This new test simply checks that helper bpf_xdp_store_bytes can
successfully read from a read-only map.

Signed-off-by: Paul Chaignon <paul.chaignon@gmail.com>
Link: https://lore.kernel.org/r/4fdb934a713b2d7cf133288c77f6cfefe9856440.1769875479.git.paul.chaignon@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_xdp.c

index 50768ed179b3c2a030a95b9c239977ee5c596410..7dc9226aeb34a575e749167d624e7dcad03e30f2 100644 (file)
@@ -5,6 +5,14 @@
 #include <bpf/bpf_helpers.h>
 #include "bpf_misc.h"
 
+struct {
+       __uint(type, BPF_MAP_TYPE_ARRAY);
+       __uint(max_entries, 1);
+       __type(key, int);
+       __type(value, __u64);
+       __uint(map_flags, BPF_F_RDONLY_PROG);
+} map_array_ro SEC(".maps");
+
 SEC("xdp")
 __description("XDP, using ifindex from netdev")
 __success __retval(1)
@@ -21,4 +29,31 @@ l0_%=:       exit;                                           \
        : __clobber_all);
 }
 
+SEC("xdp")
+__description("XDP, using xdp_store_bytes from RO map")
+__success __retval(0)
+__naked void xdp_store_bytes_from_ro_map(void)
+{
+       asm volatile ("                                 \
+       r6 = r1;                                        \
+       r1 = 0;                                         \
+       *(u64*)(r10 - 8) = r1;                          \
+       r2 = r10;                                       \
+       r2 += -8;                                       \
+       r1 = %[map_array_ro] ll;                        \
+       call %[bpf_map_lookup_elem];                    \
+       if r0 == 0 goto l0_%=;                          \
+       r1 = r6;                                        \
+       r2 = 0;                                         \
+       r3 = r0;                                        \
+       r4 = 8;                                         \
+       call %[bpf_xdp_store_bytes];                    \
+l0_%=: exit;                                           \
+"      :
+       : __imm(bpf_map_lookup_elem),
+         __imm(bpf_xdp_store_bytes),
+         __imm_addr(map_array_ro)
+       : __clobber_all);
+}
+
 char _license[] SEC("license") = "GPL";