summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-11-21 03:27:07 +0100
committerMichael Brown2007-11-21 03:27:07 +0100
commit899f5b8ab233987646e6f5012f462a19a833d8d4 (patch)
treecee5ca8745e7e84f9f2612c3eeb732d31e5c5f24
parentUpdate SMBIOS internal API to be easier to use, and not to require (diff)
downloadipxe-899f5b8ab233987646e6f5012f462a19a833d8d4.tar.gz
ipxe-899f5b8ab233987646e6f5012f462a19a833d8d4.tar.xz
ipxe-899f5b8ab233987646e6f5012f462a19a833d8d4.zip
Added definition of a UUID and uuid_ntoa() (for debugging), and
implemented smbios_get_uuid().
-rw-r--r--src/arch/i386/firmware/pcbios/smbios.c27
-rw-r--r--src/arch/i386/include/smbios.h2
-rw-r--r--src/core/uuid.c48
-rw-r--r--src/include/gpxe/uuid.h31
4 files changed, 89 insertions, 19 deletions
diff --git a/src/arch/i386/firmware/pcbios/smbios.c b/src/arch/i386/firmware/pcbios/smbios.c
index 78a74804..d8be6f8b 100644
--- a/src/arch/i386/firmware/pcbios/smbios.c
+++ b/src/arch/i386/firmware/pcbios/smbios.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <errno.h>
#include <gpxe/uaccess.h>
+#include <gpxe/uuid.h>
#include <realmode.h>
#include <pnpbios.h>
#include <smbios.h>
@@ -301,34 +302,22 @@ int find_smbios_string ( struct smbios_strings *strings, unsigned int index,
}
/**
- * Find SMBIOS serial number
+ * Get UUID from SMBIOS
*
+ * @v uuid UUID to fill in
+ * @ret rc Return status code
*/
-int dump_smbios_info ( void ) {
+int smbios_get_uuid ( union uuid *uuid ) {
struct smbios_system_information sysinfo;
- struct smbios_strings strings;
- char buf[64];
int rc;
if ( ( rc = find_smbios_structure ( SMBIOS_TYPE_SYSTEM_INFORMATION,
&sysinfo, sizeof ( sysinfo ),
- &strings ) ) != 0 )
- return rc;
-
- DBG_HD ( &sysinfo, sizeof ( sysinfo ) );
-
- if ( ( rc = find_smbios_string ( &strings, sysinfo.manufacturer,
- buf, sizeof ( buf ) ) ) != 0 )
- return rc;
- DBG ( "Manufacturer: \"%s\"\n", buf );
-
- if ( ( rc = find_smbios_string ( &strings, sysinfo.product,
- buf, sizeof ( buf ) ) ) != 0 )
+ NULL ) ) != 0 )
return rc;
- DBG ( "Product: \"%s\"\n", buf );
- DBG ( "UUID:\n" );
- DBG_HD ( &sysinfo.uuid, sizeof ( sysinfo.uuid ) );
+ memcpy ( uuid, sysinfo.uuid, sizeof ( *uuid ) );
+ DBG ( "SMBIOS found UUID %s\n", uuid_ntoa ( uuid ) );
return 0;
}
diff --git a/src/arch/i386/include/smbios.h b/src/arch/i386/include/smbios.h
index a0a7a222..f5f0b5c2 100644
--- a/src/arch/i386/include/smbios.h
+++ b/src/arch/i386/include/smbios.h
@@ -32,6 +32,8 @@ struct smbios_system_information {
uint8_t serial;
/** UUID */
uint8_t uuid[16];
+ /** Wake-up type */
+ uint8_t wakeup;
} __attribute__ (( packed ));
/** SMBIOS system information structure type */
diff --git a/src/core/uuid.c b/src/core/uuid.c
new file mode 100644
index 00000000..dae26c16
--- /dev/null
+++ b/src/core/uuid.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <byteswap.h>
+#include <gpxe/uuid.h>
+
+/** @file
+ *
+ * Universally unique IDs
+ *
+ */
+
+/**
+ * Convert UUID to printable string
+ *
+ * @v uuid UUID
+ * @ret string UUID in canonical form
+ */
+char * uuid_ntoa ( union uuid *uuid ) {
+ static char buf[37]; /* "00000000-0000-0000-0000-000000000000" */
+
+ sprintf ( buf, "%08lx-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x",
+ le32_to_cpu ( uuid->canonical.a ),
+ le16_to_cpu ( uuid->canonical.b ),
+ le16_to_cpu ( uuid->canonical.c ),
+ be16_to_cpu ( uuid->canonical.d ),
+ uuid->canonical.e[0], uuid->canonical.e[1],
+ uuid->canonical.e[2], uuid->canonical.e[3],
+ uuid->canonical.e[4], uuid->canonical.e[5] );
+ return buf;
+}
diff --git a/src/include/gpxe/uuid.h b/src/include/gpxe/uuid.h
new file mode 100644
index 00000000..4f89be50
--- /dev/null
+++ b/src/include/gpxe/uuid.h
@@ -0,0 +1,31 @@
+#ifndef _GPXE_UUID_H
+#define _GPXE_UUID_H
+
+/** @file
+ *
+ * Universally unique IDs
+ */
+
+#include <stdint.h>
+
+/** A universally unique ID */
+union uuid {
+ /** Canonical form (00000000-0000-0000-0000-000000000000) */
+ struct {
+ /** 8 hex digits, little-endian */
+ uint32_t a;
+ /** 2 hex digits, little-endian */
+ uint16_t b;
+ /** 2 hex digits, little-endian */
+ uint16_t c;
+ /** 2 hex digits, big-endian */
+ uint16_t d;
+ /** 12 hex digits, big-endian */
+ uint8_t e[6];
+ } canonical;
+ uint8_t raw[16];
+};
+
+extern char * uuid_ntoa ( union uuid *uuid );
+
+#endif /* _GPXE_UUID_H */