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