xref: /illumos-gate/usr/src/test/util-tests/tests/smbios/smbios_test_bboard.c (revision 9b9e2785021b504cb0ae537c009d1b4abebf7e19)
1*9b9e2785SRobert Mustacchi /*
2*9b9e2785SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*9b9e2785SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*9b9e2785SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*9b9e2785SRobert Mustacchi  * 1.0 of the CDDL.
6*9b9e2785SRobert Mustacchi  *
7*9b9e2785SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*9b9e2785SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*9b9e2785SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*9b9e2785SRobert Mustacchi  */
11*9b9e2785SRobert Mustacchi 
12*9b9e2785SRobert Mustacchi /*
13*9b9e2785SRobert Mustacchi  * Copyright 2026 Oxide Computer Company
14*9b9e2785SRobert Mustacchi  */
15*9b9e2785SRobert Mustacchi 
16*9b9e2785SRobert Mustacchi /*
17*9b9e2785SRobert Mustacchi  * Tests for SMBIOS Baseboard, Type 2.
18*9b9e2785SRobert Mustacchi  */
19*9b9e2785SRobert Mustacchi 
20*9b9e2785SRobert Mustacchi #include "smbios_test.h"
21*9b9e2785SRobert Mustacchi 
22*9b9e2785SRobert Mustacchi static const char *bb_mfg = "Symphonia";
23*9b9e2785SRobert Mustacchi static const char *bb_prod = "Abyss";
24*9b9e2785SRobert Mustacchi static const char *bb_version = "Arise";
25*9b9e2785SRobert Mustacchi static const char *bb_serial = "Vesperia";
26*9b9e2785SRobert Mustacchi static const char *bb_asset = "Xilia";
27*9b9e2785SRobert Mustacchi static const char *bb_location = "Destiny";
28*9b9e2785SRobert Mustacchi static const uint16_t bb_chassis = 0x4224;
29*9b9e2785SRobert Mustacchi static const uint8_t bb_flags = SMB_BBFL_MOTHERBOARD | SMB_BBFL_HOTSWAP;
30*9b9e2785SRobert Mustacchi static const uint8_t bb_type = SMB_BBT_CSWITCH;
31*9b9e2785SRobert Mustacchi static const uint16_t bb_ents[] = { 0x42, 0x169, 0x7777, UINT16_MAX };
32*9b9e2785SRobert Mustacchi 
33*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_mktable_short(smbios_test_table_t * table)34*9b9e2785SRobert Mustacchi smbios_test_bboard_mktable_short(smbios_test_table_t *table)
35*9b9e2785SRobert Mustacchi {
36*9b9e2785SRobert Mustacchi 	smb_header_t hdr;
37*9b9e2785SRobert Mustacchi 
38*9b9e2785SRobert Mustacchi 	hdr.smbh_type = SMB_TYPE_BASEBOARD;
39*9b9e2785SRobert Mustacchi 	hdr.smbh_len = sizeof (hdr);
40*9b9e2785SRobert Mustacchi 
41*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append(table, &hdr, sizeof (hdr));
42*9b9e2785SRobert Mustacchi 	smbios_test_table_append_eot(table);
43*9b9e2785SRobert Mustacchi 	return (B_TRUE);
44*9b9e2785SRobert Mustacchi }
45*9b9e2785SRobert Mustacchi 
46*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_mktable(smbios_test_table_t * table)47*9b9e2785SRobert Mustacchi smbios_test_bboard_mktable(smbios_test_table_t *table)
48*9b9e2785SRobert Mustacchi {
49*9b9e2785SRobert Mustacchi 	smb_bboard_t bboard;
50*9b9e2785SRobert Mustacchi 
51*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_type = SMB_TYPE_BASEBOARD;
52*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_len = sizeof (bboard);
53*9b9e2785SRobert Mustacchi 
54*9b9e2785SRobert Mustacchi 	bboard.smbbb_manufacturer = 1;
55*9b9e2785SRobert Mustacchi 	bboard.smbbb_product = 2;
56*9b9e2785SRobert Mustacchi 	bboard.smbbb_version = 3;
57*9b9e2785SRobert Mustacchi 	bboard.smbbb_serial = 4;
58*9b9e2785SRobert Mustacchi 	bboard.smbbb_asset = 5;
59*9b9e2785SRobert Mustacchi 	bboard.smbbb_flags = bb_flags;
60*9b9e2785SRobert Mustacchi 	bboard.smbbb_location = 6;
61*9b9e2785SRobert Mustacchi 	bboard.smbbb_chassis = bb_chassis;
62*9b9e2785SRobert Mustacchi 	bboard.smbbb_type = bb_type;
63*9b9e2785SRobert Mustacchi 	bboard.smbbb_cn = 0;
64*9b9e2785SRobert Mustacchi 
65*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append(table, &bboard, sizeof (bboard));
66*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_mfg);
67*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_prod);
68*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_version);
69*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_serial);
70*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_asset);
71*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_location);
72*9b9e2785SRobert Mustacchi 	smbios_test_table_str_fini(table);
73*9b9e2785SRobert Mustacchi 	smbios_test_table_append_eot(table);
74*9b9e2785SRobert Mustacchi 	return (B_TRUE);
75*9b9e2785SRobert Mustacchi }
76*9b9e2785SRobert Mustacchi 
77*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_mktable_ents(smbios_test_table_t * table)78*9b9e2785SRobert Mustacchi smbios_test_bboard_mktable_ents(smbios_test_table_t *table)
79*9b9e2785SRobert Mustacchi {
80*9b9e2785SRobert Mustacchi 	smb_bboard_t bboard;
81*9b9e2785SRobert Mustacchi 
82*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_type = SMB_TYPE_BASEBOARD;
83*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_len = sizeof (bboard) + sizeof (bb_ents);
84*9b9e2785SRobert Mustacchi 
85*9b9e2785SRobert Mustacchi 	bboard.smbbb_manufacturer = 1;
86*9b9e2785SRobert Mustacchi 	bboard.smbbb_product = 2;
87*9b9e2785SRobert Mustacchi 	bboard.smbbb_version = 3;
88*9b9e2785SRobert Mustacchi 	bboard.smbbb_serial = 4;
89*9b9e2785SRobert Mustacchi 	bboard.smbbb_asset = 5;
90*9b9e2785SRobert Mustacchi 	bboard.smbbb_flags = bb_flags;
91*9b9e2785SRobert Mustacchi 	bboard.smbbb_location = 6;
92*9b9e2785SRobert Mustacchi 	bboard.smbbb_chassis = bb_chassis;
93*9b9e2785SRobert Mustacchi 	bboard.smbbb_type = bb_type;
94*9b9e2785SRobert Mustacchi 	bboard.smbbb_cn = ARRAY_SIZE(bb_ents);
95*9b9e2785SRobert Mustacchi 
96*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append(table, &bboard, sizeof (bboard));
97*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, bb_ents, sizeof (bb_ents));
98*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_mfg);
99*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_prod);
100*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_version);
101*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_serial);
102*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_asset);
103*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_location);
104*9b9e2785SRobert Mustacchi 	smbios_test_table_str_fini(table);
105*9b9e2785SRobert Mustacchi 	smbios_test_table_append_eot(table);
106*9b9e2785SRobert Mustacchi 	return (B_TRUE);
107*9b9e2785SRobert Mustacchi }
108*9b9e2785SRobert Mustacchi 
109*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_mktable_short_ents(smbios_test_table_t * table)110*9b9e2785SRobert Mustacchi smbios_test_bboard_mktable_short_ents(smbios_test_table_t *table)
111*9b9e2785SRobert Mustacchi {
112*9b9e2785SRobert Mustacchi 	smb_bboard_t bboard;
113*9b9e2785SRobert Mustacchi 
114*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_type = SMB_TYPE_BASEBOARD;
115*9b9e2785SRobert Mustacchi 	bboard.smbbb_hdr.smbh_len = sizeof (bboard) + sizeof (bb_ents) / 2;
116*9b9e2785SRobert Mustacchi 
117*9b9e2785SRobert Mustacchi 	bboard.smbbb_manufacturer = 1;
118*9b9e2785SRobert Mustacchi 	bboard.smbbb_product = 2;
119*9b9e2785SRobert Mustacchi 	bboard.smbbb_version = 3;
120*9b9e2785SRobert Mustacchi 	bboard.smbbb_serial = 4;
121*9b9e2785SRobert Mustacchi 	bboard.smbbb_asset = 5;
122*9b9e2785SRobert Mustacchi 	bboard.smbbb_flags = bb_flags;
123*9b9e2785SRobert Mustacchi 	bboard.smbbb_location = 6;
124*9b9e2785SRobert Mustacchi 	bboard.smbbb_chassis = bb_chassis;
125*9b9e2785SRobert Mustacchi 	bboard.smbbb_type = bb_type;
126*9b9e2785SRobert Mustacchi 	bboard.smbbb_cn = ARRAY_SIZE(bb_ents);
127*9b9e2785SRobert Mustacchi 
128*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append(table, &bboard, sizeof (bboard));
129*9b9e2785SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, bb_ents, sizeof (bb_ents));
130*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_mfg);
131*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_prod);
132*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_version);
133*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_serial);
134*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_asset);
135*9b9e2785SRobert Mustacchi 	smbios_test_table_append_string(table, bb_location);
136*9b9e2785SRobert Mustacchi 	smbios_test_table_str_fini(table);
137*9b9e2785SRobert Mustacchi 	smbios_test_table_append_eot(table);
138*9b9e2785SRobert Mustacchi 
139*9b9e2785SRobert Mustacchi 	return (B_TRUE);
140*9b9e2785SRobert Mustacchi }
141*9b9e2785SRobert Mustacchi 
142*9b9e2785SRobert Mustacchi static boolean_t
smbios_test_bboard_verify_base(smbios_hdl_t * hdl,smbios_struct_t * sp,uint_t nents)143*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_base(smbios_hdl_t *hdl, smbios_struct_t *sp,
144*9b9e2785SRobert Mustacchi     uint_t nents)
145*9b9e2785SRobert Mustacchi {
146*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
147*9b9e2785SRobert Mustacchi 	smbios_bboard_t bboard;
148*9b9e2785SRobert Mustacchi 
149*9b9e2785SRobert Mustacchi 	if (smbios_info_bboard(hdl, sp->smbstr_id, &bboard) != 0) {
150*9b9e2785SRobert Mustacchi 		warnx("failed to get baseboard information: %s",
151*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
152*9b9e2785SRobert Mustacchi 		return (B_FALSE);
153*9b9e2785SRobert Mustacchi 	}
154*9b9e2785SRobert Mustacchi 
155*9b9e2785SRobert Mustacchi 	if (bboard.smbb_chassis != bb_chassis) {
156*9b9e2785SRobert Mustacchi 		warnx("found wrong chassis hdl 0x%" _PRIxID ", expected 0x%x",
157*9b9e2785SRobert Mustacchi 		    bboard.smbb_chassis, bb_chassis);
158*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
159*9b9e2785SRobert Mustacchi 	}
160*9b9e2785SRobert Mustacchi 
161*9b9e2785SRobert Mustacchi 	if (bboard.smbb_flags != bb_flags) {
162*9b9e2785SRobert Mustacchi 		warnx("found wrong flags value 0x%x, expected 0x%x",
163*9b9e2785SRobert Mustacchi 		    bboard.smbb_flags, bb_flags);
164*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
165*9b9e2785SRobert Mustacchi 	}
166*9b9e2785SRobert Mustacchi 
167*9b9e2785SRobert Mustacchi 	if (bboard.smbb_type != bb_type) {
168*9b9e2785SRobert Mustacchi 		warnx("found wrong type value 0x%x, expected 0x%x",
169*9b9e2785SRobert Mustacchi 		    bboard.smbb_type, bb_type);
170*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
171*9b9e2785SRobert Mustacchi 	}
172*9b9e2785SRobert Mustacchi 
173*9b9e2785SRobert Mustacchi 	if (bboard.smbb_contn != nents) {
174*9b9e2785SRobert Mustacchi 		warnx("found wrong object count 0x%x, expected 0x%x",
175*9b9e2785SRobert Mustacchi 		    bboard.smbb_contn, nents);
176*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
177*9b9e2785SRobert Mustacchi 	}
178*9b9e2785SRobert Mustacchi 
179*9b9e2785SRobert Mustacchi 	return (ret);
180*9b9e2785SRobert Mustacchi }
181*9b9e2785SRobert Mustacchi 
182*9b9e2785SRobert Mustacchi static boolean_t
smbios_test_bboard_verify_common(smbios_hdl_t * hdl,smbios_struct_t * sp)183*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_common(smbios_hdl_t *hdl, smbios_struct_t *sp)
184*9b9e2785SRobert Mustacchi {
185*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
186*9b9e2785SRobert Mustacchi 	smbios_info_t info;
187*9b9e2785SRobert Mustacchi 
188*9b9e2785SRobert Mustacchi 	if (smbios_info_common(hdl, sp->smbstr_id, &info) != 0) {
189*9b9e2785SRobert Mustacchi 		warnx("failed to get baseboard common information: %s",
190*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
191*9b9e2785SRobert Mustacchi 		return (B_FALSE);
192*9b9e2785SRobert Mustacchi 	}
193*9b9e2785SRobert Mustacchi 
194*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_manufacturer, bb_mfg) != 0) {
195*9b9e2785SRobert Mustacchi 		warnx("found wrong manufacturer: expected %s, found %s",
196*9b9e2785SRobert Mustacchi 		    bb_mfg, info.smbi_manufacturer);
197*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
198*9b9e2785SRobert Mustacchi 	}
199*9b9e2785SRobert Mustacchi 
200*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_product, bb_prod) != 0) {
201*9b9e2785SRobert Mustacchi 		warnx("found wrong product: expected %s, found %s",
202*9b9e2785SRobert Mustacchi 		    bb_prod, info.smbi_product);
203*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
204*9b9e2785SRobert Mustacchi 	}
205*9b9e2785SRobert Mustacchi 
206*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_version, bb_version) != 0) {
207*9b9e2785SRobert Mustacchi 		warnx("found wrong version: expected %s, found %s",
208*9b9e2785SRobert Mustacchi 		    bb_version, info.smbi_version);
209*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
210*9b9e2785SRobert Mustacchi 	}
211*9b9e2785SRobert Mustacchi 
212*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_serial, bb_serial) != 0) {
213*9b9e2785SRobert Mustacchi 		warnx("found wrong serial: expected %s, found %s",
214*9b9e2785SRobert Mustacchi 		    bb_serial, info.smbi_serial);
215*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
216*9b9e2785SRobert Mustacchi 	}
217*9b9e2785SRobert Mustacchi 
218*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_asset, bb_asset) != 0) {
219*9b9e2785SRobert Mustacchi 		warnx("found wrong asset: expected %s, found %s",
220*9b9e2785SRobert Mustacchi 		    bb_asset, info.smbi_asset);
221*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
222*9b9e2785SRobert Mustacchi 	}
223*9b9e2785SRobert Mustacchi 
224*9b9e2785SRobert Mustacchi 	if (strcmp(info.smbi_location, bb_location) != 0) {
225*9b9e2785SRobert Mustacchi 		warnx("found wrong location: expected %s, found %s",
226*9b9e2785SRobert Mustacchi 		    bb_location, info.smbi_location);
227*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
228*9b9e2785SRobert Mustacchi 	}
229*9b9e2785SRobert Mustacchi 
230*9b9e2785SRobert Mustacchi 	if (*info.smbi_part != '\0') {
231*9b9e2785SRobert Mustacchi 		warnx("found unexpected part string: %s", info.smbi_part);
232*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
233*9b9e2785SRobert Mustacchi 	}
234*9b9e2785SRobert Mustacchi 
235*9b9e2785SRobert Mustacchi 	return (ret);
236*9b9e2785SRobert Mustacchi }
237*9b9e2785SRobert Mustacchi 
238*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_verify_noents(smbios_hdl_t * hdl)239*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_noents(smbios_hdl_t *hdl)
240*9b9e2785SRobert Mustacchi {
241*9b9e2785SRobert Mustacchi 	smbios_struct_t sp;
242*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
243*9b9e2785SRobert Mustacchi 	id_t ids[4];
244*9b9e2785SRobert Mustacchi 	int cret;
245*9b9e2785SRobert Mustacchi 
246*9b9e2785SRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_BASEBOARD, &sp) == -1) {
247*9b9e2785SRobert Mustacchi 		warnx("failed to lookup SMBIOS baseboard: %s",
248*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
249*9b9e2785SRobert Mustacchi 		return (B_FALSE);
250*9b9e2785SRobert Mustacchi 	}
251*9b9e2785SRobert Mustacchi 
252*9b9e2785SRobert Mustacchi 	if (!smbios_test_bboard_verify_base(hdl, &sp, 0))
253*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
254*9b9e2785SRobert Mustacchi 
255*9b9e2785SRobert Mustacchi 	if (!smbios_test_bboard_verify_common(hdl, &sp))
256*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
257*9b9e2785SRobert Mustacchi 
258*9b9e2785SRobert Mustacchi 	cret = smbios_info_contains(hdl, sp.smbstr_id, 0, NULL);
259*9b9e2785SRobert Mustacchi 	if (cret != 0) {
260*9b9e2785SRobert Mustacchi 		warnx("got contains count of %d: expected 0 (no ids arg)",
261*9b9e2785SRobert Mustacchi 		    cret);
262*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
263*9b9e2785SRobert Mustacchi 	}
264*9b9e2785SRobert Mustacchi 
265*9b9e2785SRobert Mustacchi 	cret = smbios_info_contains(hdl, sp.smbstr_id, ARRAY_SIZE(ids), ids);
266*9b9e2785SRobert Mustacchi 	if (cret != 0) {
267*9b9e2785SRobert Mustacchi 		warnx("returned count of %d: expected 0 (with ids arg)",
268*9b9e2785SRobert Mustacchi 		    cret);
269*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
270*9b9e2785SRobert Mustacchi 	}
271*9b9e2785SRobert Mustacchi 
272*9b9e2785SRobert Mustacchi 	return (ret);
273*9b9e2785SRobert Mustacchi }
274*9b9e2785SRobert Mustacchi 
275*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_verify_ents(smbios_hdl_t * hdl)276*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_ents(smbios_hdl_t *hdl)
277*9b9e2785SRobert Mustacchi {
278*9b9e2785SRobert Mustacchi 	smbios_struct_t sp;
279*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
280*9b9e2785SRobert Mustacchi 	id_t ids[ARRAY_SIZE(bb_ents)], lids[ARRAY_SIZE(bb_ents) * 4];
281*9b9e2785SRobert Mustacchi 	int cret;
282*9b9e2785SRobert Mustacchi 
283*9b9e2785SRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_BASEBOARD, &sp) == -1) {
284*9b9e2785SRobert Mustacchi 		warnx("failed to lookup SMBIOS baseboard: %s",
285*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
286*9b9e2785SRobert Mustacchi 		return (B_FALSE);
287*9b9e2785SRobert Mustacchi 	}
288*9b9e2785SRobert Mustacchi 
289*9b9e2785SRobert Mustacchi 	if (!smbios_test_bboard_verify_base(hdl, &sp, ARRAY_SIZE(bb_ents)))
290*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
291*9b9e2785SRobert Mustacchi 
292*9b9e2785SRobert Mustacchi 	if (!smbios_test_bboard_verify_common(hdl, &sp))
293*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
294*9b9e2785SRobert Mustacchi 
295*9b9e2785SRobert Mustacchi 	(void) memset(ids, 0x23, sizeof (ids));
296*9b9e2785SRobert Mustacchi 	(void) memset(lids, 0x23, sizeof (lids));
297*9b9e2785SRobert Mustacchi 	cret = smbios_info_contains(hdl, sp.smbstr_id, 0, NULL);
298*9b9e2785SRobert Mustacchi 	if (cret != ARRAY_SIZE(bb_ents)) {
299*9b9e2785SRobert Mustacchi 		warnx("got contains count of %d: expected %zu (no ids arg)",
300*9b9e2785SRobert Mustacchi 		    cret, ARRAY_SIZE(bb_ents));
301*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
302*9b9e2785SRobert Mustacchi 	}
303*9b9e2785SRobert Mustacchi 
304*9b9e2785SRobert Mustacchi 	cret = smbios_info_contains(hdl, sp.smbstr_id, ARRAY_SIZE(ids), ids);
305*9b9e2785SRobert Mustacchi 	if (cret != ARRAY_SIZE(bb_ents)) {
306*9b9e2785SRobert Mustacchi 		warnx("returned count of %d: expected %zu (with ids arg)",
307*9b9e2785SRobert Mustacchi 		    cret, ARRAY_SIZE(bb_ents));
308*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
309*9b9e2785SRobert Mustacchi 	}
310*9b9e2785SRobert Mustacchi 
311*9b9e2785SRobert Mustacchi 	cret = smbios_info_contains(hdl, sp.smbstr_id, ARRAY_SIZE(lids), lids);
312*9b9e2785SRobert Mustacchi 	if (cret != ARRAY_SIZE(bb_ents)) {
313*9b9e2785SRobert Mustacchi 		warnx("returned count of %d: expected %zu (with lids arg)",
314*9b9e2785SRobert Mustacchi 		    cret, ARRAY_SIZE(bb_ents));
315*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
316*9b9e2785SRobert Mustacchi 	}
317*9b9e2785SRobert Mustacchi 
318*9b9e2785SRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(bb_ents); i++) {
319*9b9e2785SRobert Mustacchi 		if (ids[i] != bb_ents[i]) {
320*9b9e2785SRobert Mustacchi 			warnx("ids[%zu] has wrong value 0x%" _PRIxID
321*9b9e2785SRobert Mustacchi 			    ", expected 0x%x", i, ids[i], bb_ents[i]);
322*9b9e2785SRobert Mustacchi 			ret = B_FALSE;
323*9b9e2785SRobert Mustacchi 		}
324*9b9e2785SRobert Mustacchi 
325*9b9e2785SRobert Mustacchi 		if (lids[i] != bb_ents[i]) {
326*9b9e2785SRobert Mustacchi 			warnx("lids[%zu] has wrong value 0x%" _PRIxID
327*9b9e2785SRobert Mustacchi 			    ", expected 0x%x", i, lids[i], bb_ents[i]);
328*9b9e2785SRobert Mustacchi 			ret = B_FALSE;
329*9b9e2785SRobert Mustacchi 		}
330*9b9e2785SRobert Mustacchi 	}
331*9b9e2785SRobert Mustacchi 
332*9b9e2785SRobert Mustacchi 	for (size_t i = ARRAY_SIZE(bb_ents); i < ARRAY_SIZE(lids); i++) {
333*9b9e2785SRobert Mustacchi 		if (lids[i] != 0x23232323) {
334*9b9e2785SRobert Mustacchi 			warnx("smbios_info_contains() clobbered entry %zu with "
335*9b9e2785SRobert Mustacchi 			    "0x%" _PRIxID, i, lids[i]);
336*9b9e2785SRobert Mustacchi 			ret = B_FALSE;
337*9b9e2785SRobert Mustacchi 		}
338*9b9e2785SRobert Mustacchi 	}
339*9b9e2785SRobert Mustacchi 
340*9b9e2785SRobert Mustacchi 	return (ret);
341*9b9e2785SRobert Mustacchi }
342*9b9e2785SRobert Mustacchi 
343*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_verify_short(smbios_hdl_t * hdl)344*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_short(smbios_hdl_t *hdl)
345*9b9e2785SRobert Mustacchi {
346*9b9e2785SRobert Mustacchi 	smbios_bboard_t bboard;
347*9b9e2785SRobert Mustacchi 	smbios_struct_t sp;
348*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
349*9b9e2785SRobert Mustacchi 
350*9b9e2785SRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_BASEBOARD, &sp) == -1) {
351*9b9e2785SRobert Mustacchi 		warnx("failed to lookup SMBIOS baseboard: %s",
352*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
353*9b9e2785SRobert Mustacchi 		return (B_FALSE);
354*9b9e2785SRobert Mustacchi 	}
355*9b9e2785SRobert Mustacchi 
356*9b9e2785SRobert Mustacchi 	if (smbios_info_bboard(hdl, sp.smbstr_id, &bboard) != -1) {
357*9b9e2785SRobert Mustacchi 		warnx("accidentally parsed invalid baseboard data as valid");
358*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
359*9b9e2785SRobert Mustacchi 	} else if (smbios_errno(hdl) != ESMB_SHORT) {
360*9b9e2785SRobert Mustacchi 		warnx("encountered wrong error for baseboard, expected: "
361*9b9e2785SRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
362*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
363*9b9e2785SRobert Mustacchi 	}
364*9b9e2785SRobert Mustacchi 
365*9b9e2785SRobert Mustacchi 	if (smbios_info_contains(hdl, sp.smbstr_id, 0, NULL) != -1) {
366*9b9e2785SRobert Mustacchi 		warnx("smbios_info_contains() passed despite corrupt table");
367*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
368*9b9e2785SRobert Mustacchi 	} else if (smbios_errno(hdl) != ESMB_SHORT) {
369*9b9e2785SRobert Mustacchi 		warnx("encountered wrong error for short contains, expected: "
370*9b9e2785SRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
371*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
372*9b9e2785SRobert Mustacchi 	}
373*9b9e2785SRobert Mustacchi 
374*9b9e2785SRobert Mustacchi 	return (ret);
375*9b9e2785SRobert Mustacchi }
376*9b9e2785SRobert Mustacchi 
377*9b9e2785SRobert Mustacchi boolean_t
smbios_test_bboard_verify_short_ents(smbios_hdl_t * hdl)378*9b9e2785SRobert Mustacchi smbios_test_bboard_verify_short_ents(smbios_hdl_t *hdl)
379*9b9e2785SRobert Mustacchi {
380*9b9e2785SRobert Mustacchi 	smbios_struct_t sp;
381*9b9e2785SRobert Mustacchi 	boolean_t ret = B_TRUE;
382*9b9e2785SRobert Mustacchi 
383*9b9e2785SRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_BASEBOARD, &sp) == -1) {
384*9b9e2785SRobert Mustacchi 		warnx("failed to lookup SMBIOS baseboard: %s",
385*9b9e2785SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
386*9b9e2785SRobert Mustacchi 		return (B_FALSE);
387*9b9e2785SRobert Mustacchi 	}
388*9b9e2785SRobert Mustacchi 
389*9b9e2785SRobert Mustacchi 	/*
390*9b9e2785SRobert Mustacchi 	 * We should be able to parse the base structure as we have enough data
391*9b9e2785SRobert Mustacchi 	 * here. We skip trying to parse the common data as it technically fits
392*9b9e2785SRobert Mustacchi 	 * in here, but the string pointers will be in the wrong spots; however,
393*9b9e2785SRobert Mustacchi 	 * there's not a lot that we can do right now in the library about that.
394*9b9e2785SRobert Mustacchi 	 */
395*9b9e2785SRobert Mustacchi 	if (!smbios_test_bboard_verify_base(hdl, &sp, ARRAY_SIZE(bb_ents)))
396*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
397*9b9e2785SRobert Mustacchi 
398*9b9e2785SRobert Mustacchi 	if (smbios_info_contains(hdl, sp.smbstr_id, 0, NULL) != -1) {
399*9b9e2785SRobert Mustacchi 		warnx("smbios_info_contains() passed despite corrupt table");
400*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
401*9b9e2785SRobert Mustacchi 	} else if (smbios_errno(hdl) != ESMB_SHORT) {
402*9b9e2785SRobert Mustacchi 		warnx("encountered wrong error for short contains, expected: "
403*9b9e2785SRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
404*9b9e2785SRobert Mustacchi 		ret = B_FALSE;
405*9b9e2785SRobert Mustacchi 	}
406*9b9e2785SRobert Mustacchi 
407*9b9e2785SRobert Mustacchi 	return (ret);
408*9b9e2785SRobert Mustacchi }
409