@@ -20,7 +20,6 @@
#include "hw/qdev-properties.h"
#include "hw/qdev-properties-system.h"
#include "migration/vmstate.h"
-#include "system/reset.h"
#include "standard-headers/linux/vmclock-abi.h"
@@ -107,15 +106,14 @@ static const VMStateDescription vmstate_vmclock = {
},
};
-static void vmclock_handle_reset(void *opaque)
+void vmclock_mmio_map(Object *dev, hwaddr addr)
{
- VmclockState *vms = VMCLOCK(opaque);
+ VmclockState *vms = VMCLOCK(dev);
- if (!memory_region_is_mapped(&vms->clk_page)) {
- memory_region_add_subregion_overlap(get_system_memory(),
- vms->physaddr,
- &vms->clk_page, 0);
- }
+ vms->physaddr = addr;
+ memory_region_add_subregion_overlap(get_system_memory(),
+ vms->physaddr,
+ &vms->clk_page, 0);
}
static void vmclock_realize(DeviceState *dev, Error **errp)
@@ -131,8 +129,6 @@ static void vmclock_realize(DeviceState *dev, Error **errp)
return;
}
- vms->physaddr = VMCLOCK_ADDR;
-
e820_add_entry(vms->physaddr, VMCLOCK_SIZE, E820_RESERVED);
memory_region_init_ram(&vms->clk_page, OBJECT(dev), "vmclock_page",
@@ -149,8 +145,6 @@ static void vmclock_realize(DeviceState *dev, Error **errp)
vms->clk->clock_status = VMCLOCK_STATUS_UNKNOWN;
vms->clk->counter_id = VMCLOCK_COUNTER_INVALID;
- qemu_register_reset(vmclock_handle_reset, vms);
-
vmclock_update_guest(vms);
}
@@ -2446,7 +2446,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
uint8_t *u;
GArray *tables_blob = tables->table_data;
AcpiSlicOem slic_oem = { .id = NULL, .table_id = NULL };
- Object *vmgenid_dev, *vmclock_dev;
+ Object *vmgenid_dev;
char *oem_id;
char *oem_table_id;
@@ -2519,12 +2519,16 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine)
tables->vmgenid, tables->linker, x86ms->oem_id);
}
- vmclock_dev = find_vmclock_dev();
- if (vmclock_dev) {
- acpi_add_table(table_offsets, tables_blob);
- vmclock_build_acpi(VMCLOCK(vmclock_dev), tables_blob, tables->linker,
- x86ms->oem_id);
+#ifdef CONFIG_ACPI_VMCLOCK
+ {
+ Object *vmclock_dev = find_vmclock_dev();
+ if (vmclock_dev) {
+ acpi_add_table(table_offsets, tables_blob);
+ vmclock_build_acpi(VMCLOCK(vmclock_dev), tables_blob, tables->linker,
+ x86ms->oem_id);
+ }
}
+#endif
if (misc.has_hpet) {
acpi_add_table(table_offsets, tables_blob);
@@ -60,6 +60,7 @@
#include "hw/i386/kvm/xen_gnttab.h"
#include "hw/i386/kvm/xen_xenstore.h"
#include "hw/mem/memory-device.h"
+#include "hw/acpi/vmclock.h"
#include "e820_memory_layout.h"
#include "trace.h"
#include "sev.h"
@@ -635,6 +636,15 @@ void pc_machine_done(Notifier *notifier, void *data)
pci_bus_add_fw_cfg_extra_pci_roots(x86ms->fw_cfg, pcms->pcibus,
&error_abort);
+#ifdef CONFIG_ACPI_VMCLOCK
+ {
+ Object *vmclock = find_vmclock_dev();
+ if (vmclock) {
+ vmclock_mmio_map(vmclock, VMCLOCK_ADDR);
+ }
+ }
+#endif
+
acpi_setup();
if (x86ms->fw_cfg) {
fw_cfg_build_smbios(pcms, x86ms->fw_cfg, pcms->smbios_entry_point_type);
@@ -30,5 +30,6 @@ static inline Object *find_vmclock_dev(void)
void vmclock_build_acpi(VmclockState *vms, GArray *table_data,
BIOSLinker *linker, const char *oem_id);
+void vmclock_mmio_map(Object *dev, hwaddr addr);
#endif