]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpf: Add cond_break macro
authorAlexei Starovoitov <ast@kernel.org>
Wed, 6 Mar 2024 03:19:28 +0000 (19:19 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 6 Mar 2024 23:18:04 +0000 (15:18 -0800)
Use may_goto instruction to implement cond_break macro.
Ideally the macro should be written as:
  asm volatile goto(".byte 0xe5;
                     .byte 0;
                     .short %l[l_break] ...
                     .long 0;
but LLVM doesn't recognize fixup of 2 byte PC relative yet.
Hence use
  asm volatile goto(".byte 0xe5;
                     .byte 0;
                     .long %l[l_break] ...
                     .short 0;
that produces correct asm on little endian.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Tested-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20240306031929.42666-4-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/bpf_experimental.h

index 0d749006d107577877e56a89f62af5e4492a585f..bc9a0832ae725a50af1c504e480bae3a3d485e82 100644 (file)
@@ -326,6 +326,18 @@ l_true:                                                                                            \
        })
 #endif
 
+#define cond_break                                     \
+       ({ __label__ l_break, l_continue;               \
+        asm volatile goto("1:.byte 0xe5;                       \
+                     .byte 0;                          \
+                     .long ((%l[l_break] - 1b - 8) / 8) & 0xffff;      \
+                     .short 0"                         \
+                     :::: l_break);                    \
+       goto l_continue;                                \
+       l_break: break;                                 \
+       l_continue:;                                    \
+       })
+
 #ifndef bpf_nop_mov
 #define bpf_nop_mov(var) \
        asm volatile("%[reg]=%[reg]"::[reg]"r"((short)var))