selftests/bpf: add CO-RE relocs ints tests
authorAndrii Nakryiko <andriin@fb.com>
Wed, 7 Aug 2019 21:40:00 +0000 (14:40 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 7 Aug 2019 21:43:49 +0000 (14:43 -0700)
Add various tests validating handling compatible/incompatible integer
types.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/core_reloc.c
tools/testing/selftests/bpf/progs/btf__core_reloc_ints.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___bool.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_bitfield.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_16.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_32.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_64.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_8.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/btf__core_reloc_ints___reverse_sign.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/core_reloc_types.h
tools/testing/selftests/bpf/progs/test_core_reloc_ints.c [new file with mode: 0644]

index 2cfe0bd..251ef8c 100644 (file)
        .output_len = sizeof(struct core_reloc_ptr_as_arr),             \
 }
 
+#define INTS_DATA(struct_name) STRUCT_TO_CHAR_PTR(struct_name) {       \
+       .u8_field = 1,                                                  \
+       .s8_field = 2,                                                  \
+       .u16_field = 3,                                                 \
+       .s16_field = 4,                                                 \
+       .u32_field = 5,                                                 \
+       .s32_field = 6,                                                 \
+       .u64_field = 7,                                                 \
+       .s64_field = 8,                                                 \
+}
+
+#define INTS_CASE_COMMON(name)                                         \
+       .case_name = #name,                                             \
+       .bpf_obj_file = "test_core_reloc_ints.o",                       \
+       .btf_src_file = "btf__core_reloc_" #name ".o"
+
+#define INTS_CASE(name) {                                              \
+       INTS_CASE_COMMON(name),                                         \
+       .input = INTS_DATA(core_reloc_##name),                          \
+       .input_len = sizeof(struct core_reloc_##name),                  \
+       .output = INTS_DATA(core_reloc_ints),                           \
+       .output_len = sizeof(struct core_reloc_ints),                   \
+}
+
+#define INTS_ERR_CASE(name) {                                          \
+       INTS_CASE_COMMON(name),                                         \
+       .fails = true,                                                  \
+}
+
 struct core_reloc_test_case {
        const char *case_name;
        const char *bpf_obj_file;
@@ -220,6 +249,17 @@ static struct core_reloc_test_case test_cases[] = {
        /* handling "ptr is an array" semantics */
        PTR_AS_ARR_CASE(ptr_as_arr),
        PTR_AS_ARR_CASE(ptr_as_arr___diff_sz),
+
+       /* int signedness/sizing/bitfield handling */
+       INTS_CASE(ints),
+       INTS_CASE(ints___bool),
+       INTS_CASE(ints___reverse_sign),
+
+       INTS_ERR_CASE(ints___err_bitfield),
+       INTS_ERR_CASE(ints___err_wrong_sz_8),
+       INTS_ERR_CASE(ints___err_wrong_sz_16),
+       INTS_ERR_CASE(ints___err_wrong_sz_32),
+       INTS_ERR_CASE(ints___err_wrong_sz_64),
 };
 
 struct data {
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints.c
new file mode 100644 (file)
index 0000000..7d0f041
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___bool.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___bool.c
new file mode 100644 (file)
index 0000000..f935945
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___bool x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_bitfield.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_bitfield.c
new file mode 100644 (file)
index 0000000..50369e8
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___err_bitfield x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_16.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_16.c
new file mode 100644 (file)
index 0000000..823bac1
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___err_wrong_sz_16 x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_32.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_32.c
new file mode 100644 (file)
index 0000000..b44f3be
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___err_wrong_sz_32 x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_64.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_64.c
new file mode 100644 (file)
index 0000000..9a3dd20
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___err_wrong_sz_64 x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_8.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___err_wrong_sz_8.c
new file mode 100644 (file)
index 0000000..9f11ef5
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___err_wrong_sz_8 x) {}
diff --git a/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___reverse_sign.c b/tools/testing/selftests/bpf/progs/btf__core_reloc_ints___reverse_sign.c
new file mode 100644 (file)
index 0000000..aafb1c5
--- /dev/null
@@ -0,0 +1,3 @@
+#include "core_reloc_types.h"
+
+void f(struct core_reloc_ints___reverse_sign x) {}
index c17c927..5f3ebd4 100644 (file)
@@ -1,3 +1,6 @@
+#include <stdint.h>
+#include <stdbool.h>
+
 /*
  * FLAVORS
  */
@@ -539,3 +542,101 @@ struct core_reloc_ptr_as_arr___diff_sz {
        char __some_more_padding;
        int a;
 };
+
+/*
+ * INTS
+ */
+struct core_reloc_ints {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field;
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+/* signed/unsigned types swap */
+struct core_reloc_ints___reverse_sign {
+       int8_t          u8_field;
+       uint8_t         s8_field;
+       int16_t         u16_field;
+       uint16_t        s16_field;
+       int32_t         u32_field;
+       uint32_t        s32_field;
+       int64_t         u64_field;
+       uint64_t        s64_field;
+};
+
+struct core_reloc_ints___bool {
+       bool            u8_field; /* bool instead of uint8 */
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field;
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+struct core_reloc_ints___err_bitfield {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field: 32; /* bitfields are not supported */
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+struct core_reloc_ints___err_wrong_sz_8 {
+       uint16_t        u8_field; /* not 8-bit anymore */
+       int16_t         s8_field; /* not 8-bit anymore */
+
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field;
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+struct core_reloc_ints___err_wrong_sz_16 {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+
+       uint32_t        u16_field; /* not 16-bit anymore */
+       int32_t         s16_field; /* not 16-bit anymore */
+
+       uint32_t        u32_field;
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+struct core_reloc_ints___err_wrong_sz_32 {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+
+       uint64_t        u32_field; /* not 32-bit anymore */
+       int64_t         s32_field; /* not 32-bit anymore */
+
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+struct core_reloc_ints___err_wrong_sz_64 {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field;
+       int32_t         s32_field;
+
+       uint32_t        u64_field; /* not 64-bit anymore */
+       int32_t         s64_field; /* not 64-bit anymore */
+};
diff --git a/tools/testing/selftests/bpf/progs/test_core_reloc_ints.c b/tools/testing/selftests/bpf/progs/test_core_reloc_ints.c
new file mode 100644 (file)
index 0000000..d99233c
--- /dev/null
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2019 Facebook
+
+#include <linux/bpf.h>
+#include <stdint.h>
+#include "bpf_helpers.h"
+
+char _license[] SEC("license") = "GPL";
+
+static volatile struct data {
+       char in[256];
+       char out[256];
+} data;
+
+struct core_reloc_ints {
+       uint8_t         u8_field;
+       int8_t          s8_field;
+       uint16_t        u16_field;
+       int16_t         s16_field;
+       uint32_t        u32_field;
+       int32_t         s32_field;
+       uint64_t        u64_field;
+       int64_t         s64_field;
+};
+
+SEC("raw_tracepoint/sys_enter")
+int test_core_ints(void *ctx)
+{
+       struct core_reloc_ints *in = (void *)&data.in;
+       struct core_reloc_ints *out = (void *)&data.out;
+
+       if (BPF_CORE_READ(&out->u8_field, &in->u8_field) ||
+           BPF_CORE_READ(&out->s8_field, &in->s8_field) ||
+           BPF_CORE_READ(&out->u16_field, &in->u16_field) ||
+           BPF_CORE_READ(&out->s16_field, &in->s16_field) ||
+           BPF_CORE_READ(&out->u32_field, &in->u32_field) ||
+           BPF_CORE_READ(&out->s32_field, &in->s32_field) ||
+           BPF_CORE_READ(&out->u64_field, &in->u64_field) ||
+           BPF_CORE_READ(&out->s64_field, &in->s64_field))
+               return 1;
+
+       return 0;
+}
+