Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf: Support can_loop/cond_break on big endian

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

authored by

Alexei Starovoitov and committed by
Daniel Borkmann
6870bdb3 98d7ca37

+28
+28
tools/testing/selftests/bpf/bpf_experimental.h
··· 351 351 l_continue:; \ 352 352 }) 353 353 #else 354 + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 354 355 #define can_loop \ 355 356 ({ __label__ l_break, l_continue; \ 356 357 bool ret = true; \ ··· 377 376 l_break: break; \ 378 377 l_continue:; \ 379 378 }) 379 + #else 380 + #define can_loop \ 381 + ({ __label__ l_break, l_continue; \ 382 + bool ret = true; \ 383 + asm volatile goto("1:.byte 0xe5; \ 384 + .byte 0; \ 385 + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ 386 + .short 0" \ 387 + :::: l_break); \ 388 + goto l_continue; \ 389 + l_break: ret = false; \ 390 + l_continue:; \ 391 + ret; \ 392 + }) 393 + 394 + #define cond_break \ 395 + ({ __label__ l_break, l_continue; \ 396 + asm volatile goto("1:.byte 0xe5; \ 397 + .byte 0; \ 398 + .long (((%l[l_break] - 1b - 8) / 8) & 0xffff) << 16; \ 399 + .short 0" \ 400 + :::: l_break); \ 401 + goto l_continue; \ 402 + l_break: break; \ 403 + l_continue:; \ 404 + }) 405 + #endif 380 406 #endif 381 407 382 408 #ifndef bpf_nop_mov