aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c
diff options
context:
space:
mode:
authorAndrii Nakryiko <andriin@fb.com>2019-11-01 15:28:09 -0700
committerDaniel Borkmann <daniel@iogearbox.net>2019-11-04 16:06:56 +0100
commit8b1cb1c9601f835c025af5b3cf0e98c8048ad30b (patch)
tree85f2c8256c7046b8cfdb1d52182c4ae064f6f690 /tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c
parentlibbpf: Add support for field size relocations (diff)
downloadlinux-dev-8b1cb1c9601f835c025af5b3cf0e98c8048ad30b.tar.xz
linux-dev-8b1cb1c9601f835c025af5b3cf0e98c8048ad30b.zip
selftest/bpf: Add relocatable bitfield reading tests
Add a bunch of selftests verifying correctness of relocatable bitfield reading support in libbpf. Both bpf_probe_read()-based and direct read-based bitfield macros are tested. core_reloc.c "test_harness" is extended to support raw tracepoint and new typed raw tracepoints as test BPF program types. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20191101222810.1246166-5-andriin@fb.com
Diffstat (limited to 'tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c')
-rw-r--r--tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c b/tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c
new file mode 100644
index 000000000000..a381f8ac2419
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_core_reloc_bitfields_probed.c
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2019 Facebook
+
+#include <linux/bpf.h>
+#include <stdint.h>
+#include "bpf_helpers.h"
+#include "bpf_core_read.h"
+
+char _license[] SEC("license") = "GPL";
+
+static volatile struct data {
+ char in[256];
+ char out[256];
+} data;
+
+struct core_reloc_bitfields {
+ /* unsigned bitfields */
+ uint8_t ub1: 1;
+ uint8_t ub2: 2;
+ uint32_t ub7: 7;
+ /* signed bitfields */
+ int8_t sb4: 4;
+ int32_t sb20: 20;
+ /* non-bitfields */
+ uint32_t u32;
+ int32_t s32;
+};
+
+/* bitfield read results, all as plain integers */
+struct core_reloc_bitfields_output {
+ int64_t ub1;
+ int64_t ub2;
+ int64_t ub7;
+ int64_t sb4;
+ int64_t sb20;
+ int64_t u32;
+ int64_t s32;
+};
+
+#define TRANSFER_BITFIELD(in, out, field) \
+ if (BPF_CORE_READ_BITFIELD_PROBED(in, field, &res)) \
+ return 1; \
+ out->field = res
+
+SEC("raw_tracepoint/sys_enter")
+int test_core_bitfields(void *ctx)
+{
+ struct core_reloc_bitfields *in = (void *)&data.in;
+ struct core_reloc_bitfields_output *out = (void *)&data.out;
+ uint64_t res;
+
+ TRANSFER_BITFIELD(in, out, ub1);
+ TRANSFER_BITFIELD(in, out, ub2);
+ TRANSFER_BITFIELD(in, out, ub7);
+ TRANSFER_BITFIELD(in, out, sb4);
+ TRANSFER_BITFIELD(in, out, sb20);
+ TRANSFER_BITFIELD(in, out, u32);
+ TRANSFER_BITFIELD(in, out, s32);
+
+ return 0;
+}
+