selftests/bpf: Add few corner cases to test padding handling of btf_dump
authorAndrii Nakryiko <andrii@kernel.org>
Mon, 12 Dec 2022 21:15:05 +0000 (13:15 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Apr 2023 10:10:57 +0000 (12:10 +0200)
[ Upstream commit b148c8b9b926e257a59c8eb2cd6fa3adfd443254 ]

Add few hand-crafted cases and few randomized cases found using script
from [0] that tests btf_dump's padding logic.

  [0] https://lore.kernel.org/bpf/85f83c333f5355c8ac026f835b18d15060725fcb.camel@ericsson.com/

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20221212211505.558851-7-andrii@kernel.org
Stable-dep-of: 4fb877aaa179 ("libbpf: Fix btf_dump's packed struct determination")
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/testing/selftests/bpf/progs/btf_dump_test_case_packing.c
tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c

index e304b62..5c6c62f 100644 (file)
@@ -58,7 +58,64 @@ union jump_code_union {
        } __attribute__((packed));
 };
 
-/*------ END-EXPECTED-OUTPUT ------ */
+/* ----- START-EXPECTED-OUTPUT ----- */
+/*
+ *struct nested_packed_but_aligned_struct {
+ *     int x1;
+ *     int x2;
+ *};
+ *
+ *struct outer_implicitly_packed_struct {
+ *     char y1;
+ *     struct nested_packed_but_aligned_struct y2;
+ *} __attribute__((packed));
+ *
+ */
+/* ------ END-EXPECTED-OUTPUT ------ */
+
+struct nested_packed_but_aligned_struct {
+       int x1;
+       int x2;
+} __attribute__((packed));
+
+struct outer_implicitly_packed_struct {
+       char y1;
+       struct nested_packed_but_aligned_struct y2;
+};
+/* ----- START-EXPECTED-OUTPUT ----- */
+/*
+ *struct usb_ss_ep_comp_descriptor {
+ *     char: 8;
+ *     char bDescriptorType;
+ *     char bMaxBurst;
+ *     short wBytesPerInterval;
+ *};
+ *
+ *struct usb_host_endpoint {
+ *     long: 64;
+ *     char: 8;
+ *     struct usb_ss_ep_comp_descriptor ss_ep_comp;
+ *     long: 0;
+ *} __attribute__((packed));
+ *
+ */
+/* ------ END-EXPECTED-OUTPUT ------ */
+
+struct usb_ss_ep_comp_descriptor {
+       char: 8;
+       char bDescriptorType;
+       char bMaxBurst;
+       int: 0;
+       short wBytesPerInterval;
+} __attribute__((packed));
+
+struct usb_host_endpoint {
+       long: 64;
+       char: 8;
+       struct usb_ss_ep_comp_descriptor ss_ep_comp;
+       long: 0;
+};
+
 
 int f(struct {
        struct packed_trailing_space _1;
@@ -69,6 +126,8 @@ int f(struct {
        union union_is_never_packed _6;
        union union_does_not_need_packing _7;
        union jump_code_union _8;
+       struct outer_implicitly_packed_struct _9;
+       struct usb_host_endpoint _10;
 } *_)
 {
        return 0;
index 6f963d3..79276fb 100644 (file)
@@ -128,6 +128,98 @@ struct padding_weird_2 {
        char: 8;
 };
 
+/* ----- START-EXPECTED-OUTPUT ----- */
+struct exact_1byte {
+       char x;
+};
+
+struct padded_1byte {
+       char: 8;
+};
+
+struct exact_2bytes {
+       short x;
+};
+
+struct padded_2bytes {
+       short: 16;
+};
+
+struct exact_4bytes {
+       int x;
+};
+
+struct padded_4bytes {
+       int: 32;
+};
+
+struct exact_8bytes {
+       long x;
+};
+
+struct padded_8bytes {
+       long: 64;
+};
+
+struct ff_periodic_effect {
+       int: 32;
+       short magnitude;
+       long: 0;
+       short phase;
+       long: 0;
+       int: 32;
+       int custom_len;
+       short *custom_data;
+};
+
+struct ib_wc {
+       long: 64;
+       long: 64;
+       int: 32;
+       int byte_len;
+       void *qp;
+       union {} ex;
+       long: 64;
+       int slid;
+       int wc_flags;
+       long: 64;
+       char smac[6];
+       long: 0;
+       char network_hdr_type;
+};
+
+struct acpi_object_method {
+       long: 64;
+       char: 8;
+       char type;
+       short reference_count;
+       char flags;
+       short: 0;
+       char: 8;
+       char sync_level;
+       long: 64;
+       void *node;
+       void *aml_start;
+       union {} dispatch;
+       long: 64;
+       int aml_length;
+};
+
+struct nested_unpacked {
+       int x;
+};
+
+struct nested_packed {
+       struct nested_unpacked a;
+       char c;
+} __attribute__((packed));
+
+struct outer_mixed_but_unpacked {
+       struct nested_packed b1;
+       short a1;
+       struct nested_packed b2;
+};
+
 /* ------ END-EXPECTED-OUTPUT ------ */
 
 int f(struct {
@@ -139,6 +231,18 @@ int f(struct {
        struct padding_wo_named_members _6;
        struct padding_weird_1 _7;
        struct padding_weird_2 _8;
+       struct exact_1byte _100;
+       struct padded_1byte _101;
+       struct exact_2bytes _102;
+       struct padded_2bytes _103;
+       struct exact_4bytes _104;
+       struct padded_4bytes _105;
+       struct exact_8bytes _106;
+       struct padded_8bytes _107;
+       struct ff_periodic_effect _200;
+       struct ib_wc _201;
+       struct acpi_object_method _202;
+       struct outer_mixed_but_unpacked _203;
 } *_)
 {
        return 0;