* [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID
@ 2014-12-14 8:41 Gal Hammer
2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 1/3] docs: vm generation id device's description Gal Hammer
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Gal Hammer @ 2014-12-14 8:41 UTC (permalink / raw)
To: qemu-devel; +Cc: Gal Hammer, mst
Hi,
Resending patches after the release of version 2.2.
Please note that this patch set doesn't include the *.hex.generated
files and the binary ACPI tables (make check will fail).
Thanks,
Gal.
VX - Fixed typos in docs and a few clarification.
V9 - Add a unit test.
- Rebased to version 2.2.
- Removed hex.generated the binary files from patch.
V8 - Add a device's description file.
- GUID is stored in fw cfg file and the guest writes the
physical address to the device (reduces vmexits).
V7 - Move the device's description back to the static SSDT table.
- The GUID is store in a "hard coded" physical address and not
in the ACPI table itself.
- ACPI notification is triggered when the GUID is changed.
V6 - include the pre-compiled ASL file
- remove an empty line at end of files.
V5 - Move device's description to SSDT table (dynamic).
V4 - Fix a typo in error message string.
- Move device's description from DSDT back to SSDT table.
V3 - Remove "-uuid" command line parameter.
- Move device's description from SSDT to DSDT table.
- Add new "vmgenid" sysbus device.
Gal Hammer (3):
docs: vm generation id device's description
i386: Add a Virtual Machine Generation ID device
tests: add a unit test for the vmgenid device.
default-configs/i386-softmmu.mak | 1 +
default-configs/x86_64-softmmu.mak | 1 +
docs/specs/vmgenid.txt | 38 ++++++++++++++++++++++++++++
hw/acpi/core.c | 8 ++++++
hw/acpi/ich9.c | 8 ++++++
hw/acpi/piix4.c | 8 ++++++
hw/i386/acpi-build.c | 26 +++++++++++++++++++
hw/i386/acpi-dsdt.dsl | 4 ++-
hw/i386/pc.c | 8 ++++++
hw/i386/q35-acpi-dsdt.dsl | 5 +++-
hw/i386/ssdt-misc.dsl | 43 ++++++++++++++++++++++++++++++++
hw/isa/lpc_ich9.c | 1 +
hw/misc/Makefile.objs | 1 +
include/hw/acpi/acpi.h | 2 ++
include/hw/acpi/acpi_dev_interface.h | 4 +++
include/hw/acpi/ich9.h | 2 ++
include/hw/i386/pc.h | 3 +++
tests/Makefile | 2 ++
tests/vmgenid-test.c | 48 ++++++++++++++++++++++++++++++++++++
19 files changed, 211 insertions(+), 2 deletions(-)
create mode 100644 docs/specs/vmgenid.txt
create mode 100644 tests/vmgenid-test.c
--
1.9.3
^ permalink raw reply [flat|nested] 6+ messages in thread* [Qemu-devel] [PATCH V10 1/3] docs: vm generation id device's description 2014-12-14 8:41 [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Gal Hammer @ 2014-12-14 8:41 ` Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device Gal Hammer ` (2 subsequent siblings) 3 siblings, 0 replies; 6+ messages in thread From: Gal Hammer @ 2014-12-14 8:41 UTC (permalink / raw) To: qemu-devel; +Cc: Gal Hammer, mst Signed-off-by: Gal Hammer <ghammer@redhat.com> --- docs/specs/vmgenid.txt | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/specs/vmgenid.txt diff --git a/docs/specs/vmgenid.txt b/docs/specs/vmgenid.txt new file mode 100644 index 0000000..656d598 --- /dev/null +++ b/docs/specs/vmgenid.txt @@ -0,0 +1,38 @@ +VIRTUAL MACHINE GENERATION ID +============================= + +Copyright (C) 2014 Red Hat, Inc. + +This work is licensed under the terms of the GNU GPL, version 2 or later. +See the COPYING file in the top-level directory. + +=== + +The VM generation ID (vmgenid) device is an emulated device which +exposes a 128-bit, cryptographically random, integer value identifier. +This allows management applications (e.g. libvirt) to notify the guest +operating system when the virtual machine is executed with a different +configuration (e.g. snapshot execution or creation from a template). + +This is specified on the web at: http://go.microsoft.com/fwlink/?LinkId=260709 + +--- + +The vmgenid device is a sysbus device with the following ACPI ID: +"QEMU0002". + +The device adds a "vmgenid.uuid" property, which can be modified using +the -global command line argument or the QMP interface. + +The device uses a fixed memory resource: 0xfedf0000-0xfedf0003. The +guest is expected to write the physical address of the GUID's buffer +to that memory resource. This allows the device to modify the GUID if +requested by the management application. Current device's implementation +supports a 32-bit address. + +According to the specification, any change to the GUID executes an +ACPI notification. The vmgenid device triggers the GPE._E00 which +executes the ACPI Notify operation. + +Although not specified in Microsoft's document, it is assumed that the +device is expected to use the little-endian system. -- 1.9.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device 2014-12-14 8:41 [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 1/3] docs: vm generation id device's description Gal Hammer @ 2014-12-14 8:41 ` Gal Hammer 2015-01-26 18:36 ` Eric Blake 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 3/3] tests: add a unit test for the vmgenid device Gal Hammer 2015-01-26 18:33 ` [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Michael S. Tsirkin 3 siblings, 1 reply; 6+ messages in thread From: Gal Hammer @ 2014-12-14 8:41 UTC (permalink / raw) To: qemu-devel; +Cc: Gal Hammer, mst Based on Microsoft's sepecifications (paper can be dowloaded from http://go.microsoft.com/fwlink/?LinkId=260709), add a device description to the SSDT ACPI table and its implementation. The GUID is set using a global "vmgenid.uuid" parameter. Signed-off-by: Gal Hammer <ghammer@redhat.com> --- default-configs/i386-softmmu.mak | 1 + default-configs/x86_64-softmmu.mak | 1 + hw/acpi/core.c | 8 +++++++ hw/acpi/ich9.c | 8 +++++++ hw/acpi/piix4.c | 8 +++++++ hw/i386/acpi-build.c | 26 ++++++++++++++++++++++ hw/i386/acpi-dsdt.dsl | 4 +++- hw/i386/pc.c | 8 +++++++ hw/i386/q35-acpi-dsdt.dsl | 5 ++++- hw/i386/ssdt-misc.dsl | 43 ++++++++++++++++++++++++++++++++++++ hw/isa/lpc_ich9.c | 1 + hw/misc/Makefile.objs | 1 + include/hw/acpi/acpi.h | 2 ++ include/hw/acpi/acpi_dev_interface.h | 4 ++++ include/hw/acpi/ich9.h | 2 ++ include/hw/i386/pc.h | 3 +++ 16 files changed, 123 insertions(+), 2 deletions(-) diff --git a/default-configs/i386-softmmu.mak b/default-configs/i386-softmmu.mak index 8e08841..bd33c75 100644 --- a/default-configs/i386-softmmu.mak +++ b/default-configs/i386-softmmu.mak @@ -45,3 +45,4 @@ CONFIG_IOAPIC=y CONFIG_ICC_BUS=y CONFIG_PVPANIC=y CONFIG_MEM_HOTPLUG=y +CONFIG_VMGENID=y diff --git a/default-configs/x86_64-softmmu.mak b/default-configs/x86_64-softmmu.mak index 66557ac..006fc7c 100644 --- a/default-configs/x86_64-softmmu.mak +++ b/default-configs/x86_64-softmmu.mak @@ -45,3 +45,4 @@ CONFIG_IOAPIC=y CONFIG_ICC_BUS=y CONFIG_PVPANIC=y CONFIG_MEM_HOTPLUG=y +CONFIG_VMGENID=y diff --git a/hw/acpi/core.c b/hw/acpi/core.c index 51913d6..d4597c6 100644 --- a/hw/acpi/core.c +++ b/hw/acpi/core.c @@ -28,6 +28,8 @@ #include "qapi-visit.h" #include "qapi-event.h" +#define ACPI_VM_GENERATION_ID_CHANGED_STATUS 1 + struct acpi_table_header { uint16_t _length; /* our length, not actual part of the hdr */ /* allows easier parsing for fw_cfg clients */ @@ -683,3 +685,9 @@ void acpi_update_sci(ACPIREGS *regs, qemu_irq irq) (regs->pm1.evt.en & ACPI_BITMASK_TIMER_ENABLE) && !(pm1a_sts & ACPI_BITMASK_TIMER_STATUS)); } + +void acpi_vm_generation_id_changed(ACPIREGS *acpi_regs, qemu_irq irq) +{ + acpi_regs->gpe.sts[0] |= ACPI_VM_GENERATION_ID_CHANGED_STATUS; + acpi_update_sci(acpi_regs, irq); +} diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c index ea991a3..12a9387 100644 --- a/hw/acpi/ich9.c +++ b/hw/acpi/ich9.c @@ -307,3 +307,11 @@ void ich9_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) acpi_memory_ospm_status(&s->pm.acpi_memory_hotplug, list); } + +void ich9_vm_generation_id_changed(AcpiDeviceIf *adev) +{ + ICH9LPCState *s = ICH9_LPC_DEVICE(adev); + ICH9LPCPMRegs *pm = &s->pm; + + acpi_vm_generation_id_changed(&pm->acpi_regs, pm->irq); +} diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index 481a16c..41b6eb6 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -574,6 +574,13 @@ static void piix4_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) acpi_memory_ospm_status(&s->acpi_memory_hotplug, list); } +static void piix4_vm_generation_id_changed(AcpiDeviceIf *adev) +{ + PIIX4PMState *s = PIIX4_PM(adev); + + acpi_vm_generation_id_changed(&s->ar, s->irq); +} + static Property piix4_pm_properties[] = { DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0), DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 0), @@ -611,6 +618,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data) hc->plug = piix4_device_plug_cb; hc->unplug_request = piix4_device_unplug_request_cb; adevc->ospm_status = piix4_ospm_status; + adevc->vm_generation_id_changed = piix4_vm_generation_id_changed; } static const TypeInfo piix4_pm_info = { diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index a4d0c0c..f20a6a5 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -257,6 +257,7 @@ static void acpi_get_pci_info(PcPciInfo *info) #define ACPI_BUILD_TABLE_FILE "etc/acpi/tables" #define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp" #define ACPI_BUILD_TPMLOG_FILE "etc/tpm/log" +#define ACPI_BUILD_VMGENID_FILE "etc/vm-generation-id" static void build_header(GArray *linker, GArray *table_data, @@ -1068,6 +1069,8 @@ build_ssdt(GArray *table_data, GArray *linker, { MachineState *machine = MACHINE(qdev_get_machine()); uint32_t nr_mem = machine->ram_slots; + uint32_t vm_gid_physical_address; + uint32_t vm_gid_offset = 0; unsigned acpi_cpus = guest_info->apic_id_limit; int ssdt_start = table_data->len; uint8_t *ssdt_ptr; @@ -1096,6 +1099,21 @@ build_ssdt(GArray *table_data, GArray *linker, ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml), ssdt_isa_pest[0], 16, misc->pvpanic_port); + if (vm_generation_id_set()) { + vm_gid_physical_address = ssdt_start + ssdt_acpi_vm_gid_addr[0]; + bios_linker_loader_alloc(linker, ACPI_BUILD_VMGENID_FILE, 8, true); + bios_linker_loader_add_pointer(linker, ACPI_BUILD_VMGENID_FILE, + ACPI_BUILD_TABLE_FILE, + table_data, + &vm_gid_offset, + sizeof(vm_gid_offset)); + } else { + vm_gid_physical_address = 0; + } + + ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml), + ssdt_acpi_vm_gid_addr[0], 32, vm_gid_physical_address); + ACPI_BUILD_SET_LE(ssdt_ptr, sizeof(ssdp_misc_aml), ssdt_mctrl_nr_slots[0], 32, nr_mem); @@ -1490,6 +1508,7 @@ struct AcpiBuildTables { GArray *table_data; GArray *rsdp; GArray *tcpalog; + GArray *vmgenid; GArray *linker; } AcpiBuildTables; @@ -1498,6 +1517,7 @@ static inline void acpi_build_tables_init(AcpiBuildTables *tables) tables->rsdp = g_array_new(false, true /* clear */, 1); tables->table_data = g_array_new(false, true /* clear */, 1); tables->tcpalog = g_array_new(false, true /* clear */, 1); + tables->vmgenid = g_array_new(false, true /* clear */, 1); tables->linker = bios_linker_loader_init(); } @@ -1508,6 +1528,7 @@ static inline void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre) g_array_free(tables->rsdp, mfre); g_array_free(tables->table_data, true); g_array_free(tables->tcpalog, mfre); + g_array_free(tables->vmgenid, mfre); } typedef @@ -1790,6 +1811,11 @@ void acpi_setup(PcGuestInfo *guest_info) fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, acpi_data_len(tables.tcpalog)); + /* Add a 128-bit fw cfg file which stores the VM generation id. */ + g_array_set_size(tables.vmgenid, 16); + fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_VMGENID_FILE, + tables.vmgenid->data, tables.vmgenid->len); + /* * RSDP is small so it's easy to keep it immutable, no need to * bother with ROM blobs. diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl index a611e07..5a72820 100644 --- a/hw/i386/acpi-dsdt.dsl +++ b/hw/i386/acpi-dsdt.dsl @@ -306,7 +306,9 @@ DefinitionBlock ( Scope(\_GPE) { Name(_HID, "ACPI0006") - Method(_L00) { + External(\_SB.VMGI, DeviceObj) + Method(_E00) { + Notify(\_SB.VMGI, 0x80) } Method(_E01) { // PCI hotplug event diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f31d55e..c8abe43 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -59,6 +59,7 @@ #include "hw/pci/pci_host.h" #include "acpi-build.h" #include "hw/mem/pc-dimm.h" +#include "hw/misc/vmgenid.h" #include "trace.h" #include "qapi/visitor.h" #include "qapi-visit.h" @@ -1356,6 +1357,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, int i; DriveInfo *fd[MAX_FD]; DeviceState *hpet = NULL; + DeviceState *vmgenid; int pit_isa_irq = 0; qemu_irq pit_alt_irq = NULL; qemu_irq rtc_irq = NULL; @@ -1454,6 +1456,12 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, fd[i] = drive_get(IF_FLOPPY, 0, i); } *floppy = fdctrl_init_isa(isa_bus, fd); + + vmgenid = qdev_try_create(NULL, VMGENID_DEVICE); + if (vmgenid) { + qdev_init_nofail(vmgenid); + sysbus_mmio_map(SYS_BUS_DEVICE(vmgenid), 0, VMGENID_BASE_ADDRESS); + } } void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus) diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl index e1cee5d..acc6e8d 100644 --- a/hw/i386/q35-acpi-dsdt.dsl +++ b/hw/i386/q35-acpi-dsdt.dsl @@ -414,7 +414,10 @@ DefinitionBlock ( Scope(\_GPE) { Name(_HID, "ACPI0006") - Method(_L00) { + External(\_SB.VMGI, DeviceObj) + Method(_E00) + { + Notify(\_SB.VMGI, 0x80) } Method(_L01) { } diff --git a/hw/i386/ssdt-misc.dsl b/hw/i386/ssdt-misc.dsl index 1e3baae..9c7de2c 100644 --- a/hw/i386/ssdt-misc.dsl +++ b/hw/i386/ssdt-misc.dsl @@ -13,6 +13,7 @@ * with this program; if not, see <http://www.gnu.org/licenses/>. */ #include "hw/acpi/pc-hotplug.h" +#include "hw/misc/vmgenid.h" ACPI_EXTRACT_ALL_CODE ssdp_misc_aml @@ -119,4 +120,46 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1) } } } + + Scope(\_SB) { + Device(VMGI) { + Name(_HID, "QEMU0002") + Name(_CID, "VM_Gen_Counter") + Name(_DDN, "VM_Gen_Counter") + + ACPI_EXTRACT_NAME_DWORD_CONST ssdt_acpi_vm_gid_addr + Name(VGIA, 0x12345678) + + OperationRegion(OPRG, SystemMemory, + VMGENID_BASE_ADDRESS, VMGENID_BASE_ADDR_LEN) + Field(OPRG, DWordAcc, NoLock, Preserve) { + PHYA, 32 + } + + Name(_CRS, ResourceTemplate() { + Memory32Fixed(ReadOnly, + VMGENID_BASE_ADDRESS, VMGENID_BASE_ADDR_LEN) + }) + + Method(_INI, 0, NotSerialized) { + Store(VGIA, PHYA) + } + + Method(_STA, 0, NotSerialized) { + Store(VGIA, Local0) + If (LEqual(Local0, Zero)) { + Return (0x00) + } Else { + Return (0x0F) + } + } + + Method(ADDR, 0, Serialized) { + Store(Package(2) { }, Local0) + Store(VGIA, Index(Local0, 0)) + Store(0x0000, Index(Local0, 1)) + return (Local0) + } + } + } } diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c index 530b074..3a012fa 100644 --- a/hw/isa/lpc_ich9.c +++ b/hw/isa/lpc_ich9.c @@ -678,6 +678,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data) hc->plug = ich9_device_plug_cb; hc->unplug_request = ich9_device_unplug_request_cb; adevc->ospm_status = ich9_pm_ospm_status; + adevc->vm_generation_id_changed = ich9_vm_generation_id_changed; } static const TypeInfo ich9_lpc_info = { diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs index 979e532..c18b800 100644 --- a/hw/misc/Makefile.objs +++ b/hw/misc/Makefile.objs @@ -41,3 +41,4 @@ obj-$(CONFIG_SLAVIO) += slavio_misc.o obj-$(CONFIG_ZYNQ) += zynq_slcr.o obj-$(CONFIG_PVPANIC) += pvpanic.o +obj-$(CONFIG_VMGENID) += vmgenid.o diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h index 1f678b4..9373b4d 100644 --- a/include/hw/acpi/acpi.h +++ b/include/hw/acpi/acpi.h @@ -185,4 +185,6 @@ unsigned acpi_table_len(void *current); void acpi_table_add(const QemuOpts *opts, Error **errp); void acpi_table_add_builtin(const QemuOpts *opts, Error **errp); +void acpi_vm_generation_id_changed(ACPIREGS *acpi_regs, qemu_irq irq); + #endif /* !QEMU_HW_ACPI_H */ diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h index f245f8d..757ce60 100644 --- a/include/hw/acpi/acpi_dev_interface.h +++ b/include/hw/acpi/acpi_dev_interface.h @@ -28,6 +28,9 @@ typedef struct AcpiDeviceIf { * ospm_status: returns status of ACPI device objects, reported * via _OST method if device supports it. * + * vm_generation_id_changed: notify the guest that it generation + * id was changed. + * * Interface is designed for providing unified interface * to generic ACPI functionality that could be used without * knowledge about internals of actual device that implements @@ -39,5 +42,6 @@ typedef struct AcpiDeviceIfClass { /* <public> */ void (*ospm_status)(AcpiDeviceIf *adev, ACPIOSTInfoList ***list); + void (*vm_generation_id_changed)(AcpiDeviceIf *adev); } AcpiDeviceIfClass; #endif diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h index fe975e6..923e711 100644 --- a/include/hw/acpi/ich9.h +++ b/include/hw/acpi/ich9.h @@ -61,4 +61,6 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp); void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState *dev, Error **errp); void ich9_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list); + +void ich9_vm_generation_id_changed(AcpiDeviceIf *adev); #endif /* HW_ACPI_ICH9_H */ diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 69d9cf8..7e7668b 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -298,6 +298,9 @@ void pc_system_firmware_init(MemoryRegion *rom_memory, /* pvpanic.c */ uint16_t pvpanic_port(void); +/* vmgenid.c */ +bool vm_generation_id_set(void); + /* e820 types */ #define E820_RAM 1 #define E820_RESERVED 2 -- 1.9.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device Gal Hammer @ 2015-01-26 18:36 ` Eric Blake 0 siblings, 0 replies; 6+ messages in thread From: Eric Blake @ 2015-01-26 18:36 UTC (permalink / raw) To: Gal Hammer, qemu-devel; +Cc: mst [-- Attachment #1: Type: text/plain, Size: 542 bytes --] On 12/14/2014 01:41 AM, Gal Hammer wrote: > Based on Microsoft's sepecifications (paper can be dowloaded from s/sepecifications/specifications/ s/dowloaded/downloaded/ > http://go.microsoft.com/fwlink/?LinkId=260709), add a device > description to the SSDT ACPI table and its implementation. > > The GUID is set using a global "vmgenid.uuid" parameter. > > Signed-off-by: Gal Hammer <ghammer@redhat.com> > > --- -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH V10 3/3] tests: add a unit test for the vmgenid device. 2014-12-14 8:41 [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 1/3] docs: vm generation id device's description Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device Gal Hammer @ 2014-12-14 8:41 ` Gal Hammer 2015-01-26 18:33 ` [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Michael S. Tsirkin 3 siblings, 0 replies; 6+ messages in thread From: Gal Hammer @ 2014-12-14 8:41 UTC (permalink / raw) To: qemu-devel; +Cc: Gal Hammer, mst Signed-off-by: Gal Hammer <ghammer@redhat.com> --- tests/Makefile | 2 ++ tests/vmgenid-test.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/vmgenid-test.c diff --git a/tests/Makefile b/tests/Makefile index 16f0e4c..612441a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -64,6 +64,7 @@ gcov-files-check-qom-interface-y = qom/object.c check-unit-$(CONFIG_POSIX) += tests/test-vmstate$(EXESUF) check-unit-y += tests/test-qemu-opts$(EXESUF) gcov-files-test-qemu-opts-y = qom/test-qemu-opts.c +check-qtest-i386-y += tests/vmgenid-test$(EXESUF) check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh @@ -351,6 +352,7 @@ tests/usb-hcd-xhci-test$(EXESUF): tests/usb-hcd-xhci-test.o $(libqos-usb-obj-y) tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o $(qtest-obj-y) tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a +tests/vmgenid-test$(EXESUF): tests/vmgenid-test.o ifeq ($(CONFIG_POSIX),y) LIBS += -lutil diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c new file mode 100644 index 0000000..d9c3e29 --- /dev/null +++ b/tests/vmgenid-test.c @@ -0,0 +1,48 @@ +/* + * QTest testcase for VM Generation ID + * + * Copyright (c) 2014 Red Hat, Inc. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include <string.h> +#include "libqtest.h" + +static void vmgenid_test(void) +{ + static const uint8_t expected[16] = { + 0x32, 0x4e, 0x6e, 0xaf, 0xd1, 0xd1, 0x4b, 0xf6, + 0xbf, 0x41, 0xb9, 0xbb, 0x6c, 0x91, 0xfb, 0x87 + }; + uint8_t guid[16]; + uint32_t i; + + // Emulate the ACPI _INI method (tells the device where the physical + // memory was "allocated". + writel(0xfedf0000, 0x0001f000); + + // Skip the ACPI ADDR method and read the GUID directly from memory. + for (i = 0; i < 16; i++) { + guid[i] = readb(0x0001f000 + i); + } + + g_assert_cmpuint(sizeof(guid), ==, sizeof(expected)); + g_assert(memcmp(guid, expected, sizeof(guid)) == 0); +} + +int main(int argc, char **argv) +{ + int ret; + + g_test_init(&argc, &argv, NULL); + qtest_add_func("/vmgenid/vmgenid", vmgenid_test); + + qtest_start("-global vmgenid.uuid=324e6eaf-d1d1-4bf6-bf41-b9bb6c91fb87"); + ret = g_test_run(); + + qtest_end(); + + return ret; +} -- 1.9.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID 2014-12-14 8:41 [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Gal Hammer ` (2 preceding siblings ...) 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 3/3] tests: add a unit test for the vmgenid device Gal Hammer @ 2015-01-26 18:33 ` Michael S. Tsirkin 3 siblings, 0 replies; 6+ messages in thread From: Michael S. Tsirkin @ 2015-01-26 18:33 UTC (permalink / raw) To: Gal Hammer; +Cc: qemu-devel On Sun, Dec 14, 2014 at 10:41:48AM +0200, Gal Hammer wrote: > Hi, > > Resending patches after the release of version 2.2. > > Please note that this patch set doesn't include the *.hex.generated > files and the binary ACPI tables (make check will fail). > > Thanks, > > Gal. Hi Gal, I had to revert this - pls address the issues found by Igor. Looking at spec, it also seems safer to reserve a full 4K bytes of memory, to guarantee that the memory won't be shared with some uncacheable page. > VX - Fixed typos in docs and a few clarification. > > V9 - Add a unit test. > - Rebased to version 2.2. > - Removed hex.generated the binary files from patch. > > V8 - Add a device's description file. > - GUID is stored in fw cfg file and the guest writes the > physical address to the device (reduces vmexits). > > V7 - Move the device's description back to the static SSDT table. > - The GUID is store in a "hard coded" physical address and not > in the ACPI table itself. > - ACPI notification is triggered when the GUID is changed. > > V6 - include the pre-compiled ASL file > - remove an empty line at end of files. > > V5 - Move device's description to SSDT table (dynamic). > > V4 - Fix a typo in error message string. > - Move device's description from DSDT back to SSDT table. > > V3 - Remove "-uuid" command line parameter. > - Move device's description from SSDT to DSDT table. > - Add new "vmgenid" sysbus device. > > Gal Hammer (3): > docs: vm generation id device's description > i386: Add a Virtual Machine Generation ID device > tests: add a unit test for the vmgenid device. > > default-configs/i386-softmmu.mak | 1 + > default-configs/x86_64-softmmu.mak | 1 + > docs/specs/vmgenid.txt | 38 ++++++++++++++++++++++++++++ > hw/acpi/core.c | 8 ++++++ > hw/acpi/ich9.c | 8 ++++++ > hw/acpi/piix4.c | 8 ++++++ > hw/i386/acpi-build.c | 26 +++++++++++++++++++ > hw/i386/acpi-dsdt.dsl | 4 ++- > hw/i386/pc.c | 8 ++++++ > hw/i386/q35-acpi-dsdt.dsl | 5 +++- > hw/i386/ssdt-misc.dsl | 43 ++++++++++++++++++++++++++++++++ > hw/isa/lpc_ich9.c | 1 + > hw/misc/Makefile.objs | 1 + > include/hw/acpi/acpi.h | 2 ++ > include/hw/acpi/acpi_dev_interface.h | 4 +++ > include/hw/acpi/ich9.h | 2 ++ > include/hw/i386/pc.h | 3 +++ > tests/Makefile | 2 ++ > tests/vmgenid-test.c | 48 ++++++++++++++++++++++++++++++++++++ > 19 files changed, 211 insertions(+), 2 deletions(-) > create mode 100644 docs/specs/vmgenid.txt > create mode 100644 tests/vmgenid-test.c > > -- > 1.9.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-26 18:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-12-14 8:41 [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 1/3] docs: vm generation id device's description Gal Hammer 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 2/3] i386: Add a Virtual Machine Generation ID device Gal Hammer 2015-01-26 18:36 ` Eric Blake 2014-12-14 8:41 ` [Qemu-devel] [PATCH V10 3/3] tests: add a unit test for the vmgenid device Gal Hammer 2015-01-26 18:33 ` [Qemu-devel] [PATCH V10 0/3] Virtual Machine Generation ID Michael S. Tsirkin
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.