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