1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _LINUX_STDDEF_H |
3 | #define _LINUX_STDDEF_H |
4 | |
5 | #include <uapi/linux/stddef.h> |
6 | |
7 | #undef NULL |
8 | #define NULL ((void *)0) |
9 | |
10 | enum { |
11 | false = 0, |
12 | true = 1 |
13 | }; |
14 | |
15 | #undef offsetof |
16 | #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) |
17 | |
18 | /** |
19 | * sizeof_field() - Report the size of a struct field in bytes |
20 | * |
21 | * @TYPE: The structure containing the field of interest |
22 | * @MEMBER: The field to return the size of |
23 | */ |
24 | #define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) |
25 | |
26 | /** |
27 | * offsetofend() - Report the offset of a struct field within the struct |
28 | * |
29 | * @TYPE: The type of the structure |
30 | * @MEMBER: The member within the structure to get the end offset of |
31 | */ |
32 | #define offsetofend(TYPE, MEMBER) \ |
33 | (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) |
34 | |
35 | /** |
36 | * struct_group() - Wrap a set of declarations in a mirrored struct |
37 | * |
38 | * @NAME: The identifier name of the mirrored sub-struct |
39 | * @MEMBERS: The member declarations for the mirrored structs |
40 | * |
41 | * Used to create an anonymous union of two structs with identical |
42 | * layout and size: one anonymous and one named. The former can be |
43 | * used normally without sub-struct naming, and the latter can be |
44 | * used to reason about the start, end, and size of the group of |
45 | * struct members. |
46 | */ |
47 | #define struct_group(NAME, MEMBERS...) \ |
48 | __struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS) |
49 | |
50 | /** |
51 | * struct_group_attr() - Create a struct_group() with trailing attributes |
52 | * |
53 | * @NAME: The identifier name of the mirrored sub-struct |
54 | * @ATTRS: Any struct attributes to apply |
55 | * @MEMBERS: The member declarations for the mirrored structs |
56 | * |
57 | * Used to create an anonymous union of two structs with identical |
58 | * layout and size: one anonymous and one named. The former can be |
59 | * used normally without sub-struct naming, and the latter can be |
60 | * used to reason about the start, end, and size of the group of |
61 | * struct members. Includes structure attributes argument. |
62 | */ |
63 | #define struct_group_attr(NAME, ATTRS, MEMBERS...) \ |
64 | __struct_group(/* no tag */, NAME, ATTRS, MEMBERS) |
65 | |
66 | /** |
67 | * struct_group_tagged() - Create a struct_group with a reusable tag |
68 | * |
69 | * @TAG: The tag name for the named sub-struct |
70 | * @NAME: The identifier name of the mirrored sub-struct |
71 | * @MEMBERS: The member declarations for the mirrored structs |
72 | * |
73 | * Used to create an anonymous union of two structs with identical |
74 | * layout and size: one anonymous and one named. The former can be |
75 | * used normally without sub-struct naming, and the latter can be |
76 | * used to reason about the start, end, and size of the group of |
77 | * struct members. Includes struct tag argument for the named copy, |
78 | * so the specified layout can be reused later. |
79 | */ |
80 | #define struct_group_tagged(TAG, NAME, MEMBERS...) \ |
81 | __struct_group(TAG, NAME, /* no attrs */, MEMBERS) |
82 | |
83 | /** |
84 | * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union |
85 | * |
86 | * @TYPE: The type of each flexible array element |
87 | * @NAME: The name of the flexible array member |
88 | * |
89 | * In order to have a flexible array member in a union or alone in a |
90 | * struct, it needs to be wrapped in an anonymous struct with at least 1 |
91 | * named member, but that member can be empty. |
92 | */ |
93 | #define DECLARE_FLEX_ARRAY(TYPE, NAME) \ |
94 | __DECLARE_FLEX_ARRAY(TYPE, NAME) |
95 | |
96 | #endif |
97 | |