xref: /illumos-gate/usr/src/test/util-tests/tests/smbios/smbios_test_boot.c (revision a5e964148453148ea22075ace3e7044d6069395d)
1*a5e96414SRobert Mustacchi /*
2*a5e96414SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*a5e96414SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*a5e96414SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*a5e96414SRobert Mustacchi  * 1.0 of the CDDL.
6*a5e96414SRobert Mustacchi  *
7*a5e96414SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*a5e96414SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*a5e96414SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*a5e96414SRobert Mustacchi  */
11*a5e96414SRobert Mustacchi 
12*a5e96414SRobert Mustacchi /*
13*a5e96414SRobert Mustacchi  * Copyright 2026 Oxide Computer Company
14*a5e96414SRobert Mustacchi  */
15*a5e96414SRobert Mustacchi 
16*a5e96414SRobert Mustacchi /*
17*a5e96414SRobert Mustacchi  * Basic tests for SMBIOS System Boot Information, Type 32.
18*a5e96414SRobert Mustacchi  */
19*a5e96414SRobert Mustacchi 
20*a5e96414SRobert Mustacchi #include "smbios_test.h"
21*a5e96414SRobert Mustacchi 
22*a5e96414SRobert Mustacchi static const char *boot_data = "three rings for elven kings";
23*a5e96414SRobert Mustacchi 
24*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_mktable_short_base(smbios_test_table_t * table)25*a5e96414SRobert Mustacchi smbios_test_boot_mktable_short_base(smbios_test_table_t *table)
26*a5e96414SRobert Mustacchi {
27*a5e96414SRobert Mustacchi 	smb_header_t hdr;
28*a5e96414SRobert Mustacchi 
29*a5e96414SRobert Mustacchi 	hdr.smbh_type = SMB_TYPE_BOOT;
30*a5e96414SRobert Mustacchi 	hdr.smbh_len = sizeof (hdr);
31*a5e96414SRobert Mustacchi 
32*a5e96414SRobert Mustacchi 	(void) smbios_test_table_append(table, &hdr, sizeof (hdr));
33*a5e96414SRobert Mustacchi 	smbios_test_table_append_eot(table);
34*a5e96414SRobert Mustacchi 	return (B_TRUE);
35*a5e96414SRobert Mustacchi }
36*a5e96414SRobert Mustacchi 
37*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_mktable_short_data(smbios_test_table_t * table)38*a5e96414SRobert Mustacchi smbios_test_boot_mktable_short_data(smbios_test_table_t *table)
39*a5e96414SRobert Mustacchi {
40*a5e96414SRobert Mustacchi 	smb_boot_t boot;
41*a5e96414SRobert Mustacchi 
42*a5e96414SRobert Mustacchi 	(void) memset(&boot, 0, sizeof (smb_boot_t));
43*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_type = SMB_TYPE_BOOT;
44*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_len = sizeof (smb_boot_t) - 1;
45*a5e96414SRobert Mustacchi 
46*a5e96414SRobert Mustacchi 	(void) smbios_test_table_append(table, &boot, sizeof (boot) - 1);
47*a5e96414SRobert Mustacchi 	smbios_test_table_append_eot(table);
48*a5e96414SRobert Mustacchi 	return (B_TRUE);
49*a5e96414SRobert Mustacchi }
50*a5e96414SRobert Mustacchi 
51*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_mktable(smbios_test_table_t * table)52*a5e96414SRobert Mustacchi smbios_test_boot_mktable(smbios_test_table_t *table)
53*a5e96414SRobert Mustacchi {
54*a5e96414SRobert Mustacchi 	smb_boot_t boot;
55*a5e96414SRobert Mustacchi 	size_t dlen = strlen(boot_data);
56*a5e96414SRobert Mustacchi 
57*a5e96414SRobert Mustacchi 	(void) memset(&boot, 0, sizeof (smb_boot_t));
58*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_type = SMB_TYPE_BOOT;
59*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_len = sizeof (smb_boot_t) + dlen - 1;
60*a5e96414SRobert Mustacchi 	boot.smbbo_status[0] = boot_data[0];
61*a5e96414SRobert Mustacchi 
62*a5e96414SRobert Mustacchi 	(void) smbios_test_table_append(table, &boot, sizeof (boot));
63*a5e96414SRobert Mustacchi 	smbios_test_table_append_raw(table, &boot_data[1], dlen - 1);
64*a5e96414SRobert Mustacchi 	smbios_test_table_append_eot(table);
65*a5e96414SRobert Mustacchi 	return (B_TRUE);
66*a5e96414SRobert Mustacchi }
67*a5e96414SRobert Mustacchi 
68*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_mktable_nodata(smbios_test_table_t * table)69*a5e96414SRobert Mustacchi smbios_test_boot_mktable_nodata(smbios_test_table_t *table)
70*a5e96414SRobert Mustacchi {
71*a5e96414SRobert Mustacchi 	smb_boot_t boot;
72*a5e96414SRobert Mustacchi 
73*a5e96414SRobert Mustacchi 	(void) memset(&boot, 0, sizeof (smb_boot_t));
74*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_type = SMB_TYPE_BOOT;
75*a5e96414SRobert Mustacchi 	boot.smbbo_hdr.smbh_len = sizeof (smb_boot_t);
76*a5e96414SRobert Mustacchi 	boot.smbbo_status[0] = 0x42;
77*a5e96414SRobert Mustacchi 
78*a5e96414SRobert Mustacchi 	(void) smbios_test_table_append(table, &boot, sizeof (boot));
79*a5e96414SRobert Mustacchi 	smbios_test_table_append_eot(table);
80*a5e96414SRobert Mustacchi 	return (B_TRUE);
81*a5e96414SRobert Mustacchi }
82*a5e96414SRobert Mustacchi 
83*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_verify_short(smbios_hdl_t * hdl)84*a5e96414SRobert Mustacchi smbios_test_boot_verify_short(smbios_hdl_t *hdl)
85*a5e96414SRobert Mustacchi {
86*a5e96414SRobert Mustacchi 	smbios_boot_t boot;
87*a5e96414SRobert Mustacchi 
88*a5e96414SRobert Mustacchi 	if (smbios_info_boot(hdl, &boot) != -1) {
89*a5e96414SRobert Mustacchi 		warnx("accidentally parsed invalid boot data as valid");
90*a5e96414SRobert Mustacchi 		return (B_FALSE);
91*a5e96414SRobert Mustacchi 	}
92*a5e96414SRobert Mustacchi 
93*a5e96414SRobert Mustacchi 	if (smbios_errno(hdl) != ESMB_SHORT) {
94*a5e96414SRobert Mustacchi 		warnx("encountered wrong error for boot, expected: "
95*a5e96414SRobert Mustacchi 		    "0x%x, found: 0x%x", ESMB_SHORT, smbios_errno(hdl));
96*a5e96414SRobert Mustacchi 		return (B_FALSE);
97*a5e96414SRobert Mustacchi 	}
98*a5e96414SRobert Mustacchi 
99*a5e96414SRobert Mustacchi 	return (B_TRUE);
100*a5e96414SRobert Mustacchi }
101*a5e96414SRobert Mustacchi 
102*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_verify(smbios_hdl_t * hdl)103*a5e96414SRobert Mustacchi smbios_test_boot_verify(smbios_hdl_t *hdl)
104*a5e96414SRobert Mustacchi {
105*a5e96414SRobert Mustacchi 	smbios_boot_t boot;
106*a5e96414SRobert Mustacchi 	boolean_t ret = B_TRUE;
107*a5e96414SRobert Mustacchi 
108*a5e96414SRobert Mustacchi 	if (smbios_info_boot(hdl, &boot) == -1) {
109*a5e96414SRobert Mustacchi 		warnx("failed to get boot data: %s",
110*a5e96414SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
111*a5e96414SRobert Mustacchi 		return (B_FALSE);
112*a5e96414SRobert Mustacchi 	}
113*a5e96414SRobert Mustacchi 
114*a5e96414SRobert Mustacchi 	if (boot.smbt_status != boot_data[0]) {
115*a5e96414SRobert Mustacchi 		warnx("found wrong boot status: expected 0x%x, found 0x%x",
116*a5e96414SRobert Mustacchi 		    boot_data[0], boot.smbt_status);
117*a5e96414SRobert Mustacchi 		ret = B_FALSE;
118*a5e96414SRobert Mustacchi 	}
119*a5e96414SRobert Mustacchi 
120*a5e96414SRobert Mustacchi 	size_t len = strlen(boot_data);
121*a5e96414SRobert Mustacchi 	if (boot.smbt_size != len - 1) {
122*a5e96414SRobert Mustacchi 		warnx("found wrong data length: expected %zu, found %zu",
123*a5e96414SRobert Mustacchi 		    len - 1, boot.smbt_size);
124*a5e96414SRobert Mustacchi 		ret = B_FALSE;
125*a5e96414SRobert Mustacchi 	} else if (bcmp(boot.smbt_data, &boot_data[1], boot.smbt_size) != 0) {
126*a5e96414SRobert Mustacchi 		warnx("boot data mismatch encountered");
127*a5e96414SRobert Mustacchi 		ret = B_FALSE;
128*a5e96414SRobert Mustacchi 	}
129*a5e96414SRobert Mustacchi 
130*a5e96414SRobert Mustacchi 	return (ret);
131*a5e96414SRobert Mustacchi }
132*a5e96414SRobert Mustacchi 
133*a5e96414SRobert Mustacchi boolean_t
smbios_test_boot_verify_nodata(smbios_hdl_t * hdl)134*a5e96414SRobert Mustacchi smbios_test_boot_verify_nodata(smbios_hdl_t *hdl)
135*a5e96414SRobert Mustacchi {
136*a5e96414SRobert Mustacchi 	smbios_boot_t boot;
137*a5e96414SRobert Mustacchi 	boolean_t ret = B_TRUE;
138*a5e96414SRobert Mustacchi 
139*a5e96414SRobert Mustacchi 	boot.smbt_data = (void *)(uintptr_t)0x7777;
140*a5e96414SRobert Mustacchi 	boot.smbt_size = 0x7777;
141*a5e96414SRobert Mustacchi 
142*a5e96414SRobert Mustacchi 	if (smbios_info_boot(hdl, &boot) == -1) {
143*a5e96414SRobert Mustacchi 		warnx("failed to get boot data: %s",
144*a5e96414SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
145*a5e96414SRobert Mustacchi 		return (B_FALSE);
146*a5e96414SRobert Mustacchi 	}
147*a5e96414SRobert Mustacchi 
148*a5e96414SRobert Mustacchi 	if (boot.smbt_status != 0x42) {
149*a5e96414SRobert Mustacchi 		warnx("found wrong boot status: expected 0x42, found 0x%x",
150*a5e96414SRobert Mustacchi 		    boot.smbt_status);
151*a5e96414SRobert Mustacchi 		ret = B_FALSE;
152*a5e96414SRobert Mustacchi 	}
153*a5e96414SRobert Mustacchi 
154*a5e96414SRobert Mustacchi 	if (boot.smbt_size != 0) {
155*a5e96414SRobert Mustacchi 		warnx("found non-zero data size: 0x%zx", boot.smbt_size);
156*a5e96414SRobert Mustacchi 		ret = B_FALSE;
157*a5e96414SRobert Mustacchi 	}
158*a5e96414SRobert Mustacchi 
159*a5e96414SRobert Mustacchi 	if (boot.smbt_data != NULL) {
160*a5e96414SRobert Mustacchi 		warnx("found non-NULL data pointer: 0x%p", boot.smbt_data);
161*a5e96414SRobert Mustacchi 		ret = B_FALSE;
162*a5e96414SRobert Mustacchi 	}
163*a5e96414SRobert Mustacchi 
164*a5e96414SRobert Mustacchi 	return (ret);
165*a5e96414SRobert Mustacchi }
166