1d53cdfabSRobert Mustacchi /*
2d53cdfabSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3d53cdfabSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4d53cdfabSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5d53cdfabSRobert Mustacchi  * 1.0 of the CDDL.
6d53cdfabSRobert Mustacchi  *
7d53cdfabSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8d53cdfabSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9d53cdfabSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10d53cdfabSRobert Mustacchi  */
11d53cdfabSRobert Mustacchi 
12d53cdfabSRobert Mustacchi /*
13d53cdfabSRobert Mustacchi  * Copyright 2021 Oxide Computer Company
14d53cdfabSRobert Mustacchi  */
15d53cdfabSRobert Mustacchi 
16d53cdfabSRobert Mustacchi /*
17d53cdfabSRobert Mustacchi  * Tests for SMBIOS type 46 - SMB_TYPE_STRPROP.
18d53cdfabSRobert Mustacchi  */
19d53cdfabSRobert Mustacchi 
20d53cdfabSRobert Mustacchi #include "smbios_test.h"
21d53cdfabSRobert Mustacchi 
22d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_name = "Sheikah Slate";
23d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_vers = "1.3.1";
24d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_id = "ganon";
25d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_reldate = "2017-03-03";
26d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_mfg = "The Goddess Hylia";
27d53cdfabSRobert Mustacchi static const char *smbios_fwinfo_lsv = "zelda";
28d53cdfabSRobert Mustacchi static const uint64_t smbios_fwinfo_size = 0xb0111b;
29d53cdfabSRobert Mustacchi static const uint_t smbios_fwinfo_ncomps = 23;
30d53cdfabSRobert Mustacchi static const uint8_t smbios_fwinfo_versid = 0x66;
31d53cdfabSRobert Mustacchi 
32d53cdfabSRobert Mustacchi static void
smbios_test_fwinfo_mktable_common_fwinfo(smb_fwinfo_t * fw)33d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_common_fwinfo(smb_fwinfo_t *fw)
34d53cdfabSRobert Mustacchi {
35d53cdfabSRobert Mustacchi 	fw->smbfwii_hdr.smbh_type = SMB_TYPE_FWINFO;
36d53cdfabSRobert Mustacchi 	fw->smbfwii_hdr.smbh_len = sizeof (*fw);
37d53cdfabSRobert Mustacchi 	fw->smbfwii_name = 1;
38d53cdfabSRobert Mustacchi 	fw->smbfwii_vers = 2;
39d53cdfabSRobert Mustacchi 	fw->smbfwii_vers_fmt = smbios_fwinfo_versid;
40d53cdfabSRobert Mustacchi 	fw->smbfwii_id = 3;
41d53cdfabSRobert Mustacchi 	fw->smbfwii_id_fmt = smbios_fwinfo_versid;
42d53cdfabSRobert Mustacchi 	fw->smbfwii_reldate = 4;
43d53cdfabSRobert Mustacchi 	fw->smbfwii_mfg = 5;
44d53cdfabSRobert Mustacchi 	fw->smbfwii_lsv = 6;
45d53cdfabSRobert Mustacchi 	fw->smbfwii_imgsz = htole64(smbios_fwinfo_size);
46d53cdfabSRobert Mustacchi 	fw->smbfwii_chars = SMB_FWC_WP;
47d53cdfabSRobert Mustacchi 	fw->smbfwii_state = SMB_FWS_UA_OFFLINE;
48d53cdfabSRobert Mustacchi 	fw->smbfwii_ncomps = 0;
49d53cdfabSRobert Mustacchi }
50d53cdfabSRobert Mustacchi 
51d53cdfabSRobert Mustacchi static void
smbios_test_fwinfo_mktable_common_fini(smbios_test_table_t * table)52d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_common_fini(smbios_test_table_t *table)
53d53cdfabSRobert Mustacchi {
54d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_name);
55d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_vers);
56d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_id);
57d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_reldate);
58d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_mfg);
59d53cdfabSRobert Mustacchi 	smbios_test_table_append_string(table, smbios_fwinfo_lsv);
60d53cdfabSRobert Mustacchi 	smbios_test_table_str_fini(table);
61d53cdfabSRobert Mustacchi 	smbios_test_table_append_eot(table);
62d53cdfabSRobert Mustacchi }
63d53cdfabSRobert Mustacchi 
64d53cdfabSRobert Mustacchi /*
65d53cdfabSRobert Mustacchi  * Generate a table that's too short to get basic info.
66d53cdfabSRobert Mustacchi  */
67d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_mktable_invlen_base(smbios_test_table_t * table)68d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_invlen_base(smbios_test_table_t *table)
69d53cdfabSRobert Mustacchi {
70d53cdfabSRobert Mustacchi 	smb_header_t hdr;
71d53cdfabSRobert Mustacchi 
72d53cdfabSRobert Mustacchi 	hdr.smbh_type = SMB_TYPE_FWINFO;
73d53cdfabSRobert Mustacchi 	hdr.smbh_len = sizeof (hdr);
74d53cdfabSRobert Mustacchi 
75d53cdfabSRobert Mustacchi 	(void) smbios_test_table_append(table, &hdr, sizeof (hdr));
76d53cdfabSRobert Mustacchi 	smbios_test_table_append_eot(table);
77d53cdfabSRobert Mustacchi 
78d53cdfabSRobert Mustacchi 	return (B_TRUE);
79d53cdfabSRobert Mustacchi }
80d53cdfabSRobert Mustacchi 
81d53cdfabSRobert Mustacchi /*
82d53cdfabSRobert Mustacchi  * Generate a table where the table is too short for a specified number of
83d53cdfabSRobert Mustacchi  * components.
84d53cdfabSRobert Mustacchi  */
85d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_mktable_invlen_comps(smbios_test_table_t * table)86d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_invlen_comps(smbios_test_table_t *table)
87d53cdfabSRobert Mustacchi {
88d53cdfabSRobert Mustacchi 	smb_fwinfo_t fw;
89d53cdfabSRobert Mustacchi 
90d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fwinfo(&fw);
91d53cdfabSRobert Mustacchi 	fw.smbfwii_ncomps = smbios_fwinfo_ncomps;
92d53cdfabSRobert Mustacchi 	(void) smbios_test_table_append(table, &fw, sizeof (fw));
93d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fini(table);
94d53cdfabSRobert Mustacchi 
95d53cdfabSRobert Mustacchi 	return (B_TRUE);
96d53cdfabSRobert Mustacchi }
97d53cdfabSRobert Mustacchi 
98d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_mktable_nocomps(smbios_test_table_t * table)99d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_nocomps(smbios_test_table_t *table)
100d53cdfabSRobert Mustacchi {
101d53cdfabSRobert Mustacchi 	smb_fwinfo_t fw;
102d53cdfabSRobert Mustacchi 
103d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fwinfo(&fw);
104d53cdfabSRobert Mustacchi 	(void) smbios_test_table_append(table, &fw, sizeof (fw));
105d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fini(table);
106d53cdfabSRobert Mustacchi 
107d53cdfabSRobert Mustacchi 	return (B_TRUE);
108d53cdfabSRobert Mustacchi }
109d53cdfabSRobert Mustacchi 
110d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_mktable_comps(smbios_test_table_t * table)111d53cdfabSRobert Mustacchi smbios_test_fwinfo_mktable_comps(smbios_test_table_t *table)
112d53cdfabSRobert Mustacchi {
113d53cdfabSRobert Mustacchi 	smb_fwinfo_t fw;
114d53cdfabSRobert Mustacchi 
115d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fwinfo(&fw);
116d53cdfabSRobert Mustacchi 
117d53cdfabSRobert Mustacchi 	fw.smbfwii_hdr.smbh_len += smbios_fwinfo_ncomps * sizeof (uint16_t);
118d53cdfabSRobert Mustacchi 	fw.smbfwii_ncomps = smbios_fwinfo_ncomps;
119d53cdfabSRobert Mustacchi 	(void) smbios_test_table_append(table, &fw, sizeof (fw));
120d53cdfabSRobert Mustacchi 
121d53cdfabSRobert Mustacchi 	for (uint_t i = 0; i < fw.smbfwii_ncomps; i++) {
122d53cdfabSRobert Mustacchi 		uint16_t comp = 0x2300 + i;
123d53cdfabSRobert Mustacchi 
124d53cdfabSRobert Mustacchi 		smbios_test_table_append_raw(table, &comp, sizeof (comp));
125d53cdfabSRobert Mustacchi 	}
126d53cdfabSRobert Mustacchi 	smbios_test_fwinfo_mktable_common_fini(table);
127d53cdfabSRobert Mustacchi 
128d53cdfabSRobert Mustacchi 	return (B_TRUE);
129d53cdfabSRobert Mustacchi }
130d53cdfabSRobert Mustacchi 
131d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_verify_badtype(smbios_hdl_t * hdl)132d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_badtype(smbios_hdl_t *hdl)
133d53cdfabSRobert Mustacchi {
134d53cdfabSRobert Mustacchi 	smbios_struct_t sp;
135d53cdfabSRobert Mustacchi 	smbios_fwinfo_t fw;
136d53cdfabSRobert Mustacchi 
137d53cdfabSRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_MEMDEVICE, &sp) == -1) {
138d53cdfabSRobert Mustacchi 		warnx("failed to lookup SMBIOS memory device: %s",
139d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
140d53cdfabSRobert Mustacchi 		return (B_FALSE);
141d53cdfabSRobert Mustacchi 	}
142d53cdfabSRobert Mustacchi 
143d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo(hdl, sp.smbstr_id, &fw) != -1) {
144d53cdfabSRobert Mustacchi 		warnx("accidentally parsed invalid fwinfo information as "
145d53cdfabSRobert Mustacchi 		    "valid");
146d53cdfabSRobert Mustacchi 		return (B_FALSE);
147d53cdfabSRobert Mustacchi 	}
148d53cdfabSRobert Mustacchi 
149d53cdfabSRobert Mustacchi 	if (smbios_errno(hdl) != ESMB_TYPE) {
150d53cdfabSRobert Mustacchi 		warnx("encountered wrong error for fwinfo, expected: "
151d53cdfabSRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
152d53cdfabSRobert Mustacchi 		return (B_FALSE);
153d53cdfabSRobert Mustacchi 	}
154d53cdfabSRobert Mustacchi 
155d53cdfabSRobert Mustacchi 	return (B_TRUE);
156d53cdfabSRobert Mustacchi }
157d53cdfabSRobert Mustacchi 
158d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_verify_invlen_base(smbios_hdl_t * hdl)159d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_invlen_base(smbios_hdl_t *hdl)
160d53cdfabSRobert Mustacchi {
161d53cdfabSRobert Mustacchi 	smbios_struct_t sp;
162d53cdfabSRobert Mustacchi 	smbios_fwinfo_t fw;
163d53cdfabSRobert Mustacchi 
164d53cdfabSRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_FWINFO, &sp) == -1) {
165d53cdfabSRobert Mustacchi 		warnx("failed to lookup SMBIOS fwinfo: %s",
166d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
167d53cdfabSRobert Mustacchi 		return (B_FALSE);
168d53cdfabSRobert Mustacchi 	}
169d53cdfabSRobert Mustacchi 
170d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo(hdl, sp.smbstr_id, &fw) != -1) {
171d53cdfabSRobert Mustacchi 		warnx("accidentally parsed invalid fwinfo information as "
172d53cdfabSRobert Mustacchi 		    "valid");
173d53cdfabSRobert Mustacchi 		return (B_FALSE);
174d53cdfabSRobert Mustacchi 	}
175d53cdfabSRobert Mustacchi 
176d53cdfabSRobert Mustacchi 	if (smbios_errno(hdl) != ESMB_SHORT) {
177d53cdfabSRobert Mustacchi 		warnx("encountered wrong error for fwinfo, expected: "
178d53cdfabSRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
179d53cdfabSRobert Mustacchi 		return (B_FALSE);
180d53cdfabSRobert Mustacchi 	}
181d53cdfabSRobert Mustacchi 
182d53cdfabSRobert Mustacchi 	return (B_TRUE);
183d53cdfabSRobert Mustacchi }
184d53cdfabSRobert Mustacchi 
185d53cdfabSRobert Mustacchi static boolean_t
smbios_test_fwinfo_verify_common(smbios_hdl_t * hdl,smbios_struct_t * sp,const smbios_fwinfo_t * fw)186d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_common(smbios_hdl_t *hdl, smbios_struct_t *sp,
187d53cdfabSRobert Mustacchi     const smbios_fwinfo_t *fw)
188d53cdfabSRobert Mustacchi {
189d53cdfabSRobert Mustacchi 	boolean_t ret = B_TRUE;
190d53cdfabSRobert Mustacchi 	smbios_info_t info;
191d53cdfabSRobert Mustacchi 
192d53cdfabSRobert Mustacchi 	if (strcmp(fw->smbfw_name, smbios_fwinfo_name) != 0) {
193d53cdfabSRobert Mustacchi 		warnx("firmware inventory name mismatch, found %s",
194d53cdfabSRobert Mustacchi 		    fw->smbfw_name);
195d53cdfabSRobert Mustacchi 		ret = B_FALSE;
196d53cdfabSRobert Mustacchi 	}
197d53cdfabSRobert Mustacchi 
198d53cdfabSRobert Mustacchi 	if (strcmp(fw->smbfw_id, smbios_fwinfo_id) != 0) {
199d53cdfabSRobert Mustacchi 		warnx("firmware inventory id mismatch, found %s",
200d53cdfabSRobert Mustacchi 		    fw->smbfw_id);
201d53cdfabSRobert Mustacchi 		ret = B_FALSE;
202d53cdfabSRobert Mustacchi 	}
203d53cdfabSRobert Mustacchi 
204d53cdfabSRobert Mustacchi 	if (strcmp(fw->smbfw_reldate, smbios_fwinfo_reldate) != 0) {
205d53cdfabSRobert Mustacchi 		warnx("firmware inventory release date mismatch, found %s",
206d53cdfabSRobert Mustacchi 		    fw->smbfw_reldate);
207d53cdfabSRobert Mustacchi 		ret = B_FALSE;
208d53cdfabSRobert Mustacchi 	}
209d53cdfabSRobert Mustacchi 
210d53cdfabSRobert Mustacchi 	if (strcmp(fw->smbfw_lsv, smbios_fwinfo_lsv) != 0) {
211d53cdfabSRobert Mustacchi 		warnx("firmware inventory lsv mismatch, found %s",
212d53cdfabSRobert Mustacchi 		    fw->smbfw_lsv);
213d53cdfabSRobert Mustacchi 		ret = B_FALSE;
214d53cdfabSRobert Mustacchi 	}
215d53cdfabSRobert Mustacchi 
216d53cdfabSRobert Mustacchi 	if (fw->smbfw_imgsz != smbios_fwinfo_size) {
217d53cdfabSRobert Mustacchi 		warnx("firmware inventory size mismatch, found 0x%" PRIx64,
218d53cdfabSRobert Mustacchi 		    fw->smbfw_imgsz);
219d53cdfabSRobert Mustacchi 		ret = B_FALSE;
220d53cdfabSRobert Mustacchi 	}
221d53cdfabSRobert Mustacchi 
222d53cdfabSRobert Mustacchi 	if (fw->smbfw_chars != SMB_FWC_WP) {
223d53cdfabSRobert Mustacchi 		warnx("firmware inventory chars mismatch, found 0x%x",
224d53cdfabSRobert Mustacchi 		    fw->smbfw_chars);
225d53cdfabSRobert Mustacchi 		ret = B_FALSE;
226d53cdfabSRobert Mustacchi 	}
227d53cdfabSRobert Mustacchi 
228d53cdfabSRobert Mustacchi 	if (fw->smbfw_state != SMB_FWS_UA_OFFLINE) {
229d53cdfabSRobert Mustacchi 		warnx("firmware inventory state mismatch, found 0x%x",
230d53cdfabSRobert Mustacchi 		    fw->smbfw_state);
231d53cdfabSRobert Mustacchi 		ret = B_FALSE;
232d53cdfabSRobert Mustacchi 	}
233d53cdfabSRobert Mustacchi 
234d53cdfabSRobert Mustacchi 	if (fw->smbfw_vers_fmt != smbios_fwinfo_versid) {
235d53cdfabSRobert Mustacchi 		warnx("firmware inventory version format mismatch, found 0x%x",
236d53cdfabSRobert Mustacchi 		    fw->smbfw_vers_fmt);
237d53cdfabSRobert Mustacchi 		ret = B_FALSE;
238d53cdfabSRobert Mustacchi 	}
239d53cdfabSRobert Mustacchi 
240d53cdfabSRobert Mustacchi 	if (fw->smbfw_id_fmt != smbios_fwinfo_versid) {
241d53cdfabSRobert Mustacchi 		warnx("firmware inventory ID format mismatch, found 0x%x",
242d53cdfabSRobert Mustacchi 		    fw->smbfw_id_fmt);
243d53cdfabSRobert Mustacchi 		ret = B_FALSE;
244d53cdfabSRobert Mustacchi 	}
245d53cdfabSRobert Mustacchi 
246d53cdfabSRobert Mustacchi 	if (smbios_info_common(hdl, sp->smbstr_id, &info) == -1) {
247d53cdfabSRobert Mustacchi 		warnx("failed to get firmware inventory common items: %s",
248d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
249d53cdfabSRobert Mustacchi 		return (B_FALSE);
250d53cdfabSRobert Mustacchi 	}
251d53cdfabSRobert Mustacchi 
252d53cdfabSRobert Mustacchi 	if (strcmp(info.smbi_manufacturer, smbios_fwinfo_mfg) != 0) {
253d53cdfabSRobert Mustacchi 		warnx("firmware inventory manufacturer mismatch, found %s",
254d53cdfabSRobert Mustacchi 		    info.smbi_manufacturer);
255d53cdfabSRobert Mustacchi 		ret = B_FALSE;
256d53cdfabSRobert Mustacchi 	}
257d53cdfabSRobert Mustacchi 
258d53cdfabSRobert Mustacchi 	if (strcmp(info.smbi_version, smbios_fwinfo_vers) != 0) {
259d53cdfabSRobert Mustacchi 		warnx("firmware inventory version mismatch, found %s",
260d53cdfabSRobert Mustacchi 		    info.smbi_version);
261d53cdfabSRobert Mustacchi 		ret = B_FALSE;
262d53cdfabSRobert Mustacchi 	}
263d53cdfabSRobert Mustacchi 
264d53cdfabSRobert Mustacchi 	return (ret);
265d53cdfabSRobert Mustacchi }
266d53cdfabSRobert Mustacchi 
267d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_verify_nocomps(smbios_hdl_t * hdl)268d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_nocomps(smbios_hdl_t *hdl)
269d53cdfabSRobert Mustacchi {
270d53cdfabSRobert Mustacchi 	smbios_struct_t sp;
271d53cdfabSRobert Mustacchi 	smbios_fwinfo_t fw;
272d53cdfabSRobert Mustacchi 	uint_t ncomps;
273d53cdfabSRobert Mustacchi 	smbios_fwinfo_comp_t *comps;
274d53cdfabSRobert Mustacchi 	boolean_t ret = B_TRUE;
275d53cdfabSRobert Mustacchi 
276d53cdfabSRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_FWINFO, &sp) == -1) {
277d53cdfabSRobert Mustacchi 		warnx("failed to lookup SMBIOS fwinfo: %s",
278d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
279d53cdfabSRobert Mustacchi 		return (B_FALSE);
280d53cdfabSRobert Mustacchi 	}
281d53cdfabSRobert Mustacchi 
282d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo(hdl, sp.smbstr_id, &fw) == -1) {
283d53cdfabSRobert Mustacchi 		warnx("failed to get firmware inventory: %s",
284d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
285d53cdfabSRobert Mustacchi 		return (B_FALSE);
286d53cdfabSRobert Mustacchi 	}
287d53cdfabSRobert Mustacchi 
288d53cdfabSRobert Mustacchi 	if (!smbios_test_fwinfo_verify_common(hdl, &sp, &fw)) {
289d53cdfabSRobert Mustacchi 		ret = B_FALSE;
290d53cdfabSRobert Mustacchi 	}
291d53cdfabSRobert Mustacchi 
292d53cdfabSRobert Mustacchi 	if (fw.smbfw_ncomps != 0) {
293d53cdfabSRobert Mustacchi 		warnx("firmware inventory ncomps mismatch, found 0x%x",
294d53cdfabSRobert Mustacchi 		    fw.smbfw_ncomps);
295d53cdfabSRobert Mustacchi 		ret = B_FALSE;
296d53cdfabSRobert Mustacchi 	}
297d53cdfabSRobert Mustacchi 
298d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo_comps(hdl, sp.smbstr_id, &ncomps, &comps) != 0) {
299d53cdfabSRobert Mustacchi 		warnx("failed to get components: %s",
300d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
301d53cdfabSRobert Mustacchi 		ret = B_FALSE;
302d53cdfabSRobert Mustacchi 	}
303d53cdfabSRobert Mustacchi 
304d53cdfabSRobert Mustacchi 	if (ncomps != 0) {
305d53cdfabSRobert Mustacchi 		warnx("smbios_info_fwinfo_comps() returned wrong number of "
306d53cdfabSRobert Mustacchi 		    "comps: 0x%x", ncomps);
307d53cdfabSRobert Mustacchi 		ret = B_FALSE;
308d53cdfabSRobert Mustacchi 	}
309d53cdfabSRobert Mustacchi 
310d53cdfabSRobert Mustacchi 	if (comps != NULL) {
311d53cdfabSRobert Mustacchi 		warnx("smbios_info_fwinfo_comps() gave a non-NULL comps "
312d53cdfabSRobert Mustacchi 		    "pointer: %p", comps);
313d53cdfabSRobert Mustacchi 		ret = B_FALSE;
314d53cdfabSRobert Mustacchi 	}
315d53cdfabSRobert Mustacchi 
316d53cdfabSRobert Mustacchi 	smbios_info_fwinfo_comps_free(hdl, ncomps, comps);
317d53cdfabSRobert Mustacchi 
318d53cdfabSRobert Mustacchi 	return (ret);
319d53cdfabSRobert Mustacchi }
320d53cdfabSRobert Mustacchi 
321d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_verify_invlen_comps(smbios_hdl_t * hdl)322d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_invlen_comps(smbios_hdl_t *hdl)
323d53cdfabSRobert Mustacchi {
324d53cdfabSRobert Mustacchi 	smbios_struct_t sp;
325d53cdfabSRobert Mustacchi 	smbios_fwinfo_t fw;
326d53cdfabSRobert Mustacchi 	uint_t ncomps;
327d53cdfabSRobert Mustacchi 	smbios_fwinfo_comp_t *comps;
328d53cdfabSRobert Mustacchi 	boolean_t ret = B_TRUE;
329d53cdfabSRobert Mustacchi 
330d53cdfabSRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_FWINFO, &sp) == -1) {
331d53cdfabSRobert Mustacchi 		warnx("failed to lookup SMBIOS fwinfo: %s",
332d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
333d53cdfabSRobert Mustacchi 		return (B_FALSE);
334d53cdfabSRobert Mustacchi 	}
335d53cdfabSRobert Mustacchi 
336d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo(hdl, sp.smbstr_id, &fw) == -1) {
337d53cdfabSRobert Mustacchi 		warnx("failed to get firmware inventory: %s",
338d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
339d53cdfabSRobert Mustacchi 		return (B_FALSE);
340d53cdfabSRobert Mustacchi 	}
341d53cdfabSRobert Mustacchi 
342d53cdfabSRobert Mustacchi 	if (!smbios_test_fwinfo_verify_common(hdl, &sp, &fw)) {
343d53cdfabSRobert Mustacchi 		ret = B_FALSE;
344d53cdfabSRobert Mustacchi 	}
345d53cdfabSRobert Mustacchi 
346d53cdfabSRobert Mustacchi 	if (fw.smbfw_ncomps != smbios_fwinfo_ncomps) {
347d53cdfabSRobert Mustacchi 		warnx("firmware inventory ncomps mismatch, found 0x%x",
348d53cdfabSRobert Mustacchi 		    fw.smbfw_ncomps);
349d53cdfabSRobert Mustacchi 		ret = B_FALSE;
350d53cdfabSRobert Mustacchi 	}
351d53cdfabSRobert Mustacchi 
352d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo_comps(hdl, sp.smbstr_id, &ncomps, &comps) !=
353d53cdfabSRobert Mustacchi 	    -1) {
354d53cdfabSRobert Mustacchi 		warnx("accidentally parsed invalid fwinfo components as "
355d53cdfabSRobert Mustacchi 		    "valid");
356d53cdfabSRobert Mustacchi 		return (B_FALSE);
357d53cdfabSRobert Mustacchi 	}
358d53cdfabSRobert Mustacchi 
359d53cdfabSRobert Mustacchi 	if (smbios_errno(hdl) != ESMB_SHORT) {
360d53cdfabSRobert Mustacchi 		warnx("encountered wrong error for fwinfo comps, expected: "
361d53cdfabSRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
362d53cdfabSRobert Mustacchi 		return (B_FALSE);
363d53cdfabSRobert Mustacchi 	}
364d53cdfabSRobert Mustacchi 
365d53cdfabSRobert Mustacchi 	return (ret);
366d53cdfabSRobert Mustacchi }
367d53cdfabSRobert Mustacchi 
368d53cdfabSRobert Mustacchi 
369d53cdfabSRobert Mustacchi 
370d53cdfabSRobert Mustacchi boolean_t
smbios_test_fwinfo_verify_comps(smbios_hdl_t * hdl)371d53cdfabSRobert Mustacchi smbios_test_fwinfo_verify_comps(smbios_hdl_t *hdl)
372d53cdfabSRobert Mustacchi {
373d53cdfabSRobert Mustacchi 	smbios_struct_t sp;
374d53cdfabSRobert Mustacchi 	smbios_fwinfo_t fw;
375d53cdfabSRobert Mustacchi 	uint_t ncomps;
376d53cdfabSRobert Mustacchi 	smbios_fwinfo_comp_t *comps;
377d53cdfabSRobert Mustacchi 	boolean_t ret = B_TRUE;
378d53cdfabSRobert Mustacchi 
379d53cdfabSRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_FWINFO, &sp) == -1) {
380d53cdfabSRobert Mustacchi 		warnx("failed to lookup SMBIOS fwinfo: %s",
381d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
382d53cdfabSRobert Mustacchi 		return (B_FALSE);
383d53cdfabSRobert Mustacchi 	}
384d53cdfabSRobert Mustacchi 
385d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo(hdl, sp.smbstr_id, &fw) == -1) {
386d53cdfabSRobert Mustacchi 		warnx("failed to get firmware inventory: %s",
387d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
388d53cdfabSRobert Mustacchi 		return (B_FALSE);
389d53cdfabSRobert Mustacchi 	}
390d53cdfabSRobert Mustacchi 
391d53cdfabSRobert Mustacchi 	if (!smbios_test_fwinfo_verify_common(hdl, &sp, &fw)) {
392d53cdfabSRobert Mustacchi 		ret = B_FALSE;
393d53cdfabSRobert Mustacchi 	}
394d53cdfabSRobert Mustacchi 
395d53cdfabSRobert Mustacchi 	if (fw.smbfw_ncomps != smbios_fwinfo_ncomps) {
396d53cdfabSRobert Mustacchi 		warnx("firmware inventory ncomps mismatch, found 0x%x",
397d53cdfabSRobert Mustacchi 		    fw.smbfw_ncomps);
398d53cdfabSRobert Mustacchi 		ret = B_FALSE;
399d53cdfabSRobert Mustacchi 	}
400d53cdfabSRobert Mustacchi 
401d53cdfabSRobert Mustacchi 	if (smbios_info_fwinfo_comps(hdl, sp.smbstr_id, &ncomps, &comps) != 0) {
402d53cdfabSRobert Mustacchi 		warnx("failed to get components: %s",
403d53cdfabSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
404d53cdfabSRobert Mustacchi 		ret = B_FALSE;
405d53cdfabSRobert Mustacchi 	}
406d53cdfabSRobert Mustacchi 
407d53cdfabSRobert Mustacchi 	if (ncomps != smbios_fwinfo_ncomps) {
408d53cdfabSRobert Mustacchi 		warnx("smbios_info_fwinfo_comps() returned wrong number of "
409d53cdfabSRobert Mustacchi 		    "comps: 0x%x", ncomps);
410d53cdfabSRobert Mustacchi 		ret = B_FALSE;
411d53cdfabSRobert Mustacchi 	}
412d53cdfabSRobert Mustacchi 
413d53cdfabSRobert Mustacchi 	if (comps == NULL) {
414d53cdfabSRobert Mustacchi 		warnx("smbios_info_fwinfo_comps() gave a NULL comps pointer");
415d53cdfabSRobert Mustacchi 		ret = B_FALSE;
416d53cdfabSRobert Mustacchi 	} else {
417d53cdfabSRobert Mustacchi 		for (uint_t i = 0; i < smbios_fwinfo_ncomps; i++) {
418d53cdfabSRobert Mustacchi 			if (comps[i].smbfwe_id != 0x2300 + i) {
419*8d195583SRobert Mustacchi 				warnx("component id %u is wrong: 0x%" _PRIxID,
420*8d195583SRobert Mustacchi 				    i, comps[i].smbfwe_id);
421d53cdfabSRobert Mustacchi 				ret = B_FALSE;
422d53cdfabSRobert Mustacchi 			}
423d53cdfabSRobert Mustacchi 		}
424d53cdfabSRobert Mustacchi 	}
425d53cdfabSRobert Mustacchi 
426d53cdfabSRobert Mustacchi 	smbios_info_fwinfo_comps_free(hdl, ncomps, comps);
427d53cdfabSRobert Mustacchi 
428d53cdfabSRobert Mustacchi 	return (ret);
429d53cdfabSRobert Mustacchi }
430