Message ID | 20200630060739.1722733-3-andriin@fb.com |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | Make bpf_endian.h compatible with vmlinux.h | expand |
On 6/30/20 8:07 AM, Andrii Nakryiko wrote: > Add simple selftest validating byte swap built-ins and compile-time macros. > > Signed-off-by: Andrii Nakryiko <andriin@fb.com> > --- > .../testing/selftests/bpf/prog_tests/endian.c | 53 +++++++++++++++++++ > .../testing/selftests/bpf/progs/test_endian.c | 37 +++++++++++++ > 2 files changed, 90 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/endian.c > create mode 100644 tools/testing/selftests/bpf/progs/test_endian.c This fails the build for me with: [...] GEN-SKEL [test_progs] tailcall3.skel.h GEN-SKEL [test_progs] test_endian.skel.h libbpf: invalid relo for 'const16' in special section 0xfff2; forgot to initialize global var?.. Error: failed to open BPF object file: 0 Makefile:372: recipe for target '/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h' failed make: *** [/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h] Error 255 make: *** Deleting file '/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h'
On Tue, Jun 30, 2020 at 7:09 AM Daniel Borkmann <daniel@iogearbox.net> wrote: > > On 6/30/20 8:07 AM, Andrii Nakryiko wrote: > > Add simple selftest validating byte swap built-ins and compile-time macros. > > > > Signed-off-by: Andrii Nakryiko <andriin@fb.com> > > --- > > .../testing/selftests/bpf/prog_tests/endian.c | 53 +++++++++++++++++++ > > .../testing/selftests/bpf/progs/test_endian.c | 37 +++++++++++++ > > 2 files changed, 90 insertions(+) > > create mode 100644 tools/testing/selftests/bpf/prog_tests/endian.c > > create mode 100644 tools/testing/selftests/bpf/progs/test_endian.c > > This fails the build for me with: > > [...] > GEN-SKEL [test_progs] tailcall3.skel.h > GEN-SKEL [test_progs] test_endian.skel.h > libbpf: invalid relo for 'const16' in special section 0xfff2; forgot to initialize global var?.. > Error: failed to open BPF object file: 0 > Makefile:372: recipe for target '/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h' failed > make: *** [/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h] Error 255 > make: *** Deleting file '/root/bpf-next/tools/testing/selftests/bpf/test_endian.skel.h' Interesting. You must have a bit of an older Clang. I noticed people submit code without explicit initialization of global variables, which is ok now, because I think Clang doesn't emit it into the COM section anymore. I'm surprised you don't get other compilation errors. But regardless, I'll respin with explicit zero-initialization to fix this.
diff --git a/tools/testing/selftests/bpf/prog_tests/endian.c b/tools/testing/selftests/bpf/prog_tests/endian.c new file mode 100644 index 000000000000..1a11612ace6c --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/endian.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020 Facebook */ + +#include <test_progs.h> +#include "test_endian.skel.h" + +static int duration; + +#define IN16 0x1234 +#define IN32 0x12345678U +#define IN64 0x123456789abcdef0ULL + +#define OUT16 0x3412 +#define OUT32 0x78563412U +#define OUT64 0xf0debc9a78563412ULL + +void test_endian(void) +{ + struct test_endian* skel; + struct test_endian__bss *bss; + int err; + + skel = test_endian__open_and_load(); + if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) + return; + bss = skel->bss; + + bss->in16 = IN16; + bss->in32 = IN32; + bss->in64 = IN64; + + err = test_endian__attach(skel); + if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err)) + goto cleanup; + + usleep(1); + + CHECK(bss->out16 != OUT16, "out16", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->out16, (__u64)OUT16); + CHECK(bss->out32 != OUT32, "out32", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->out32, (__u64)OUT32); + CHECK(bss->out64 != OUT64, "out16", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->out64, (__u64)OUT64); + + CHECK(bss->const16 != OUT16, "const16", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->const16, (__u64)OUT16); + CHECK(bss->const32 != OUT32, "const32", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->const32, (__u64)OUT32); + CHECK(bss->const64 != OUT64, "const64", "got 0x%llx != exp 0x%llx\n", + (__u64)bss->const64, (__u64)OUT64); +cleanup: + test_endian__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/progs/test_endian.c b/tools/testing/selftests/bpf/progs/test_endian.c new file mode 100644 index 000000000000..1d37d93102a7 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_endian.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2020 Facebook */ + +#include "vmlinux.h" +#include <bpf/bpf_helpers.h> +#include <bpf/bpf_endian.h> + +#define IN16 0x1234 +#define IN32 0x12345678U +#define IN64 0x123456789abcdef0ULL + +__u16 in16; +__u32 in32; +__u64 in64; + +__u16 out16; +__u32 out32; +__u64 out64; + +__u16 const16; +__u32 const32; +__u64 const64; + +SEC("raw_tp/sys_enter") +int sys_enter(const void *ctx) +{ + out16 = __builtin_bswap16(in16); + out32 = __builtin_bswap32(in32); + out64 = __builtin_bswap64(in64); + const16 = ___bpf_swab16(IN16); + const32 = ___bpf_swab32(IN32); + const64 = ___bpf_swab64(IN64); + + return 0; +} + +char _license[] SEC("license") = "GPL";
Add simple selftest validating byte swap built-ins and compile-time macros. Signed-off-by: Andrii Nakryiko <andriin@fb.com> --- .../testing/selftests/bpf/prog_tests/endian.c | 53 +++++++++++++++++++ .../testing/selftests/bpf/progs/test_endian.c | 37 +++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/endian.c create mode 100644 tools/testing/selftests/bpf/progs/test_endian.c