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