Added definition of a UUID and uuid_ntoa() (for debugging), and
authorMichael Brown <mcb30@etherboot.org>
Wed, 21 Nov 2007 02:27:07 +0000 (02:27 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 21 Nov 2007 02:27:07 +0000 (02:27 +0000)
implemented smbios_get_uuid().

src/arch/i386/firmware/pcbios/smbios.c
src/arch/i386/include/smbios.h
src/core/uuid.c [new file with mode: 0644]
src/include/gpxe/uuid.h [new file with mode: 0644]

index 78a7480..d8be6f8 100644 (file)
@@ -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;
 }
index a0a7a22..f5f0b5c 100644 (file)
@@ -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 (file)
index 0000000..dae26c1
--- /dev/null
@@ -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 (file)
index 0000000..4f89be5
--- /dev/null
@@ -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 */