1*d53cdfabSRobert Mustacchi /*
2*d53cdfabSRobert Mustacchi * This file and its contents are supplied under the terms of the
3*d53cdfabSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4*d53cdfabSRobert Mustacchi * You may only use this file in accordance with the terms of version
5*d53cdfabSRobert Mustacchi * 1.0 of the CDDL.
6*d53cdfabSRobert Mustacchi *
7*d53cdfabSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8*d53cdfabSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9*d53cdfabSRobert Mustacchi * http://www.illumos.org/license/CDDL.
10*d53cdfabSRobert Mustacchi */
11*d53cdfabSRobert Mustacchi
12*d53cdfabSRobert Mustacchi /*
13*d53cdfabSRobert Mustacchi * Copyright 2021 Oxide Computer Company
14*d53cdfabSRobert Mustacchi */
15*d53cdfabSRobert Mustacchi
16*d53cdfabSRobert Mustacchi /*
17*d53cdfabSRobert Mustacchi * Tests for SMBIOS type 46 - SMB_TYPE_STRPROP.
18*d53cdfabSRobert Mustacchi */
19*d53cdfabSRobert Mustacchi
20*d53cdfabSRobert Mustacchi #include "smbios_test.h"
21*d53cdfabSRobert Mustacchi
22*d53cdfabSRobert Mustacchi static const char *smbios_strprop_path = "/not/really/uefi";
23*d53cdfabSRobert Mustacchi static uint16_t smbios_strprop_hdl = 0xcafe;
24*d53cdfabSRobert Mustacchi
25*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_mktable_basic(smbios_test_table_t * table)26*d53cdfabSRobert Mustacchi smbios_test_strprop_mktable_basic(smbios_test_table_t *table)
27*d53cdfabSRobert Mustacchi {
28*d53cdfabSRobert Mustacchi smb_strprop_t str;
29*d53cdfabSRobert Mustacchi
30*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
31*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_len = sizeof (str);
32*d53cdfabSRobert Mustacchi str.smbstrp_prop_id = htole16(SMB_STRP_UEFI_DEVPATH);
33*d53cdfabSRobert Mustacchi str.smbstrp_prop_val = 1;
34*d53cdfabSRobert Mustacchi str.smbstrp_phdl = htole16(smbios_strprop_hdl);
35*d53cdfabSRobert Mustacchi
36*d53cdfabSRobert Mustacchi (void) smbios_test_table_append(table, &str, sizeof (str));
37*d53cdfabSRobert Mustacchi smbios_test_table_append_string(table, smbios_strprop_path);
38*d53cdfabSRobert Mustacchi smbios_test_table_str_fini(table);
39*d53cdfabSRobert Mustacchi smbios_test_table_append_eot(table);
40*d53cdfabSRobert Mustacchi
41*d53cdfabSRobert Mustacchi return (B_TRUE);
42*d53cdfabSRobert Mustacchi }
43*d53cdfabSRobert Mustacchi
44*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_mktable_badstr(smbios_test_table_t * table)45*d53cdfabSRobert Mustacchi smbios_test_strprop_mktable_badstr(smbios_test_table_t *table)
46*d53cdfabSRobert Mustacchi {
47*d53cdfabSRobert Mustacchi smb_strprop_t str;
48*d53cdfabSRobert Mustacchi
49*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
50*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_len = sizeof (str);
51*d53cdfabSRobert Mustacchi str.smbstrp_prop_id = htole16(SMB_STRP_UEFI_DEVPATH);
52*d53cdfabSRobert Mustacchi str.smbstrp_prop_val = 0x23;
53*d53cdfabSRobert Mustacchi str.smbstrp_phdl = htole16(smbios_strprop_hdl);
54*d53cdfabSRobert Mustacchi
55*d53cdfabSRobert Mustacchi (void) smbios_test_table_append(table, &str, sizeof (str));
56*d53cdfabSRobert Mustacchi smbios_test_table_append_string(table, smbios_strprop_path);
57*d53cdfabSRobert Mustacchi smbios_test_table_str_fini(table);
58*d53cdfabSRobert Mustacchi smbios_test_table_append_eot(table);
59*d53cdfabSRobert Mustacchi
60*d53cdfabSRobert Mustacchi return (B_TRUE);
61*d53cdfabSRobert Mustacchi }
62*d53cdfabSRobert Mustacchi
63*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_mktable_invlen1(smbios_test_table_t * table)64*d53cdfabSRobert Mustacchi smbios_test_strprop_mktable_invlen1(smbios_test_table_t *table)
65*d53cdfabSRobert Mustacchi {
66*d53cdfabSRobert Mustacchi smb_header_t hdr;
67*d53cdfabSRobert Mustacchi
68*d53cdfabSRobert Mustacchi hdr.smbh_type = SMB_TYPE_STRPROP;
69*d53cdfabSRobert Mustacchi hdr.smbh_len = sizeof (hdr);
70*d53cdfabSRobert Mustacchi
71*d53cdfabSRobert Mustacchi (void) smbios_test_table_append(table, &hdr, sizeof (hdr));
72*d53cdfabSRobert Mustacchi smbios_test_table_append_eot(table);
73*d53cdfabSRobert Mustacchi
74*d53cdfabSRobert Mustacchi return (B_TRUE);
75*d53cdfabSRobert Mustacchi }
76*d53cdfabSRobert Mustacchi
77*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_mktable_invlen2(smbios_test_table_t * table)78*d53cdfabSRobert Mustacchi smbios_test_strprop_mktable_invlen2(smbios_test_table_t *table)
79*d53cdfabSRobert Mustacchi {
80*d53cdfabSRobert Mustacchi smb_strprop_t str;
81*d53cdfabSRobert Mustacchi const uint8_t endstring = 0;
82*d53cdfabSRobert Mustacchi
83*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
84*d53cdfabSRobert Mustacchi str.smbstrp_hdr.smbh_len = sizeof (str) + 1;
85*d53cdfabSRobert Mustacchi str.smbstrp_prop_id = htole16(0);
86*d53cdfabSRobert Mustacchi str.smbstrp_prop_val = 0;
87*d53cdfabSRobert Mustacchi str.smbstrp_phdl = htole16(0);
88*d53cdfabSRobert Mustacchi
89*d53cdfabSRobert Mustacchi /*
90*d53cdfabSRobert Mustacchi * Append the end string again as to get us to our additional byte of
91*d53cdfabSRobert Mustacchi * actual table length.
92*d53cdfabSRobert Mustacchi */
93*d53cdfabSRobert Mustacchi (void) smbios_test_table_append(table, &str, sizeof (str));
94*d53cdfabSRobert Mustacchi (void) smbios_test_table_append_raw(table, &endstring,
95*d53cdfabSRobert Mustacchi sizeof (endstring));
96*d53cdfabSRobert Mustacchi (void) smbios_test_table_append_string(table, smbios_strprop_path);
97*d53cdfabSRobert Mustacchi (void) smbios_test_table_append_raw(table, &endstring,
98*d53cdfabSRobert Mustacchi sizeof (endstring));
99*d53cdfabSRobert Mustacchi smbios_test_table_append_eot(table);
100*d53cdfabSRobert Mustacchi
101*d53cdfabSRobert Mustacchi return (B_TRUE);
102*d53cdfabSRobert Mustacchi }
103*d53cdfabSRobert Mustacchi
104*d53cdfabSRobert Mustacchi static boolean_t
smbios_test_strprop_verify_badtable(smbios_hdl_t * hdl,int smberr)105*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_badtable(smbios_hdl_t *hdl, int smberr)
106*d53cdfabSRobert Mustacchi {
107*d53cdfabSRobert Mustacchi smbios_struct_t sp;
108*d53cdfabSRobert Mustacchi smbios_strprop_t prop;
109*d53cdfabSRobert Mustacchi
110*d53cdfabSRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
111*d53cdfabSRobert Mustacchi warnx("failed to lookup SMBIOS strprop: %s",
112*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
113*d53cdfabSRobert Mustacchi return (B_FALSE);
114*d53cdfabSRobert Mustacchi }
115*d53cdfabSRobert Mustacchi
116*d53cdfabSRobert Mustacchi if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != -1) {
117*d53cdfabSRobert Mustacchi warnx("accidentally parsed invalid strprop information as "
118*d53cdfabSRobert Mustacchi "valid");
119*d53cdfabSRobert Mustacchi return (B_FALSE);
120*d53cdfabSRobert Mustacchi }
121*d53cdfabSRobert Mustacchi
122*d53cdfabSRobert Mustacchi if (smbios_errno(hdl) != smberr) {
123*d53cdfabSRobert Mustacchi warnx("encountered wrong error for strprop, expected: "
124*d53cdfabSRobert Mustacchi "0x%x, found: 0x%x", smberr, smbios_errno(hdl));
125*d53cdfabSRobert Mustacchi return (B_FALSE);
126*d53cdfabSRobert Mustacchi }
127*d53cdfabSRobert Mustacchi
128*d53cdfabSRobert Mustacchi return (B_TRUE);
129*d53cdfabSRobert Mustacchi }
130*d53cdfabSRobert Mustacchi
131*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_verify_invlen1(smbios_hdl_t * hdl)132*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_invlen1(smbios_hdl_t *hdl)
133*d53cdfabSRobert Mustacchi {
134*d53cdfabSRobert Mustacchi return (smbios_test_strprop_verify_badtable(hdl, ESMB_SHORT));
135*d53cdfabSRobert Mustacchi }
136*d53cdfabSRobert Mustacchi
137*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_verify_invlen2(smbios_hdl_t * hdl)138*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_invlen2(smbios_hdl_t *hdl)
139*d53cdfabSRobert Mustacchi {
140*d53cdfabSRobert Mustacchi return (smbios_test_strprop_verify_badtable(hdl, ESMB_CORRUPT));
141*d53cdfabSRobert Mustacchi }
142*d53cdfabSRobert Mustacchi
143*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_verify_badtype(smbios_hdl_t * hdl)144*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_badtype(smbios_hdl_t *hdl)
145*d53cdfabSRobert Mustacchi {
146*d53cdfabSRobert Mustacchi smbios_struct_t sp;
147*d53cdfabSRobert Mustacchi smbios_strprop_t prop;
148*d53cdfabSRobert Mustacchi
149*d53cdfabSRobert Mustacchi /*
150*d53cdfabSRobert Mustacchi * Here we've explicitly created a table with a memory device that we're
151*d53cdfabSRobert Mustacchi * going to try and look up as well, not that.
152*d53cdfabSRobert Mustacchi */
153*d53cdfabSRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_MEMDEVICE, &sp) == -1) {
154*d53cdfabSRobert Mustacchi warnx("failed to lookup SMBIOS memory device: %s",
155*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
156*d53cdfabSRobert Mustacchi return (B_FALSE);
157*d53cdfabSRobert Mustacchi }
158*d53cdfabSRobert Mustacchi
159*d53cdfabSRobert Mustacchi if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != -1) {
160*d53cdfabSRobert Mustacchi warnx("accidentally parsed invalid strprop information as "
161*d53cdfabSRobert Mustacchi "valid");
162*d53cdfabSRobert Mustacchi return (B_FALSE);
163*d53cdfabSRobert Mustacchi }
164*d53cdfabSRobert Mustacchi
165*d53cdfabSRobert Mustacchi if (smbios_errno(hdl) != ESMB_TYPE) {
166*d53cdfabSRobert Mustacchi warnx("encountered wrong error for strprop, expected: "
167*d53cdfabSRobert Mustacchi "0x%x, found: 0x%x", ESMB_TYPE, smbios_errno(hdl));
168*d53cdfabSRobert Mustacchi return (B_FALSE);
169*d53cdfabSRobert Mustacchi }
170*d53cdfabSRobert Mustacchi
171*d53cdfabSRobert Mustacchi return (B_TRUE);
172*d53cdfabSRobert Mustacchi
173*d53cdfabSRobert Mustacchi }
174*d53cdfabSRobert Mustacchi
175*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_verify_basic(smbios_hdl_t * hdl)176*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_basic(smbios_hdl_t *hdl)
177*d53cdfabSRobert Mustacchi {
178*d53cdfabSRobert Mustacchi smbios_struct_t sp;
179*d53cdfabSRobert Mustacchi smbios_strprop_t prop;
180*d53cdfabSRobert Mustacchi boolean_t ret = B_TRUE;
181*d53cdfabSRobert Mustacchi
182*d53cdfabSRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
183*d53cdfabSRobert Mustacchi warnx("failed to lookup SMBIOS strprop: %s",
184*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
185*d53cdfabSRobert Mustacchi return (B_FALSE);
186*d53cdfabSRobert Mustacchi }
187*d53cdfabSRobert Mustacchi
188*d53cdfabSRobert Mustacchi if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != 0) {
189*d53cdfabSRobert Mustacchi warnx("failed to get SMBIOS strprop: %s",
190*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
191*d53cdfabSRobert Mustacchi return (B_FALSE);
192*d53cdfabSRobert Mustacchi }
193*d53cdfabSRobert Mustacchi
194*d53cdfabSRobert Mustacchi if (prop.smbsp_prop_id != SMB_STRP_UEFI_DEVPATH) {
195*d53cdfabSRobert Mustacchi warnx("property id incorrect, expected 0x%x, found 0x %x",
196*d53cdfabSRobert Mustacchi SMB_STRP_UEFI_DEVPATH, prop.smbsp_prop_id);
197*d53cdfabSRobert Mustacchi ret = B_FALSE;
198*d53cdfabSRobert Mustacchi }
199*d53cdfabSRobert Mustacchi
200*d53cdfabSRobert Mustacchi if (strcmp(smbios_strprop_id_desc(prop.smbsp_prop_id),
201*d53cdfabSRobert Mustacchi "UEFI device path") != 0) {
202*d53cdfabSRobert Mustacchi warnx("property id string incorrect, found %s",
203*d53cdfabSRobert Mustacchi smbios_strprop_id_desc(prop.smbsp_prop_id));
204*d53cdfabSRobert Mustacchi ret = B_FALSE;
205*d53cdfabSRobert Mustacchi }
206*d53cdfabSRobert Mustacchi
207*d53cdfabSRobert Mustacchi if (strcmp(prop.smbsp_prop_val, smbios_strprop_path) != 0) {
208*d53cdfabSRobert Mustacchi warnx("property value incorrect, found %s",
209*d53cdfabSRobert Mustacchi prop.smbsp_prop_val);
210*d53cdfabSRobert Mustacchi ret = B_FALSE;
211*d53cdfabSRobert Mustacchi }
212*d53cdfabSRobert Mustacchi
213*d53cdfabSRobert Mustacchi return (ret);
214*d53cdfabSRobert Mustacchi }
215*d53cdfabSRobert Mustacchi
216*d53cdfabSRobert Mustacchi boolean_t
smbios_test_strprop_verify_badstr(smbios_hdl_t * hdl)217*d53cdfabSRobert Mustacchi smbios_test_strprop_verify_badstr(smbios_hdl_t *hdl)
218*d53cdfabSRobert Mustacchi {
219*d53cdfabSRobert Mustacchi smbios_struct_t sp;
220*d53cdfabSRobert Mustacchi smbios_strprop_t prop;
221*d53cdfabSRobert Mustacchi boolean_t ret = B_TRUE;
222*d53cdfabSRobert Mustacchi
223*d53cdfabSRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
224*d53cdfabSRobert Mustacchi warnx("failed to lookup SMBIOS strprop: %s",
225*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
226*d53cdfabSRobert Mustacchi return (B_FALSE);
227*d53cdfabSRobert Mustacchi }
228*d53cdfabSRobert Mustacchi
229*d53cdfabSRobert Mustacchi if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != 0) {
230*d53cdfabSRobert Mustacchi warnx("failed to get SMBIOS strprop: %s",
231*d53cdfabSRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
232*d53cdfabSRobert Mustacchi return (B_FALSE);
233*d53cdfabSRobert Mustacchi }
234*d53cdfabSRobert Mustacchi
235*d53cdfabSRobert Mustacchi if (prop.smbsp_prop_id != SMB_STRP_UEFI_DEVPATH) {
236*d53cdfabSRobert Mustacchi warnx("property id incorrect, expected 0x%x, found 0x %x",
237*d53cdfabSRobert Mustacchi SMB_STRP_UEFI_DEVPATH, prop.smbsp_prop_id);
238*d53cdfabSRobert Mustacchi ret = B_FALSE;
239*d53cdfabSRobert Mustacchi }
240*d53cdfabSRobert Mustacchi
241*d53cdfabSRobert Mustacchi if (strcmp(smbios_strprop_id_desc(prop.smbsp_prop_id),
242*d53cdfabSRobert Mustacchi "UEFI device path") != 0) {
243*d53cdfabSRobert Mustacchi warnx("property id string incorrect, found %s",
244*d53cdfabSRobert Mustacchi smbios_strprop_id_desc(prop.smbsp_prop_id));
245*d53cdfabSRobert Mustacchi ret = B_FALSE;
246*d53cdfabSRobert Mustacchi }
247*d53cdfabSRobert Mustacchi
248*d53cdfabSRobert Mustacchi if (strcmp(prop.smbsp_prop_val, "") != 0) {
249*d53cdfabSRobert Mustacchi warnx("property value incorrect, found %s",
250*d53cdfabSRobert Mustacchi prop.smbsp_prop_val);
251*d53cdfabSRobert Mustacchi ret = B_FALSE;
252*d53cdfabSRobert Mustacchi }
253*d53cdfabSRobert Mustacchi
254*d53cdfabSRobert Mustacchi return (ret);
255*d53cdfabSRobert Mustacchi }
256