1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001 Silicon Graphics, Inc.
17 /* The purpose of this test is to make sure that each field in each structure
18 defined in dmi.h is properly aligned so that there is no dead space, and
19 that the sizes and offsets of those fields remain constant no matter what
20 mode the program is compiled with, i.e. -32, -n32 or -64.
22 Run the program with no parameters. If everything is correct, no message
23 will start with the word "ERROR:". Compile and run the test in each of
24 the three mods and diff the outputs. They must all be identical.
26 Note: this test cannot detect the addition of new structures to dmi.h, so
27 it will have to periodically be compared with dmi.h manually to ensure that
28 all the structures are still being validated!
31 #define S_START(struct_name) { offset = 0; s_name = #struct_name; }
33 #define S_NEXT(struct_name, field_name) \
37 f_name = #field_name; \
38 printf("field %s.%s offset is %d\n", s_name, f_name, offset); \
39 if (offsetof(struct_name, field_name) != offset) { \
40 printf("ERROR: field %s should be %d\n", \
41 #struct_name "." #field_name, \
42 (int) offsetof(struct_name, field_name)); \
44 offset = offsetof(struct_name, field_name) + sizeof(X.field_name); \
47 #define S_END(struct_name) \
49 printf("struct %s size is %d\n", s_name, offset); \
50 if (sizeof(struct_name) != offset) { \
51 printf("ERROR: struct %s should be %zd\n", \
52 s_name, sizeof(struct_name)); \
68 S_START(dm_vardata_t);
69 S_NEXT(dm_vardata_t, vd_offset);
70 S_NEXT(dm_vardata_t, vd_length);
74 S_START(dm_attrname_t);
75 S_NEXT(dm_attrname_t, an_chars);
79 S_START(dm_attrlist_t);
80 S_NEXT(dm_attrlist_t, _link);
81 S_NEXT(dm_attrlist_t, al_name);
82 S_NEXT(dm_attrlist_t, al_data);
86 S_START(dm_dispinfo_t);
87 S_NEXT(dm_dispinfo_t, _link);
88 S_NEXT(dm_dispinfo_t, di_pad1);
89 S_NEXT(dm_dispinfo_t, di_fshandle);
90 S_NEXT(dm_dispinfo_t, di_eventset);
94 S_START(dm_eventmsg_t);
95 S_NEXT(dm_eventmsg_t, _link);
96 S_NEXT(dm_eventmsg_t, ev_type);
97 S_NEXT(dm_eventmsg_t, ev_token);
98 S_NEXT(dm_eventmsg_t, ev_sequence);
99 S_NEXT(dm_eventmsg_t, ev_data);
100 S_END(dm_eventmsg_t);
103 S_START(dm_cancel_event_t);
104 S_NEXT(dm_cancel_event_t, ce_sequence);
105 S_NEXT(dm_cancel_event_t, ce_token);
106 S_END(dm_cancel_event_t);
109 S_START(dm_data_event_t);
110 S_NEXT(dm_data_event_t, de_handle);
111 S_NEXT(dm_data_event_t, de_offset);
112 S_NEXT(dm_data_event_t, de_length);
113 S_END(dm_data_event_t);
116 S_START(dm_destroy_event_t);
117 S_NEXT(dm_destroy_event_t, ds_handle);
118 S_NEXT(dm_destroy_event_t, ds_attrname);
119 S_NEXT(dm_destroy_event_t, ds_attrcopy);
120 S_END(dm_destroy_event_t);
123 S_START(dm_mount_event_t);
124 S_NEXT(dm_mount_event_t, me_mode);
125 S_NEXT(dm_mount_event_t, me_handle1);
126 S_NEXT(dm_mount_event_t, me_handle2);
127 S_NEXT(dm_mount_event_t, me_name1);
128 S_NEXT(dm_mount_event_t, me_name2);
129 S_NEXT(dm_mount_event_t, me_roothandle);
130 S_END(dm_mount_event_t);
133 S_START(dm_namesp_event_t);
134 S_NEXT(dm_namesp_event_t, ne_mode);
135 S_NEXT(dm_namesp_event_t, ne_handle1);
136 S_NEXT(dm_namesp_event_t, ne_handle2);
137 S_NEXT(dm_namesp_event_t, ne_name1);
138 S_NEXT(dm_namesp_event_t, ne_name2);
139 S_NEXT(dm_namesp_event_t, ne_retcode);
140 S_END(dm_namesp_event_t);
143 S_START(dm_extent_t);
144 S_NEXT(dm_extent_t, ex_type);
145 S_NEXT(dm_extent_t, ex_pad1);
146 S_NEXT(dm_extent_t, ex_offset);
147 S_NEXT(dm_extent_t, ex_length);
151 S_START(dm_fileattr_t);
152 S_NEXT(dm_fileattr_t, fa_mode);
153 S_NEXT(dm_fileattr_t, fa_uid);
154 S_NEXT(dm_fileattr_t, fa_gid);
155 S_NEXT(dm_fileattr_t, fa_atime);
156 S_NEXT(dm_fileattr_t, fa_mtime);
157 S_NEXT(dm_fileattr_t, fa_ctime);
158 S_NEXT(dm_fileattr_t, fa_dtime);
159 S_NEXT(dm_fileattr_t, fa_pad1);
160 S_NEXT(dm_fileattr_t, fa_size);
161 S_END(dm_fileattr_t);
164 S_START(dm_inherit_t);
165 S_NEXT(dm_inherit_t, ih_name);
166 S_NEXT(dm_inherit_t, ih_filetype);
170 S_START(dm_region_t);
171 S_NEXT(dm_region_t, rg_offset);
172 S_NEXT(dm_region_t, rg_size);
173 S_NEXT(dm_region_t, rg_flags);
174 S_NEXT(dm_region_t, rg_pad1);
179 S_NEXT(dm_stat_t, _link);
180 S_NEXT(dm_stat_t, dt_handle);
181 S_NEXT(dm_stat_t, dt_compname);
182 S_NEXT(dm_stat_t, dt_nevents);
183 S_NEXT(dm_stat_t, dt_emask);
184 S_NEXT(dm_stat_t, dt_pers);
185 S_NEXT(dm_stat_t, dt_pmanreg);
186 S_NEXT(dm_stat_t, dt_dtime);
187 S_NEXT(dm_stat_t, dt_change);
188 S_NEXT(dm_stat_t, dt_pad1);
190 S_NEXT(dm_stat_t, dt_dev);
191 S_NEXT(dm_stat_t, dt_ino);
192 S_NEXT(dm_stat_t, dt_mode);
193 S_NEXT(dm_stat_t, dt_nlink);
194 S_NEXT(dm_stat_t, dt_uid);
195 S_NEXT(dm_stat_t, dt_gid);
196 S_NEXT(dm_stat_t, dt_rdev);
197 S_NEXT(dm_stat_t, dt_pad2);
198 S_NEXT(dm_stat_t, dt_size);
199 S_NEXT(dm_stat_t, dt_atime);
200 S_NEXT(dm_stat_t, dt_mtime);
201 S_NEXT(dm_stat_t, dt_ctime);
202 S_NEXT(dm_stat_t, dt_blksize);
203 S_NEXT(dm_stat_t, dt_blocks);
205 S_NEXT(dm_stat_t, dt_pad3);
206 S_NEXT(dm_stat_t, dt_fstype);
208 S_NEXT(dm_stat_t, dt_xfs_igen);
209 S_NEXT(dm_stat_t, dt_xfs_xflags);
210 S_NEXT(dm_stat_t, dt_xfs_extsize);
211 S_NEXT(dm_stat_t, dt_xfs_extents);
212 S_NEXT(dm_stat_t, dt_xfs_aextents);
213 S_NEXT(dm_stat_t, dt_xfs_dmstate);
218 S_NEXT(dm_xstat_t, dx_statinfo);
219 S_NEXT(dm_xstat_t, dx_attrdata);