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