Currently, hvmloader uses SMBIOS 2.4, however, when using OVMF, the SMBIOS is patched to 2.8, which has clarified the UUID format (as GUID).
In Linux, if the SMBIOS version is >= 2.6, the GUID format is used, else (undefined as per SMBIOS spec), big endian is used (used by Xen). Therefore, you have a endian mismatch causing the UUIDs to mismatch in the guest. $ cat /sys/hypervisor/uuid e865e63f-3d30-4f0b-83e0-8fdfc1e30eb7 $ cat /sys/devices/virtual/dmi/id/product_uuid 3fe665e8-303d-0b4f-83e0-8fdfc1e30eb7 $ cat /sys/devices/virtual/dmi/id/product_serial e865e63f-3d30-4f0b-83e0-8fdfc1e30eb7 This patch updates the SMBIOS version from 2.4 to 2.6 and fixup the UUID written in the table; which effectively fix this endianness mismatch with OVMF; while the UUID displayed by Linux is still the same for SeaBIOS. Signed-off-by: Teddy Astie <teddy.as...@vates.tech> --- This effectively changes the UUID seen with UEFI guests as it was actually inconsistent with SeaBIOS and SMBIOS expectations. --- tools/firmware/hvmloader/smbios.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/firmware/hvmloader/smbios.c b/tools/firmware/hvmloader/smbios.c index 6bcdcc233a..f4822ae6f8 100644 --- a/tools/firmware/hvmloader/smbios.c +++ b/tools/firmware/hvmloader/smbios.c @@ -352,7 +352,7 @@ smbios_entry_point_init(void *start, memcpy(ep->anchor_string, "_SM_", 4); ep->length = 0x1f; ep->smbios_major_version = 2; - ep->smbios_minor_version = 4; + ep->smbios_minor_version = 6; ep->max_structure_size = max_structure_size; ep->entry_point_revision = 0; memcpy(ep->intermediate_anchor_string, "_DMI_", 5); @@ -462,7 +462,23 @@ smbios_type_1_init(void *start, const char *xen_version, p->version_str = 3; p->serial_number_str = 4; - memcpy(p->uuid, uuid, 16); + /* + * Xen uses OSF DCE UUIDs which is fully big endian, however, + * GUIDs (which requirement is clarified by SMBIOS >= 2.6) has the + * first 3 components appearing as being little endian and the rest + * as still being big endian. + */ + /* First component */ + for ( unsigned int i = 0; i < 4; i++ ) + p->uuid[i] = uuid[4 - i - 1]; + /* Second component */ + p->uuid[4] = uuid[5]; + p->uuid[5] = uuid[4]; + /* Third component */ + p->uuid[6] = uuid[7]; + p->uuid[7] = uuid[6]; + /* Rest */ + memcpy(p->uuid + 8, uuid + 8, 8); p->wake_up_type = 0x06; /* power switch */ p->sku_str = 0; -- 2.50.1 | Vates XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech