bpf: Add bpf_nop_mov() asm macro.
authorAlexei Starovoitov <ast@kernel.org>
Tue, 26 Dec 2023 19:11:47 +0000 (11:11 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 3 Jan 2024 19:08:23 +0000 (11:08 -0800)
bpf_nop_mov(var) asm macro emits nop register move: rX = rX.
If 'var' is a scalar and not a fixed constant the verifier will assign ID to it.
If it's later spilled the stack slot will carry that ID as well.
Hence the range refining comparison "if rX < const" will update all copies
including spilled slot.
This macro is a temporary workaround until the verifier gets smarter.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20231226191148.48536-6-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/bpf_experimental.h

index 2ef9949fbd637e6491f38258f445b349c6e099f1..f44875f8b36780aba49f19700bac9562a4e06f4f 100644 (file)
@@ -323,6 +323,11 @@ l_true:                                                                                            \
        })
 #endif
 
+#ifndef bpf_nop_mov
+#define bpf_nop_mov(var) \
+       asm volatile("%[reg]=%[reg]"::[reg]"r"((short)var))
+#endif
+
 /* Description
  *     Assert that a conditional expression is true.
  * Returns