1176a9270SRobert Mustacchi /*
2176a9270SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3176a9270SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4176a9270SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5176a9270SRobert Mustacchi  * 1.0 of the CDDL.
6176a9270SRobert Mustacchi  *
7176a9270SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8176a9270SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9176a9270SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10176a9270SRobert Mustacchi  */
11176a9270SRobert Mustacchi 
12176a9270SRobert Mustacchi /*
13*064d431aSRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14176a9270SRobert Mustacchi  */
15176a9270SRobert Mustacchi 
16176a9270SRobert Mustacchi /*
17176a9270SRobert Mustacchi  * Collection of functions to be used with tests that will cause a handle to
18176a9270SRobert Mustacchi  * fail to open.
19176a9270SRobert Mustacchi  */
20176a9270SRobert Mustacchi 
21176a9270SRobert Mustacchi #include "smbios_test.h"
22176a9270SRobert Mustacchi 
23176a9270SRobert Mustacchi boolean_t
smbios_test_badvers_mktable(smbios_test_table_t * table)24176a9270SRobert Mustacchi smbios_test_badvers_mktable(smbios_test_table_t *table)
25176a9270SRobert Mustacchi {
26176a9270SRobert Mustacchi 	smbios_test_table_append_eot(table);
27176a9270SRobert Mustacchi 	return (B_TRUE);
28176a9270SRobert Mustacchi }
29d53cdfabSRobert Mustacchi 
30d53cdfabSRobert Mustacchi typedef int (*smbios_lookup_f)(smbios_hdl_t *, id_t, void *);
31d53cdfabSRobert Mustacchi typedef struct {
32d53cdfabSRobert Mustacchi 	smbios_lookup_f sif_func;
33d53cdfabSRobert Mustacchi 	const char *sif_name;
34d53cdfabSRobert Mustacchi } smbios_info_func_t;
35d53cdfabSRobert Mustacchi 
36d53cdfabSRobert Mustacchi static smbios_info_func_t smbios_lookup_funcs[] = {
37d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_bboard, "bboard" },
38d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_chassis, "chassis" },
39d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_processor, "processor" },
40d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_extprocessor, "extprocessor" },
41d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_cache, "cache" },
42d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_pointdev, "pointdev" },
43d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_battery, "battery" },
44d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_port, "port" },
45d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_extport, "extport" },
46d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_slot, "slot" },
47d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_obdevs_ext, "obdevs_ext" },
48d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_memarray, "memarray" },
49d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_extmemarray, "extmemarray" },
50d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_memarrmap, "memarrmap" },
51d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_memdevice, "memdevice" },
52d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_memdevmap, "memdevmap" },
53d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_vprobe, "vprobe" },
54d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_cooldev, "cooldev" },
55d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_tprobe, "tprobe" },
56d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_iprobe, "iprobe" },
57d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_powersup, "powersup" },
58*064d431aSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_addinfo_nents, "addinfo" },
59d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_pciexrc, "pciexrc" },
60d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_processor_info, "processor_info" },
61d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_processor_riscv, "processor_riscv" },
62d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_strprop, "strprop" },
63d53cdfabSRobert Mustacchi 	{ (smbios_lookup_f)smbios_info_fwinfo, "fwinfo" }
64d53cdfabSRobert Mustacchi };
65d53cdfabSRobert Mustacchi 
66d53cdfabSRobert Mustacchi /*
67d53cdfabSRobert Mustacchi  * Go through and verify that if we give an explicit lookup a bad id, it
68d53cdfabSRobert Mustacchi  * properly detects that and errors. We simply use SMB_ID_NOTSUP, which should
69d53cdfabSRobert Mustacchi  * always trigger the internal lookup to fail. In addition, we always pass NULL
70d53cdfabSRobert Mustacchi  * for the actual data pointer to make sure that if we get further, we'll crash
71d53cdfabSRobert Mustacchi  * on writing to a NULL pointer.
72d53cdfabSRobert Mustacchi  */
73d53cdfabSRobert Mustacchi boolean_t
smbios_test_verify_badids(smbios_hdl_t * hdl)74d53cdfabSRobert Mustacchi smbios_test_verify_badids(smbios_hdl_t *hdl)
75d53cdfabSRobert Mustacchi {
76d53cdfabSRobert Mustacchi 	boolean_t ret = B_TRUE;
77d53cdfabSRobert Mustacchi 
78d53cdfabSRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(smbios_lookup_funcs); i++) {
79d53cdfabSRobert Mustacchi 		if (smbios_lookup_funcs[i].sif_func(hdl, SMB_ID_NOTSUP, NULL) !=
80d53cdfabSRobert Mustacchi 		    -1) {
81d53cdfabSRobert Mustacchi 			warnx("smbios_info_%s somehow didn't fail?!",
82d53cdfabSRobert Mustacchi 			    smbios_lookup_funcs[i].sif_name);
83d53cdfabSRobert Mustacchi 			ret = B_FALSE;
84d53cdfabSRobert Mustacchi 		}
85d53cdfabSRobert Mustacchi 	}
86d53cdfabSRobert Mustacchi 
87d53cdfabSRobert Mustacchi 	return (ret);
88d53cdfabSRobert Mustacchi }
89