]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Add a test for ids=0 to verifier_scalar_ids test
authorPuranjay Mohan <puranjay@kernel.org>
Tue, 3 Feb 2026 16:51:01 +0000 (08:51 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 3 Feb 2026 18:34:33 +0000 (10:34 -0800)
Test that two registers with their id=0 (unlinked) in the cached state
can be mapped to a single id (linked) in the current state.

Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Link: https://lore.kernel.org/r/20260203165102.2302462-6-puranjay@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_scalar_ids.c

index c8f8820336b7d57fdedf0445654d4384c1483bb7..3072fee9a448bb3438d6167987c51bed54034a87 100644 (file)
@@ -715,6 +715,51 @@ __naked void ignore_unique_scalar_ids_old(void)
        : __clobber_all);
 }
 
+/* Check that two registers with 0 scalar IDs in a verified state can be mapped
+ * to the same scalar ID in current state.
+ */
+SEC("socket")
+__success __log_level(2)
+/* The states should be equivalent on reaching insn 12.
+ */
+__msg("12: safe")
+__msg("processed 17 insns")
+__flag(BPF_F_TEST_STATE_FREQ)
+__naked void two_nil_old_ids_one_cur_id(void)
+{
+       asm volatile (
+       /* Give unique scalar IDs to r{6,7} */
+       "call %[bpf_ktime_get_ns];"
+       "r0 &= 0xff;"
+       "r6 = r0;"
+       "r6 *= 1;"
+       "call %[bpf_ktime_get_ns];"
+       "r0 &= 0xff;"
+       "r7 = r0;"
+       "r7 *= 1;"
+       "r0 = 0;"
+       /* Maybe make r{6,7} IDs identical */
+       "if r6 > r7 goto l0_%=;"
+       "goto l1_%=;"
+"l0_%=:"
+       "r6 = r7;"
+"l1_%=:"
+       /* Mark r{6,7} precise.
+        * Get here in two states:
+        * - first:  r6{.id=0}, r7{.id=0} (cached state)
+        * - second: r6{.id=A}, r7{.id=A}
+        * Verifier considers such states equivalent.
+        * Thus "exit;" would be verified only once.
+        */
+       "r2 = r10;"
+       "r2 += r6;"
+       "r2 += r7;"
+       "exit;"
+       :
+       : __imm(bpf_ktime_get_ns)
+       : __clobber_all);
+}
+
 /* Check that two different scalar IDs in a verified state can't be
  * mapped to the same scalar ID in current state.
  */