xref: /illumos-gate/usr/src/test/util-tests/tests/smbios/smbios_test_system.c (revision 140ce76ef556d86651c4775379bb050b60809a7e)
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