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 /*
13176a9270SRobert Mustacchi * Copyright 2019 Robert Mustacchi
14d53cdfabSRobert Mustacchi * Copyright 2021 Oxide Computer Company
15176a9270SRobert Mustacchi */
16176a9270SRobert Mustacchi
17176a9270SRobert Mustacchi /*
18176a9270SRobert Mustacchi * Tests for SMBIOS type 44 - SMB_TYPE_PROCESSOR_INFO and the per-CPU type
19176a9270SRobert Mustacchi * follow ups.
20176a9270SRobert Mustacchi */
21176a9270SRobert Mustacchi
22176a9270SRobert Mustacchi #include "smbios_test.h"
23176a9270SRobert Mustacchi
24176a9270SRobert Mustacchi static uint16_t smbios_pinfo_phandle = 0x1;
25176a9270SRobert Mustacchi static uint64_t smbios_pinfo_isa = 0x4010d;
26176a9270SRobert Mustacchi static uint8_t smbios_pinfo_hartid[16];
27176a9270SRobert Mustacchi static uint8_t smbios_pinfo_vendid[16];
28176a9270SRobert Mustacchi static uint8_t smbios_pinfo_archid[16];
29176a9270SRobert Mustacchi static uint8_t smbios_pinfo_machid[16];
30176a9270SRobert Mustacchi static uint8_t smbios_pinfo_metdi[16];
31176a9270SRobert Mustacchi static uint8_t smbios_pinfo_mitdi[16];
32176a9270SRobert Mustacchi
33176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_amd64(smbios_test_table_t * table)34176a9270SRobert Mustacchi smbios_test_pinfo_mktable_amd64(smbios_test_table_t *table)
35176a9270SRobert Mustacchi {
36176a9270SRobert Mustacchi smb_processor_info_t pi;
37176a9270SRobert Mustacchi
38176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
39176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = sizeof (smb_processor_info_t);
40176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
41176a9270SRobert Mustacchi pi.smbpai_len = 0;
42176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_AMD64;
43176a9270SRobert Mustacchi
44176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
45176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
46176a9270SRobert Mustacchi
47176a9270SRobert Mustacchi return (B_TRUE);
48176a9270SRobert Mustacchi }
49176a9270SRobert Mustacchi
50176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_amd64(smbios_hdl_t * hdl)51176a9270SRobert Mustacchi smbios_test_pinfo_verify_amd64(smbios_hdl_t *hdl)
52176a9270SRobert Mustacchi {
53176a9270SRobert Mustacchi smbios_struct_t sp;
54176a9270SRobert Mustacchi smbios_processor_info_t pinfo;
55176a9270SRobert Mustacchi smbios_processor_info_riscv_t rv;
56176a9270SRobert Mustacchi boolean_t ret = B_TRUE;
57176a9270SRobert Mustacchi
58176a9270SRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_PROCESSOR_INFO, &sp) == -1) {
59176a9270SRobert Mustacchi warnx("failed to lookup SMBIOS processor additional "
60176a9270SRobert Mustacchi "information: %s", smbios_errmsg(smbios_errno(hdl)));
61176a9270SRobert Mustacchi return (B_FALSE);
62176a9270SRobert Mustacchi }
63176a9270SRobert Mustacchi
64176a9270SRobert Mustacchi if (smbios_info_processor_info(hdl, sp.smbstr_id, &pinfo) != 0) {
65176a9270SRobert Mustacchi
66176a9270SRobert Mustacchi warnx("failed to get SMBIOS processor additional "
67176a9270SRobert Mustacchi "information: %s", smbios_errmsg(smbios_errno(hdl)));
68176a9270SRobert Mustacchi return (B_FALSE);
69176a9270SRobert Mustacchi }
70176a9270SRobert Mustacchi
71176a9270SRobert Mustacchi if (pinfo.smbpi_processor != smbios_pinfo_phandle) {
72*8d195583SRobert Mustacchi warnx("processor handle incorrect, found 0x%" _PRIxID,
73176a9270SRobert Mustacchi pinfo.smbpi_processor);
74176a9270SRobert Mustacchi ret = B_FALSE;
75176a9270SRobert Mustacchi }
76176a9270SRobert Mustacchi
77176a9270SRobert Mustacchi if (pinfo.smbpi_ptype != SMB_PROCINFO_T_AMD64) {
78176a9270SRobert Mustacchi warnx("processor type incorrect, found 0x%x",
79176a9270SRobert Mustacchi pinfo.smbpi_ptype);
80176a9270SRobert Mustacchi ret = B_FALSE;
81176a9270SRobert Mustacchi }
82176a9270SRobert Mustacchi
83176a9270SRobert Mustacchi if (strcmp(smbios_processor_info_type_desc(pinfo.smbpi_ptype),
84176a9270SRobert Mustacchi "X64 (x86-64, Intel64, AMD64, EMT64)") != 0) {
85176a9270SRobert Mustacchi warnx("processor type incorrect, found %s",
86176a9270SRobert Mustacchi smbios_processor_info_type_desc(pinfo.smbpi_ptype));
87176a9270SRobert Mustacchi ret = B_FALSE;
88176a9270SRobert Mustacchi }
89176a9270SRobert Mustacchi
90176a9270SRobert Mustacchi if (smbios_info_processor_riscv(hdl, sp.smbstr_id, &rv) != -1) {
91176a9270SRobert Mustacchi warnx("accidentally got riscv info on non-riscv handle");
92176a9270SRobert Mustacchi ret = B_FALSE;
93176a9270SRobert Mustacchi }
94176a9270SRobert Mustacchi
95176a9270SRobert Mustacchi if (smbios_errno(hdl) != ESMB_TYPE) {
96176a9270SRobert Mustacchi warnx("encountered wrong errno for RISC-V info, found: 0x%x",
97176a9270SRobert Mustacchi smbios_errno(hdl));
98176a9270SRobert Mustacchi ret = B_FALSE;
99176a9270SRobert Mustacchi }
100176a9270SRobert Mustacchi
101176a9270SRobert Mustacchi return (ret);
102176a9270SRobert Mustacchi }
103176a9270SRobert Mustacchi
104176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_riscv(smbios_test_table_t * table)105176a9270SRobert Mustacchi smbios_test_pinfo_mktable_riscv(smbios_test_table_t *table)
106176a9270SRobert Mustacchi {
107176a9270SRobert Mustacchi smb_processor_info_t pi;
108176a9270SRobert Mustacchi smb_processor_info_riscv_t rv;
109176a9270SRobert Mustacchi
110176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
111176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = sizeof (smb_processor_info_t) +
112176a9270SRobert Mustacchi sizeof (smb_processor_info_riscv_t);
113176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
114176a9270SRobert Mustacchi pi.smbpai_len = sizeof (smb_processor_info_riscv_t);
115176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_RV64;
116176a9270SRobert Mustacchi
117176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
118176a9270SRobert Mustacchi
119176a9270SRobert Mustacchi rv.smbpairv_vers = 1;
120176a9270SRobert Mustacchi rv.smbpairv_len = sizeof (smb_processor_info_riscv_t);
121176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_hartid, sizeof (smbios_pinfo_hartid));
122176a9270SRobert Mustacchi bcopy(smbios_pinfo_hartid, rv.smbpairv_hartid,
123176a9270SRobert Mustacchi sizeof (smbios_pinfo_hartid));
124176a9270SRobert Mustacchi rv.smbpairv_boot = 1;
125176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_vendid, sizeof (smbios_pinfo_vendid));
126176a9270SRobert Mustacchi bcopy(smbios_pinfo_vendid, rv.smbpairv_vendid,
127176a9270SRobert Mustacchi sizeof (smbios_pinfo_vendid));
128176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_archid, sizeof (smbios_pinfo_archid));
129176a9270SRobert Mustacchi bcopy(smbios_pinfo_archid, rv.smbpairv_archid,
130176a9270SRobert Mustacchi sizeof (smbios_pinfo_archid));
131176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_machid, sizeof (smbios_pinfo_machid));
132176a9270SRobert Mustacchi bcopy(smbios_pinfo_machid, rv.smbpairv_machid,
133176a9270SRobert Mustacchi sizeof (smbios_pinfo_machid));
134176a9270SRobert Mustacchi rv.smbpairv_boot = 1;
135176a9270SRobert Mustacchi rv.smbpairv_isa = htole64(smbios_pinfo_isa);
136176a9270SRobert Mustacchi rv.smbpairv_privlvl = SMB_RV_PRIV_M | SMB_RV_PRIV_S;
137176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_metdi, sizeof (smbios_pinfo_metdi));
138176a9270SRobert Mustacchi bcopy(smbios_pinfo_metdi, rv.smbpairv_metdi,
139176a9270SRobert Mustacchi sizeof (smbios_pinfo_metdi));
140176a9270SRobert Mustacchi arc4random_buf(smbios_pinfo_mitdi, sizeof (smbios_pinfo_mitdi));
141176a9270SRobert Mustacchi bcopy(smbios_pinfo_mitdi, rv.smbpairv_mitdi,
142176a9270SRobert Mustacchi sizeof (smbios_pinfo_mitdi));
143176a9270SRobert Mustacchi rv.smbpairv_xlen = SMB_RV_WIDTH_64B;
144176a9270SRobert Mustacchi rv.smbpairv_mxlen = SMB_RV_WIDTH_64B;
145176a9270SRobert Mustacchi rv.smbpairv_sxlen = SMB_RV_WIDTH_128B;
146176a9270SRobert Mustacchi rv.smbpairv_uxlen = SMB_RV_WIDTH_32B;
147176a9270SRobert Mustacchi
148176a9270SRobert Mustacchi smbios_test_table_append_raw(table, &rv, sizeof (rv));
149176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
150176a9270SRobert Mustacchi
151176a9270SRobert Mustacchi return (B_TRUE);
152176a9270SRobert Mustacchi }
153176a9270SRobert Mustacchi
154176a9270SRobert Mustacchi static void
smbios_test_pinfo_id_mismatch(uint8_t * act,uint8_t * exp)155176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(uint8_t *act, uint8_t *exp)
156176a9270SRobert Mustacchi {
157176a9270SRobert Mustacchi uint_t i;
158176a9270SRobert Mustacchi (void) fprintf(stderr, "found: ");
159176a9270SRobert Mustacchi for (i = 0; i < 16; i++) {
160176a9270SRobert Mustacchi (void) fprintf(stderr, " %02x", act[i]);
161176a9270SRobert Mustacchi }
162176a9270SRobert Mustacchi (void) fprintf(stderr, "\nexpected: ");
163176a9270SRobert Mustacchi for (i = 0; i < 16; i++) {
164176a9270SRobert Mustacchi (void) fprintf(stderr, " %02x", exp[i]);
165176a9270SRobert Mustacchi }
166176a9270SRobert Mustacchi (void) fprintf(stderr, "\n");
167176a9270SRobert Mustacchi }
168176a9270SRobert Mustacchi
169176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_riscv(smbios_hdl_t * hdl)170176a9270SRobert Mustacchi smbios_test_pinfo_verify_riscv(smbios_hdl_t *hdl)
171176a9270SRobert Mustacchi {
172176a9270SRobert Mustacchi smbios_struct_t sp;
173176a9270SRobert Mustacchi smbios_processor_info_t pinfo;
174176a9270SRobert Mustacchi smbios_processor_info_riscv_t rv;
175176a9270SRobert Mustacchi boolean_t ret = B_TRUE;
176176a9270SRobert Mustacchi
177176a9270SRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_PROCESSOR_INFO, &sp) == -1) {
178176a9270SRobert Mustacchi warnx("failed to lookup SMBIOS processor additional "
179176a9270SRobert Mustacchi "information: %s", smbios_errmsg(smbios_errno(hdl)));
180176a9270SRobert Mustacchi return (B_FALSE);
181176a9270SRobert Mustacchi }
182176a9270SRobert Mustacchi
183176a9270SRobert Mustacchi if (smbios_info_processor_info(hdl, sp.smbstr_id, &pinfo) != 0) {
184176a9270SRobert Mustacchi warnx("failed to get SMBIOS processor additional "
185176a9270SRobert Mustacchi "information: %s", smbios_errmsg(smbios_errno(hdl)));
186176a9270SRobert Mustacchi return (B_FALSE);
187176a9270SRobert Mustacchi }
188176a9270SRobert Mustacchi
189176a9270SRobert Mustacchi if (pinfo.smbpi_processor != smbios_pinfo_phandle) {
190*8d195583SRobert Mustacchi warnx("processor handle incorrect, found 0x%" _PRIxID,
191176a9270SRobert Mustacchi pinfo.smbpi_processor);
192176a9270SRobert Mustacchi ret = B_FALSE;
193176a9270SRobert Mustacchi }
194176a9270SRobert Mustacchi
195176a9270SRobert Mustacchi if (pinfo.smbpi_ptype != SMB_PROCINFO_T_RV64) {
196176a9270SRobert Mustacchi warnx("processor type incorrect, found 0x%x",
197176a9270SRobert Mustacchi pinfo.smbpi_ptype);
198176a9270SRobert Mustacchi ret = B_FALSE;
199176a9270SRobert Mustacchi }
200176a9270SRobert Mustacchi
201176a9270SRobert Mustacchi if (strcmp(smbios_processor_info_type_desc(pinfo.smbpi_ptype),
202176a9270SRobert Mustacchi "64-bit RISC-V (RV64)") != 0) {
203176a9270SRobert Mustacchi warnx("processor type incorrect, found %s",
204176a9270SRobert Mustacchi smbios_processor_info_type_desc(pinfo.smbpi_ptype));
205176a9270SRobert Mustacchi ret = B_FALSE;
206176a9270SRobert Mustacchi }
207176a9270SRobert Mustacchi
208176a9270SRobert Mustacchi if (smbios_info_processor_riscv(hdl, sp.smbstr_id, &rv) != 0) {
209176a9270SRobert Mustacchi
210176a9270SRobert Mustacchi warnx("failed to get SMBIOS processor additional "
211176a9270SRobert Mustacchi "information for RISC-V: %s",
212176a9270SRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
213176a9270SRobert Mustacchi return (B_FALSE);
214176a9270SRobert Mustacchi }
215176a9270SRobert Mustacchi
216176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_hartid, smbios_pinfo_hartid,
217176a9270SRobert Mustacchi sizeof (smbios_pinfo_hartid)) != 0) {
218176a9270SRobert Mustacchi warnx("RISC-V hart id's don't match");
219176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_hartid,
220176a9270SRobert Mustacchi smbios_pinfo_hartid);
221176a9270SRobert Mustacchi ret = B_FALSE;
222176a9270SRobert Mustacchi }
223176a9270SRobert Mustacchi
224176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_vendid, smbios_pinfo_vendid,
225176a9270SRobert Mustacchi sizeof (smbios_pinfo_vendid)) != 0) {
226176a9270SRobert Mustacchi warnx("RISC-V vend id's don't match");
227176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_vendid,
228176a9270SRobert Mustacchi smbios_pinfo_vendid);
229176a9270SRobert Mustacchi ret = B_FALSE;
230176a9270SRobert Mustacchi }
231176a9270SRobert Mustacchi
232176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_archid, smbios_pinfo_archid,
233176a9270SRobert Mustacchi sizeof (smbios_pinfo_archid)) != 0) {
234176a9270SRobert Mustacchi warnx("RISC-V arch id's don't match");
235176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_archid,
236176a9270SRobert Mustacchi smbios_pinfo_archid);
237176a9270SRobert Mustacchi ret = B_FALSE;
238176a9270SRobert Mustacchi }
239176a9270SRobert Mustacchi
240176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_machid, smbios_pinfo_machid,
241176a9270SRobert Mustacchi sizeof (smbios_pinfo_machid)) != 0) {
242176a9270SRobert Mustacchi warnx("RISC-V mach id's don't match");
243176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_machid,
244176a9270SRobert Mustacchi smbios_pinfo_machid);
245176a9270SRobert Mustacchi ret = B_FALSE;
246176a9270SRobert Mustacchi }
247176a9270SRobert Mustacchi
248176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_metdi, smbios_pinfo_metdi,
249176a9270SRobert Mustacchi sizeof (smbios_pinfo_metdi)) != 0) {
250176a9270SRobert Mustacchi warnx("RISC-V METDI don't match");
251176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_metdi,
252176a9270SRobert Mustacchi smbios_pinfo_metdi);
253176a9270SRobert Mustacchi ret = B_FALSE;
254176a9270SRobert Mustacchi }
255176a9270SRobert Mustacchi
256176a9270SRobert Mustacchi if (bcmp(rv.smbpirv_mitdi, smbios_pinfo_mitdi,
257176a9270SRobert Mustacchi sizeof (smbios_pinfo_mitdi)) != 0) {
258176a9270SRobert Mustacchi warnx("RISC-V METDI don't match");
259176a9270SRobert Mustacchi smbios_test_pinfo_id_mismatch(rv.smbpirv_mitdi,
260176a9270SRobert Mustacchi smbios_pinfo_mitdi);
261176a9270SRobert Mustacchi ret = B_FALSE;
262176a9270SRobert Mustacchi }
263176a9270SRobert Mustacchi
264176a9270SRobert Mustacchi if (rv.smbpirv_isa != smbios_pinfo_isa) {
265176a9270SRobert Mustacchi warnx("RISC-V ISA mismatch");
266176a9270SRobert Mustacchi ret = B_FALSE;
267176a9270SRobert Mustacchi }
268176a9270SRobert Mustacchi
269176a9270SRobert Mustacchi if (rv.smbpirv_privlvl != (SMB_RV_PRIV_M | SMB_RV_PRIV_S)) {
270176a9270SRobert Mustacchi warnx("RISC-V privilege level mismatch, found: 0x%x",
271176a9270SRobert Mustacchi rv.smbpirv_privlvl);
272176a9270SRobert Mustacchi ret = B_FALSE;
273176a9270SRobert Mustacchi }
274176a9270SRobert Mustacchi
275176a9270SRobert Mustacchi if (rv.smbpirv_xlen != SMB_RV_WIDTH_64B) {
276176a9270SRobert Mustacchi warnx("RISC-V xlen mismatch, found: 0x%x", rv.smbpirv_xlen);
277176a9270SRobert Mustacchi ret = B_FALSE;
278176a9270SRobert Mustacchi }
279176a9270SRobert Mustacchi
280176a9270SRobert Mustacchi if (rv.smbpirv_mxlen != SMB_RV_WIDTH_64B) {
281176a9270SRobert Mustacchi warnx("RISC-V mxlen mismatch, found: 0x%x", rv.smbpirv_mxlen);
282176a9270SRobert Mustacchi ret = B_FALSE;
283176a9270SRobert Mustacchi }
284176a9270SRobert Mustacchi
285176a9270SRobert Mustacchi if (rv.smbpirv_sxlen != SMB_RV_WIDTH_128B) {
286176a9270SRobert Mustacchi warnx("RISC-V sxlen mismatch, found: 0x%x", rv.smbpirv_sxlen);
287176a9270SRobert Mustacchi ret = B_FALSE;
288176a9270SRobert Mustacchi }
289176a9270SRobert Mustacchi
290176a9270SRobert Mustacchi if (rv.smbpirv_uxlen != SMB_RV_WIDTH_32B) {
291176a9270SRobert Mustacchi warnx("RISC-V uxlen mismatch, found: 0x%x", rv.smbpirv_uxlen);
292176a9270SRobert Mustacchi ret = B_FALSE;
293176a9270SRobert Mustacchi }
294176a9270SRobert Mustacchi
295176a9270SRobert Mustacchi /*
296176a9270SRobert Mustacchi * Finally, use this to spot check several of the different RISC-V
297176a9270SRobert Mustacchi * strings.
298176a9270SRobert Mustacchi */
299176a9270SRobert Mustacchi if (strcmp(smbios_riscv_priv_desc(SMB_RV_PRIV_M), "Machine Mode") !=
300176a9270SRobert Mustacchi 0) {
301176a9270SRobert Mustacchi warnx("SMB_RV_PRIV_M string desc mismatch, found %s",
302176a9270SRobert Mustacchi smbios_riscv_priv_desc(SMB_RV_PRIV_M));
303176a9270SRobert Mustacchi ret = B_FALSE;
304176a9270SRobert Mustacchi }
305176a9270SRobert Mustacchi
306176a9270SRobert Mustacchi if (strcmp(smbios_riscv_priv_name(SMB_RV_PRIV_U), "SMB_RV_PRIV_U") !=
307176a9270SRobert Mustacchi 0) {
308176a9270SRobert Mustacchi warnx("SMB_RV_PRIV_U string name mismatch, found %s",
309176a9270SRobert Mustacchi smbios_riscv_priv_name(SMB_RV_PRIV_U));
310176a9270SRobert Mustacchi ret = B_FALSE;
311176a9270SRobert Mustacchi }
312176a9270SRobert Mustacchi
313176a9270SRobert Mustacchi if (strcmp(smbios_riscv_width_desc(SMB_RV_WIDTH_64B), "64-bit") !=
314176a9270SRobert Mustacchi 0) {
315176a9270SRobert Mustacchi warnx("SMB_RV_WIDTH_64B string desc mismatch, found %s",
316176a9270SRobert Mustacchi smbios_riscv_width_desc(SMB_RV_WIDTH_64B));
317176a9270SRobert Mustacchi ret = B_FALSE;
318176a9270SRobert Mustacchi }
319176a9270SRobert Mustacchi
320176a9270SRobert Mustacchi if (strcmp(smbios_riscv_width_desc(SMB_RV_WIDTH_128B), "128-bit") !=
321176a9270SRobert Mustacchi 0) {
322176a9270SRobert Mustacchi warnx("SMB_RV_WIDTH_128B string desc mismatch, found %s",
323176a9270SRobert Mustacchi smbios_riscv_width_desc(SMB_RV_WIDTH_128B));
324176a9270SRobert Mustacchi ret = B_FALSE;
325176a9270SRobert Mustacchi }
326176a9270SRobert Mustacchi
327176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_desc(SMB_RV_ISA_A), "Atomic") != 0) {
328176a9270SRobert Mustacchi warnx("SMB_RV_ISA_A string desc mismatch, found %s",
329176a9270SRobert Mustacchi smbios_riscv_isa_desc(SMB_RV_ISA_A));
330176a9270SRobert Mustacchi ret = B_FALSE;
331176a9270SRobert Mustacchi }
332176a9270SRobert Mustacchi
333176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_desc(SMB_RV_ISA_C), "Compressed") != 0) {
334d53cdfabSRobert Mustacchi warnx("SMB_RV_ISA_C string desc mismatch, found %s",
335176a9270SRobert Mustacchi smbios_riscv_isa_desc(SMB_RV_ISA_C));
336176a9270SRobert Mustacchi ret = B_FALSE;
337176a9270SRobert Mustacchi }
338176a9270SRobert Mustacchi
339176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_desc(SMB_RV_ISA_Q),
340d53cdfabSRobert Mustacchi "Quad-precision floating-point") != 0) {
341176a9270SRobert Mustacchi warnx("SMB_RV_ISA_Q string desc mismatch, found %s",
342176a9270SRobert Mustacchi smbios_riscv_isa_desc(SMB_RV_ISA_Q));
343176a9270SRobert Mustacchi ret = B_FALSE;
344176a9270SRobert Mustacchi }
345176a9270SRobert Mustacchi
346176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_name(SMB_RV_ISA_A), "SMB_RV_ISA_A") != 0) {
347176a9270SRobert Mustacchi warnx("SMB_RV_ISA_A string name mismatch, found %s",
348176a9270SRobert Mustacchi smbios_riscv_isa_name(SMB_RV_ISA_A));
349176a9270SRobert Mustacchi ret = B_FALSE;
350176a9270SRobert Mustacchi }
351176a9270SRobert Mustacchi
352176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_name(SMB_RV_ISA_C), "SMB_RV_ISA_C") != 0) {
353176a9270SRobert Mustacchi warnx("SMB_RV_ISA_Q string name mismatch, found %s",
354176a9270SRobert Mustacchi smbios_riscv_isa_name(SMB_RV_ISA_C));
355176a9270SRobert Mustacchi ret = B_FALSE;
356176a9270SRobert Mustacchi }
357176a9270SRobert Mustacchi
358176a9270SRobert Mustacchi if (strcmp(smbios_riscv_isa_name(SMB_RV_ISA_Q), "SMB_RV_ISA_Q") != 0) {
359176a9270SRobert Mustacchi warnx("SMB_RV_ISA_Q string name mismatch, found %s",
360176a9270SRobert Mustacchi smbios_riscv_isa_name(SMB_RV_ISA_Q));
361176a9270SRobert Mustacchi ret = B_FALSE;
362176a9270SRobert Mustacchi }
363176a9270SRobert Mustacchi
364176a9270SRobert Mustacchi return (ret);
365176a9270SRobert Mustacchi }
366176a9270SRobert Mustacchi
367176a9270SRobert Mustacchi /*
368176a9270SRobert Mustacchi * This shows having an invalid table length.
369176a9270SRobert Mustacchi */
370176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_invlen1(smbios_test_table_t * table)371176a9270SRobert Mustacchi smbios_test_pinfo_mktable_invlen1(smbios_test_table_t *table)
372176a9270SRobert Mustacchi {
373176a9270SRobert Mustacchi smb_processor_info_t pi;
374176a9270SRobert Mustacchi
375176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
376176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = 2;
377176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
378176a9270SRobert Mustacchi pi.smbpai_len = 0;
379176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_AMD64;
380176a9270SRobert Mustacchi
381176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
382176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
383176a9270SRobert Mustacchi
384176a9270SRobert Mustacchi return (B_TRUE);
385176a9270SRobert Mustacchi }
386176a9270SRobert Mustacchi
387176a9270SRobert Mustacchi /*
388176a9270SRobert Mustacchi * This sets the internal length of the additional processor information data to
389176a9270SRobert Mustacchi * go beyond the length of the basic structure.
390176a9270SRobert Mustacchi */
391176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_invlen2(smbios_test_table_t * table)392176a9270SRobert Mustacchi smbios_test_pinfo_mktable_invlen2(smbios_test_table_t *table)
393176a9270SRobert Mustacchi {
394176a9270SRobert Mustacchi smb_processor_info_t pi;
395176a9270SRobert Mustacchi smb_processor_info_riscv_t rv;
396176a9270SRobert Mustacchi
397176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
398176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = sizeof (smb_processor_info_t);
399176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
400176a9270SRobert Mustacchi pi.smbpai_len = sizeof (smb_processor_info_riscv_t);
401176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_RV64;
402176a9270SRobert Mustacchi
403176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
404176a9270SRobert Mustacchi
405176a9270SRobert Mustacchi arc4random_buf(&rv, sizeof (rv));
406176a9270SRobert Mustacchi rv.smbpairv_vers = 1;
407176a9270SRobert Mustacchi rv.smbpairv_len = sizeof (smb_processor_info_riscv_t);
408176a9270SRobert Mustacchi
409176a9270SRobert Mustacchi smbios_test_table_append_raw(table, &rv, sizeof (rv));
410176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
411176a9270SRobert Mustacchi
412176a9270SRobert Mustacchi return (B_TRUE);
413176a9270SRobert Mustacchi }
414176a9270SRobert Mustacchi
415176a9270SRobert Mustacchi /*
416176a9270SRobert Mustacchi * This verifies that we can detect a header length that doesn't properly
417176a9270SRobert Mustacchi * contain both the risc-v and base structure.
418176a9270SRobert Mustacchi */
419176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_invlen3(smbios_test_table_t * table)420176a9270SRobert Mustacchi smbios_test_pinfo_mktable_invlen3(smbios_test_table_t *table)
421176a9270SRobert Mustacchi {
422176a9270SRobert Mustacchi smb_processor_info_t pi;
423176a9270SRobert Mustacchi smb_processor_info_riscv_t rv;
424176a9270SRobert Mustacchi
425176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
426176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = sizeof (smb_processor_info_t);
427176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
428176a9270SRobert Mustacchi pi.smbpai_len = 0;
429176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_RV64;
430176a9270SRobert Mustacchi
431176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
432176a9270SRobert Mustacchi
433176a9270SRobert Mustacchi arc4random_buf(&rv, sizeof (rv));
434176a9270SRobert Mustacchi rv.smbpairv_vers = 1;
435176a9270SRobert Mustacchi rv.smbpairv_len = sizeof (smb_processor_info_riscv_t);
436176a9270SRobert Mustacchi
437176a9270SRobert Mustacchi smbios_test_table_append_raw(table, &rv, sizeof (rv));
438176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
439176a9270SRobert Mustacchi
440176a9270SRobert Mustacchi return (B_TRUE);
441176a9270SRobert Mustacchi }
442176a9270SRobert Mustacchi
443176a9270SRobert Mustacchi /*
444176a9270SRobert Mustacchi * This verifies that we can detect an inner risc-v additional processor
445176a9270SRobert Mustacchi * information section that declares its size to be beyond the header of the
446176a9270SRobert Mustacchi * structure.
447176a9270SRobert Mustacchi */
448176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_mktable_invlen4(smbios_test_table_t * table)449176a9270SRobert Mustacchi smbios_test_pinfo_mktable_invlen4(smbios_test_table_t *table)
450176a9270SRobert Mustacchi {
451176a9270SRobert Mustacchi smb_processor_info_t pi;
452176a9270SRobert Mustacchi smb_processor_info_riscv_t rv;
453176a9270SRobert Mustacchi
454176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_type = SMB_TYPE_PROCESSOR_INFO;
455176a9270SRobert Mustacchi pi.smbpai_hdr.smbh_len = sizeof (smb_processor_info_t) +
456176a9270SRobert Mustacchi sizeof (smb_processor_info_riscv_t);
457176a9270SRobert Mustacchi pi.smbpai_proc = htole16(smbios_pinfo_phandle);
458176a9270SRobert Mustacchi pi.smbpai_len = sizeof (smb_processor_info_riscv_t);
459176a9270SRobert Mustacchi pi.smbpai_type = SMB_PROCINFO_T_RV64;
460176a9270SRobert Mustacchi
461176a9270SRobert Mustacchi (void) smbios_test_table_append(table, &pi, sizeof (pi));
462176a9270SRobert Mustacchi
463176a9270SRobert Mustacchi arc4random_buf(&rv, sizeof (rv));
464176a9270SRobert Mustacchi rv.smbpairv_vers = 1;
465176a9270SRobert Mustacchi rv.smbpairv_len = sizeof (smb_processor_info_riscv_t) * 2;
466176a9270SRobert Mustacchi
467176a9270SRobert Mustacchi smbios_test_table_append_raw(table, &rv, sizeof (rv));
468176a9270SRobert Mustacchi smbios_test_table_append_eot(table);
469176a9270SRobert Mustacchi
470176a9270SRobert Mustacchi return (B_TRUE);
471176a9270SRobert Mustacchi }
472176a9270SRobert Mustacchi static boolean_t
smbios_test_pinfo_verify_badtable(smbios_hdl_t * hdl,int smberr,boolean_t valid_pinfo)473176a9270SRobert Mustacchi smbios_test_pinfo_verify_badtable(smbios_hdl_t *hdl, int smberr,
474176a9270SRobert Mustacchi boolean_t valid_pinfo)
475176a9270SRobert Mustacchi {
476176a9270SRobert Mustacchi smbios_struct_t sp;
477176a9270SRobert Mustacchi smbios_processor_info_t pinfo;
478176a9270SRobert Mustacchi smbios_processor_info_riscv_t rv;
479176a9270SRobert Mustacchi boolean_t ret = B_TRUE;
480176a9270SRobert Mustacchi
481176a9270SRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_PROCESSOR_INFO, &sp) == -1) {
482176a9270SRobert Mustacchi warnx("failed to lookup SMBIOS processor additional "
483176a9270SRobert Mustacchi "information: %s", smbios_errmsg(smbios_errno(hdl)));
484176a9270SRobert Mustacchi return (B_FALSE);
485176a9270SRobert Mustacchi }
486176a9270SRobert Mustacchi
487176a9270SRobert Mustacchi if (!valid_pinfo) {
488176a9270SRobert Mustacchi if (smbios_info_processor_info(hdl, sp.smbstr_id, &pinfo) !=
489176a9270SRobert Mustacchi -1) {
490176a9270SRobert Mustacchi warnx("accidentally parsed invalid processor "
491176a9270SRobert Mustacchi "additional information as valid");
492176a9270SRobert Mustacchi ret = B_FALSE;
493176a9270SRobert Mustacchi }
494176a9270SRobert Mustacchi
495176a9270SRobert Mustacchi if (smbios_errno(hdl) != smberr) {
496176a9270SRobert Mustacchi warnx("encountered wrong error for processor info, "
497176a9270SRobert Mustacchi "found: 0x%x", smbios_errno(hdl));
498176a9270SRobert Mustacchi ret = B_FALSE;
499176a9270SRobert Mustacchi }
500176a9270SRobert Mustacchi } else {
501176a9270SRobert Mustacchi if (smbios_info_processor_info(hdl, sp.smbstr_id, &pinfo) !=
502176a9270SRobert Mustacchi 0) {
503176a9270SRobert Mustacchi warnx("failed to get SMBIOS processor additional "
504176a9270SRobert Mustacchi "information: %s",
505176a9270SRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
506176a9270SRobert Mustacchi ret = B_FALSE;
507176a9270SRobert Mustacchi }
508176a9270SRobert Mustacchi }
509176a9270SRobert Mustacchi
510176a9270SRobert Mustacchi if (smbios_info_processor_riscv(hdl, sp.smbstr_id, &rv) != -1) {
511176a9270SRobert Mustacchi warnx("accidentally got riscv info on invalid handle");
512176a9270SRobert Mustacchi ret = B_FALSE;
513176a9270SRobert Mustacchi }
514176a9270SRobert Mustacchi
515176a9270SRobert Mustacchi if (smbios_errno(hdl) != smberr) {
516176a9270SRobert Mustacchi warnx("encountered wrong error for amd64 info, found: 0x%x",
517176a9270SRobert Mustacchi smbios_errno(hdl));
518176a9270SRobert Mustacchi ret = B_FALSE;
519176a9270SRobert Mustacchi }
520176a9270SRobert Mustacchi
521176a9270SRobert Mustacchi return (ret);
522176a9270SRobert Mustacchi }
523176a9270SRobert Mustacchi
524176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_invlen1(smbios_hdl_t * hdl)525176a9270SRobert Mustacchi smbios_test_pinfo_verify_invlen1(smbios_hdl_t *hdl)
526176a9270SRobert Mustacchi {
527176a9270SRobert Mustacchi return (smbios_test_pinfo_verify_badtable(hdl, ESMB_SHORT, B_FALSE));
528176a9270SRobert Mustacchi }
529176a9270SRobert Mustacchi
530176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_invlen2(smbios_hdl_t * hdl)531176a9270SRobert Mustacchi smbios_test_pinfo_verify_invlen2(smbios_hdl_t *hdl)
532176a9270SRobert Mustacchi {
533176a9270SRobert Mustacchi return (smbios_test_pinfo_verify_badtable(hdl, ESMB_CORRUPT, B_FALSE));
534176a9270SRobert Mustacchi }
535176a9270SRobert Mustacchi
536176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_invlen3(smbios_hdl_t * hdl)537176a9270SRobert Mustacchi smbios_test_pinfo_verify_invlen3(smbios_hdl_t *hdl)
538176a9270SRobert Mustacchi {
539176a9270SRobert Mustacchi return (smbios_test_pinfo_verify_badtable(hdl, ESMB_SHORT, B_TRUE));
540176a9270SRobert Mustacchi }
541176a9270SRobert Mustacchi
542176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_invlen4(smbios_hdl_t * hdl)543176a9270SRobert Mustacchi smbios_test_pinfo_verify_invlen4(smbios_hdl_t *hdl)
544176a9270SRobert Mustacchi {
545176a9270SRobert Mustacchi return (smbios_test_pinfo_verify_badtable(hdl, ESMB_CORRUPT, B_TRUE));
546176a9270SRobert Mustacchi }
547176a9270SRobert Mustacchi
548176a9270SRobert Mustacchi boolean_t
smbios_test_pinfo_verify_badtype(smbios_hdl_t * hdl)549176a9270SRobert Mustacchi smbios_test_pinfo_verify_badtype(smbios_hdl_t *hdl)
550176a9270SRobert Mustacchi {
551176a9270SRobert Mustacchi smbios_struct_t sp;
552176a9270SRobert Mustacchi smbios_processor_info_t pinfo;
553176a9270SRobert Mustacchi smbios_processor_info_riscv_t rv;
554176a9270SRobert Mustacchi boolean_t ret = B_TRUE;
555176a9270SRobert Mustacchi
556176a9270SRobert Mustacchi if (smbios_lookup_type(hdl, SMB_TYPE_MEMDEVICE, &sp) == -1) {
557176a9270SRobert Mustacchi warnx("failed to lookup SMBIOS memory device information: %s",
558176a9270SRobert Mustacchi smbios_errmsg(smbios_errno(hdl)));
559176a9270SRobert Mustacchi return (B_FALSE);
560176a9270SRobert Mustacchi }
561176a9270SRobert Mustacchi
562176a9270SRobert Mustacchi if (smbios_info_processor_info(hdl, sp.smbstr_id, &pinfo) != -1) {
563176a9270SRobert Mustacchi warnx("accidentally parsed invalid processor additional "
564176a9270SRobert Mustacchi "information as valid");
565176a9270SRobert Mustacchi ret = B_FALSE;
566176a9270SRobert Mustacchi }
567176a9270SRobert Mustacchi
568176a9270SRobert Mustacchi if (smbios_errno(hdl) != ESMB_TYPE) {
569176a9270SRobert Mustacchi warnx("encountered wrong error for processor info, found: 0x%x",
570176a9270SRobert Mustacchi smbios_errno(hdl));
571176a9270SRobert Mustacchi ret = B_FALSE;
572176a9270SRobert Mustacchi }
573176a9270SRobert Mustacchi
574176a9270SRobert Mustacchi if (smbios_info_processor_riscv(hdl, sp.smbstr_id, &rv) != -1) {
575176a9270SRobert Mustacchi warnx("accidentally got riscv info on invalid handle");
576176a9270SRobert Mustacchi ret = B_FALSE;
577176a9270SRobert Mustacchi }
578176a9270SRobert Mustacchi
579176a9270SRobert Mustacchi if (smbios_errno(hdl) != ESMB_TYPE) {
580176a9270SRobert Mustacchi warnx("encountered wrong error for processor info, found: 0x%x",
581176a9270SRobert Mustacchi smbios_errno(hdl));
582176a9270SRobert Mustacchi ret = B_FALSE;
583176a9270SRobert Mustacchi }
584176a9270SRobert Mustacchi
585176a9270SRobert Mustacchi return (ret);
586176a9270SRobert Mustacchi }
587