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