1*140ce76eSRobert Mustacchi /*
2*140ce76eSRobert Mustacchi * This file and its contents are supplied under the terms of the
3*140ce76eSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4*140ce76eSRobert Mustacchi * You may only use this file in accordance with the terms of version
5*140ce76eSRobert Mustacchi * 1.0 of the CDDL.
6*140ce76eSRobert Mustacchi *
7*140ce76eSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8*140ce76eSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9*140ce76eSRobert Mustacchi * http://www.illumos.org/license/CDDL.
10*140ce76eSRobert Mustacchi */
11*140ce76eSRobert Mustacchi
12*140ce76eSRobert Mustacchi /*
13*140ce76eSRobert Mustacchi * Copyright 2026 Oxide Computer Company
14*140ce76eSRobert Mustacchi */
15*140ce76eSRobert Mustacchi
16*140ce76eSRobert Mustacchi /*
17*140ce76eSRobert Mustacchi * Tests for SMBIOS System, Type 1.
18*140ce76eSRobert Mustacchi *
19*140ce76eSRobert Mustacchi * We basically create three different types of tables. Those that mimic 2.0 and
20*140ce76eSRobert Mustacchi * therefore stop short of the UUID. Those that mimic 2.1-2.3 which fall short
21*140ce76eSRobert Mustacchi * of the family string. And those that have everything.
22*140ce76eSRobert Mustacchi */
23*140ce76eSRobert Mustacchi
24*140ce76eSRobert Mustacchi #include "smbios_test.h"
25*140ce76eSRobert Mustacchi
26*140ce76eSRobert Mustacchi #include <sys/uuid.h>
27*140ce76eSRobert Mustacchi
28*140ce76eSRobert Mustacchi static const char *sys_mfg = "manufacturer";
29*140ce76eSRobert Mustacchi static const char *sys_product = "product";
30*140ce76eSRobert Mustacchi static const char *sys_version = "version";
31*140ce76eSRobert Mustacchi static const char *sys_serial = "serial";
32*140ce76eSRobert Mustacchi static const uint8_t sys_uuid[UUID_LEN] = { 0x01, 0x02, 0x03, 0x4, 0x5, 0x6,
33*140ce76eSRobert Mustacchi 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe };
34*140ce76eSRobert Mustacchi static const uint8_t sys_wakeup = 0x42;
35*140ce76eSRobert Mustacchi static const char *sys_sku = "SKU";
36*140ce76eSRobert Mustacchi static const char *sys_family = "family";
37*140ce76eSRobert Mustacchi
38*140ce76eSRobert Mustacchi static void
smbios_test_system_mktable_common(smbios_test_table_t * table,size_t len)39*140ce76eSRobert Mustacchi smbios_test_system_mktable_common(smbios_test_table_t *table, size_t len)
40*140ce76eSRobert Mustacchi {
41*140ce76eSRobert Mustacchi smb_system_t sys;
42*140ce76eSRobert Mustacchi
43*140ce76eSRobert Mustacchi sys.smbsi_hdr.smbh_type = SMB_TYPE_SYSTEM;
44*140ce76eSRobert Mustacchi sys.smbsi_hdr.smbh_len = len;
45*140ce76eSRobert Mustacchi
46*140ce76eSRobert Mustacchi sys.smbsi_manufacturer = 1;
47*140ce76eSRobert Mustacchi sys.smbsi_product = 2;
48*140ce76eSRobert Mustacchi sys.smbsi_version = 3;
49*140ce76eSRobert Mustacchi sys.smbsi_serial = 4;
50*140ce76eSRobert Mustacchi (void) memcpy(sys.smbsi_uuid, sys_uuid, ARRAY_SIZE(sys_uuid));
51*140ce76eSRobert Mustacchi sys.smbsi_wakeup = sys_wakeup;
52*140ce76eSRobert Mustacchi sys.smbsi_sku = 5;
53*140ce76eSRobert Mustacchi sys.smbsi_family = 6;
54*140ce76eSRobert Mustacchi
55*140ce76eSRobert Mustacchi (void) smbios_test_table_append(table, &sys, len);
56*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_manufacturer))
57*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_mfg);
58*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_product))
59*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_product);
60*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_version))
61*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_version);
62*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_serial))
63*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_serial);
64*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_sku))
65*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_sku);
66*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_family))
67*140ce76eSRobert Mustacchi smbios_test_table_append_string(table, sys_family);
68*140ce76eSRobert Mustacchi if (len > offsetof(smb_system_t, smbsi_manufacturer))
69*140ce76eSRobert Mustacchi smbios_test_table_str_fini(table);
70*140ce76eSRobert Mustacchi smbios_test_table_append_eot(table);
71*140ce76eSRobert Mustacchi }
72*140ce76eSRobert Mustacchi
73*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_mktable_2p0(smbios_test_table_t * table)74*140ce76eSRobert Mustacchi smbios_test_system_mktable_2p0(smbios_test_table_t *table)
75*140ce76eSRobert Mustacchi {
76*140ce76eSRobert Mustacchi smbios_test_system_mktable_common(table, offsetof(smb_system_t,
77*140ce76eSRobert Mustacchi smbsi_uuid));
78*140ce76eSRobert Mustacchi return (B_TRUE);
79*140ce76eSRobert Mustacchi }
80*140ce76eSRobert Mustacchi
81*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_mktable_2p3(smbios_test_table_t * table)82*140ce76eSRobert Mustacchi smbios_test_system_mktable_2p3(smbios_test_table_t *table)
83*140ce76eSRobert Mustacchi {
84*140ce76eSRobert Mustacchi smbios_test_system_mktable_common(table, offsetof(smb_system_t,
85*140ce76eSRobert Mustacchi smbsi_family));
86*140ce76eSRobert Mustacchi return (B_TRUE);
87*140ce76eSRobert Mustacchi }
88*140ce76eSRobert Mustacchi
89*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_mktable(smbios_test_table_t * table)90*140ce76eSRobert Mustacchi smbios_test_system_mktable(smbios_test_table_t *table)
91*140ce76eSRobert Mustacchi {
92*140ce76eSRobert Mustacchi smbios_test_system_mktable_common(table, sizeof (smb_system_t));
93*140ce76eSRobert Mustacchi return (B_TRUE);
94*140ce76eSRobert Mustacchi }
95*140ce76eSRobert Mustacchi
96*140ce76eSRobert Mustacchi static boolean_t
smbios_test_system_verify_common(smbios_hdl_t * hdl,size_t len)97*140ce76eSRobert Mustacchi smbios_test_system_verify_common(smbios_hdl_t *hdl, size_t len)
98*140ce76eSRobert Mustacchi {
99*140ce76eSRobert Mustacchi boolean_t ret = B_TRUE;
100*140ce76eSRobert Mustacchi id_t id;
101*140ce76eSRobert Mustacchi smbios_struct_t sp;
102*140ce76eSRobert Mustacchi smbios_system_t sys;
103*140ce76eSRobert Mustacchi smbios_info_t info;
104*140ce76eSRobert Mustacchi
105*140ce76eSRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_SYSTEM, &sp) == -1) {
106*140ce76eSRobert Mustacchi warnx("failed to lookup SMBIOS system: %s",
107*140ce76eSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
108*140ce76eSRobert Mustacchi return (B_FALSE);
109*140ce76eSRobert Mustacchi }
110*140ce76eSRobert Mustacchi
111*140ce76eSRobert Mustacchi id = smbios_info_system(hdl, &sys);
112*140ce76eSRobert Mustacchi if (id < 0) {
113*140ce76eSRobert Mustacchi warnx("failed to get system information: %s",
114*140ce76eSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
115*140ce76eSRobert Mustacchi return (B_FALSE);
116*140ce76eSRobert Mustacchi }
117*140ce76eSRobert Mustacchi
118*140ce76eSRobert Mustacchi if (id != sp.smbstr_id) {
119*140ce76eSRobert Mustacchi warnx("found mismatched IDs: smbios_info_system() returned 0x%"
120*140ce76eSRobert Mustacchi _PRIxID ", but lookup gave us 0x%" _PRIxID, id,
121*140ce76eSRobert Mustacchi sp.smbstr_id);
122*140ce76eSRobert Mustacchi return (B_FALSE);
123*140ce76eSRobert Mustacchi }
124*140ce76eSRobert Mustacchi
125*140ce76eSRobert Mustacchi if (smbios_info_common(hdl, id, &info) != 0) {
126*140ce76eSRobert Mustacchi warnx("failed to get system common information: %s",
127*140ce76eSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
128*140ce76eSRobert Mustacchi return (B_FALSE);
129*140ce76eSRobert Mustacchi }
130*140ce76eSRobert Mustacchi
131*140ce76eSRobert Mustacchi /*
132*140ce76eSRobert Mustacchi * Everything should always have a manufacturer, product, version, and
133*140ce76eSRobert Mustacchi * serial.
134*140ce76eSRobert Mustacchi */
135*140ce76eSRobert Mustacchi if (strcmp(info.smbi_manufacturer, sys_mfg) != 0) {
136*140ce76eSRobert Mustacchi warnx("found wrong manufacturer %s: expected %s",
137*140ce76eSRobert Mustacchi info.smbi_manufacturer, sys_mfg);
138*140ce76eSRobert Mustacchi ret = B_FALSE;
139*140ce76eSRobert Mustacchi }
140*140ce76eSRobert Mustacchi
141*140ce76eSRobert Mustacchi if (strcmp(info.smbi_product, sys_product) != 0) {
142*140ce76eSRobert Mustacchi warnx("found wrong product %s: expected %s",
143*140ce76eSRobert Mustacchi info.smbi_product, sys_product);
144*140ce76eSRobert Mustacchi ret = B_FALSE;
145*140ce76eSRobert Mustacchi }
146*140ce76eSRobert Mustacchi
147*140ce76eSRobert Mustacchi if (strcmp(info.smbi_version, sys_version) != 0) {
148*140ce76eSRobert Mustacchi warnx("found wrong version %s: expected %s",
149*140ce76eSRobert Mustacchi info.smbi_version, sys_version);
150*140ce76eSRobert Mustacchi ret = B_FALSE;
151*140ce76eSRobert Mustacchi }
152*140ce76eSRobert Mustacchi
153*140ce76eSRobert Mustacchi if (strcmp(info.smbi_serial, sys_serial) != 0) {
154*140ce76eSRobert Mustacchi warnx("found wrong serial %s: expected %s",
155*140ce76eSRobert Mustacchi info.smbi_serial, sys_serial);
156*140ce76eSRobert Mustacchi ret = B_FALSE;
157*140ce76eSRobert Mustacchi }
158*140ce76eSRobert Mustacchi
159*140ce76eSRobert Mustacchi if (len >= offsetof(smb_system_t, smbsi_wakeup)) {
160*140ce76eSRobert Mustacchi if (sys.smbs_uuidlen != ARRAY_SIZE(sys_uuid)) {
161*140ce76eSRobert Mustacchi warnx("found wrong uuid length %u: expected %zu",
162*140ce76eSRobert Mustacchi sys.smbs_uuidlen, ARRAY_SIZE(sys_uuid));
163*140ce76eSRobert Mustacchi ret = B_FALSE;
164*140ce76eSRobert Mustacchi }
165*140ce76eSRobert Mustacchi
166*140ce76eSRobert Mustacchi if (sys.smbs_uuid == NULL) {
167*140ce76eSRobert Mustacchi warnx("found unexpected NULL uuid pointer");
168*140ce76eSRobert Mustacchi ret = B_FALSE;
169*140ce76eSRobert Mustacchi }
170*140ce76eSRobert Mustacchi
171*140ce76eSRobert Mustacchi if (sys.smbs_uuidlen == ARRAY_SIZE(sys_uuid) &&
172*140ce76eSRobert Mustacchi sys.smbs_uuid != NULL && memcmp(sys.smbs_uuid,
173*140ce76eSRobert Mustacchi sys_uuid, sizeof (sys_uuid)) != 0) {
174*140ce76eSRobert Mustacchi warnx("encountered UUID mismatch");
175*140ce76eSRobert Mustacchi ret = B_FALSE;
176*140ce76eSRobert Mustacchi }
177*140ce76eSRobert Mustacchi } else {
178*140ce76eSRobert Mustacchi if (sys.smbs_uuid != NULL) {
179*140ce76eSRobert Mustacchi warnx("found unexpected non-NULL uuid pointer");
180*140ce76eSRobert Mustacchi ret = B_FALSE;
181*140ce76eSRobert Mustacchi }
182*140ce76eSRobert Mustacchi
183*140ce76eSRobert Mustacchi if (sys.smbs_uuidlen != 0) {
184*140ce76eSRobert Mustacchi warnx("found unexpected non-zero uuid length: %u",
185*140ce76eSRobert Mustacchi sys.smbs_uuidlen);
186*140ce76eSRobert Mustacchi ret = B_FALSE;
187*140ce76eSRobert Mustacchi }
188*140ce76eSRobert Mustacchi }
189*140ce76eSRobert Mustacchi
190*140ce76eSRobert Mustacchi if (len >= offsetof(smb_system_t, smbsi_sku)) {
191*140ce76eSRobert Mustacchi if (sys.smbs_wakeup != sys_wakeup) {
192*140ce76eSRobert Mustacchi warnx("found wrong wakeup 0x%x: expected 0x%x",
193*140ce76eSRobert Mustacchi sys.smbs_wakeup, sys_wakeup);
194*140ce76eSRobert Mustacchi ret = B_FALSE;
195*140ce76eSRobert Mustacchi }
196*140ce76eSRobert Mustacchi } else if (sys.smbs_wakeup != 0) {
197*140ce76eSRobert Mustacchi warnx("found wrong wakeup 0x%x: expected none",
198*140ce76eSRobert Mustacchi sys.smbs_wakeup);
199*140ce76eSRobert Mustacchi ret = B_FALSE;
200*140ce76eSRobert Mustacchi }
201*140ce76eSRobert Mustacchi
202*140ce76eSRobert Mustacchi if (len >= offsetof(smb_system_t, smbsi_family)) {
203*140ce76eSRobert Mustacchi if (strcmp(sys.smbs_sku, sys_sku) != 0) {
204*140ce76eSRobert Mustacchi warnx("found wrong sku %s: expected %s",
205*140ce76eSRobert Mustacchi sys.smbs_sku, sys_sku);
206*140ce76eSRobert Mustacchi ret = B_FALSE;
207*140ce76eSRobert Mustacchi }
208*140ce76eSRobert Mustacchi } else if (strcmp(sys.smbs_sku, "") != 0) {
209*140ce76eSRobert Mustacchi warnx("found wrong sku %s: expected none", sys.smbs_sku);
210*140ce76eSRobert Mustacchi ret = B_FALSE;
211*140ce76eSRobert Mustacchi }
212*140ce76eSRobert Mustacchi
213*140ce76eSRobert Mustacchi if (len >= sizeof (smb_system_t)) {
214*140ce76eSRobert Mustacchi if (strcmp(sys.smbs_family, sys_family) != 0) {
215*140ce76eSRobert Mustacchi warnx("found wrong family %s: expected %s",
216*140ce76eSRobert Mustacchi sys.smbs_family, sys_family);
217*140ce76eSRobert Mustacchi ret = B_FALSE;
218*140ce76eSRobert Mustacchi }
219*140ce76eSRobert Mustacchi } else if (strcmp(sys.smbs_family, "") != 0) {
220*140ce76eSRobert Mustacchi warnx("found wrong family %s: expected none", sys.smbs_family);
221*140ce76eSRobert Mustacchi ret = B_FALSE;
222*140ce76eSRobert Mustacchi }
223*140ce76eSRobert Mustacchi
224*140ce76eSRobert Mustacchi return (ret);
225*140ce76eSRobert Mustacchi }
226*140ce76eSRobert Mustacchi
227*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_verify_2p0(smbios_hdl_t * hdl)228*140ce76eSRobert Mustacchi smbios_test_system_verify_2p0(smbios_hdl_t *hdl)
229*140ce76eSRobert Mustacchi {
230*140ce76eSRobert Mustacchi return (smbios_test_system_verify_common(hdl, offsetof(smb_system_t,
231*140ce76eSRobert Mustacchi smbsi_uuid)));
232*140ce76eSRobert Mustacchi }
233*140ce76eSRobert Mustacchi
234*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_verify_2p3(smbios_hdl_t * hdl)235*140ce76eSRobert Mustacchi smbios_test_system_verify_2p3(smbios_hdl_t *hdl)
236*140ce76eSRobert Mustacchi {
237*140ce76eSRobert Mustacchi return (smbios_test_system_verify_common(hdl, offsetof(smb_system_t,
238*140ce76eSRobert Mustacchi smbsi_family)));
239*140ce76eSRobert Mustacchi }
240*140ce76eSRobert Mustacchi
241*140ce76eSRobert Mustacchi boolean_t
smbios_test_system_verify(smbios_hdl_t * hdl)242*140ce76eSRobert Mustacchi smbios_test_system_verify(smbios_hdl_t *hdl)
243*140ce76eSRobert Mustacchi {
244*140ce76eSRobert Mustacchi return (smbios_test_system_verify_common(hdl, sizeof (smb_system_t)));
245*140ce76eSRobert Mustacchi }
246