xref: /titanic_51/usr/src/test/util-tests/tests/smbios/smbios.c (revision 174bc6499d233e329ecd3d98a880a7b07df16bfa)
1*174bc649SRobert Mustacchi /*
2*174bc649SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*174bc649SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*174bc649SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*174bc649SRobert Mustacchi  * 1.0 of the CDDL.
6*174bc649SRobert Mustacchi  *
7*174bc649SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*174bc649SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*174bc649SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*174bc649SRobert Mustacchi  */
11*174bc649SRobert Mustacchi 
12*174bc649SRobert Mustacchi /*
13*174bc649SRobert Mustacchi  * Copyright (c) 2018, Joyent, Inc.
14*174bc649SRobert Mustacchi  */
15*174bc649SRobert Mustacchi 
16*174bc649SRobert Mustacchi /*
17*174bc649SRobert Mustacchi  * Primordial SMBIOS test suite. At the moment, the purpose of this is just to
18*174bc649SRobert Mustacchi  * test the recent SMBIOS 3.2 additions specific to the variable length slots.
19*174bc649SRobert Mustacchi  * This should be evolved into a much fuller test suite.
20*174bc649SRobert Mustacchi  */
21*174bc649SRobert Mustacchi 
22*174bc649SRobert Mustacchi #include <smbios.h>
23*174bc649SRobert Mustacchi #include <umem.h>
24*174bc649SRobert Mustacchi #include <stdint.h>
25*174bc649SRobert Mustacchi #include <endian.h>
26*174bc649SRobert Mustacchi #include <stdio.h>
27*174bc649SRobert Mustacchi #include <err.h>
28*174bc649SRobert Mustacchi 
29*174bc649SRobert Mustacchi #include <sys/smbios.h>
30*174bc649SRobert Mustacchi #include <sys/smbios_impl.h>
31*174bc649SRobert Mustacchi 
32*174bc649SRobert Mustacchi static const char *smbios_test_name = "The One Slot";
33*174bc649SRobert Mustacchi 
34*174bc649SRobert Mustacchi /*
35*174bc649SRobert Mustacchi  * Number of bytes we allocate at a given time for an SMBIOS table.
36*174bc649SRobert Mustacchi  */
37*174bc649SRobert Mustacchi #define	SMBIOS_TEST_ALLOC_SIZE	1024
38*174bc649SRobert Mustacchi 
39*174bc649SRobert Mustacchi typedef struct smbios_test_table {
40*174bc649SRobert Mustacchi 	smbios_entry_point_t	stt_type;
41*174bc649SRobert Mustacchi 	void			*stt_data;
42*174bc649SRobert Mustacchi 	size_t			stt_buflen;
43*174bc649SRobert Mustacchi 	size_t			stt_offset;
44*174bc649SRobert Mustacchi 	uint_t			stt_nents;
45*174bc649SRobert Mustacchi 	uint_t			stt_version;
46*174bc649SRobert Mustacchi 	uint_t			stt_nextid;
47*174bc649SRobert Mustacchi 	smbios_entry_t		stt_entry;
48*174bc649SRobert Mustacchi } smbios_test_table_t;
49*174bc649SRobert Mustacchi 
50*174bc649SRobert Mustacchi const char *
51*174bc649SRobert Mustacchi _umem_debug_init(void)
52*174bc649SRobert Mustacchi {
53*174bc649SRobert Mustacchi 	return ("default,verbose");
54*174bc649SRobert Mustacchi }
55*174bc649SRobert Mustacchi 
56*174bc649SRobert Mustacchi const char *
57*174bc649SRobert Mustacchi _umem_logging_init(void)
58*174bc649SRobert Mustacchi {
59*174bc649SRobert Mustacchi 	return ("fail,contents");
60*174bc649SRobert Mustacchi }
61*174bc649SRobert Mustacchi 
62*174bc649SRobert Mustacchi static smbios_test_table_t *
63*174bc649SRobert Mustacchi smbios_test_table_init(smbios_entry_point_t type, uint_t version)
64*174bc649SRobert Mustacchi {
65*174bc649SRobert Mustacchi 	smbios_test_table_t *table;
66*174bc649SRobert Mustacchi 
67*174bc649SRobert Mustacchi 	if (type != SMBIOS_ENTRY_POINT_30) {
68*174bc649SRobert Mustacchi 		abort();
69*174bc649SRobert Mustacchi 	}
70*174bc649SRobert Mustacchi 
71*174bc649SRobert Mustacchi 	table = umem_zalloc(sizeof (smbios_test_table_t), UMEM_DEFAULT);
72*174bc649SRobert Mustacchi 	if (table == NULL) {
73*174bc649SRobert Mustacchi 		return (NULL);
74*174bc649SRobert Mustacchi 	}
75*174bc649SRobert Mustacchi 
76*174bc649SRobert Mustacchi 	table->stt_data = umem_zalloc(SMBIOS_TEST_ALLOC_SIZE, UMEM_DEFAULT);
77*174bc649SRobert Mustacchi 	if (table->stt_data == NULL) {
78*174bc649SRobert Mustacchi 		umem_free(table, sizeof (smbios_test_table_t));
79*174bc649SRobert Mustacchi 		return (NULL);
80*174bc649SRobert Mustacchi 	}
81*174bc649SRobert Mustacchi 	table->stt_buflen = SMBIOS_TEST_ALLOC_SIZE;
82*174bc649SRobert Mustacchi 	table->stt_type = type;
83*174bc649SRobert Mustacchi 	table->stt_version = version;
84*174bc649SRobert Mustacchi 	table->stt_nextid = 1;
85*174bc649SRobert Mustacchi 
86*174bc649SRobert Mustacchi 	return (table);
87*174bc649SRobert Mustacchi }
88*174bc649SRobert Mustacchi 
89*174bc649SRobert Mustacchi static void *
90*174bc649SRobert Mustacchi smbios_test_table_append_common(smbios_test_table_t *table, const void *buf,
91*174bc649SRobert Mustacchi     size_t len)
92*174bc649SRobert Mustacchi {
93*174bc649SRobert Mustacchi 	void *start;
94*174bc649SRobert Mustacchi 
95*174bc649SRobert Mustacchi 	if (SIZE_MAX - table->stt_offset < len)
96*174bc649SRobert Mustacchi 		abort();
97*174bc649SRobert Mustacchi 
98*174bc649SRobert Mustacchi 	if (len + table->stt_offset >= table->stt_buflen) {
99*174bc649SRobert Mustacchi 		void *newbuf;
100*174bc649SRobert Mustacchi 		size_t newlen = table->stt_buflen + SMBIOS_TEST_ALLOC_SIZE;
101*174bc649SRobert Mustacchi 
102*174bc649SRobert Mustacchi 		while (len + table->stt_offset >= newlen) {
103*174bc649SRobert Mustacchi 			newlen += SMBIOS_TEST_ALLOC_SIZE;
104*174bc649SRobert Mustacchi 		}
105*174bc649SRobert Mustacchi 
106*174bc649SRobert Mustacchi 		newbuf = umem_zalloc(newlen, UMEM_DEFAULT);
107*174bc649SRobert Mustacchi 		if (newbuf == NULL) {
108*174bc649SRobert Mustacchi 			err(EXIT_FAILURE, "failed to umem_zalloc for %lu bytes",
109*174bc649SRobert Mustacchi 			    newlen);
110*174bc649SRobert Mustacchi 		}
111*174bc649SRobert Mustacchi 
112*174bc649SRobert Mustacchi 		(void) memcpy(newbuf, table->stt_data, table->stt_buflen);
113*174bc649SRobert Mustacchi 		umem_free(table->stt_data, table->stt_buflen);
114*174bc649SRobert Mustacchi 		table->stt_data = newbuf;
115*174bc649SRobert Mustacchi 		table->stt_buflen = newlen;
116*174bc649SRobert Mustacchi 	}
117*174bc649SRobert Mustacchi 
118*174bc649SRobert Mustacchi 	start = (void *)((uintptr_t)table->stt_data + table->stt_offset);
119*174bc649SRobert Mustacchi 	(void) memcpy(start, buf, len);
120*174bc649SRobert Mustacchi 	table->stt_offset += len;
121*174bc649SRobert Mustacchi 
122*174bc649SRobert Mustacchi 	return (start);
123*174bc649SRobert Mustacchi }
124*174bc649SRobert Mustacchi 
125*174bc649SRobert Mustacchi static void
126*174bc649SRobert Mustacchi smbios_test_table_append_raw(smbios_test_table_t *table, const void *buf,
127*174bc649SRobert Mustacchi     size_t len)
128*174bc649SRobert Mustacchi {
129*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_common(table, buf, len);
130*174bc649SRobert Mustacchi }
131*174bc649SRobert Mustacchi 
132*174bc649SRobert Mustacchi static void
133*174bc649SRobert Mustacchi smbios_test_table_append_string(smbios_test_table_t *table, const char *str)
134*174bc649SRobert Mustacchi {
135*174bc649SRobert Mustacchi 	size_t len = strlen(str) + 1;
136*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_common(table, str, len);
137*174bc649SRobert Mustacchi }
138*174bc649SRobert Mustacchi 
139*174bc649SRobert Mustacchi static uint16_t
140*174bc649SRobert Mustacchi smbios_test_table_append(smbios_test_table_t *table, const void *buf,
141*174bc649SRobert Mustacchi     size_t len)
142*174bc649SRobert Mustacchi {
143*174bc649SRobert Mustacchi 	smb_header_t *hdr;
144*174bc649SRobert Mustacchi 	uint16_t id;
145*174bc649SRobert Mustacchi 
146*174bc649SRobert Mustacchi 	hdr = smbios_test_table_append_common(table, buf, len);
147*174bc649SRobert Mustacchi 	table->stt_nents++;
148*174bc649SRobert Mustacchi 
149*174bc649SRobert Mustacchi 	id = table->stt_nextid;
150*174bc649SRobert Mustacchi 	hdr->smbh_hdl = htole16(table->stt_nextid);
151*174bc649SRobert Mustacchi 	table->stt_nextid++;
152*174bc649SRobert Mustacchi 
153*174bc649SRobert Mustacchi 	return (id);
154*174bc649SRobert Mustacchi }
155*174bc649SRobert Mustacchi 
156*174bc649SRobert Mustacchi static uint8_t
157*174bc649SRobert Mustacchi smbios_test_table_checksum(const uint8_t *buf, size_t len)
158*174bc649SRobert Mustacchi {
159*174bc649SRobert Mustacchi 	uint8_t sum;
160*174bc649SRobert Mustacchi 	size_t i;
161*174bc649SRobert Mustacchi 
162*174bc649SRobert Mustacchi 	for (i = 0, sum = 0; i < len; i++) {
163*174bc649SRobert Mustacchi 		sum += buf[i];
164*174bc649SRobert Mustacchi 	}
165*174bc649SRobert Mustacchi 
166*174bc649SRobert Mustacchi 	if (sum == 0)
167*174bc649SRobert Mustacchi 		return (0);
168*174bc649SRobert Mustacchi 
169*174bc649SRobert Mustacchi 	return ((uint8_t)(0x100 - sum));
170*174bc649SRobert Mustacchi }
171*174bc649SRobert Mustacchi 
172*174bc649SRobert Mustacchi static void
173*174bc649SRobert Mustacchi smbios_test_table_snapshot(smbios_test_table_t *table, smbios_entry_t **entryp,
174*174bc649SRobert Mustacchi     void **bufp, size_t *lenp)
175*174bc649SRobert Mustacchi {
176*174bc649SRobert Mustacchi 	smbios_30_entry_t *ent30;
177*174bc649SRobert Mustacchi 
178*174bc649SRobert Mustacchi 	switch (table->stt_type) {
179*174bc649SRobert Mustacchi 	case SMBIOS_ENTRY_POINT_30:
180*174bc649SRobert Mustacchi 		ent30 = &table->stt_entry.ep30;
181*174bc649SRobert Mustacchi 
182*174bc649SRobert Mustacchi 		(void) memcpy(ent30->smbe_eanchor, SMB3_ENTRY_EANCHOR,
183*174bc649SRobert Mustacchi 		    sizeof (ent30->smbe_eanchor));
184*174bc649SRobert Mustacchi 		ent30->smbe_ecksum = 0;
185*174bc649SRobert Mustacchi 		ent30->smbe_elen = sizeof (*ent30);
186*174bc649SRobert Mustacchi 		ent30->smbe_major = (table->stt_version >> 8) & 0xff;
187*174bc649SRobert Mustacchi 		ent30->smbe_minor = table->stt_version & 0xff;
188*174bc649SRobert Mustacchi 		ent30->smbe_docrev = 0;
189*174bc649SRobert Mustacchi 		ent30->smbe_revision = 1;
190*174bc649SRobert Mustacchi 		ent30->smbe_reserved = 0;
191*174bc649SRobert Mustacchi 		ent30->smbe_stlen = htole32(table->stt_offset);
192*174bc649SRobert Mustacchi 		ent30->smbe_staddr = htole64(P2ROUNDUP(sizeof (*ent30), 16));
193*174bc649SRobert Mustacchi 
194*174bc649SRobert Mustacchi 		ent30->smbe_ecksum = smbios_test_table_checksum((void *)ent30,
195*174bc649SRobert Mustacchi 		    sizeof (*ent30));
196*174bc649SRobert Mustacchi 		break;
197*174bc649SRobert Mustacchi 	default:
198*174bc649SRobert Mustacchi 		abort();
199*174bc649SRobert Mustacchi 	}
200*174bc649SRobert Mustacchi 
201*174bc649SRobert Mustacchi 	*entryp = &table->stt_entry;
202*174bc649SRobert Mustacchi 	*bufp = table->stt_data;
203*174bc649SRobert Mustacchi 	*lenp = table->stt_offset;
204*174bc649SRobert Mustacchi }
205*174bc649SRobert Mustacchi 
206*174bc649SRobert Mustacchi static void
207*174bc649SRobert Mustacchi smbios_test_table_fini(smbios_test_table_t *table)
208*174bc649SRobert Mustacchi {
209*174bc649SRobert Mustacchi 	if (table == NULL) {
210*174bc649SRobert Mustacchi 		return;
211*174bc649SRobert Mustacchi 	}
212*174bc649SRobert Mustacchi 
213*174bc649SRobert Mustacchi 	if (table->stt_data != NULL) {
214*174bc649SRobert Mustacchi 		umem_free(table->stt_data, table->stt_buflen);
215*174bc649SRobert Mustacchi 	}
216*174bc649SRobert Mustacchi 
217*174bc649SRobert Mustacchi 	umem_free(table, sizeof (smbios_test_table_t));
218*174bc649SRobert Mustacchi }
219*174bc649SRobert Mustacchi 
220*174bc649SRobert Mustacchi static void
221*174bc649SRobert Mustacchi smbios_test_mktable(smbios_test_table_t *table)
222*174bc649SRobert Mustacchi {
223*174bc649SRobert Mustacchi 	smb_slot_t slot;
224*174bc649SRobert Mustacchi 	smb_slot_peer_t peers[2];
225*174bc649SRobert Mustacchi 	smb_header_t eot;
226*174bc649SRobert Mustacchi 	uint8_t endstring = 0;
227*174bc649SRobert Mustacchi 
228*174bc649SRobert Mustacchi 	slot.smbsl_hdr.smbh_type = SMB_TYPE_SLOT;
229*174bc649SRobert Mustacchi 	slot.smbsl_hdr.smbh_len = sizeof (smb_slot_t) + sizeof (peers);
230*174bc649SRobert Mustacchi 
231*174bc649SRobert Mustacchi 	slot.smbsl_name = 1;
232*174bc649SRobert Mustacchi 	slot.smbsl_type = SMB_SLT_PCIE3G16;
233*174bc649SRobert Mustacchi 	slot.smbsl_width = SMB_SLW_16X;
234*174bc649SRobert Mustacchi 	slot.smbsl_length = SMB_SLL_SHORT;
235*174bc649SRobert Mustacchi 	slot.smbsl_id = htole16(1);
236*174bc649SRobert Mustacchi 	slot.smbsl_ch1 = SMB_SLCH1_33V;
237*174bc649SRobert Mustacchi 	slot.smbsl_ch2 = SMB_SLCH2_PME;
238*174bc649SRobert Mustacchi 	slot.smbsl_sg = htole16(1);
239*174bc649SRobert Mustacchi 	slot.smbsl_bus = 0x42;
240*174bc649SRobert Mustacchi 	slot.smbsl_df = 0x23;
241*174bc649SRobert Mustacchi 	slot.smbsl_dbw = SMB_SLW_16X;
242*174bc649SRobert Mustacchi 	slot.smbsl_npeers = 2;
243*174bc649SRobert Mustacchi 	peers[0].smbspb_group_no = htole16(1);
244*174bc649SRobert Mustacchi 	peers[0].smbspb_bus = 0x42;
245*174bc649SRobert Mustacchi 	peers[0].smbspb_df = 0x42;
246*174bc649SRobert Mustacchi 	peers[0].smbspb_width = SMB_SLW_8X;
247*174bc649SRobert Mustacchi 
248*174bc649SRobert Mustacchi 	peers[1].smbspb_group_no = htole16(1);
249*174bc649SRobert Mustacchi 	peers[1].smbspb_bus = 0x23;
250*174bc649SRobert Mustacchi 	peers[1].smbspb_df = 0x31;
251*174bc649SRobert Mustacchi 	peers[1].smbspb_width = SMB_SLW_8X;
252*174bc649SRobert Mustacchi 
253*174bc649SRobert Mustacchi 	(void) smbios_test_table_append(table, &slot, sizeof (slot));
254*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, peers, sizeof (peers));
255*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_string(table, smbios_test_name);
256*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, &endstring,
257*174bc649SRobert Mustacchi 	    sizeof (endstring));
258*174bc649SRobert Mustacchi 
259*174bc649SRobert Mustacchi 	bzero(&eot, sizeof (eot));
260*174bc649SRobert Mustacchi 	eot.smbh_type = SMB_TYPE_EOT;
261*174bc649SRobert Mustacchi 	eot.smbh_len = 4;
262*174bc649SRobert Mustacchi 	(void) smbios_test_table_append(table, &eot, sizeof (eot));
263*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, &endstring,
264*174bc649SRobert Mustacchi 	    sizeof (endstring));
265*174bc649SRobert Mustacchi 	(void) smbios_test_table_append_raw(table, &endstring,
266*174bc649SRobert Mustacchi 	    sizeof (endstring));
267*174bc649SRobert Mustacchi }
268*174bc649SRobert Mustacchi 
269*174bc649SRobert Mustacchi static void
270*174bc649SRobert Mustacchi smbios_test_verify_table(smbios_hdl_t *hdl)
271*174bc649SRobert Mustacchi {
272*174bc649SRobert Mustacchi 	smbios_struct_t sp;
273*174bc649SRobert Mustacchi 	smbios_slot_t slot;
274*174bc649SRobert Mustacchi 	uint_t npeers;
275*174bc649SRobert Mustacchi 	smbios_slot_peer_t *peers;
276*174bc649SRobert Mustacchi 	uint_t errs = 0;
277*174bc649SRobert Mustacchi 
278*174bc649SRobert Mustacchi 	if (smbios_lookup_type(hdl, SMB_TYPE_SLOT, &sp) == -1) {
279*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "failed to lookup SMBIOS slot: %s",
280*174bc649SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
281*174bc649SRobert Mustacchi 	}
282*174bc649SRobert Mustacchi 
283*174bc649SRobert Mustacchi 	if (smbios_info_slot(hdl, sp.smbstr_id, &slot) != 0) {
284*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "failed to get SMBIOS slot info: %s",
285*174bc649SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
286*174bc649SRobert Mustacchi 	}
287*174bc649SRobert Mustacchi 
288*174bc649SRobert Mustacchi 	/*
289*174bc649SRobert Mustacchi 	 * Verify everything we'd expect about the slot.
290*174bc649SRobert Mustacchi 	 */
291*174bc649SRobert Mustacchi 	if (strcmp(slot.smbl_name, smbios_test_name) != 0) {
292*174bc649SRobert Mustacchi 		warnx("slot name mismatch, expected %s, found %s",
293*174bc649SRobert Mustacchi 		    smbios_test_name, slot.smbl_name);
294*174bc649SRobert Mustacchi 		errs++;
295*174bc649SRobert Mustacchi 	}
296*174bc649SRobert Mustacchi 
297*174bc649SRobert Mustacchi 	if (slot.smbl_type != SMB_SLT_PCIE3G16) {
298*174bc649SRobert Mustacchi 		warnx("incorrect slot type, found %u", slot.smbl_type);
299*174bc649SRobert Mustacchi 		errs++;
300*174bc649SRobert Mustacchi 	}
301*174bc649SRobert Mustacchi 
302*174bc649SRobert Mustacchi 	if (slot.smbl_width != SMB_SLW_16X) {
303*174bc649SRobert Mustacchi 		warnx("incorrect slot width, found %u", slot.smbl_width);
304*174bc649SRobert Mustacchi 		errs++;
305*174bc649SRobert Mustacchi 	}
306*174bc649SRobert Mustacchi 
307*174bc649SRobert Mustacchi 	if (slot.smbl_length != SMB_SLL_SHORT) {
308*174bc649SRobert Mustacchi 		warnx("incorrect slot length, found %u", slot.smbl_length);
309*174bc649SRobert Mustacchi 		errs++;
310*174bc649SRobert Mustacchi 	}
311*174bc649SRobert Mustacchi 
312*174bc649SRobert Mustacchi 	if (slot.smbl_dbw != SMB_SLW_16X) {
313*174bc649SRobert Mustacchi 		warnx("incorrect slot data bus width, found %u", slot.smbl_dbw);
314*174bc649SRobert Mustacchi 		errs++;
315*174bc649SRobert Mustacchi 	}
316*174bc649SRobert Mustacchi 
317*174bc649SRobert Mustacchi 	if (slot.smbl_npeers != 2) {
318*174bc649SRobert Mustacchi 		warnx("incorrect number of slot peers, found %u",
319*174bc649SRobert Mustacchi 		    slot.smbl_npeers);
320*174bc649SRobert Mustacchi 		errs++;
321*174bc649SRobert Mustacchi 	}
322*174bc649SRobert Mustacchi 
323*174bc649SRobert Mustacchi 	if (smbios_info_slot_peers(hdl, sp.smbstr_id, &npeers, &peers) != 0) {
324*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "failed to get SMBIOS peer info: %s",
325*174bc649SRobert Mustacchi 		    smbios_errmsg(smbios_errno(hdl)));
326*174bc649SRobert Mustacchi 	}
327*174bc649SRobert Mustacchi 
328*174bc649SRobert Mustacchi 	if (npeers != 2) {
329*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "got wrong number of slot peers: %u\n",
330*174bc649SRobert Mustacchi 		    npeers);
331*174bc649SRobert Mustacchi 	}
332*174bc649SRobert Mustacchi 
333*174bc649SRobert Mustacchi 	if (peers[0].smblp_group != 1) {
334*174bc649SRobert Mustacchi 		warnx("incorrect group for peer 0: %u", peers[0].smblp_group);
335*174bc649SRobert Mustacchi 		errs++;
336*174bc649SRobert Mustacchi 	}
337*174bc649SRobert Mustacchi 
338*174bc649SRobert Mustacchi 	if (peers[0].smblp_data_width != SMB_SLW_8X) {
339*174bc649SRobert Mustacchi 		warnx("incorrect data width for peer 0: %u",
340*174bc649SRobert Mustacchi 		    peers[0].smblp_data_width);
341*174bc649SRobert Mustacchi 		errs++;
342*174bc649SRobert Mustacchi 	}
343*174bc649SRobert Mustacchi 
344*174bc649SRobert Mustacchi 	if (peers[0].smblp_device != (0x42 >> 3)) {
345*174bc649SRobert Mustacchi 		warnx("incorrect PCI device for peer 0: %u",
346*174bc649SRobert Mustacchi 		    peers[0].smblp_device);
347*174bc649SRobert Mustacchi 		errs++;
348*174bc649SRobert Mustacchi 	}
349*174bc649SRobert Mustacchi 
350*174bc649SRobert Mustacchi 	if (peers[0].smblp_function != (0x42 & 0x7)) {
351*174bc649SRobert Mustacchi 		warnx("incorrect PCI function for peer 0: %u",
352*174bc649SRobert Mustacchi 		    peers[0].smblp_function);
353*174bc649SRobert Mustacchi 		errs++;
354*174bc649SRobert Mustacchi 	}
355*174bc649SRobert Mustacchi 
356*174bc649SRobert Mustacchi 	if (peers[1].smblp_group != 1) {
357*174bc649SRobert Mustacchi 		warnx("incorrect group for peer 1: %u", peers[1].smblp_group);
358*174bc649SRobert Mustacchi 		errs++;
359*174bc649SRobert Mustacchi 	}
360*174bc649SRobert Mustacchi 
361*174bc649SRobert Mustacchi 	if (peers[1].smblp_device != (0x31 >> 3)) {
362*174bc649SRobert Mustacchi 		warnx("incorrect PCI device for peer 1: %u",
363*174bc649SRobert Mustacchi 		    peers[1].smblp_device);
364*174bc649SRobert Mustacchi 		errs++;
365*174bc649SRobert Mustacchi 	}
366*174bc649SRobert Mustacchi 
367*174bc649SRobert Mustacchi 	if (peers[1].smblp_function != (0x31 & 0x7)) {
368*174bc649SRobert Mustacchi 		warnx("incorrect PCI function for peer 1: %u",
369*174bc649SRobert Mustacchi 		    peers[1].smblp_function);
370*174bc649SRobert Mustacchi 		errs++;
371*174bc649SRobert Mustacchi 	}
372*174bc649SRobert Mustacchi 
373*174bc649SRobert Mustacchi 	if (peers[1].smblp_data_width != SMB_SLW_8X) {
374*174bc649SRobert Mustacchi 		warnx("incorrect data width for peer 1: %u",
375*174bc649SRobert Mustacchi 		    peers[1].smblp_data_width);
376*174bc649SRobert Mustacchi 		errs++;
377*174bc649SRobert Mustacchi 	}
378*174bc649SRobert Mustacchi 
379*174bc649SRobert Mustacchi 	smbios_info_slot_peers_free(hdl, npeers, peers);
380*174bc649SRobert Mustacchi 
381*174bc649SRobert Mustacchi 	if (errs > 0) {
382*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "encountered fatal errors");
383*174bc649SRobert Mustacchi 	}
384*174bc649SRobert Mustacchi }
385*174bc649SRobert Mustacchi 
386*174bc649SRobert Mustacchi int
387*174bc649SRobert Mustacchi main(void)
388*174bc649SRobert Mustacchi {
389*174bc649SRobert Mustacchi 	void *buf;
390*174bc649SRobert Mustacchi 	size_t len;
391*174bc649SRobert Mustacchi 	smbios_test_table_t *table;
392*174bc649SRobert Mustacchi 	smbios_entry_t *entry;
393*174bc649SRobert Mustacchi 	smbios_hdl_t *hdl;
394*174bc649SRobert Mustacchi 	int err = 0;
395*174bc649SRobert Mustacchi 
396*174bc649SRobert Mustacchi 	table = smbios_test_table_init(SMBIOS_ENTRY_POINT_30, SMB_VERSION_32);
397*174bc649SRobert Mustacchi 	smbios_test_mktable(table);
398*174bc649SRobert Mustacchi 	smbios_test_table_snapshot(table, &entry, &buf, &len);
399*174bc649SRobert Mustacchi 
400*174bc649SRobert Mustacchi 	hdl = smbios_bufopen(entry, buf, len, SMB_VERSION_32, SMB_FL_DEBUG,
401*174bc649SRobert Mustacchi 	    &err);
402*174bc649SRobert Mustacchi 	if (hdl == NULL) {
403*174bc649SRobert Mustacchi 		errx(EXIT_FAILURE, "failed to create fake smbios table: %s",
404*174bc649SRobert Mustacchi 		    smbios_errmsg(err));
405*174bc649SRobert Mustacchi 	}
406*174bc649SRobert Mustacchi 	smbios_test_verify_table(hdl);
407*174bc649SRobert Mustacchi 	smbios_close(hdl);
408*174bc649SRobert Mustacchi 	smbios_test_table_fini(table);
409*174bc649SRobert Mustacchi 
410*174bc649SRobert Mustacchi 	return (0);
411*174bc649SRobert Mustacchi }
412