xref: /illumos-gate/usr/src/test/util-tests/tests/smbios/smbios_test_extproc.c (revision a3d73cfd151b1e83f74b4f6d1f3497dd064d8c84)
1*a3d73cfdSRobert Mustacchi /*
2*a3d73cfdSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*a3d73cfdSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*a3d73cfdSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*a3d73cfdSRobert Mustacchi  * 1.0 of the CDDL.
6*a3d73cfdSRobert Mustacchi  *
7*a3d73cfdSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*a3d73cfdSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*a3d73cfdSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*a3d73cfdSRobert Mustacchi  */
11*a3d73cfdSRobert Mustacchi 
12*a3d73cfdSRobert Mustacchi /*
13*a3d73cfdSRobert Mustacchi  * Copyright 2026 Oxide Computer Company
14*a3d73cfdSRobert Mustacchi  */
15*a3d73cfdSRobert Mustacchi 
16*a3d73cfdSRobert Mustacchi /*
17*a3d73cfdSRobert Mustacchi  * Tests for Sun OEM Extended Processor, Type 132.
18*a3d73cfdSRobert Mustacchi  */
19*a3d73cfdSRobert Mustacchi 
20*a3d73cfdSRobert Mustacchi #include "smbios_test.h"
21*a3d73cfdSRobert Mustacchi 
22*a3d73cfdSRobert Mustacchi static uint16_t proc_hdl = 0x1234;
23*a3d73cfdSRobert Mustacchi static uint8_t proc_fru = 0x23;
24*a3d73cfdSRobert Mustacchi static uint16_t proc_apicid[] = { 0x23, 0x42, 0x169, 0x7777, UINT16_MAX };
25*a3d73cfdSRobert Mustacchi 
26*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_mktable_short(smbios_test_table_t * table)27*a3d73cfdSRobert Mustacchi smbios_test_extproc_mktable_short(smbios_test_table_t *table)
28*a3d73cfdSRobert Mustacchi {
29*a3d73cfdSRobert Mustacchi 	smb_header_t hdr;
30*a3d73cfdSRobert Mustacchi 
31*a3d73cfdSRobert Mustacchi 	smbios_test_table_add_sunoem(table);
32*a3d73cfdSRobert Mustacchi 
33*a3d73cfdSRobert Mustacchi 	hdr.smbh_type = SUN_OEM_EXT_PROCESSOR;
34*a3d73cfdSRobert Mustacchi 	hdr.smbh_len = sizeof (hdr);
35*a3d73cfdSRobert Mustacchi 
36*a3d73cfdSRobert Mustacchi 	(void) smbios_test_table_append(table, &hdr, sizeof (hdr));
37*a3d73cfdSRobert Mustacchi 	smbios_test_table_append_eot(table);
38*a3d73cfdSRobert Mustacchi 	return (B_TRUE);
39*a3d73cfdSRobert Mustacchi }
40*a3d73cfdSRobert Mustacchi 
41*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_mktable_noapic(smbios_test_table_t * table)42*a3d73cfdSRobert Mustacchi smbios_test_extproc_mktable_noapic(smbios_test_table_t *table)
43*a3d73cfdSRobert Mustacchi {
44*a3d73cfdSRobert Mustacchi 	smb_processor_ext_t proc;
45*a3d73cfdSRobert Mustacchi 
46*a3d73cfdSRobert Mustacchi 	smbios_test_table_add_sunoem(table);
47*a3d73cfdSRobert Mustacchi 
48*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_type = SUN_OEM_EXT_PROCESSOR;
49*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_len = sizeof (proc);
50*a3d73cfdSRobert Mustacchi 
51*a3d73cfdSRobert Mustacchi 	proc.smbpre_processor = proc_hdl;
52*a3d73cfdSRobert Mustacchi 	proc.smbpre_fru = proc_fru;
53*a3d73cfdSRobert Mustacchi 	proc.smbpre_n = 0;
54*a3d73cfdSRobert Mustacchi 	(void) smbios_test_table_append(table, &proc, sizeof (proc));
55*a3d73cfdSRobert Mustacchi 	smbios_test_table_append_eot(table);
56*a3d73cfdSRobert Mustacchi 	return (B_TRUE);
57*a3d73cfdSRobert Mustacchi }
58*a3d73cfdSRobert Mustacchi 
59*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_mktable_short_apic(smbios_test_table_t * table)60*a3d73cfdSRobert Mustacchi smbios_test_extproc_mktable_short_apic(smbios_test_table_t *table)
61*a3d73cfdSRobert Mustacchi {
62*a3d73cfdSRobert Mustacchi 	smb_processor_ext_t proc;
63*a3d73cfdSRobert Mustacchi 
64*a3d73cfdSRobert Mustacchi 	smbios_test_table_add_sunoem(table);
65*a3d73cfdSRobert Mustacchi 
66*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_type = SUN_OEM_EXT_PROCESSOR;
67*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_len = sizeof (proc);
68*a3d73cfdSRobert Mustacchi 
69*a3d73cfdSRobert Mustacchi 	proc.smbpre_processor = proc_hdl;
70*a3d73cfdSRobert Mustacchi 	proc.smbpre_fru = proc_fru;
71*a3d73cfdSRobert Mustacchi 	proc.smbpre_n = ARRAY_SIZE(proc_apicid);
72*a3d73cfdSRobert Mustacchi 	(void) smbios_test_table_append(table, &proc, sizeof (proc));
73*a3d73cfdSRobert Mustacchi 	smbios_test_table_append_eot(table);
74*a3d73cfdSRobert Mustacchi 	return (B_TRUE);
75*a3d73cfdSRobert Mustacchi }
76*a3d73cfdSRobert Mustacchi 
77*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_mktable_apic(smbios_test_table_t * table)78*a3d73cfdSRobert Mustacchi smbios_test_extproc_mktable_apic(smbios_test_table_t *table)
79*a3d73cfdSRobert Mustacchi {
80*a3d73cfdSRobert Mustacchi 	smb_processor_ext_t proc;
81*a3d73cfdSRobert Mustacchi 
82*a3d73cfdSRobert Mustacchi 	smbios_test_table_add_sunoem(table);
83*a3d73cfdSRobert Mustacchi 
84*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_type = SUN_OEM_EXT_PROCESSOR;
85*a3d73cfdSRobert Mustacchi 	proc.smbpre_hdr.smbh_len = sizeof (proc) + sizeof (proc_apicid);
86*a3d73cfdSRobert Mustacchi 
87*a3d73cfdSRobert Mustacchi 	proc.smbpre_processor = proc_hdl;
88*a3d73cfdSRobert Mustacchi 	proc.smbpre_fru = proc_fru;
89*a3d73cfdSRobert Mustacchi 	proc.smbpre_n = ARRAY_SIZE(proc_apicid);
90*a3d73cfdSRobert Mustacchi 	(void) smbios_test_table_append(table, &proc, sizeof (proc));
91*a3d73cfdSRobert Mustacchi 	smbios_test_table_append_raw(table, proc_apicid, sizeof (proc_apicid));
92*a3d73cfdSRobert Mustacchi 	smbios_test_table_append_eot(table);
93*a3d73cfdSRobert Mustacchi 	return (B_TRUE);
94*a3d73cfdSRobert Mustacchi }
95*a3d73cfdSRobert Mustacchi 
96*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_verify_short(smbios_hdl_t * hdl)97*a3d73cfdSRobert Mustacchi smbios_test_extproc_verify_short(smbios_hdl_t *hdl)
98*a3d73cfdSRobert Mustacchi {
99*a3d73cfdSRobert Mustacchi 	smbios_struct_t sp;
100*a3d73cfdSRobert Mustacchi 	smbios_processor_ext_t proc;
101*a3d73cfdSRobert Mustacchi 
102*a3d73cfdSRobert Mustacchi 	if (smbios_lookup_type(hdl, SUN_OEM_EXT_PROCESSOR, &sp) == -1) {
103*a3d73cfdSRobert Mustacchi 		warnx("failed to lookup SMBIOS Sun OEM processor: %s",
104*a3d73cfdSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
105*a3d73cfdSRobert Mustacchi 		return (B_FALSE);
106*a3d73cfdSRobert Mustacchi 	}
107*a3d73cfdSRobert Mustacchi 
108*a3d73cfdSRobert Mustacchi 	if (smbios_info_extprocessor(hdl, sp.smbstr_id, &proc) != -1) {
109*a3d73cfdSRobert Mustacchi 		warnx("accidentally parsed invalid extended processor as "
110*a3d73cfdSRobert Mustacchi 		    "valid");
111*a3d73cfdSRobert Mustacchi 		return (B_FALSE);
112*a3d73cfdSRobert Mustacchi 	}
113*a3d73cfdSRobert Mustacchi 
114*a3d73cfdSRobert Mustacchi 	if (smbios_errno(hdl) != ESMB_SHORT) {
115*a3d73cfdSRobert Mustacchi 		warnx("encountered wrong error for extended processor, "
116*a3d73cfdSRobert Mustacchi 		    "expected: 0x%x, found: 0x%x", ESMB_SHORT,
117*a3d73cfdSRobert Mustacchi 		    smbios_errno(hdl));
118*a3d73cfdSRobert Mustacchi 		return (B_FALSE);
119*a3d73cfdSRobert Mustacchi 	}
120*a3d73cfdSRobert Mustacchi 
121*a3d73cfdSRobert Mustacchi 	return (B_TRUE);
122*a3d73cfdSRobert Mustacchi }
123*a3d73cfdSRobert Mustacchi 
124*a3d73cfdSRobert Mustacchi static boolean_t
smbios_test_extproc_verify_common(smbios_hdl_t * hdl,const uint16_t * apics,size_t napics)125*a3d73cfdSRobert Mustacchi smbios_test_extproc_verify_common(smbios_hdl_t *hdl, const uint16_t *apics,
126*a3d73cfdSRobert Mustacchi     size_t napics)
127*a3d73cfdSRobert Mustacchi {
128*a3d73cfdSRobert Mustacchi 	smbios_processor_ext_t proc;
129*a3d73cfdSRobert Mustacchi 	boolean_t ret = B_TRUE;
130*a3d73cfdSRobert Mustacchi 	smbios_struct_t sp;
131*a3d73cfdSRobert Mustacchi 
132*a3d73cfdSRobert Mustacchi 	if (smbios_lookup_type(hdl, SUN_OEM_EXT_PROCESSOR, &sp) == -1) {
133*a3d73cfdSRobert Mustacchi 		warnx("failed to lookup SMBIOS Sun OEM processor: %s",
134*a3d73cfdSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
135*a3d73cfdSRobert Mustacchi 		return (B_FALSE);
136*a3d73cfdSRobert Mustacchi 	}
137*a3d73cfdSRobert Mustacchi 
138*a3d73cfdSRobert Mustacchi 	if (smbios_info_extprocessor(hdl, sp.smbstr_id, &proc) == -1) {
139*a3d73cfdSRobert Mustacchi 		warnx("failed to get extended processor information: %s",
140*a3d73cfdSRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
141*a3d73cfdSRobert Mustacchi 		return (B_FALSE);
142*a3d73cfdSRobert Mustacchi 	}
143*a3d73cfdSRobert Mustacchi 
144*a3d73cfdSRobert Mustacchi 	if (proc.smbpe_processor != proc_hdl) {
145*a3d73cfdSRobert Mustacchi 		warnx("encountered wrong proc handle 0x%x, expected 0x%x",
146*a3d73cfdSRobert Mustacchi 		    proc.smbpe_processor, proc_hdl);
147*a3d73cfdSRobert Mustacchi 		ret = B_FALSE;
148*a3d73cfdSRobert Mustacchi 	}
149*a3d73cfdSRobert Mustacchi 
150*a3d73cfdSRobert Mustacchi 	if (proc.smbpe_fru != proc_fru) {
151*a3d73cfdSRobert Mustacchi 		warnx("encountered wrong proc fru 0x%x, expected 0x%x",
152*a3d73cfdSRobert Mustacchi 		    proc.smbpe_fru, proc_fru);
153*a3d73cfdSRobert Mustacchi 		ret = B_FALSE;
154*a3d73cfdSRobert Mustacchi 	}
155*a3d73cfdSRobert Mustacchi 
156*a3d73cfdSRobert Mustacchi 	if (proc.smbpe_n != napics) {
157*a3d73cfdSRobert Mustacchi 		warnx("encountered wrong apic id count 0x%x, expected 0x%zx",
158*a3d73cfdSRobert Mustacchi 		    proc.smbpe_n, napics);
159*a3d73cfdSRobert Mustacchi 		ret = B_FALSE;
160*a3d73cfdSRobert Mustacchi 	}
161*a3d73cfdSRobert Mustacchi 
162*a3d73cfdSRobert Mustacchi 	if (napics > 0 && proc.smbpe_apicid == NULL) {
163*a3d73cfdSRobert Mustacchi 		warnx("expected 0x%zx apic ids, but found NULL APIC pointer",
164*a3d73cfdSRobert Mustacchi 		    napics);
165*a3d73cfdSRobert Mustacchi 		ret = B_FALSE;
166*a3d73cfdSRobert Mustacchi 	} else if (napics == 0 && proc.smbpe_apicid != NULL) {
167*a3d73cfdSRobert Mustacchi 		warnx("found non-NULL APIC pointer, but expected no APIC ids");
168*a3d73cfdSRobert Mustacchi 		ret = B_FALSE;
169*a3d73cfdSRobert Mustacchi 	}
170*a3d73cfdSRobert Mustacchi 
171*a3d73cfdSRobert Mustacchi 	if (napics > 0 && proc.smbpe_n == napics && proc.smbpe_apicid != NULL) {
172*a3d73cfdSRobert Mustacchi 		for (size_t i = 0; i < napics; i++) {
173*a3d73cfdSRobert Mustacchi 			if (proc.smbpe_apicid[i] != apics[i]) {
174*a3d73cfdSRobert Mustacchi 				warnx("APIC ID %zu mismatch: found 0x%x, "
175*a3d73cfdSRobert Mustacchi 				    "expected 0x%x", i, proc.smbpe_apicid[i],
176*a3d73cfdSRobert Mustacchi 				    apics[i]);
177*a3d73cfdSRobert Mustacchi 				ret = B_FALSE;
178*a3d73cfdSRobert Mustacchi 			}
179*a3d73cfdSRobert Mustacchi 		}
180*a3d73cfdSRobert Mustacchi 	}
181*a3d73cfdSRobert Mustacchi 
182*a3d73cfdSRobert Mustacchi 	return (ret);
183*a3d73cfdSRobert Mustacchi }
184*a3d73cfdSRobert Mustacchi 
185*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_verify_noapic(smbios_hdl_t * hdl)186*a3d73cfdSRobert Mustacchi smbios_test_extproc_verify_noapic(smbios_hdl_t *hdl)
187*a3d73cfdSRobert Mustacchi {
188*a3d73cfdSRobert Mustacchi 	return (smbios_test_extproc_verify_common(hdl, NULL, 0));
189*a3d73cfdSRobert Mustacchi }
190*a3d73cfdSRobert Mustacchi 
191*a3d73cfdSRobert Mustacchi boolean_t
smbios_test_extproc_verify_apic(smbios_hdl_t * hdl)192*a3d73cfdSRobert Mustacchi smbios_test_extproc_verify_apic(smbios_hdl_t *hdl)
193*a3d73cfdSRobert Mustacchi {
194*a3d73cfdSRobert Mustacchi 	return (smbios_test_extproc_verify_common(hdl, proc_apicid,
195*a3d73cfdSRobert Mustacchi 	    ARRAY_SIZE(proc_apicid)));
196*a3d73cfdSRobert Mustacchi }
197