* [PATCH bpf-next v4 3/3] selftests/bpf: Cover enum signedness in data dumps and map fields
2026-11-07 2:07 [PATCH bpf-next v4 0/3] Normalize enum values in libbpf and bpftool Hungyu Lin
2026-11-07 2:07 ` [PATCH bpf-next v4 1/3] libbpf: Normalize enum values according to signedness Hungyu Lin
2026-11-07 2:07 ` [PATCH bpf-next v4 2/3] bpftool: Preserve unsigned enum values in data dumps Hungyu Lin
@ 2026-11-07 2:07 ` Hungyu Lin
2026-11-07 2:47 ` bot+bpf-ci
2026-11-07 3:46 ` [PATCH bpf-next v4 0/3] Normalize enum values in libbpf and bpftool Alexei Starovoitov
3 siblings, 1 reply; 6+ messages in thread
From: Hungyu Lin @ 2026-11-07 2:07 UTC (permalink / raw)
To: ast, bpf
Cc: andrii, qmo, daniel, yonghong.song, eddyz87, ihor.solodrai,
shuah, linux-kselftest, linux-kernel, Hungyu Lin
Exercise unsigned enum values with their high bit set and signed
controls through libbpf's data dumper. Include ordinary enums stored in
eight bytes and check that wider data cannot match an enumerator only
through its low 32 bits.
Extend bpftool_map_dump with BTF-backed array maps and check both JSON
and plain output. Cover narrow unsigned names, signed and unsigned
numeric output, wider ordinary enums and unmatched ENUM64 values.
Initialize map data at its actual width so the stored bytes match the
value width on big-endian hosts.
Also use an open-only arena skeleton to check an enum-backed map_extra
value with bit 31 set. The object is not loaded into the kernel, so the
test needs neither arena support nor mmap.
Suggested-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Quentin Monnet <qmo@kernel.org>
Signed-off-by: Hungyu Lin <dennylin0707@gmail.com>
---
Changes in v4:
- Remove legacy-name and ambiguous narrow-alias cases, following the
decision to rely on kflag.
- Add an open-only skeleton test for the map_extra parser.
- Remove four unrelated libbpf numeric-fallback cases.
.../bpf/prog_tests/bpftool_map_dump.c | 162 ++++++++++++++++++
.../selftests/bpf/prog_tests/btf_dump.c | 77 +++++++++
| 19 ++
| 12 ++
4 files changed, 270 insertions(+)
create mode 100644 tools/testing/selftests/bpf/prog_tests/map_extra.c
create mode 100644 tools/testing/selftests/bpf/progs/test_map_extra.c
diff --git a/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c b/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
index 187b3f784307..8002c24d02de 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
@@ -7,6 +7,7 @@
#define PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_sk_storage"
#define QUEUE_PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_queue"
+#define ENUM_PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_enum"
#define JSON_ERROR "{\"error\":\"can't dump sk_storage map"
/* An empty socket storage map with an int value. */
@@ -124,10 +125,171 @@ static void test_queue(void)
close(map_fd);
}
+enum enum_dump_kind {
+ DUMP_ENUM_UNSIGNED,
+ DUMP_ENUM_SIGNED,
+ DUMP_ENUM64_UNSIGNED,
+ DUMP_ENUM64_SIGNED,
+};
+
+struct enum_dump_test {
+ const char *name;
+ enum enum_dump_kind kind;
+ __u32 size;
+ __u64 value;
+ const char *expected;
+};
+
+static const struct enum_dump_test enum_dump_tests[] = {
+ { "enum_u8_name", DUMP_ENUM_UNSIGNED, 1, 0xff, "\"MAX\"" },
+ { "enum_u8_unknown", DUMP_ENUM_UNSIGNED, 1, (__u64)-22, "234" },
+ { "enum_u16_name", DUMP_ENUM_UNSIGNED, 2, 0xffff, "\"MAX\"" },
+ { "enum_u16_unknown", DUMP_ENUM_UNSIGNED, 2, (__u64)-22, "65514" },
+ { "enum_u32_high", DUMP_ENUM_UNSIGNED, 4, 0x80000000, "\"HIGH\"" },
+ { "enum_u32_max", DUMP_ENUM_UNSIGNED, 4, 0xffffffff, "\"MAX\"" },
+ { "enum_u32_unknown", DUMP_ENUM_UNSIGNED, 4, (__u64)-22, "4294967274" },
+ { "enum_s8_name", DUMP_ENUM_SIGNED, 1, (__u64)-1, "\"NEG\"" },
+ { "enum_s8_unknown", DUMP_ENUM_SIGNED, 1, (__u64)-22, "-22" },
+ { "enum_s16_name", DUMP_ENUM_SIGNED, 2, (__u64)-1, "\"NEG\"" },
+ { "enum_s32_name", DUMP_ENUM_SIGNED, 4, (__u64)-1, "\"NEG\"" },
+ { "enum_s32_unknown", DUMP_ENUM_SIGNED, 4, (__u64)-22, "-22" },
+ { "enum_wide_name", DUMP_ENUM_UNSIGNED, 8, 0xffffffff, "\"MAX\"" },
+ { "enum_wide_unknown", DUMP_ENUM_UNSIGNED, 8, 0x1ffffffffULL, "8589934591" },
+ { "enum64_unsigned", DUMP_ENUM64_UNSIGNED, 8, (1ULL << 63) | 1,
+ "9223372036854775809" },
+ { "enum64_signed", DUMP_ENUM64_SIGNED, 8, (__u64)-22, "-22" },
+};
+
+static int add_enum_dump_values(struct btf *btf, const struct enum_dump_test *test)
+{
+ __u64 max = test->size == 1 ? 0xff : test->size == 2 ? 0xffff : 0xffffffff;
+ int err;
+
+ switch (test->kind) {
+ case DUMP_ENUM_UNSIGNED:
+ err = btf__add_enum_value(btf, "HIGH", (max >> 1) + 1);
+ return err ?: btf__add_enum_value(btf, "MAX", max);
+ case DUMP_ENUM_SIGNED:
+ return btf__add_enum_value(btf, "NEG", -1);
+ case DUMP_ENUM64_UNSIGNED:
+ err = btf__add_enum64_value(btf, "HIGH", 1ULL << 63);
+ return err ?: btf__add_enum64_value(btf, "LOW", 1);
+ case DUMP_ENUM64_SIGNED:
+ return btf__add_enum64_value(btf, "NEG", (__u64)-1);
+ default:
+ return -EINVAL;
+ }
+}
+
+static int create_enum_dump_map(const struct enum_dump_test *test)
+{
+ LIBBPF_OPTS(bpf_map_create_opts, opts);
+ bool enum64 = test->kind == DUMP_ENUM64_UNSIGNED ||
+ test->kind == DUMP_ENUM64_SIGNED;
+ struct btf *btf;
+ int key_id, value_id, fd = -1;
+
+ btf = btf__new_empty();
+ if (!ASSERT_OK_PTR(btf, "btf__new_empty"))
+ return -1;
+
+ key_id = btf__add_int(btf, "int", 4, BTF_INT_SIGNED);
+ if (!ASSERT_GT(key_id, 0, "btf__add_int"))
+ goto out;
+ if (enum64)
+ value_id = btf__add_enum64(btf, "enum_value", test->size,
+ test->kind == DUMP_ENUM64_SIGNED);
+ else
+ value_id = btf__add_enum(btf, "enum_value", test->size);
+ if (!ASSERT_GT(value_id, 0, "add enum"))
+ goto out;
+ if (!ASSERT_OK(add_enum_dump_values(btf, test), "add enum values"))
+ goto out;
+ if (!ASSERT_OK(btf__load_into_kernel(btf), "btf__load_into_kernel"))
+ goto out;
+
+ opts.btf_fd = btf__fd(btf);
+ opts.btf_key_type_id = key_id;
+ opts.btf_value_type_id = value_id;
+ fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "enum_dump", sizeof(__u32),
+ test->size, 1, &opts);
+ ASSERT_OK_FD(fd, "bpf_map_create");
+out:
+ btf__free(btf);
+ return fd;
+}
+
+static void test_enum_dump(const struct enum_dump_test *test)
+{
+ union {
+ __u8 val8;
+ __u16 val16;
+ __u32 val32;
+ __u64 val64;
+ } value;
+ char output[1024] = {}, expected[128];
+ __u32 key = 0;
+ int map_fd, ret;
+
+ /* Store the value at its native width, including on big-endian hosts. */
+ switch (test->size) {
+ case 1:
+ value.val8 = (__u8)test->value;
+ break;
+ case 2:
+ value.val16 = (__u16)test->value;
+ break;
+ case 4:
+ value.val32 = (__u32)test->value;
+ break;
+ case 8:
+ value.val64 = test->value;
+ break;
+ default:
+ PRINT_FAIL("unexpected enum size %u (expected 1, 2, 4 or 8)\n", test->size);
+ return;
+ }
+
+ map_fd = create_enum_dump_map(test);
+ if (map_fd < 0)
+ return;
+ if (!ASSERT_OK(bpf_map_update_elem(map_fd, &key, &value, BPF_ANY),
+ "update enum value"))
+ goto out;
+ if (!ASSERT_OK(bpf_obj_pin(map_fd, ENUM_PIN_PATH), "pin enum map"))
+ goto out;
+
+ ret = get_bpftool_command_output("-j map dump pinned " ENUM_PIN_PATH,
+ output, sizeof(output));
+ if (!ASSERT_OK(ret, "json enum dump"))
+ goto out;
+ snprintf(expected, sizeof(expected), "\"formatted\":{\"key\":0,\"value\":%s}",
+ test->expected);
+ ASSERT_HAS_SUBSTR(output, expected, "json enum value");
+
+ memset(output, 0, sizeof(output));
+ ret = get_bpftool_command_output("map dump pinned " ENUM_PIN_PATH,
+ output, sizeof(output));
+ if (!ASSERT_OK(ret, "plain enum dump"))
+ goto out;
+ snprintf(expected, sizeof(expected), "\"value\": %s\n", test->expected);
+ ASSERT_HAS_SUBSTR(output, expected, "plain enum value");
+out:
+ unlink(ENUM_PIN_PATH);
+ close(map_fd);
+}
+
void test_bpftool_map_dump(void)
{
+ size_t i;
+
if (test__start_subtest("sk_storage"))
test_sk_storage();
if (test__start_subtest("queue"))
test_queue();
+
+ for (i = 0; i < ARRAY_SIZE(enum_dump_tests); i++) {
+ if (test__start_subtest(enum_dump_tests[i].name))
+ test_enum_dump(&enum_dump_tests[i]);
+ }
}
diff --git a/tools/testing/selftests/bpf/prog_tests/btf_dump.c b/tools/testing/selftests/bpf/prog_tests/btf_dump.c
index bfa74db17987..b2af060fe5b5 100644
--- a/tools/testing/selftests/bpf/prog_tests/btf_dump.c
+++ b/tools/testing/selftests/bpf/prog_tests/btf_dump.c
@@ -977,6 +977,80 @@ static void test_btf_dump_enum_data(struct btf *btf, struct btf_dump *d,
sizeof(enum bpf_cmd) - 1, "", BPF_MAP_CREATE);
}
+static void test_btf_dump_enum_values(void)
+{
+ LIBBPF_OPTS(btf_dump_type_data_opts, opts,
+ .compact = true,
+ .skip_names = true);
+ struct {
+ const char *name;
+ __u32 size;
+ __s64 enum_value;
+ union {
+ __u8 u8;
+ __u16 u16;
+ __u32 u32;
+ __u64 u64;
+ } data;
+ const char *expected;
+ } cases[] = {
+ { "unsigned_byte", 1, 0xff, { .u8 = 0xff }, "VALUE" },
+ { "unsigned_short", 2, 0xffff, { .u16 = 0xffff }, "VALUE" },
+ { "unsigned_high", 4, 0x80000000LL,
+ { .u32 = 0x80000000U }, "VALUE" },
+ { "unsigned_max", 4, 0xffffffffLL,
+ { .u32 = 0xffffffffU }, "VALUE" },
+ { "signed_value", 4, -1, { .u32 = (__u32)-1 }, "VALUE" },
+ { "unsigned_wide", 8, 0xffffffffLL,
+ { .u64 = 0xffffffffULL }, "VALUE" },
+ /*
+ * Wider data must not match an enumerator through its low 32 bits.
+ * Check numeric output without requiring an exact value.
+ */
+ { "wide_unknown", 8, 0xffffffffLL,
+ { .u64 = 0x1ffffffffULL }, NULL },
+ };
+ struct btf_dump *d;
+ struct btf *btf;
+ int ids[ARRAY_SIZE(cases)];
+ char str[STRSIZE];
+ int err, i;
+
+ btf = btf__new_empty();
+ if (!ASSERT_OK_PTR(btf, "new_empty"))
+ return;
+ for (i = 0; i < ARRAY_SIZE(cases); i++) {
+ ids[i] = btf__add_enum(btf, cases[i].name, cases[i].size);
+ if (!ASSERT_GT(ids[i], 0, "add_enum"))
+ goto free_btf;
+ err = btf__add_enum_value(btf, "VALUE", cases[i].enum_value);
+ if (!ASSERT_OK(err, "add_enum_value"))
+ goto free_btf;
+ }
+
+ d = btf_dump__new(btf, btf_dump_snprintf, str, NULL);
+ if (!ASSERT_OK_PTR(d, "btf_dump__new"))
+ goto free_btf;
+
+ for (i = 0; i < ARRAY_SIZE(cases); i++) {
+ str[0] = '\0';
+ err = btf_dump__dump_type_data(d, ids[i], &cases[i].data,
+ cases[i].size, &opts);
+ ASSERT_EQ(err, cases[i].size, cases[i].name);
+ if (cases[i].expected) {
+ ASSERT_STREQ(str, cases[i].expected, cases[i].name);
+ } else {
+ ASSERT_NEQ(str[0], '\0', cases[i].name);
+ ASSERT_EQ(strspn(str, "0123456789"), strlen(str),
+ cases[i].name);
+ }
+ }
+
+ btf_dump__free(d);
+free_btf:
+ btf__free(btf);
+}
+
static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
char *str)
{
@@ -1421,6 +1495,9 @@ void test_btf_dump() {
if (test__start_subtest("btf_dump: type_tags"))
test_btf_dump_type_tags();
+ if (test__start_subtest("btf_dump: enum_values"))
+ test_btf_dump_enum_values();
+
btf = libbpf_find_kernel_btf();
if (!ASSERT_OK_PTR(btf, "no kernel BTF found"))
return;
--git a/tools/testing/selftests/bpf/prog_tests/map_extra.c b/tools/testing/selftests/bpf/prog_tests/map_extra.c
new file mode 100644
index 000000000000..cbb1881ba693
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/map_extra.c
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+#include "test_map_extra.skel.h"
+
+void test_map_extra(void)
+{
+ struct test_map_extra *skel;
+
+ if (!test__start_subtest("enum32_high"))
+ return;
+
+ skel = test_map_extra__open();
+ if (!ASSERT_OK_PTR(skel, "test_map_extra__open"))
+ return;
+
+ ASSERT_EQ(bpf_map__map_extra(skel->maps.arena), 0x80000000ULL,
+ "map_extra");
+ test_map_extra__destroy(skel);
+}
--git a/tools/testing/selftests/bpf/progs/test_map_extra.c b/tools/testing/selftests/bpf/progs/test_map_extra.c
new file mode 100644
index 000000000000..b6aa2341c115
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/test_map_extra.c
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/bpf.h>
+#include <bpf/bpf_helpers.h>
+
+struct {
+ __uint(type, BPF_MAP_TYPE_ARENA);
+ __uint(map_flags, BPF_F_MMAPABLE);
+ __uint(max_entries, 1);
+ __ulong(map_extra, 0x80000000U);
+} arena SEC(".maps");
+
+char LICENSE[] SEC("license") = "GPL";
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH bpf-next v4 0/3] Normalize enum values in libbpf and bpftool
2026-11-07 2:07 [PATCH bpf-next v4 0/3] Normalize enum values in libbpf and bpftool Hungyu Lin
` (2 preceding siblings ...)
2026-11-07 2:07 ` [PATCH bpf-next v4 3/3] selftests/bpf: Cover enum signedness in data dumps and map fields Hungyu Lin
@ 2026-11-07 3:46 ` Alexei Starovoitov
3 siblings, 0 replies; 6+ messages in thread
From: Alexei Starovoitov @ 2026-11-07 3:46 UTC (permalink / raw)
To: Hungyu Lin, bpf
Cc: andrii, qmo, daniel, yonghong.song, eddyz87, ihor.solodrai,
shuah, linux-kselftest, linux-kernel
On Fri, Nov 06, 2026 at 06:07 PM Hungyu Lin <dennylin0707@gmail.com> wrote:
> .../bpf/prog_tests/bpftool_map_dump.c | 162 ++++++++++++++++++
> .../selftests/bpf/prog_tests/btf_dump.c | 77 +++++++++
> .../selftests/bpf/prog_tests/map_extra.c | 19 ++
> .../selftests/bpf/progs/test_map_extra.c | 12 ++
> 8 files changed, 293 insertions(+), 10 deletions(-)
selftest are growing too fast.
16 subtests create 16 maps and run bpftool 32 times.
9 of the 16 pass without the fix.
Plain and json output come from the same btf_dumper_enum().
One map with a struct of four enums and one run of bpftool are enough.
The btf_dump.c part below is the test from my reply to the libbpf patch.
Keep patches 1 and 2. Keep the map_extra test.
Instead of the other two files of patch 3 (not even compile tested):
diff --git a/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c b/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
index 187b3f7..1c581db 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpftool_map_dump.c
@@ -7,6 +7,7 @@
#define PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_sk_storage"
#define QUEUE_PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_queue"
+#define ENUM_PIN_PATH "/sys/fs/bpf/test_bpftool_map_dump_enum"
#define JSON_ERROR "{\"error\":\"can't dump sk_storage map"
/* An empty socket storage map with an int value. */
@@ -124,10 +125,85 @@ out:
close(map_fd);
}
+struct enums {
+ __u8 u8_name;
+ __s8 s8_name;
+ __u32 u32_num;
+ __u64 u64_num;
+};
+
+/* An array map. Its value is struct enums with an enum behind every member. */
+static int create_enum_map(void)
+{
+ LIBBPF_OPTS(bpf_map_create_opts, opts);
+ struct btf *btf;
+ int fd = -1;
+
+ btf = btf__new_empty();
+ if (!ASSERT_OK_PTR(btf, "btf__new_empty"))
+ return -1;
+
+ btf__add_int(btf, "int", 4, BTF_INT_SIGNED); /* [1] */
+ btf__add_enum(btf, "u8", 1); /* [2] */
+ btf__add_enum_value(btf, "U8_MAX", 0xff);
+ btf__add_enum(btf, "s8", 1); /* [3] */
+ btf__add_enum_value(btf, "S8_NEG", -1);
+ btf__add_enum(btf, "u32", 4); /* [4] */
+ btf__add_enum_value(btf, "U32_ONE", 1);
+ btf__add_enum64(btf, "u64", 8, false); /* [5] */
+ btf__add_enum64_value(btf, "U64_ONE", 1);
+ btf__add_struct(btf, "enums", sizeof(struct enums)); /* [6] */
+ btf__add_field(btf, "u8_name", 2, 0, 0);
+ btf__add_field(btf, "s8_name", 3, 8, 0);
+ btf__add_field(btf, "u32_num", 4, 32, 0);
+ btf__add_field(btf, "u64_num", 5, 64, 0);
+ if (!ASSERT_OK(btf__load_into_kernel(btf), "btf__load_into_kernel"))
+ goto out;
+
+ opts.btf_fd = btf__fd(btf);
+ opts.btf_key_type_id = 1;
+ opts.btf_value_type_id = 6;
+ fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "enums", sizeof(int),
+ sizeof(struct enums), 1, &opts);
+ ASSERT_OK_FD(fd, "bpf_map_create");
+out:
+ btf__free(btf);
+ return fd;
+}
+
+static void test_enum(void)
+{
+ struct enums value = { 0xff, -1, (__u32)-22, (1ULL << 63) | 1 };
+ char output[1024] = {};
+ int map_fd, key = 0, ret;
+
+ map_fd = create_enum_map();
+ if (map_fd < 0)
+ return;
+ if (!ASSERT_OK(bpf_map_update_elem(map_fd, &key, &value, BPF_ANY),
+ "update map"))
+ goto out;
+ if (!ASSERT_OK(bpf_obj_pin(map_fd, ENUM_PIN_PATH), "pin map"))
+ goto out;
+
+ ret = get_bpftool_command_output("-j map dump pinned " ENUM_PIN_PATH,
+ output, sizeof(output));
+ ASSERT_OK(ret, "json dump");
+ ASSERT_HAS_SUBSTR(output,
+ "{\"u8_name\":\"U8_MAX\",\"s8_name\":\"S8_NEG\","
+ "\"u32_num\":4294967274,\"u64_num\":9223372036854775809}",
+ "enum values");
+out:
+ unlink(ENUM_PIN_PATH);
+ close(map_fd);
+}
+
void test_bpftool_map_dump(void)
{
if (test__start_subtest("sk_storage"))
test_sk_storage();
if (test__start_subtest("queue"))
test_queue();
+ if (test__start_subtest("enum"))
+ test_enum();
}
diff --git a/tools/testing/selftests/bpf/prog_tests/btf_dump.c b/tools/testing/selftests/bpf/prog_tests/btf_dump.c
index bfa74db..f126fe3 100644
--- a/tools/testing/selftests/bpf/prog_tests/btf_dump.c
+++ b/tools/testing/selftests/bpf/prog_tests/btf_dump.c
@@ -944,6 +944,9 @@ static void test_btf_dump_typedef_data(struct btf *btf, struct btf_dump *d,
static void test_btf_dump_enum_data(struct btf *btf, struct btf_dump *d,
char *str)
{
+ __u32 high = 0x80000000;
+ __s32 neg = -1;
+
/* enum where enum value does (and does not) exist */
TEST_BTF_DUMP_DATA_C(btf, d, "enum", str, enum bpf_cmd, BTF_F_COMPACT,
BPF_MAP_CREATE);
@@ -975,6 +978,22 @@ static void test_btf_dump_enum_data(struct btf *btf, struct btf_dump *d,
TEST_BTF_DUMP_DATA_OVER(btf, d, "enum", str, enum bpf_cmd,
sizeof(enum bpf_cmd) - 1, "", BPF_MAP_CREATE);
+
+ /* enumerators with bit 31 set in unsigned and in signed enum */
+ ASSERT_GT(btf__add_enum(btf, "test_enum_u32", 4), 0, "add unsigned enum");
+ ASSERT_OK(btf__add_enum_value(btf, "TEST_ENUM_HIGH", 0x80000000), "add TEST_ENUM_HIGH");
+ ASSERT_GT(btf__add_enum(btf, "test_enum_s32", 4), 0, "add signed enum");
+ ASSERT_OK(btf__add_enum_value(btf, "TEST_ENUM_NEG", -1), "add TEST_ENUM_NEG");
+
+ /* btf_dump__dump_type_data() doesn't resize 'd' for the new types */
+ d = btf_dump__new(btf, btf_dump_snprintf, str, NULL);
+ if (!ASSERT_OK_PTR(d, "btf_dump__new"))
+ return;
+ ASSERT_OK(btf_dump_data(btf, d, "test_enum_u32", NULL, 0, &high, 4, str,
+ "(enum test_enum_u32)TEST_ENUM_HIGH"), "dump unsigned enum");
+ ASSERT_OK(btf_dump_data(btf, d, "test_enum_s32", NULL, 0, &neg, 4, str,
+ "(enum test_enum_s32)TEST_ENUM_NEG"), "dump signed enum");
+ btf_dump__free(d);
}
static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
pw-bot: cr
^ permalink raw reply [flat|nested] 6+ messages in thread