]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
bpf: Support can_loop/cond_break on big endian
authorAlexei Starovoitov <ast@kernel.org>
Thu, 13 Jun 2024 01:38:14 +0000 (18:38 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 14 Jun 2024 19:52:40 +0000 (21:52 +0200)
Add big endian support for can_loop/cond_break macros.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20240613013815.953-4-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/bpf_experimental.h

index 8ee7a00b7c8289c6702c82f6caec48e78ab47265..eede6fc2ccb4043d78591046a0e2bc7c09c014d5 100644 (file)
@@ -351,6 +351,7 @@ l_true:                                                                                             \
        l_continue:;                                    \
        })
 #else
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
 #define can_loop                                       \
        ({ __label__ l_break, l_continue;               \
        bool ret = true;                                \
@@ -376,6 +377,33 @@ l_true:                                                                                            \
        l_break: break;                                 \
        l_continue:;                                    \
        })
+#else
+#define can_loop                                       \
+       ({ __label__ l_break, l_continue;               \
+       bool ret = true;                                \
+       asm volatile goto("1:.byte 0xe5;                \
+                     .byte 0;                          \
+                     .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16;      \
+                     .short 0"                         \
+                     :::: l_break);                    \
+       goto l_continue;                                \
+       l_break: ret = false;                           \
+       l_continue:;                                    \
+       ret;                                            \
+       })
+
+#define cond_break                                     \
+       ({ __label__ l_break, l_continue;               \
+       asm volatile goto("1:.byte 0xe5;                \
+                     .byte 0;                          \
+                     .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16;      \
+                     .short 0"                         \
+                     :::: l_break);                    \
+       goto l_continue;                                \
+       l_break: break;                                 \
+       l_continue:;                                    \
+       })
+#endif
 #endif
 
 #ifndef bpf_nop_mov