diff options
-rw-r--r-- | hw/acpi/Makefile.objs | 1 | ||||
-rw-r--r-- | hw/acpi/bios-linker-loader.c (renamed from hw/i386/bios-linker-loader.c) | 2 | ||||
-rw-r--r-- | hw/acpi/ich9.c | 98 | ||||
-rw-r--r-- | hw/i386/Makefile.objs | 1 | ||||
-rw-r--r-- | hw/i386/acpi-build.c | 17 | ||||
-rw-r--r-- | hw/i386/acpi-dsdt-cpu-hotplug.dsl | 1 | ||||
-rw-r--r-- | hw/i386/acpi-dsdt.hex.generated | 43 | ||||
-rw-r--r-- | hw/i386/pc.c | 40 | ||||
-rw-r--r-- | hw/i386/q35-acpi-dsdt.hex.generated | 45 | ||||
-rw-r--r-- | hw/i386/smbios.c | 8 | ||||
-rw-r--r-- | hw/mem/pc-dimm.c | 37 | ||||
-rw-r--r-- | hw/pci/pci.c | 9 | ||||
-rw-r--r-- | hw/pci/pcie_host.c | 9 | ||||
-rw-r--r-- | hw/scsi/virtio-scsi.c | 2 | ||||
-rw-r--r-- | hw/virtio/dataplane/vring.c | 4 | ||||
-rw-r--r-- | include/hw/acpi/bios-linker-loader.h (renamed from hw/i386/bios-linker-loader.h) | 0 | ||||
-rw-r--r-- | include/hw/acpi/ich9.h | 4 | ||||
-rw-r--r-- | include/hw/mem/pc-dimm.h | 1 | ||||
-rw-r--r-- | include/hw/pci/pcie_host.h | 1 | ||||
-rw-r--r-- | tests/acpi-test-data/pc/DSDT | bin | 3592 -> 3621 bytes | |||
-rw-r--r-- | tests/acpi-test-data/q35/DSDT | bin | 8182 -> 8211 bytes | |||
-rw-r--r-- | tests/acpi-test-data/q35/SSDT | bin | 560 -> 560 bytes | |||
-rw-r--r-- | tests/bios-tables-test.c | 10 | ||||
-rw-r--r-- | trace-events | 4 |
24 files changed, 268 insertions, 69 deletions
diff --git a/hw/acpi/Makefile.objs b/hw/acpi/Makefile.objs index acd2389431..ee82073338 100644 --- a/hw/acpi/Makefile.objs +++ b/hw/acpi/Makefile.objs @@ -1,3 +1,4 @@ common-obj-$(CONFIG_ACPI) += core.o piix4.o ich9.o pcihp.o cpu_hotplug.o common-obj-$(CONFIG_ACPI) += memory_hotplug.o common-obj-$(CONFIG_ACPI) += acpi_interface.o +common-obj-$(CONFIG_ACPI) += bios-linker-loader.o diff --git a/hw/i386/bios-linker-loader.c b/hw/acpi/bios-linker-loader.c index aa56184e9a..5cc4d90c16 100644 --- a/hw/i386/bios-linker-loader.c +++ b/hw/acpi/bios-linker-loader.c @@ -19,7 +19,7 @@ */ #include "qemu-common.h" -#include "bios-linker-loader.h" +#include "hw/acpi/bios-linker-loader.h" #include "hw/nvram/fw_cfg.h" #include "qemu/bswap.h" diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c index 43869d7980..884dab3d45 100644 --- a/hw/acpi/ich9.c +++ b/hw/acpi/ich9.c @@ -219,7 +219,7 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm, acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io); - acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io, 2); + acpi_pm1_cnt_init(&pm->acpi_regs, &pm->io, pm->s4_val); acpi_gpe_init(&pm->acpi_regs, ICH9_PMIO_GPE0_LEN); memory_region_init_io(&pm->io_gpe, OBJECT(lpc_pci), &ich9_gpe_ops, pm, @@ -269,10 +269,94 @@ static void ich9_pm_set_memory_hotplug_support(Object *obj, bool value, s->pm.acpi_memory_hotplug.is_enabled = value; } +static void ich9_pm_get_disable_s3(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + uint8_t value = pm->disable_s3; + + visit_type_uint8(v, &value, name, errp); +} + +static void ich9_pm_set_disable_s3(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + Error *local_err = NULL; + uint8_t value; + + visit_type_uint8(v, &value, name, &local_err); + if (local_err) { + goto out; + } + pm->disable_s3 = value; +out: + error_propagate(errp, local_err); +} + +static void ich9_pm_get_disable_s4(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + uint8_t value = pm->disable_s4; + + visit_type_uint8(v, &value, name, errp); +} + +static void ich9_pm_set_disable_s4(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + Error *local_err = NULL; + uint8_t value; + + visit_type_uint8(v, &value, name, &local_err); + if (local_err) { + goto out; + } + pm->disable_s4 = value; +out: + error_propagate(errp, local_err); +} + +static void ich9_pm_get_s4_val(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + uint8_t value = pm->s4_val; + + visit_type_uint8(v, &value, name, errp); +} + +static void ich9_pm_set_s4_val(Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + ICH9LPCPMRegs *pm = opaque; + Error *local_err = NULL; + uint8_t value; + + visit_type_uint8(v, &value, name, &local_err); + if (local_err) { + goto out; + } + pm->s4_val = value; +out: + error_propagate(errp, local_err); +} + void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp) { static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN; pm->acpi_memory_hotplug.is_enabled = true; + pm->disable_s3 = 0; + pm->disable_s4 = 0; + pm->s4_val = 2; object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE, &pm->pm_io_base, errp); @@ -285,6 +369,18 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp) ich9_pm_get_memory_hotplug_support, ich9_pm_set_memory_hotplug_support, NULL); + object_property_add(obj, ACPI_PM_PROP_S3_DISABLED, "uint8", + ich9_pm_get_disable_s3, + ich9_pm_set_disable_s3, + NULL, pm, NULL); + object_property_add(obj, ACPI_PM_PROP_S4_DISABLED, "uint8", + ich9_pm_get_disable_s4, + ich9_pm_set_disable_s4, + NULL, pm, NULL); + object_property_add(obj, ACPI_PM_PROP_S4_VAL, "uint8", + ich9_pm_get_s4_val, + ich9_pm_set_s4_val, + NULL, pm, NULL); } void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState *dev, Error **errp) diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs index 9d419addb4..2b678ef2a6 100644 --- a/hw/i386/Makefile.objs +++ b/hw/i386/Makefile.objs @@ -7,7 +7,6 @@ obj-$(CONFIG_XEN) += ../xenpv/ xen/ obj-y += kvmvapic.o obj-y += acpi-build.o -obj-y += bios-linker-loader.o hw/i386/acpi-build.o: hw/i386/acpi-build.c hw/i386/acpi-dsdt.hex \ hw/i386/ssdt-proc.hex hw/i386/ssdt-pcihp.hex hw/i386/ssdt-misc.hex \ hw/i386/acpi-dsdt.hex hw/i386/q35-acpi-dsdt.hex \ diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 6a2e9c52bc..4944249b84 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -36,7 +36,7 @@ #include "hw/i386/acpi-defs.h" #include "hw/acpi/acpi.h" #include "hw/nvram/fw_cfg.h" -#include "bios-linker-loader.h" +#include "hw/acpi/bios-linker-loader.h" #include "hw/loader.h" #include "hw/isa/isa.h" #include "hw/acpi/memory_hotplug.h" @@ -305,6 +305,8 @@ static inline void build_append_array(GArray *array, GArray *val) g_array_append_vals(array, val->data, val->len); } +#define ACPI_NAMESEG_LEN 4 + static void GCC_FMT_ATTR(2, 3) build_append_nameseg(GArray *array, const char *format, ...) { @@ -317,8 +319,11 @@ build_append_nameseg(GArray *array, const char *format, ...) len = vsnprintf(s, sizeof s, format, args); va_end(args); - assert(len == 4); + assert(len <= ACPI_NAMESEG_LEN); + g_array_append_vals(array, s, len); + /* Pad up to ACPI_NAMESEG_LEN characters if necessary. */ + g_array_append_vals(array, "____", ACPI_NAMESEG_LEN - len); } /* 5.4 Definition Block Encoding */ @@ -859,7 +864,7 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state) if (bus->parent_dev) { op = 0x82; /* DeviceOp */ - build_append_nameseg(bus_table, "S%.02X_", + build_append_nameseg(bus_table, "S%.02X", bus->parent_dev->devfn); build_append_byte(bus_table, 0x08); /* NameOp */ build_append_nameseg(bus_table, "_SUN"); @@ -979,7 +984,7 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state) build_append_int(notify, 0x1U << i); build_append_byte(notify, 0x00); /* NullName */ build_append_byte(notify, 0x86); /* NotifyOp */ - build_append_nameseg(notify, "S%.02X_", PCI_DEVFN(i, 0)); + build_append_nameseg(notify, "S%.02X", PCI_DEVFN(i, 0)); build_append_byte(notify, 0x69); /* Arg1Op */ /* Pack it up */ @@ -1036,7 +1041,7 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state) if (bus->parent_dev) { build_append_byte(parent->notify_table, '^'); /* ParentPrefixChar */ build_append_byte(parent->notify_table, 0x2E); /* DualNamePrefix */ - build_append_nameseg(parent->notify_table, "S%.02X_", + build_append_nameseg(parent->notify_table, "S%.02X", bus->parent_dev->devfn); build_append_nameseg(parent->notify_table, "PCNT"); } @@ -1106,7 +1111,7 @@ build_ssdt(GArray *table_data, GArray *linker, GArray *sb_scope = build_alloc_array(); uint8_t op = 0x10; /* ScopeOp */ - build_append_nameseg(sb_scope, "_SB_"); + build_append_nameseg(sb_scope, "_SB"); /* build Processor object for each processor */ for (i = 0; i < acpi_cpus; i++) { diff --git a/hw/i386/acpi-dsdt-cpu-hotplug.dsl b/hw/i386/acpi-dsdt-cpu-hotplug.dsl index 34aab5af43..268d870990 100644 --- a/hw/i386/acpi-dsdt-cpu-hotplug.dsl +++ b/hw/i386/acpi-dsdt-cpu-hotplug.dsl @@ -94,6 +94,7 @@ Scope(\_SB) { Device(CPU_HOTPLUG_RESOURCE_DEVICE) { Name(_HID, EisaId("PNP0A06")) + Name(_UID, "CPU hotplug resources") Name(_CRS, ResourceTemplate() { IO(Decode16, CPU_STATUS_BASE, CPU_STATUS_BASE, 0, CPU_STATUS_LEN) diff --git a/hw/i386/acpi-dsdt.hex.generated b/hw/i386/acpi-dsdt.hex.generated index 875570e5b1..498b194a0c 100644 --- a/hw/i386/acpi-dsdt.hex.generated +++ b/hw/i386/acpi-dsdt.hex.generated @@ -3,12 +3,12 @@ static unsigned char AcpiDsdtAmlCode[] = { 0x53, 0x44, 0x54, -0x8, +0x25, 0xe, 0x0, 0x0, 0x1, -0xfc, +0x6c, 0x42, 0x58, 0x50, @@ -31,8 +31,8 @@ static unsigned char AcpiDsdtAmlCode[] = { 0x4e, 0x54, 0x4c, -0x28, -0x8, +0x7, +0x11, 0x14, 0x20, 0x10, @@ -2318,8 +2318,8 @@ static unsigned char AcpiDsdtAmlCode[] = { 0x53, 0x1, 0x10, -0x42, -0x11, +0x4f, +0x12, 0x5f, 0x53, 0x42, @@ -2551,7 +2551,8 @@ static unsigned char AcpiDsdtAmlCode[] = { 0x60, 0x5b, 0x82, -0x29, +0x46, +0x4, 0x50, 0x52, 0x45, @@ -2568,6 +2569,34 @@ static unsigned char AcpiDsdtAmlCode[] = { 0x6, 0x8, 0x5f, +0x55, +0x49, +0x44, +0xd, +0x43, +0x50, +0x55, +0x20, +0x68, +0x6f, +0x74, +0x70, +0x6c, +0x75, +0x67, +0x20, +0x72, +0x65, +0x73, +0x6f, +0x75, +0x72, +0x63, +0x65, +0x73, +0x0, +0x8, +0x5f, 0x43, 0x52, 0x53, diff --git a/hw/i386/pc.c b/hw/i386/pc.c index e07f1fac56..c7af6aae01 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1552,37 +1552,6 @@ void qemu_register_pc_machine(QEMUMachine *m) g_free(name); } -static int pc_dimm_count(Object *obj, void *opaque) -{ - int *count = opaque; - - if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { - (*count)++; - } - - object_child_foreach(obj, pc_dimm_count, opaque); - return 0; -} - -static int pc_existing_dimms_capacity(Object *obj, void *opaque) -{ - Error *local_err = NULL; - uint64_t *size = opaque; - - if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { - (*size) += object_property_get_int(obj, PC_DIMM_SIZE_PROP, &local_err); - - if (local_err) { - qerror_report_err(local_err); - error_free(local_err); - return 1; - } - } - - object_child_foreach(obj, pc_dimm_count, opaque); - return 0; -} - static void pc_dimm_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { @@ -1615,16 +1584,17 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev, goto out; } - if (pc_existing_dimms_capacity(OBJECT(machine), &existing_dimms_capacity)) { - error_setg(&local_err, "failed to get total size of existing DIMMs"); + existing_dimms_capacity = pc_existing_dimms_capacity(&local_err); + if (local_err) { goto out; } if (existing_dimms_capacity + memory_region_size(mr) > machine->maxram_size - machine->ram_size) { error_setg(&local_err, "not enough space, currently 0x%" PRIx64 - " in use of total 0x" RAM_ADDR_FMT, - existing_dimms_capacity, machine->maxram_size); + " in use of total hot pluggable 0x" RAM_ADDR_FMT, + existing_dimms_capacity, + machine->maxram_size - machine->ram_size); goto out; } diff --git a/hw/i386/q35-acpi-dsdt.hex.generated b/hw/i386/q35-acpi-dsdt.hex.generated index 4807bdf484..0d5b133150 100644 --- a/hw/i386/q35-acpi-dsdt.hex.generated +++ b/hw/i386/q35-acpi-dsdt.hex.generated @@ -3,12 +3,12 @@ static unsigned char Q35AcpiDsdtAmlCode[] = { 0x53, 0x44, 0x54, -0xf6, -0x1f, +0x13, +0x20, 0x0, 0x0, 0x1, -0x91, +0x0, 0x42, 0x58, 0x50, @@ -31,8 +31,8 @@ static unsigned char Q35AcpiDsdtAmlCode[] = { 0x4e, 0x54, 0x4c, -0x28, -0x8, +0x7, +0x11, 0x14, 0x20, 0x10, @@ -6959,8 +6959,8 @@ static unsigned char Q35AcpiDsdtAmlCode[] = { 0x53, 0x1, 0x10, -0x42, -0x11, +0x4f, +0x12, 0x5f, 0x53, 0x42, @@ -7192,7 +7192,8 @@ static unsigned char Q35AcpiDsdtAmlCode[] = { 0x60, 0x5b, 0x82, -0x29, +0x46, +0x4, 0x50, 0x52, 0x45, @@ -7209,6 +7210,34 @@ static unsigned char Q35AcpiDsdtAmlCode[] = { 0x6, 0x8, 0x5f, +0x55, +0x49, +0x44, +0xd, +0x43, +0x50, +0x55, +0x20, +0x68, +0x6f, +0x74, +0x70, +0x6c, +0x75, +0x67, +0x20, +0x72, +0x65, +0x73, +0x6f, +0x75, +0x72, +0x63, +0x65, +0x73, +0x0, +0x8, +0x5f, 0x43, 0x52, 0x53, diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c index 024e59445b..12d213769d 100644 --- a/hw/i386/smbios.c +++ b/hw/i386/smbios.c @@ -618,8 +618,9 @@ static void smbios_build_type_4_table(unsigned instance) SMBIOS_TABLE_SET_STR(4, processor_version_str, type4.version); t->voltage = 0; t->external_clock = cpu_to_le16(0); /* Unknown */ - t->max_speed = cpu_to_le16(0); /* Unknown */ - t->current_speed = cpu_to_le16(0); /* Unknown */ + /* SVVP requires max_speed and current_speed to not be unknown. */ + t->max_speed = cpu_to_le16(2000); /* 2000 MHz */ + t->current_speed = cpu_to_le16(2000); /* 2000 MHz */ t->status = 0x41; /* Socket populated, CPU enabled */ t->processor_upgrade = 0x01; /* Other */ t->l1_cache_handle = cpu_to_le16(0xFFFF); /* N/A */ @@ -850,7 +851,8 @@ void smbios_get_tables(uint8_t **tables, size_t *tables_len, } #define MAX_DIMM_SZ (16ll * ONE_GB) -#define GET_DIMM_SZ ((i < dimm_cnt - 1) ? MAX_DIMM_SZ : ram_size % MAX_DIMM_SZ) +#define GET_DIMM_SZ ((i < dimm_cnt - 1) ? MAX_DIMM_SZ \ + : ((ram_size - 1) % MAX_DIMM_SZ) + 1) dimm_cnt = QEMU_ALIGN_UP(ram_size, MAX_DIMM_SZ) / MAX_DIMM_SZ; diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index d431834030..18cdc54bf9 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -23,6 +23,43 @@ #include "qapi/visitor.h" #include "qemu/range.h" +typedef struct pc_dimms_capacity { + uint64_t size; + Error **errp; +} pc_dimms_capacity; + +static int pc_existing_dimms_capacity_internal(Object *obj, void *opaque) +{ + pc_dimms_capacity *cap = opaque; + uint64_t *size = &cap->size; + + if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { + DeviceState *dev = DEVICE(obj); + + if (dev->realized) { + (*size) += object_property_get_int(obj, PC_DIMM_SIZE_PROP, + cap->errp); + } + + if (cap->errp && *cap->errp) { + return 1; + } + } + object_child_foreach(obj, pc_existing_dimms_capacity_internal, opaque); + return 0; +} + +uint64_t pc_existing_dimms_capacity(Error **errp) +{ + pc_dimms_capacity cap; + + cap.size = 0; + cap.errp = errp; + + pc_existing_dimms_capacity_internal(qdev_get_machine(), &cap); + return cap.size; +} + int qmp_pc_dimm_device_list(Object *obj, void *opaque) { MemoryDeviceInfoList ***prev = opaque; diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 371699cf86..d5e0e419c2 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -32,6 +32,7 @@ #include "hw/loader.h" #include "qemu/range.h" #include "qmp-commands.h" +#include "trace.h" #include "hw/pci/msi.h" #include "hw/pci/msix.h" #include "exec/address-spaces.h" @@ -1106,10 +1107,18 @@ static void pci_update_mappings(PCIDevice *d) /* now do the real mapping */ if (r->addr != PCI_BAR_UNMAPPED) { + trace_pci_update_mappings_del(d, pci_bus_num(d->bus), + PCI_FUNC(d->devfn), + PCI_SLOT(d->devfn), + i, r->addr, r->size); memory_region_del_subregion(r->address_space, r->memory); } r->addr = new_addr; if (r->addr != PCI_BAR_UNMAPPED) { + trace_pci_update_mappings_add(d, pci_bus_num(d->bus), + PCI_FUNC(d->devfn), + PCI_SLOT(d->devfn), + i, r->addr, r->size); memory_region_add_subregion_overlap(r->address_space, r->addr, r->memory, 1); } diff --git a/hw/pci/pcie_host.c b/hw/pci/pcie_host.c index 3db038fc7f..dfb4a2b505 100644 --- a/hw/pci/pcie_host.c +++ b/hw/pci/pcie_host.c @@ -98,8 +98,7 @@ void pcie_host_mmcfg_unmap(PCIExpressHost *e) } } -void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr, - uint32_t size) +void pcie_host_mmcfg_init(PCIExpressHost *e, uint32_t size) { assert(!(size & (size - 1))); /* power of 2 */ assert(size >= PCIE_MMCFG_SIZE_MIN); @@ -107,6 +106,12 @@ void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr, e->size = size; memory_region_init_io(&e->mmio, OBJECT(e), &pcie_mmcfg_ops, e, "pcie-mmcfg", e->size); +} + +void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr, + uint32_t size) +{ + pcie_host_mmcfg_init(e, size); e->base_addr = addr; memory_region_add_subregion(get_system_memory(), e->base_addr, &e->mmio); } diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index b06dd390d2..9e2c718be7 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -144,7 +144,7 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req, * * TODO: always disable this workaround for virtio 1.0 devices. */ - if ((vdev->guest_features & VIRTIO_F_ANY_LAYOUT) == 0) { + if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) { req_size = req->elem.out_sg[0].iov_len; resp_size = req->elem.in_sg[0].iov_len; } diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c index 61f6d83686..78c6f45a07 100644 --- a/hw/virtio/dataplane/vring.c +++ b/hw/virtio/dataplane/vring.c @@ -133,12 +133,12 @@ bool vring_should_notify(VirtIODevice *vdev, Vring *vring) * interrupts. */ smp_mb(); - if ((vdev->guest_features & VIRTIO_F_NOTIFY_ON_EMPTY) && + if ((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) && unlikely(vring->vr.avail->idx == vring->last_avail_idx)) { return true; } - if (!(vdev->guest_features & VIRTIO_RING_F_EVENT_IDX)) { + if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) { return !(vring->vr.avail->flags & VRING_AVAIL_F_NO_INTERRUPT); } old = vring->signalled_used; diff --git a/hw/i386/bios-linker-loader.h b/include/hw/acpi/bios-linker-loader.h index 498c0af773..498c0af773 100644 --- a/hw/i386/bios-linker-loader.h +++ b/include/hw/acpi/bios-linker-loader.h diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h index fe975e6624..12d7a7af5f 100644 --- a/include/hw/acpi/ich9.h +++ b/include/hw/acpi/ich9.h @@ -49,6 +49,10 @@ typedef struct ICH9LPCPMRegs { AcpiCpuHotplug gpe_cpu; MemHotplugState acpi_memory_hotplug; + + uint8_t disable_s3; + uint8_t disable_s4; + uint8_t s4_val; } ICH9LPCPMRegs; void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm, diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h index e1dcbbcd58..f7b80b44b7 100644 --- a/include/hw/mem/pc-dimm.h +++ b/include/hw/mem/pc-dimm.h @@ -78,4 +78,5 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start, int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp); int qmp_pc_dimm_device_list(Object *obj, void *opaque); +uint64_t pc_existing_dimms_capacity(Error **errp); #endif diff --git a/include/hw/pci/pcie_host.h b/include/hw/pci/pcie_host.h index ff44ef6fca..4d23c80759 100644 --- a/include/hw/pci/pcie_host.h +++ b/include/hw/pci/pcie_host.h @@ -50,6 +50,7 @@ struct PCIExpressHost { }; void pcie_host_mmcfg_unmap(PCIExpressHost *e); +void pcie_host_mmcfg_init(PCIExpressHost *e, uint32_t size); void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr, uint32_t size); void pcie_host_mmcfg_update(PCIExpressHost *e, int enable, diff --git a/tests/acpi-test-data/pc/DSDT b/tests/acpi-test-data/pc/DSDT Binary files differindex ee9cc6781c..010d74603f 100644 --- a/tests/acpi-test-data/pc/DSDT +++ b/tests/acpi-test-data/pc/DSDT diff --git a/tests/acpi-test-data/q35/DSDT b/tests/acpi-test-data/q35/DSDT Binary files differindex ef0c75f423..8ac32efc03 100644 --- a/tests/acpi-test-data/q35/DSDT +++ b/tests/acpi-test-data/q35/DSDT diff --git a/tests/acpi-test-data/q35/SSDT b/tests/acpi-test-data/q35/SSDT Binary files differindex 4e45510181..2cb3e08bd4 100644 --- a/tests/acpi-test-data/q35/SSDT +++ b/tests/acpi-test-data/q35/SSDT diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index 2519f7d0e2..4d0fa848b1 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -765,7 +765,7 @@ static void test_acpi_one(const char *params, test_data *data) g_free(args); } -static void test_acpi_tcg(void) +static void test_acpi_piix4_tcg(void) { test_data data; @@ -776,6 +776,11 @@ static void test_acpi_tcg(void) data.machine = MACHINE_PC; test_acpi_one("-machine accel=tcg", &data); free_test_data(&data); +} + +static void test_acpi_q35_tcg(void) +{ + test_data data; memset(&data, 0, sizeof(data)); data.machine = MACHINE_Q35; @@ -799,7 +804,8 @@ int main(int argc, char *argv[]) g_test_init(&argc, &argv, NULL); if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { - qtest_add_func("acpi/tcg", test_acpi_tcg); + qtest_add_func("acpi/piix4/tcg", test_acpi_piix4_tcg); + qtest_add_func("acpi/q35/tcg", test_acpi_q35_tcg); } ret = g_test_run(); unlink(disk); diff --git a/trace-events b/trace-events index 4ec81eb534..04f5df2526 100644 --- a/trace-events +++ b/trace-events @@ -1247,6 +1247,10 @@ spapr_pci_msi_write(uint64_t addr, uint64_t data, uint32_t dt_irq) "@%"PRIx64"<= spapr_pci_lsi_set(const char *busname, int pin, uint32_t irq) "%s PIN%d IRQ %u" spapr_pci_msi_retry(unsigned config_addr, unsigned req_num, unsigned max_irqs) "Guest device at %x asked %u, have only %u" +# hw/pci/pci.c +pci_update_mappings_del(void *d, uint32_t bus, uint32_t func, uint32_t slot, int bar, uint64_t addr, uint64_t size) "d=%p %02x:%02x.%x %d,%#"PRIx64"+%#"PRIx64 +pci_update_mappings_add(void *d, uint32_t bus, uint32_t func, uint32_t slot, int bar, uint64_t addr, uint64_t size) "d=%p %02x:%02x.%x %d,%#"PRIx64"+%#"PRIx64 + # hw/intc/xics.c xics_icp_check_ipi(int server, uint8_t mfrr) "CPU %d can take IPI mfrr=%#x" xics_icp_accept(uint32_t old_xirr, uint32_t new_xirr) "icp_accept: XIRR %#"PRIx32"->%#"PRIx32 |