On 12/14/12 12:59, Laszlo Ersek wrote:
There are users who would like to see the UUID at startup, and it probably won't bother others.
Related RHBZ: 876250.
Signed-off-by: Laszlo Ersek lersek@redhat.com
v2->v3:
- moved everything to display_uuid() in smbios.c, called from maininit()
Diff with v2:
diff --git a/src/bootsplash.c b/src/bootsplash.c index a0fea61..78023a5 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -12,7 +12,6 @@ #include "jpeg.h" // splash #include "vbe.h" // struct vbe_info #include "bmp.h" // bmp_alloc -#include "smbios.h" // smbios_locate_uuid
/**************************************************************** @@ -34,24 +33,6 @@ call16_int10(struct bregs *br) * VGA text / graphics console ****************************************************************/
-static void -print_hello(void) -{ - const u8 *uuid; - u8 empty_uuid[16] = { 0 }; - - printf("SeaBIOS (version %s)\n", VERSION); - - uuid = smbios_locate_uuid(SMBiosAddr); - if (uuid != NULL && memcmp(uuid, empty_uuid, sizeof empty_uuid) != 0) { - char uuid_str[37]; - - format_uuid(uuid_str, uuid); - printf("Machine UUID %s\n", uuid_str); - } - printf("\n"); -} - void enable_vga_console(void) { @@ -64,7 +45,7 @@ enable_vga_console(void) call16_int10(&br);
// Write to screen. - print_hello(); + printf("SeaBIOS (version %s)\n\n", VERSION); }
static int diff --git a/src/output.c b/src/output.c index b6263b6..83de7f4 100644 --- a/src/output.c +++ b/src/output.c @@ -474,22 +474,6 @@ hexdump(const void *d, int len) debug_serial_flush(); }
-void -format_uuid(char buf[37], const u8 uuid[16]) -{ - snprintf(buf, 37 - , "%02x%02x%02x%02x" - "-%02x%02x" - "-%02x%02x" - "-%02x%02x" - "-%02x%02x%02x%02x%02x%02x" - , 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]); -} - static void dump_regs(struct bregs *regs) { diff --git a/src/post.c b/src/post.c index 3705c3b..f3b56b8 100644 --- a/src/post.c +++ b/src/post.c @@ -261,6 +261,9 @@ maininit(void) // Run vga option rom vga_setup();
+ // SMBIOS tables and VGA console are ready, print UUID + display_uuid(); + // Do hardware initialization (if running synchronously) if (!CONFIG_THREADS || !CONFIG_THREAD_OPTIONROMS) { init_hw(); diff --git a/src/smbios.c b/src/smbios.c index 5874bec..aaa99bc 100644 --- a/src/smbios.c +++ b/src/smbios.c @@ -522,16 +522,18 @@ smbios_init(void) free(start); }
-const u8 * -smbios_locate_uuid(const struct smbios_entry_point *ep) +void +display_uuid(void) { u32 addr, end; + u8 *uuid; + u8 empty_uuid[16] = { 0 };
- if (ep == NULL) - return NULL; + if (SMBiosAddr == NULL) + return;
- addr = ep->structure_table_address; - end = addr + ep->structure_table_length; + addr = SMBiosAddr->structure_table_address; + end = addr + SMBiosAddr->structure_table_length;
/* the following takes care of any initial wraparound too */ while (addr < end) { @@ -539,18 +541,18 @@ smbios_locate_uuid(const struct smbios_entry_point *ep)
/* partial structure header */ if (end - addr < sizeof(struct smbios_structure_header)) - return NULL; + return;
hdr = (struct smbios_structure_header *)addr;
/* partial structure */ if (end - addr < hdr->length) - return NULL; + return;
/* any Type 1 structure version will do that has the UUID */ if (hdr->type == 1 && hdr->length >= offsetof(struct smbios_type_1, uuid) + 16) - return (u8 *)(addr + offsetof(struct smbios_type_1, uuid)); + break;
/* done with formatted area, skip string-set */ addr += hdr->length; @@ -562,9 +564,28 @@ smbios_locate_uuid(const struct smbios_entry_point *ep)
/* structure terminator not found */ if (end - addr < 2) - return NULL; + return;
addr += 2; } - return NULL; + + /* parsing finished, UUID not found */ + if (addr == end) + return; + + uuid = (u8 *)(addr + offsetof(struct smbios_type_1, uuid)); + 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]); } diff --git a/src/smbios.h b/src/smbios.h index c1fe7f6..5bf0392 100644 --- a/src/smbios.h +++ b/src/smbios.h @@ -165,5 +165,5 @@ struct smbios_type_127 { struct smbios_structure_header header; } PACKED;
-const u8 *smbios_locate_uuid(const struct smbios_entry_point *ep); +void display_uuid(void); #endif // smbios.h diff --git a/src/util.h b/src/util.h index aafa9b0..7723bb1 100644 --- a/src/util.h +++ b/src/util.h @@ -227,7 +227,6 @@ void __set_code_invalid(struct bregs *regs, u32 linecode, const char *fname); void __set_code_unimplemented(struct bregs *regs, u32 linecode , const char *fname); void hexdump(const void *d, int len); -void format_uuid(char buf[37], const u8 uuid[16]);
#define dprintf(lvl, fmt, args...) do { \ if (CONFIG_DEBUG_LEVEL && (lvl) <= CONFIG_DEBUG_LEVEL) \