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