Use smbios uuid as pxe client uuid.
In XenServer VMs, this corresponds to the VM uuid.

Index: etherboot-5.4.3/src/core/nic.c
===================================================================
--- etherboot-5.4.3.orig/src/core/nic.c	2008-07-31 12:32:01.000000000 -0700
+++ etherboot-5.4.3/src/core/nic.c	2008-07-31 12:32:07.000000000 -0700
@@ -347,6 +347,83 @@
 	(*nic.irq)(&nic,action);
 }
 
+#define replace_uuid(buf, old, new) {           \
+    int n;                                      \
+    for (n = 0; n < sizeof(buf) - 16; n++) {    \
+        if (memcmp(&(buf)[n], old, 16) == 0) {  \
+            memcpy(&(buf)[n], new, 16);         \
+            break;                              \
+        }                                       \
+    }                                           \
+}
+
+void update_client_uuid_from_smbios(void)
+{
+    unsigned char defaultUUID[] = {RFC3679_PXE_CLIENT_UUID_DEFAULT};
+    unsigned long dmi_base, dmi_count, dmi_end, dmi_size;
+    unsigned long i;
+    unsigned char *pa, *uuid, *va;
+
+    dmi_base = 0;
+    for (pa = 0xE0000; pa < 0x100000 - 32; pa += 16) {
+        va = phys_to_virt(pa);
+        if ((memcmp(va, "_SM_", 4) == 0) &&
+            (memcmp(va + 16, "_DMI_", 5) == 0)) {
+
+            dmi_base = *(unsigned long *)(va + 0x18);
+            dmi_size = *(unsigned short *)(va + 0x16);
+            dmi_count = *(unsigned short *)(va + 0x1C);
+            break;
+        }
+    }
+
+    if (dmi_base == 0) {
+        printf("Failed to find SMBIOS table information!\n");
+        return;
+    }
+
+    uuid = 0;
+    pa = dmi_base;
+    dmi_end = dmi_base + dmi_size;
+    for (i = 0; (i < dmi_count) && (pa < dmi_end - 4); i++) {
+        va = phys_to_virt(pa);
+        if (va[0] == 1) { // System Information
+            if (va[1] >= 0x19) {
+                uuid = va + 8;
+                break;
+            }
+        }
+
+        //
+        // Next structure is past the one with NULL handle.
+        //
+        pa += va[1];
+        while (pa < (dmi_end - 1)) {
+            va = phys_to_virt(pa);
+            if (*(unsigned short *)va == 0) {
+                break;
+            }
+
+            pa += 1;
+        }
+
+        pa += 2;
+    }
+
+    if (uuid == 0) {
+        printf("Failed to find System Information UUID from SMBIOS tables!\n");
+        return;
+    }
+
+    // Replace all occurances of RFC3679_PXE_CLIENT_UUID_DEFAULT
+    // with SMBIOS system UUID.
+    replace_uuid(dhcpdiscover, &defaultUUID[1], uuid);
+    replace_uuid(dhcprequest, &defaultUUID[1], uuid);
+    replace_uuid(proxydhcprequest, &defaultUUID[1], uuid);
+    replace_uuid(pxedhcprequest, &defaultUUID[1], uuid);
+    return;
+}
+
 /*
  * Find out what our boot parameters are
  */
@@ -368,6 +445,8 @@
 #endif
 #endif
 
+	update_client_uuid_from_smbios();
+
 #ifdef	USE_STATIC_BOOT_INFO
 	server_found = get_static_boot_info();
 #else
