void display_uuid(void) { struct smbios_type_1 *tbl = smbios_next(SMBiosAddr, NULL); int minlen = offsetof(struct smbios_type_1, uuid) + sizeof(tbl->uuid); for (; tbl; tbl = smbios_next(SMBiosAddr, tbl)) if (tbl->header.type == 1 && tbl->header.length >= minlen) { u8 *uuid = tbl->uuid; u8 empty_uuid[sizeof(tbl->uuid)] = { 0 }; if (memcmp(uuid, empty_uuid, sizeof(empty_uuid)) == 0) return; printf("Machine UUID" " %02x%02x%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x%02x%02x%02x%02x\n" , uuid[ 0], uuid[ 1], uuid[ 2], uuid[ 3] , uuid[ 4], uuid[ 5] , uuid[ 6], uuid[ 7] , uuid[ 8], uuid[ 9] , uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); return; } }
/* * Starting with version 2.1 qemu provides a full set of smbios tables * for the virtual hardware emulated, except type 0 (bios information). * * What we are going to do here is find the type0 table, keep it, and * override everything else generated by coreboot with the qemu smbios * tables. * * It's a bit hackish, but qemu is a special case (compared to real * hardware) and this way we don't need special qemu support in the * generic smbios code. */ unsigned long fw_cfg_smbios_tables(int *handle, unsigned long *current) { struct smbios_type0 *t0; unsigned long start, end; int len, ret, i, count = 1; char *str; len = fw_cfg_check_file("etc/smbios/smbios-tables"); if (len < 0) return 0; printk(BIOS_DEBUG, "QEMU: found smbios tables in fw_cfg (len %d).\n", len); /* * Search backwards for "coreboot" (first string in type0 table, * see src/arch/x86/boot/smbios.c), then find type0 table. */ for (i = 0; i < 16384; i++) { str = (char*)(*current - i); if (strcmp(str, "coreboot") == 0) break; } if (i == 16384) return 0; i += sizeof(struct smbios_type0) - 2; t0 = (struct smbios_type0*)(*current - i); if (t0->type != SMBIOS_BIOS_INFORMATION || t0->handle != 0) return 0; printk(BIOS_DEBUG, "QEMU: coreboot type0 table found at 0x%lx.\n", *current - i); start = smbios_next(*current - i); /* * Fetch smbios tables from qemu, go find the end marker. * We'll exclude the end marker as coreboot will add one. */ printk(BIOS_DEBUG, "QEMU: loading smbios tables to 0x%lx\n", start); fw_cfg_load_file("etc/smbios/smbios-tables", (void*)start); end = start; do { t0 = (struct smbios_type0*)end; if (t0->type == SMBIOS_END_OF_TABLE) break; end = smbios_next(end); count++; } while (end < start + len); /* final fixups. */ ret = end - *current; *current = end; *handle = count; return ret; }
void display_uuid(void) { struct smbios_type_1 *tbl = smbios_next(SMBiosAddr, NULL); int minlen = offsetof(struct smbios_type_1, uuid) + sizeof(tbl->uuid); for (; tbl; tbl = smbios_next(SMBiosAddr, tbl)) if (tbl->header.type == 1 && tbl->header.length >= minlen) { u8 *uuid = tbl->uuid; u8 empty_uuid[sizeof(tbl->uuid)] = { 0 }; if (memcmp(uuid, empty_uuid, sizeof(empty_uuid)) == 0) return; /* * According to SMBIOS v2.6 the first three fields are encoded in * little-endian format. Versions prior to v2.6 did not specify * the encoding, but we follow dmidecode and assume big-endian * encoding. */ if (SMBiosAddr->smbios_major_version > 2 || (SMBiosAddr->smbios_major_version == 2 && SMBiosAddr->smbios_minor_version >= 6)) { printf("Machine UUID" " %02x%02x%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x%02x%02x%02x%02x\n" , uuid[ 3], uuid[ 2], uuid[ 1], uuid[ 0] , uuid[ 5], uuid[ 4] , uuid[ 7], uuid[ 6] , uuid[ 8], uuid[ 9] , uuid[10], uuid[11], uuid[12] , uuid[13], uuid[14], uuid[15]); } else { printf("Machine UUID" " %02x%02x%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x" "-%02x%02x%02x%02x%02x%02x\n" , uuid[ 0], uuid[ 1], uuid[ 2], uuid[ 3] , uuid[ 4], uuid[ 5] , uuid[ 6], uuid[ 7] , uuid[ 8], uuid[ 9] , uuid[10], uuid[11], uuid[12] , uuid[13], uuid[14], uuid[15]); } return; } }
static int smbios_romfile_setup(void) { struct romfile_s *f_anchor = romfile_find("etc/smbios/smbios-anchor"); struct romfile_s *f_tables = romfile_find("etc/smbios/smbios-tables"); struct smbios_entry_point ep; struct smbios_type_0 *t0; u16 qtables_len, need_t0 = 1; u8 *qtables, *tables; if (!f_anchor || !f_tables || f_anchor->size != sizeof(ep)) return 0; f_anchor->copy(f_anchor, &ep, f_anchor->size); if (f_tables->size != ep.structure_table_length) return 0; qtables = malloc_tmphigh(f_tables->size); if (!qtables) { warn_noalloc(); return 0; } f_tables->copy(f_tables, qtables, f_tables->size); ep.structure_table_address = (u32)qtables; /* for smbios_next(), below */ /* did we get a type 0 structure ? */ for (t0 = smbios_next(&ep, NULL); t0; t0 = smbios_next(&ep, t0)) if (t0->header.type == 0) { need_t0 = 0; break; } qtables_len = ep.structure_table_length; if (need_t0) { /* common case: add our own type 0, with 3 strings and 4 '\0's */ u16 t0_len = sizeof(struct smbios_type_0) + strlen(BIOS_NAME) + strlen(VERSION) + strlen(BIOS_DATE) + 4; ep.structure_table_length += t0_len; if (t0_len > ep.max_structure_size) ep.max_structure_size = t0_len; ep.number_of_structures++; } /* allocate final blob and record its address in the entry point */ if (ep.structure_table_length > BUILD_MAX_SMBIOS_FSEG) tables = malloc_high(ep.structure_table_length); else tables = malloc_fseg(ep.structure_table_length); if (!tables) { warn_noalloc(); free(qtables); return 0; } ep.structure_table_address = (u32)tables; /* populate final blob */ if (need_t0) tables = smbios_new_type_0(tables, BIOS_NAME, VERSION, BIOS_DATE); memcpy(tables, qtables, qtables_len); free(qtables); /* finalize entry point */ ep.checksum -= checksum(&ep, 0x10); ep.intermediate_checksum -= checksum((void *)&ep + 0x10, ep.length - 0x10); copy_smbios(&ep); return 1; }