: Plumb qemu_uuid through to the VMware back door
PATCH 3/3 : Plumb qemu_uuid through to the VMware back door
This patch finishes plumbing qemu_uuid through the VMware back door so that the Bochs BIOS can actually fetch the information to put in the SMBIOS tables.
Signed-off-by Chris Lalancette <[email protected]>
Cc Gleb Natapov <[email protected]>
Cc Anthony Liguori <[email protected]>
hw/vmport.c +39 -0
@@ -26,8 +26,17 @@#include "pc.h" #include "sysemu.h" +#ifdef CONFIG_UUID +#include <uuid/uuid.h> +uuid_t vmport_uuid; +extern char *qemu_uuid; +#else +const unsigned char vmport_uuid[16 ] = {0 }; +#endif +#define VMPORT_CMD_GETVERSION 0x0a#define VMPORT_CMD_GETRAMSIZE 0x14 +#define VMPORT_CMD_GETBIOSUUID 0x13#define VMPORT_ENTRIES 0x2c#define VMPORT_MAGIC 0x564D5868
@@ -93,6 +102,26 @@ static uint32_t vmport_cmd_ram_size(voidreturn ram_size; } +static inline uint32_t uuid2reg (const unsigned char *uuid,uint32_t idx) +{ +int i; +uint32_t reg =0 ; + +for (i =0 ; i <4 ; i++) + reg |= (uuid[(idx*4 ) + i] << (i*8 )); + +return reg; +} + +static uint32_t vmport_cmd_bios_uuid (void *opaque,uint32_t addr) +{ +CPUState *env = cpu_single_env; + env->regs[R_EBX ] =uuid2reg (vmport_uuid,1 ); + env->regs[R_ECX ] =uuid2reg (vmport_uuid,2 ); + env->regs[R_EDX ] =uuid2reg (vmport_uuid,3 ); +return uuid2reg (vmport_uuid,0 ); +} +void vmport_init (void ) {register_ioport_read (0x5658 ,1 ,4 , vmport_ioport_read, &port_state);
@@ -101,4 +130,14 @@ void vmport_init(void)/* Register some generic port commands */ vmport_register (VMPORT_CMD_GETVERSION , vmport_cmd_get_version,NULL );vmport_register (VMPORT_CMD_GETRAMSIZE , vmport_cmd_ram_size,NULL ); +vmport_register (VMPORT_CMD_GETBIOSUUID , vmport_cmd_bios_uuid,NULL ); + +#ifdef CONFIG_UUID +if (qemu_uuid !=NULL ) { +if (uuid_parse (qemu_uuid, vmport_uuid) !=0 ) { +/* failed UUID parse; print a warning, but go on */ +fprintf (stderr,"Failed parsing UUID\n" ); + } + } +#endif }