11566bc34SRobert Mustacchi /*
21566bc34SRobert Mustacchi  * This file and its contents are supplied under the terms of the
31566bc34SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
41566bc34SRobert Mustacchi  * You may only use this file in accordance with the terms of version
51566bc34SRobert Mustacchi  * 1.0 of the CDDL.
61566bc34SRobert Mustacchi  *
71566bc34SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
81566bc34SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
91566bc34SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
101566bc34SRobert Mustacchi  */
111566bc34SRobert Mustacchi 
121566bc34SRobert Mustacchi /*
131566bc34SRobert Mustacchi  * Copyright (c) 2018, Joyent, Inc.
14*064d431aSRobert Mustacchi  * Copyright 2024 Oxide Computer Company
151566bc34SRobert Mustacchi  */
161566bc34SRobert Mustacchi 
171566bc34SRobert Mustacchi /*
181566bc34SRobert Mustacchi  * Primordial SMBIOS test suite. At the moment, the purpose of this is just to
191566bc34SRobert Mustacchi  * test the recent SMBIOS 3.2 additions specific to the variable length slots.
201566bc34SRobert Mustacchi  * This should be evolved into a much fuller test suite.
211566bc34SRobert Mustacchi  */
221566bc34SRobert Mustacchi 
231566bc34SRobert Mustacchi #include <umem.h>
24d53cdfabSRobert Mustacchi #include <sys/types.h>
25d53cdfabSRobert Mustacchi #include <sys/stat.h>
26d53cdfabSRobert Mustacchi #include <fcntl.h>
27d53cdfabSRobert Mustacchi #include <limits.h>
28d53cdfabSRobert Mustacchi #include <unistd.h>
29176a9270SRobert Mustacchi #include "smbios_test.h"
301566bc34SRobert Mustacchi 
31d53cdfabSRobert Mustacchi static int test_dirfd = -1;
32d53cdfabSRobert Mustacchi 
331566bc34SRobert Mustacchi const char *
_umem_debug_init(void)341566bc34SRobert Mustacchi _umem_debug_init(void)
351566bc34SRobert Mustacchi {
361566bc34SRobert Mustacchi 	return ("default,verbose");
371566bc34SRobert Mustacchi }
381566bc34SRobert Mustacchi 
391566bc34SRobert Mustacchi const char *
_umem_logging_init(void)401566bc34SRobert Mustacchi _umem_logging_init(void)
411566bc34SRobert Mustacchi {
421566bc34SRobert Mustacchi 	return ("fail,contents");
431566bc34SRobert Mustacchi }
441566bc34SRobert Mustacchi 
45176a9270SRobert Mustacchi smbios_test_table_t *
smbios_test_table_init(smbios_entry_point_t type,uint_t version)461566bc34SRobert Mustacchi smbios_test_table_init(smbios_entry_point_t type, uint_t version)
471566bc34SRobert Mustacchi {
481566bc34SRobert Mustacchi 	smbios_test_table_t *table;
491566bc34SRobert Mustacchi 
501566bc34SRobert Mustacchi 	if (type != SMBIOS_ENTRY_POINT_30) {
511566bc34SRobert Mustacchi 		abort();
521566bc34SRobert Mustacchi 	}
531566bc34SRobert Mustacchi 
541566bc34SRobert Mustacchi 	table = umem_zalloc(sizeof (smbios_test_table_t), UMEM_DEFAULT);
551566bc34SRobert Mustacchi 	if (table == NULL) {
561566bc34SRobert Mustacchi 		return (NULL);
571566bc34SRobert Mustacchi 	}
581566bc34SRobert Mustacchi 
591566bc34SRobert Mustacchi 	table->stt_data = umem_zalloc(SMBIOS_TEST_ALLOC_SIZE, UMEM_DEFAULT);
601566bc34SRobert Mustacchi 	if (table->stt_data == NULL) {
611566bc34SRobert Mustacchi 		umem_free(table, sizeof (smbios_test_table_t));
621566bc34SRobert Mustacchi 		return (NULL);
631566bc34SRobert Mustacchi 	}
641566bc34SRobert Mustacchi 	table->stt_buflen = SMBIOS_TEST_ALLOC_SIZE;
651566bc34SRobert Mustacchi 	table->stt_type = type;
661566bc34SRobert Mustacchi 	table->stt_version = version;
671566bc34SRobert Mustacchi 	table->stt_nextid = 1;
681566bc34SRobert Mustacchi 
691566bc34SRobert Mustacchi 	return (table);
701566bc34SRobert Mustacchi }
711566bc34SRobert Mustacchi 
721566bc34SRobert Mustacchi static void *
smbios_test_table_append_common(smbios_test_table_t * table,const void * buf,size_t len)731566bc34SRobert Mustacchi smbios_test_table_append_common(smbios_test_table_t *table, const void *buf,
741566bc34SRobert Mustacchi     size_t len)
751566bc34SRobert Mustacchi {
761566bc34SRobert Mustacchi 	void *start;
771566bc34SRobert Mustacchi 
781566bc34SRobert Mustacchi 	if (SIZE_MAX - table->stt_offset < len)
791566bc34SRobert Mustacchi 		abort();
801566bc34SRobert Mustacchi 
811566bc34SRobert Mustacchi 	if (len + table->stt_offset >= table->stt_buflen) {
821566bc34SRobert Mustacchi 		void *newbuf;
831566bc34SRobert Mustacchi 		size_t newlen = table->stt_buflen + SMBIOS_TEST_ALLOC_SIZE;
841566bc34SRobert Mustacchi 
851566bc34SRobert Mustacchi 		while (len + table->stt_offset >= newlen) {
861566bc34SRobert Mustacchi 			newlen += SMBIOS_TEST_ALLOC_SIZE;
871566bc34SRobert Mustacchi 		}
881566bc34SRobert Mustacchi 
891566bc34SRobert Mustacchi 		newbuf = umem_zalloc(newlen, UMEM_DEFAULT);
901566bc34SRobert Mustacchi 		if (newbuf == NULL) {
918d195583SRobert Mustacchi 			err(EXIT_FAILURE, "failed to umem_zalloc for %zu bytes",
921566bc34SRobert Mustacchi 			    newlen);
931566bc34SRobert Mustacchi 		}
941566bc34SRobert Mustacchi 
951566bc34SRobert Mustacchi 		(void) memcpy(newbuf, table->stt_data, table->stt_buflen);
961566bc34SRobert Mustacchi 		umem_free(table->stt_data, table->stt_buflen);
971566bc34SRobert Mustacchi 		table->stt_data = newbuf;
981566bc34SRobert Mustacchi 		table->stt_buflen = newlen;
991566bc34SRobert Mustacchi 	}
1001566bc34SRobert Mustacchi 
1011566bc34SRobert Mustacchi 	start = (void *)((uintptr_t)table->stt_data + table->stt_offset);
1021566bc34SRobert Mustacchi 	(void) memcpy(start, buf, len);
1031566bc34SRobert Mustacchi 	table->stt_offset += len;
1041566bc34SRobert Mustacchi 
1051566bc34SRobert Mustacchi 	return (start);
1061566bc34SRobert Mustacchi }
1071566bc34SRobert Mustacchi 
108176a9270SRobert Mustacchi void
smbios_test_table_append_raw(smbios_test_table_t * table,const void * buf,size_t len)1091566bc34SRobert Mustacchi smbios_test_table_append_raw(smbios_test_table_t *table, const void *buf,
1101566bc34SRobert Mustacchi     size_t len)
1111566bc34SRobert Mustacchi {
1121566bc34SRobert Mustacchi 	(void) smbios_test_table_append_common(table, buf, len);
1131566bc34SRobert Mustacchi }
1141566bc34SRobert Mustacchi 
115176a9270SRobert Mustacchi void
smbios_test_table_append_string(smbios_test_table_t * table,const char * str)1161566bc34SRobert Mustacchi smbios_test_table_append_string(smbios_test_table_t *table, const char *str)
1171566bc34SRobert Mustacchi {
1181566bc34SRobert Mustacchi 	size_t len = strlen(str) + 1;
1191566bc34SRobert Mustacchi 	(void) smbios_test_table_append_common(table, str, len);
1201566bc34SRobert Mustacchi }
1211566bc34SRobert Mustacchi 
122d53cdfabSRobert Mustacchi void
smbios_test_table_str_fini(smbios_test_table_t * table)123d53cdfabSRobert Mustacchi smbios_test_table_str_fini(smbios_test_table_t *table)
124d53cdfabSRobert Mustacchi {
125d53cdfabSRobert Mustacchi 	const uint8_t endstring = 0;
126d53cdfabSRobert Mustacchi 
127d53cdfabSRobert Mustacchi 	smbios_test_table_append_raw(table, &endstring, sizeof (endstring));
128d53cdfabSRobert Mustacchi }
129d53cdfabSRobert Mustacchi 
130176a9270SRobert Mustacchi uint16_t
smbios_test_table_append(smbios_test_table_t * table,const void * buf,size_t len)1311566bc34SRobert Mustacchi smbios_test_table_append(smbios_test_table_t *table, const void *buf,
1321566bc34SRobert Mustacchi     size_t len)
1331566bc34SRobert Mustacchi {
1341566bc34SRobert Mustacchi 	smb_header_t *hdr;
1351566bc34SRobert Mustacchi 	uint16_t id;
1361566bc34SRobert Mustacchi 
1371566bc34SRobert Mustacchi 	hdr = smbios_test_table_append_common(table, buf, len);
1381566bc34SRobert Mustacchi 	table->stt_nents++;
1391566bc34SRobert Mustacchi 
1401566bc34SRobert Mustacchi 	id = table->stt_nextid;
1411566bc34SRobert Mustacchi 	hdr->smbh_hdl = htole16(table->stt_nextid);
1421566bc34SRobert Mustacchi 	table->stt_nextid++;
1431566bc34SRobert Mustacchi 
1441566bc34SRobert Mustacchi 	return (id);
1451566bc34SRobert Mustacchi }
1461566bc34SRobert Mustacchi 
147176a9270SRobert Mustacchi void
smbios_test_table_append_eot(smbios_test_table_t * table)148176a9270SRobert Mustacchi smbios_test_table_append_eot(smbios_test_table_t *table)
149176a9270SRobert Mustacchi {
150176a9270SRobert Mustacchi 	smb_header_t eot;
151176a9270SRobert Mustacchi 	uint8_t endstring = 0;
152176a9270SRobert Mustacchi 
153176a9270SRobert Mustacchi 	bzero(&eot, sizeof (eot));
154176a9270SRobert Mustacchi 	eot.smbh_type = SMB_TYPE_EOT;
155176a9270SRobert Mustacchi 	eot.smbh_len = 4;
156176a9270SRobert Mustacchi 	(void) smbios_test_table_append(table, &eot, sizeof (eot));
157176a9270SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, &endstring,
158176a9270SRobert Mustacchi 	    sizeof (endstring));
159176a9270SRobert Mustacchi 	smbios_test_table_append_raw(table, &endstring,
160176a9270SRobert Mustacchi 	    sizeof (endstring));
161176a9270SRobert Mustacchi 	smbios_test_table_append_raw(table, &endstring,
162176a9270SRobert Mustacchi 	    sizeof (endstring));
163176a9270SRobert Mustacchi 
164176a9270SRobert Mustacchi }
165176a9270SRobert Mustacchi 
1661566bc34SRobert Mustacchi static uint8_t
smbios_test_table_checksum(const uint8_t * buf,size_t len)1671566bc34SRobert Mustacchi smbios_test_table_checksum(const uint8_t *buf, size_t len)
1681566bc34SRobert Mustacchi {
1691566bc34SRobert Mustacchi 	uint8_t sum;
1701566bc34SRobert Mustacchi 	size_t i;
1711566bc34SRobert Mustacchi 
1721566bc34SRobert Mustacchi 	for (i = 0, sum = 0; i < len; i++) {
1731566bc34SRobert Mustacchi 		sum += buf[i];
1741566bc34SRobert Mustacchi 	}
1751566bc34SRobert Mustacchi 
1761566bc34SRobert Mustacchi 	if (sum == 0)
1771566bc34SRobert Mustacchi 		return (0);
1781566bc34SRobert Mustacchi 
1791566bc34SRobert Mustacchi 	return ((uint8_t)(0x100 - sum));
1801566bc34SRobert Mustacchi }
1811566bc34SRobert Mustacchi 
1821566bc34SRobert Mustacchi static void
smbios_test_table_snapshot(smbios_test_table_t * table,smbios_entry_t ** entryp,void ** bufp,size_t * lenp)1831566bc34SRobert Mustacchi smbios_test_table_snapshot(smbios_test_table_t *table, smbios_entry_t **entryp,
1841566bc34SRobert Mustacchi     void **bufp, size_t *lenp)
1851566bc34SRobert Mustacchi {
1861566bc34SRobert Mustacchi 	smbios_30_entry_t *ent30;
1871566bc34SRobert Mustacchi 
1881566bc34SRobert Mustacchi 	switch (table->stt_type) {
1891566bc34SRobert Mustacchi 	case SMBIOS_ENTRY_POINT_30:
1901566bc34SRobert Mustacchi 		ent30 = &table->stt_entry.ep30;
1911566bc34SRobert Mustacchi 
1921566bc34SRobert Mustacchi 		(void) memcpy(ent30->smbe_eanchor, SMB3_ENTRY_EANCHOR,
1931566bc34SRobert Mustacchi 		    sizeof (ent30->smbe_eanchor));
1941566bc34SRobert Mustacchi 		ent30->smbe_ecksum = 0;
1951566bc34SRobert Mustacchi 		ent30->smbe_elen = sizeof (*ent30);
1961566bc34SRobert Mustacchi 		ent30->smbe_major = (table->stt_version >> 8) & 0xff;
1971566bc34SRobert Mustacchi 		ent30->smbe_minor = table->stt_version & 0xff;
1981566bc34SRobert Mustacchi 		ent30->smbe_docrev = 0;
1991566bc34SRobert Mustacchi 		ent30->smbe_revision = 1;
2001566bc34SRobert Mustacchi 		ent30->smbe_reserved = 0;
2011566bc34SRobert Mustacchi 		ent30->smbe_stlen = htole32(table->stt_offset);
2021566bc34SRobert Mustacchi 		ent30->smbe_staddr = htole64(P2ROUNDUP(sizeof (*ent30), 16));
2031566bc34SRobert Mustacchi 
2041566bc34SRobert Mustacchi 		ent30->smbe_ecksum = smbios_test_table_checksum((void *)ent30,
2051566bc34SRobert Mustacchi 		    sizeof (*ent30));
2061566bc34SRobert Mustacchi 		break;
2071566bc34SRobert Mustacchi 	default:
2081566bc34SRobert Mustacchi 		abort();
2091566bc34SRobert Mustacchi 	}
2101566bc34SRobert Mustacchi 
2111566bc34SRobert Mustacchi 	*entryp = &table->stt_entry;
2121566bc34SRobert Mustacchi 	*bufp = table->stt_data;
2131566bc34SRobert Mustacchi 	*lenp = table->stt_offset;
2141566bc34SRobert Mustacchi }
2151566bc34SRobert Mustacchi 
2161566bc34SRobert Mustacchi static void
smbios_test_table_fini(smbios_test_table_t * table)2171566bc34SRobert Mustacchi smbios_test_table_fini(smbios_test_table_t *table)
2181566bc34SRobert Mustacchi {
2191566bc34SRobert Mustacchi 	if (table == NULL) {
2201566bc34SRobert Mustacchi 		return;
2211566bc34SRobert Mustacchi 	}
2221566bc34SRobert Mustacchi 
2231566bc34SRobert Mustacchi 	if (table->stt_data != NULL) {
2241566bc34SRobert Mustacchi 		umem_free(table->stt_data, table->stt_buflen);
2251566bc34SRobert Mustacchi 	}
2261566bc34SRobert Mustacchi 
2271566bc34SRobert Mustacchi 	umem_free(table, sizeof (smbios_test_table_t));
2281566bc34SRobert Mustacchi }
2291566bc34SRobert Mustacchi 
230176a9270SRobert Mustacchi static const smbios_test_t smbios_tests[] = {
231176a9270SRobert Mustacchi 	{
232d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
233d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
234d53cdfabSRobert Mustacchi 	    .st_libvers = 0xffff,
235d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_badvers_mktable,
236d53cdfabSRobert Mustacchi 	    .st_desc = "bad library version"
237d53cdfabSRobert Mustacchi 	}, {
238d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
239d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
240d53cdfabSRobert Mustacchi 	    .st_libvers = 0,
241d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_badvers_mktable,
242d53cdfabSRobert Mustacchi 	    .st_desc = "bad library version (zeros)"
243d53cdfabSRobert Mustacchi 	}, {
244d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
245d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
246d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
247d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable,
248d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
249d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_verify_badids,
250d53cdfabSRobert Mustacchi 	    .st_desc = "smbios_info_* with bad id"
251d53cdfabSRobert Mustacchi 	}, {
252d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
253d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
254d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
255d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable,
256d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
257d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_verify_strings,
258d53cdfabSRobert Mustacchi 	    .st_desc = "smbios string functions"
259d53cdfabSRobert Mustacchi 	}, {
260176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
261176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION_32,
262176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
263176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable,
264176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
265176a9270SRobert Mustacchi 	    .st_verify = smbios_test_slot_verify,
266c6795799SRobert Mustacchi 	    .st_desc = "slot 3.2"
267c6795799SRobert Mustacchi 	}, {
268c6795799SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
269c6795799SRobert Mustacchi 	    .st_tvers = SMB_VERSION_34,
270c6795799SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
271c6795799SRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable_34_nopeers,
272c6795799SRobert Mustacchi 	    .st_canopen = B_TRUE,
273c6795799SRobert Mustacchi 	    .st_verify = smbios_test_slot_verify_34_nopeers,
274c6795799SRobert Mustacchi 	    .st_desc = "slot 3.4 without peers"
275c6795799SRobert Mustacchi 	}, {
276c6795799SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
277c6795799SRobert Mustacchi 	    .st_tvers = SMB_VERSION_34,
278c6795799SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
279c6795799SRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable_34_peers,
280c6795799SRobert Mustacchi 	    .st_canopen = B_TRUE,
281c6795799SRobert Mustacchi 	    .st_verify = smbios_test_slot_verify_34_peers,
282c6795799SRobert Mustacchi 	    .st_desc = "slot 3.4 with peers"
283176a9270SRobert Mustacchi 	}, {
284176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
285d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION_35,
286d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION_34,
287d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable_35,
288d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
289d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_slot_verify_34_overrun,
290d53cdfabSRobert Mustacchi 	    .st_desc = "slot 3.5 against 3.4 lib"
291d53cdfabSRobert Mustacchi 	}, {
292d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
293d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION_35,
294d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
295d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_slot_mktable_35,
296d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
297d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_slot_verify_35,
298d53cdfabSRobert Mustacchi 	    .st_desc = "slot 3.5"
299176a9270SRobert Mustacchi 	}, {
300176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
301176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION_32,
302176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION_32,
303176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
304176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
305176a9270SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_32,
306d53cdfabSRobert Mustacchi 	    .st_desc = "memory device 3.2 % 3.2"
307176a9270SRobert Mustacchi 	}, {
308176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
309176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION_32,
310176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION_33,
311176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
312176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
313176a9270SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_32_33,
314d53cdfabSRobert Mustacchi 	    .st_desc = "memory device 3.2 % 3.3"
3156bc074b1SRobert Mustacchi 	}, {
3166bc074b1SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
3176bc074b1SRobert Mustacchi 	    .st_tvers = SMB_VERSION_32,
3186bc074b1SRobert Mustacchi 	    .st_libvers = SMB_VERSION_37,
3196bc074b1SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
3206bc074b1SRobert Mustacchi 	    .st_canopen = B_TRUE,
3216bc074b1SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_32_37,
3226bc074b1SRobert Mustacchi 	    .st_desc = "memory device 3.2 % 3.7"
323176a9270SRobert Mustacchi 	}, {
324176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
325176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION_33,
326176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION_33,
327176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_33,
328176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
329176a9270SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_33,
330176a9270SRobert Mustacchi 	    .st_desc = "memory device 3.3"
331176a9270SRobert Mustacchi 	}, {
332176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
333176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION_33,
334176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION_33,
335176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_33ext,
336176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
337176a9270SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_33ext,
3386bc074b1SRobert Mustacchi 	    .st_desc = "memory device 3.3 with extended data"
3396bc074b1SRobert Mustacchi 	}, {
3406bc074b1SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
3416bc074b1SRobert Mustacchi 	    .st_tvers = SMB_VERSION_37,
3426bc074b1SRobert Mustacchi 	    .st_libvers = SMB_VERSION_37,
3436bc074b1SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_37,
3446bc074b1SRobert Mustacchi 	    .st_canopen = B_TRUE,
3456bc074b1SRobert Mustacchi 	    .st_verify = smbios_test_memdevice_verify_37,
3466bc074b1SRobert Mustacchi 	    .st_desc = "memory device 3.7"
347176a9270SRobert Mustacchi 	}, {
348176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
349176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
350176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
351176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_amd64,
352176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
353176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_amd64,
354176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - amd64"
355176a9270SRobert Mustacchi 	}, {
356176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
357176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
358176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
359176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_riscv,
360176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
361176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_riscv,
362176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - riscv"
363176a9270SRobert Mustacchi 	}, {
364176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
365176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
366176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
367176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_invlen1,
368176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
369176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_invlen1,
370176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - bad table length 1"
371176a9270SRobert Mustacchi 	}, {
372176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
373176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
374176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
375176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_invlen2,
376176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
377176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_invlen2,
378176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - bad table length 2"
379176a9270SRobert Mustacchi 	}, {
380176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
381176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
382176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
383176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_invlen3,
384176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
385176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_invlen3,
386176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - bad table length 3"
387176a9270SRobert Mustacchi 	}, {
388176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
389176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
390176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
391176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_pinfo_mktable_invlen4,
392176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
393176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_invlen4,
394176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - bad table length 4"
395176a9270SRobert Mustacchi 	}, {
396176a9270SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
397176a9270SRobert Mustacchi 	    .st_tvers = SMB_VERSION,
398176a9270SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
399176a9270SRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
400176a9270SRobert Mustacchi 	    .st_canopen = B_TRUE,
401176a9270SRobert Mustacchi 	    .st_verify = smbios_test_pinfo_verify_badtype,
402176a9270SRobert Mustacchi 	    .st_desc = "processor additional information - bad type"
403d53cdfabSRobert Mustacchi 	}, {
404d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
405d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
406d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
407d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_strprop_mktable_invlen1,
408d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
409d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_strprop_verify_invlen1,
410d53cdfabSRobert Mustacchi 	    .st_desc = "string property - bad table length 1"
411d53cdfabSRobert Mustacchi 	}, {
412d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
413d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
414d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
415d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_strprop_mktable_invlen2,
416d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
417d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_strprop_verify_invlen2,
418d53cdfabSRobert Mustacchi 	    .st_desc = "string property - bad table length 2"
419d53cdfabSRobert Mustacchi 	}, {
420d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
421d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
422d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
423d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
424d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
425d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_strprop_verify_badtype,
426d53cdfabSRobert Mustacchi 	    .st_desc = "string property - bad type"
427d53cdfabSRobert Mustacchi 	}, {
428d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
429d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
430d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
431d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_strprop_mktable_basic,
432d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
433d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_strprop_verify_basic,
434d53cdfabSRobert Mustacchi 	    .st_desc = "string property - basic"
435d53cdfabSRobert Mustacchi 	}, {
436d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
437d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
438d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
439d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_strprop_mktable_badstr,
440d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
441d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_strprop_verify_badstr,
442d53cdfabSRobert Mustacchi 	    .st_desc = "string property - bad string"
443d53cdfabSRobert Mustacchi 	}, {
444d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
445d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
446d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
447d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_fwinfo_mktable_invlen_base,
448d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
449d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_fwinfo_verify_invlen_base,
450d53cdfabSRobert Mustacchi 	    .st_desc = "firmware inventory - bad base length"
451d53cdfabSRobert Mustacchi 	}, {
452d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
453d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
454d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
455d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_fwinfo_mktable_invlen_comps,
456d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
457d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_fwinfo_verify_invlen_comps,
458d53cdfabSRobert Mustacchi 	    .st_desc = "firmware inventory - bad comp length"
459d53cdfabSRobert Mustacchi 	}, {
460d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
461d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
462d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
463d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_memdevice_mktable_32,
464d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
465d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_fwinfo_verify_badtype,
466d53cdfabSRobert Mustacchi 	    .st_desc = "firmware inventory - bad type"
467d53cdfabSRobert Mustacchi 	}, {
468d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
469d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
470d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
471d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_fwinfo_mktable_nocomps,
472d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
473d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_fwinfo_verify_nocomps,
474d53cdfabSRobert Mustacchi 	    .st_desc = "firmware inventory - no components"
475d53cdfabSRobert Mustacchi 	}, {
476d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
477d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
478d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
479d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_fwinfo_mktable_comps,
480d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
481d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_fwinfo_verify_comps,
482d53cdfabSRobert Mustacchi 	    .st_desc = "firmware inventory - components"
483d53cdfabSRobert Mustacchi 	}, {
484d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
485d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION_24,
486d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
487d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_invlen_base,
488d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
489d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_invlen,
490d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - bad length (2.4 table)"
491d53cdfabSRobert Mustacchi 	}, {
492d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
493d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
494d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
495d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_invlen_base,
496d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
497d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_invlen,
498d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - bad length (latest version)"
499d53cdfabSRobert Mustacchi 	}, {
500d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
501d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
502d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
503d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_base,
504d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
505d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_invlen,
506d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - bad length, expect sku"
507d53cdfabSRobert Mustacchi 	}, {
508d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
509d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION_24,
510d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
511d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_base,
512d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
513d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_base,
514d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - basic 2.4 version"
515d53cdfabSRobert Mustacchi 	}, {
516d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
517d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
518d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
519d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_sku_nocomps,
520d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
521d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_sku_nocomps,
522d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - sku, but no components"
523d53cdfabSRobert Mustacchi 	}, {
524d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
525d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION_24,
526d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
527d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_comps,
528d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
529d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_comps,
530d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - 2.4 version with comps"
531d53cdfabSRobert Mustacchi 	}, {
532d53cdfabSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
533d53cdfabSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
534d53cdfabSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
535d53cdfabSRobert Mustacchi 	    .st_mktable = smbios_test_chassis_mktable_sku_nocomps,
536d53cdfabSRobert Mustacchi 	    .st_canopen = B_TRUE,
537d53cdfabSRobert Mustacchi 	    .st_verify = smbios_test_chassis_verify_sku_nocomps,
538d53cdfabSRobert Mustacchi 	    .st_desc = "chassis - sku + comps"
5391d1fc316SRobert Mustacchi 	}, {
5401d1fc316SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
5411d1fc316SRobert Mustacchi 	    .st_tvers = SMB_VERSION_25,
5421d1fc316SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
5431d1fc316SRobert Mustacchi 	    .st_mktable = smbios_test_proc_mktable_25,
5441d1fc316SRobert Mustacchi 	    .st_canopen = B_TRUE,
5451d1fc316SRobert Mustacchi 	    .st_verify = smbios_test_proc_verify_25,
5461d1fc316SRobert Mustacchi 	    .st_desc = "SMBIOS 2.5 processor"
5471d1fc316SRobert Mustacchi 	}, {
5481d1fc316SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
5491d1fc316SRobert Mustacchi 	    .st_tvers = SMB_VERSION_36,
5501d1fc316SRobert Mustacchi 	    .st_libvers = SMB_VERSION,
5511d1fc316SRobert Mustacchi 	    .st_mktable = smbios_test_proc_mktable_36,
5521d1fc316SRobert Mustacchi 	    .st_canopen = B_TRUE,
5531d1fc316SRobert Mustacchi 	    .st_verify = smbios_test_proc_verify_36,
5541d1fc316SRobert Mustacchi 	    .st_desc = "SMBIOS 3.6 processor"
5551d1fc316SRobert Mustacchi 	}, {
5561d1fc316SRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
5571d1fc316SRobert Mustacchi 	    .st_tvers = SMB_VERSION_36,
5581d1fc316SRobert Mustacchi 	    .st_libvers = SMB_VERSION_25,
5591d1fc316SRobert Mustacchi 	    .st_mktable = smbios_test_proc_mktable_36,
5601d1fc316SRobert Mustacchi 	    .st_canopen = B_TRUE,
5611d1fc316SRobert Mustacchi 	    .st_verify = smbios_test_proc_verify_36_25,
5621d1fc316SRobert Mustacchi 	    .st_desc = "SMBIOS 3.6 processor, 2.5 client"
563679a141eSToomas Soome 	}, {
564679a141eSToomas Soome 	    .st_entry = SMBIOS_ENTRY_POINT_30,
565679a141eSToomas Soome 	    .st_tvers = SMB_VERSION,
566679a141eSToomas Soome 	    .st_libvers = SMB_VERSION,
567679a141eSToomas Soome 	    .st_mktable = smbios_test_extmem_mktable_cs,
568679a141eSToomas Soome 	    .st_canopen = B_TRUE,
569679a141eSToomas Soome 	    .st_verify = smbios_test_extmem_verify_cs,
570679a141eSToomas Soome 	    .st_desc = "SMBIOS Sun extended memory device with cs"
571679a141eSToomas Soome 	}, {
572679a141eSToomas Soome 	    .st_entry = SMBIOS_ENTRY_POINT_30,
573679a141eSToomas Soome 	    .st_tvers = SMB_VERSION,
574679a141eSToomas Soome 	    .st_libvers = SMB_VERSION,
575679a141eSToomas Soome 	    .st_mktable = smbios_test_extmem_mktable_nocs,
576679a141eSToomas Soome 	    .st_canopen = B_TRUE,
577679a141eSToomas Soome 	    .st_verify = smbios_test_extmem_verify_nocs,
578679a141eSToomas Soome 	    .st_desc = "SMBIOS Sun extended memory device with no cs"
579679a141eSToomas Soome 	}, {
580679a141eSToomas Soome 	    .st_entry = SMBIOS_ENTRY_POINT_30,
581679a141eSToomas Soome 	    .st_tvers = SMB_VERSION,
582679a141eSToomas Soome 	    .st_libvers = SMB_VERSION,
583679a141eSToomas Soome 	    .st_mktable = smbios_test_extmem_mktable_invlen_cs,
584679a141eSToomas Soome 	    .st_canopen = B_TRUE,
585679a141eSToomas Soome 	    .st_verify = smbios_test_extmem_verify_invlen_cs,
586679a141eSToomas Soome 	    .st_desc = "SMBIOS Sun extended memory device invalid cs length"
587*064d431aSRobert Mustacchi 	},
588*064d431aSRobert Mustacchi {
589*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
590*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
591*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
592*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_noent,
593*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
594*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_noent,
595*064d431aSRobert Mustacchi 	    .st_desc = "additional information - no entries"
596*064d431aSRobert Mustacchi 	}, {
597*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
598*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
599*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
600*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_ents,
601*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
602*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_ents,
603*064d431aSRobert Mustacchi 	    .st_desc = "additional information - multiple entries"
604*064d431aSRobert Mustacchi 	}, {
605*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
606*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
607*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
608*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_invlen_base,
609*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
610*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_invlen_base,
611*064d431aSRobert Mustacchi 	    .st_desc = "additional information - invalid length: base"
612*064d431aSRobert Mustacchi 	}, {
613*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
614*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
615*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
616*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_invlen_ent,
617*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
618*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_invlen_ent,
619*064d431aSRobert Mustacchi 	    .st_desc = "additional information - invalid length: base entry"
620*064d431aSRobert Mustacchi 	}, {
621*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
622*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
623*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
624*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_invlen_multient,
625*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
626*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_invlen_multient,
627*064d431aSRobert Mustacchi 	    .st_desc = "additional information - invalid length: multiple "
628*064d431aSRobert Mustacchi 		"entries"
629*064d431aSRobert Mustacchi 	}, {
630*064d431aSRobert Mustacchi 	    .st_entry = SMBIOS_ENTRY_POINT_30,
631*064d431aSRobert Mustacchi 	    .st_tvers = SMB_VERSION,
632*064d431aSRobert Mustacchi 	    .st_libvers = SMB_VERSION,
633*064d431aSRobert Mustacchi 	    .st_mktable = smbios_test_addinfo_mktable_invlen_entdata,
634*064d431aSRobert Mustacchi 	    .st_canopen = B_TRUE,
635*064d431aSRobert Mustacchi 	    .st_verify = smbios_test_addinfo_verify_invlen_entdata,
636*064d431aSRobert Mustacchi 	    .st_desc = "additional information - invalid length: entry data"
637d53cdfabSRobert Mustacchi 	}
638*064d431aSRobert Mustacchi /* XXX Missing an addinfo ent call with the wrong type to verify */
639176a9270SRobert Mustacchi };
640176a9270SRobert Mustacchi 
641176a9270SRobert Mustacchi static boolean_t
smbios_test_run_one(const smbios_test_t * test)642176a9270SRobert Mustacchi smbios_test_run_one(const smbios_test_t *test)
6431566bc34SRobert Mustacchi {
644176a9270SRobert Mustacchi 	smbios_test_table_t *table = NULL;
645176a9270SRobert Mustacchi 	smbios_hdl_t *hdl = NULL;
646176a9270SRobert Mustacchi 	void *buf;
647176a9270SRobert Mustacchi 	size_t len;
648176a9270SRobert Mustacchi 	smbios_entry_t *entry;
649176a9270SRobert Mustacchi 	int err = 0;
650176a9270SRobert Mustacchi 	boolean_t ret = B_FALSE;
6511566bc34SRobert Mustacchi 
652176a9270SRobert Mustacchi 	table = smbios_test_table_init(test->st_entry, test->st_tvers);
653176a9270SRobert Mustacchi 	if (!test->st_mktable(table)) {
654176a9270SRobert Mustacchi 		goto out;
6551566bc34SRobert Mustacchi 	}
6561566bc34SRobert Mustacchi 
657176a9270SRobert Mustacchi 	smbios_test_table_snapshot(table, &entry, &buf, &len);
658176a9270SRobert Mustacchi 	hdl = smbios_bufopen(entry, buf, len, test->st_libvers, SMB_FL_DEBUG,
659176a9270SRobert Mustacchi 	    &err);
660176a9270SRobert Mustacchi 	if (test->st_canopen) {
661176a9270SRobert Mustacchi 		if (hdl == NULL) {
662176a9270SRobert Mustacchi 			warnx("failed to create table for test %s: %s",
663176a9270SRobert Mustacchi 			    test->st_desc, smbios_errmsg(err));
664176a9270SRobert Mustacchi 			goto out;
665176a9270SRobert Mustacchi 		}
666176a9270SRobert Mustacchi 	} else {
667176a9270SRobert Mustacchi 		if (hdl != NULL) {
668176a9270SRobert Mustacchi 			warnx("accidentally created table for test %s, "
669176a9270SRobert Mustacchi 			    "expected failure", test->st_desc);
670176a9270SRobert Mustacchi 		} else {
671176a9270SRobert Mustacchi 			ret = B_TRUE;
672176a9270SRobert Mustacchi 		}
673176a9270SRobert Mustacchi 		goto out;
6741566bc34SRobert Mustacchi 	}
6751566bc34SRobert Mustacchi 
676176a9270SRobert Mustacchi 	if (test->st_verify(hdl)) {
677176a9270SRobert Mustacchi 		ret = B_TRUE;
6781566bc34SRobert Mustacchi 	}
6791566bc34SRobert Mustacchi 
680d53cdfabSRobert Mustacchi 	if (hdl != NULL && test_dirfd > -1) {
681d53cdfabSRobert Mustacchi 		int fd;
682d53cdfabSRobert Mustacchi 		char fname[PATH_MAX];
683d53cdfabSRobert Mustacchi 
684d53cdfabSRobert Mustacchi 		(void) snprintf(fname, sizeof (fname), "%s.smbios",
685d53cdfabSRobert Mustacchi 		    test->st_desc);
686d53cdfabSRobert Mustacchi 		fd = openat(test_dirfd, fname, O_RDWR | O_CREAT, 0644);
687d53cdfabSRobert Mustacchi 		if (fd < 0) {
688d53cdfabSRobert Mustacchi 			warn("failed to dump test %s, failed to open output "
689d53cdfabSRobert Mustacchi 			    "file", test->st_desc);
690d53cdfabSRobert Mustacchi 		} else {
691d53cdfabSRobert Mustacchi 			if (smbios_write(hdl, fd) != 0) {
692d53cdfabSRobert Mustacchi 				warnx("failed to dump test %s: %s",
693d53cdfabSRobert Mustacchi 				    test->st_desc,
694d53cdfabSRobert Mustacchi 				    smbios_errmsg(smbios_errno(hdl)));
695d53cdfabSRobert Mustacchi 			} else {
696d53cdfabSRobert Mustacchi 				(void) close(fd);
697d53cdfabSRobert Mustacchi 			}
698d53cdfabSRobert Mustacchi 		}
699d53cdfabSRobert Mustacchi 	}
700176a9270SRobert Mustacchi out:
701176a9270SRobert Mustacchi 	if (hdl != NULL) {
702176a9270SRobert Mustacchi 		smbios_close(hdl);
7031566bc34SRobert Mustacchi 	}
7041566bc34SRobert Mustacchi 
705176a9270SRobert Mustacchi 	if (table != NULL) {
706176a9270SRobert Mustacchi 		smbios_test_table_fini(table);
7071566bc34SRobert Mustacchi 	}
7081566bc34SRobert Mustacchi 
709176a9270SRobert Mustacchi 	if (ret) {
710176a9270SRobert Mustacchi 		(void) printf("TEST PASSED: %s\n", test->st_desc);
711176a9270SRobert Mustacchi 	} else {
712176a9270SRobert Mustacchi 		(void) printf("TEST FAILED: %s\n", test->st_desc);
7131566bc34SRobert Mustacchi 	}
7141566bc34SRobert Mustacchi 
715176a9270SRobert Mustacchi 	return (ret);
7161566bc34SRobert Mustacchi }
7171566bc34SRobert Mustacchi 
7181566bc34SRobert Mustacchi int
main(int argc,char * argv[])719d53cdfabSRobert Mustacchi main(int argc, char *argv[])
7201566bc34SRobert Mustacchi {
721d53cdfabSRobert Mustacchi 	int ret = 0, c;
722176a9270SRobert Mustacchi 	size_t i;
723d53cdfabSRobert Mustacchi 	const char *outdir = NULL;
724d53cdfabSRobert Mustacchi 
725d53cdfabSRobert Mustacchi 	while ((c = getopt(argc, argv, ":d:")) != -1) {
726d53cdfabSRobert Mustacchi 		switch (c) {
727d53cdfabSRobert Mustacchi 		case 'd':
728d53cdfabSRobert Mustacchi 			outdir = optarg;
729d53cdfabSRobert Mustacchi 			break;
730d53cdfabSRobert Mustacchi 		case '?':
731d53cdfabSRobert Mustacchi 			errx(EXIT_FAILURE, "unknown option: -%c", optopt);
732d53cdfabSRobert Mustacchi 		case ':':
733d53cdfabSRobert Mustacchi 			errx(EXIT_FAILURE, "-%c requires an operand", optopt);
734d53cdfabSRobert Mustacchi 		}
735d53cdfabSRobert Mustacchi 	}
736d53cdfabSRobert Mustacchi 
737d53cdfabSRobert Mustacchi 	if (outdir != NULL) {
738d53cdfabSRobert Mustacchi 		if ((test_dirfd = open(outdir, O_RDONLY)) < 0) {
739d53cdfabSRobert Mustacchi 			err(EXIT_FAILURE, "failed to open %s", outdir);
740d53cdfabSRobert Mustacchi 		}
741d53cdfabSRobert Mustacchi 	}
7421566bc34SRobert Mustacchi 
743176a9270SRobert Mustacchi 	for (i = 0; i < ARRAY_SIZE(smbios_tests); i++) {
744176a9270SRobert Mustacchi 		if (!smbios_test_run_one(&smbios_tests[i])) {
745d53cdfabSRobert Mustacchi 			ret = 1;
746176a9270SRobert Mustacchi 		}
7471566bc34SRobert Mustacchi 	}
7481566bc34SRobert Mustacchi 
749d53cdfabSRobert Mustacchi 	if (ret == 0) {
750d53cdfabSRobert Mustacchi 		(void) printf("All tests passed successfully\n");
751d53cdfabSRobert Mustacchi 	}
752d53cdfabSRobert Mustacchi 
753d53cdfabSRobert Mustacchi 	return (ret);
7541566bc34SRobert Mustacchi }
755