* [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix
@ 2025-06-18 11:27 Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init() Mark Cave-Ayland
` (11 more replies)
0 siblings, 12 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
For various historical reasons the initialisation of the isapc machine is closely
intertwined with the initialisation of the pc machine, which is preventing some
future improvements to the pc machine initialisation logic.
Since the consensus [1] was that the isapc is still useful for testing and running
older OSs, this series splits the isapc machine and its main initialisation
routine pc_init_isa() into a separate isapc.c file to reduce the maintenance
burden on pc machine developers.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
[1] https://lists.gnu.org/archive/html/qemu-devel/2024-03/msg06137.html
v2:
- Rebase onto master to account for the fix in commit 0b006153b7
("hw/i386/pc_piix: Fix RTC ISA IRQ wiring of isapc machine")
- Replace verbatim MIT licence text with SPDX identifier as discussed
with Daniel
Mark Cave-Ayland (12):
hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init()
hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation
from pc_init_isa()
hw/i386/pc_piix.c: remove SMI and piix4_pm initialisation from
pc_init_isa()
hw/i386/pc_piix.c: remove SGX initialisation from pc_init_isa()
hw/i386/pc_piix.c: remove nvdimm initialisation from pc_init_isa()
hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa()
hw/i386/pc_piix.c: hardcode hole64_size to 0 in pc_init_isa()
hw/i386/pc_piix.c: remove pc_system_flash_cleanup_unused() from
pc_init_isa()
hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa()
hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false in
pc_init_isa()
hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL in pc_init_isa()
hw/i386: move isapc machine to separate isapc.c file
hw/i386/Kconfig | 3 -
hw/i386/isapc.c | 145 ++++++++++++++++++++++++++++++++++++++++++++
hw/i386/meson.build | 1 +
hw/i386/pc_piix.c | 31 ----------
4 files changed, 146 insertions(+), 34 deletions(-)
create mode 100644 hw/i386/isapc.c
--
2.43.0
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:47 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa() Mark Cave-Ayland
` (10 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
This is to prepare for splitting the isapc machine into its own separate file.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 260 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 259 insertions(+), 1 deletion(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index ea7572e783..9842d2152b 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -418,7 +418,265 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp)
#ifdef CONFIG_ISAPC
static void pc_init_isa(MachineState *machine)
{
- pc_init1(machine, NULL);
+ const char *pci_type = NULL;
+ PCMachineState *pcms = PC_MACHINE(machine);
+ PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+ X86MachineState *x86ms = X86_MACHINE(machine);
+ MemoryRegion *system_memory = get_system_memory();
+ MemoryRegion *system_io = get_system_io();
+ Object *phb = NULL;
+ ISABus *isa_bus;
+ Object *piix4_pm = NULL;
+ qemu_irq smi_irq;
+ GSIState *gsi_state;
+ MemoryRegion *ram_memory;
+ MemoryRegion *pci_memory = NULL;
+ MemoryRegion *rom_memory = system_memory;
+ ram_addr_t lowmem;
+ uint64_t hole64_size = 0;
+
+ /*
+ * Calculate ram split, for memory below and above 4G. It's a bit
+ * complicated for backward compatibility reasons ...
+ *
+ * - Traditional split is 3.5G (lowmem = 0xe0000000). This is the
+ * default value for max_ram_below_4g now.
+ *
+ * - Then, to gigabyte align the memory, we move the split to 3G
+ * (lowmem = 0xc0000000). But only in case we have to split in
+ * the first place, i.e. ram_size is larger than (traditional)
+ * lowmem. And for new machine types (gigabyte_align = true)
+ * only, for live migration compatibility reasons.
+ *
+ * - Next the max-ram-below-4g option was added, which allowed to
+ * reduce lowmem to a smaller value, to allow a larger PCI I/O
+ * window below 4G. qemu doesn't enforce gigabyte alignment here,
+ * but prints a warning.
+ *
+ * - Finally max-ram-below-4g got updated to also allow raising lowmem,
+ * so legacy non-PAE guests can get as much memory as possible in
+ * the 32bit address space below 4G.
+ *
+ * - Note that Xen has its own ram setup code in xen_ram_init(),
+ * called via xen_hvm_init_pc().
+ *
+ * Examples:
+ * qemu -M pc-1.7 -m 4G (old default) -> 3584M low, 512M high
+ * qemu -M pc -m 4G (new default) -> 3072M low, 1024M high
+ * qemu -M pc,max-ram-below-4g=2G -m 4G -> 2048M low, 2048M high
+ * qemu -M pc,max-ram-below-4g=4G -m 3968M -> 3968M low (=4G-128M)
+ */
+ if (xen_enabled()) {
+ xen_hvm_init_pc(pcms, &ram_memory);
+ } else {
+ ram_memory = machine->ram;
+ if (!pcms->max_ram_below_4g) {
+ pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
+ }
+ lowmem = pcms->max_ram_below_4g;
+ if (machine->ram_size >= pcms->max_ram_below_4g) {
+ if (pcmc->gigabyte_align) {
+ if (lowmem > 0xc0000000) {
+ lowmem = 0xc0000000;
+ }
+ if (lowmem & (1 * GiB - 1)) {
+ warn_report("Large machine and max_ram_below_4g "
+ "(%" PRIu64 ") not a multiple of 1G; "
+ "possible bad performance.",
+ pcms->max_ram_below_4g);
+ }
+ }
+ }
+
+ if (machine->ram_size >= lowmem) {
+ x86ms->above_4g_mem_size = machine->ram_size - lowmem;
+ x86ms->below_4g_mem_size = lowmem;
+ } else {
+ x86ms->above_4g_mem_size = 0;
+ x86ms->below_4g_mem_size = machine->ram_size;
+ }
+ }
+
+ pc_machine_init_sgx_epc(pcms);
+ x86_cpus_init(x86ms, pcmc->default_cpu_version);
+
+ if (kvm_enabled()) {
+ kvmclock_create(pcmc->kvmclock_create_always);
+ }
+
+ if (pcmc->pci_enabled) {
+ pci_memory = g_new(MemoryRegion, 1);
+ memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
+ rom_memory = pci_memory;
+
+ phb = OBJECT(qdev_new(TYPE_I440FX_PCI_HOST_BRIDGE));
+ object_property_add_child(OBJECT(machine), "i440fx", phb);
+ object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
+ OBJECT(ram_memory), &error_fatal);
+ object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
+ OBJECT(pci_memory), &error_fatal);
+ object_property_set_link(phb, PCI_HOST_PROP_SYSTEM_MEM,
+ OBJECT(system_memory), &error_fatal);
+ object_property_set_link(phb, PCI_HOST_PROP_IO_MEM,
+ OBJECT(system_io), &error_fatal);
+ object_property_set_uint(phb, PCI_HOST_BELOW_4G_MEM_SIZE,
+ x86ms->below_4g_mem_size, &error_fatal);
+ object_property_set_uint(phb, PCI_HOST_ABOVE_4G_MEM_SIZE,
+ x86ms->above_4g_mem_size, &error_fatal);
+ object_property_set_str(phb, I440FX_HOST_PROP_PCI_TYPE, pci_type,
+ &error_fatal);
+ sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
+
+ pcms->pcibus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pci.0"));
+ pci_bus_map_irqs(pcms->pcibus,
+ xen_enabled() ? xen_pci_slot_get_pirq
+ : pc_pci_slot_get_pirq);
+
+ hole64_size = object_property_get_uint(phb,
+ PCI_HOST_PROP_PCI_HOLE64_SIZE,
+ &error_abort);
+ }
+
+ /* allocate ram and load rom/bios */
+ if (!xen_enabled()) {
+ pc_memory_init(pcms, system_memory, rom_memory, hole64_size);
+ } else {
+ assert(machine->ram_size == x86ms->below_4g_mem_size +
+ x86ms->above_4g_mem_size);
+
+ pc_system_flash_cleanup_unused(pcms);
+ if (machine->kernel_filename != NULL) {
+ /* For xen HVM direct kernel boot, load linux here */
+ xen_load_linux(pcms);
+ }
+ }
+
+ gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
+
+ if (pcmc->pci_enabled) {
+ PCIDevice *pci_dev;
+ DeviceState *dev;
+ size_t i;
+
+ pci_dev = pci_new_multifunction(-1, pcms->south_bridge);
+ object_property_set_bool(OBJECT(pci_dev), "has-usb",
+ machine_usb(machine), &error_abort);
+ object_property_set_bool(OBJECT(pci_dev), "has-acpi",
+ x86_machine_is_acpi_enabled(x86ms),
+ &error_abort);
+ object_property_set_bool(OBJECT(pci_dev), "has-pic", false,
+ &error_abort);
+ object_property_set_bool(OBJECT(pci_dev), "has-pit", false,
+ &error_abort);
+ qdev_prop_set_uint32(DEVICE(pci_dev), "smb_io_base", 0xb100);
+ object_property_set_bool(OBJECT(pci_dev), "smm-enabled",
+ x86_machine_is_smm_enabled(x86ms),
+ &error_abort);
+ dev = DEVICE(pci_dev);
+ for (i = 0; i < ISA_NUM_IRQS; i++) {
+ qdev_connect_gpio_out_named(dev, "isa-irqs", i, x86ms->gsi[i]);
+ }
+ pci_realize_and_unref(pci_dev, pcms->pcibus, &error_fatal);
+
+ if (xen_enabled()) {
+ pci_device_set_intx_routing_notifier(
+ pci_dev, piix_intx_routing_notifier_xen);
+
+ /*
+ * Xen supports additional interrupt routes from the PCI devices to
+ * the IOAPIC: the four pins of each PCI device on the bus are also
+ * connected to the IOAPIC directly.
+ * These additional routes can be discovered through ACPI.
+ */
+ pci_bus_irqs(pcms->pcibus, xen_intx_set_irq, pci_dev,
+ XEN_IOAPIC_NUM_PIRQS);
+ }
+
+ isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(pci_dev), "isa.0"));
+ x86ms->rtc = ISA_DEVICE(object_resolve_path_component(OBJECT(pci_dev),
+ "rtc"));
+ piix4_pm = object_resolve_path_component(OBJECT(pci_dev), "pm");
+ dev = DEVICE(object_resolve_path_component(OBJECT(pci_dev), "ide"));
+ pci_ide_create_devs(PCI_DEVICE(dev));
+ pcms->idebus[0] = qdev_get_child_bus(dev, "ide.0");
+ pcms->idebus[1] = qdev_get_child_bus(dev, "ide.1");
+ } else {
+ isa_bus = isa_bus_new(NULL, system_memory, system_io,
+ &error_abort);
+ isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
+
+ x86ms->rtc = isa_new(TYPE_MC146818_RTC);
+ qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
+ isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
+
+ i8257_dma_init(OBJECT(machine), isa_bus, 0);
+ pcms->hpet_enabled = false;
+ }
+
+ if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
+ pc_i8259_create(isa_bus, gsi_state->i8259_irq);
+ }
+
+ if (phb) {
+ ioapic_init_gsi(gsi_state, phb);
+ }
+
+ if (tcg_enabled()) {
+ x86_register_ferr_irq(x86ms->gsi[13]);
+ }
+
+ pc_vga_init(isa_bus, pcmc->pci_enabled ? pcms->pcibus : NULL);
+
+ /* init basic PC hardware */
+ pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
+ !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
+
+ pc_nic_init(pcmc, isa_bus, pcms->pcibus);
+
+#ifdef CONFIG_IDE_ISA
+ if (!pcmc->pci_enabled) {
+ DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+ int i;
+
+ ide_drive_get(hd, ARRAY_SIZE(hd));
+ for (i = 0; i < MAX_IDE_BUS; i++) {
+ ISADevice *dev;
+ char busname[] = "ide.0";
+ dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+ ide_irq[i],
+ hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+ /*
+ * The ide bus name is ide.0 for the first bus and ide.1 for the
+ * second one.
+ */
+ busname[4] = '0' + i;
+ pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
+ }
+ }
+#endif
+
+ if (piix4_pm) {
+ smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
+
+ qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
+ pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
+ /* TODO: Populate SPD eeprom data. */
+ smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
+
+ object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
+ TYPE_HOTPLUG_HANDLER,
+ (Object **)&x86ms->acpi_dev,
+ object_property_allow_set_link,
+ OBJ_PROP_LINK_STRONG);
+ object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
+ piix4_pm, &error_abort);
+ }
+
+ if (machine->nvdimms_state->is_enabled) {
+ nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
+ x86_nvdimm_acpi_dsmio,
+ x86ms->fw_cfg, OBJECT(pcms));
+ }
}
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init() Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:47 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm " Mark Cave-Ayland
` (9 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
This code will never be used for an isapc machine.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 105 ++++------------------------------------------
1 file changed, 8 insertions(+), 97 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 9842d2152b..102e785d27 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -418,19 +418,16 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp)
#ifdef CONFIG_ISAPC
static void pc_init_isa(MachineState *machine)
{
- const char *pci_type = NULL;
PCMachineState *pcms = PC_MACHINE(machine);
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
X86MachineState *x86ms = X86_MACHINE(machine);
MemoryRegion *system_memory = get_system_memory();
MemoryRegion *system_io = get_system_io();
- Object *phb = NULL;
ISABus *isa_bus;
Object *piix4_pm = NULL;
qemu_irq smi_irq;
GSIState *gsi_state;
MemoryRegion *ram_memory;
- MemoryRegion *pci_memory = NULL;
MemoryRegion *rom_memory = system_memory;
ram_addr_t lowmem;
uint64_t hole64_size = 0;
@@ -504,39 +501,6 @@ static void pc_init_isa(MachineState *machine)
kvmclock_create(pcmc->kvmclock_create_always);
}
- if (pcmc->pci_enabled) {
- pci_memory = g_new(MemoryRegion, 1);
- memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
- rom_memory = pci_memory;
-
- phb = OBJECT(qdev_new(TYPE_I440FX_PCI_HOST_BRIDGE));
- object_property_add_child(OBJECT(machine), "i440fx", phb);
- object_property_set_link(phb, PCI_HOST_PROP_RAM_MEM,
- OBJECT(ram_memory), &error_fatal);
- object_property_set_link(phb, PCI_HOST_PROP_PCI_MEM,
- OBJECT(pci_memory), &error_fatal);
- object_property_set_link(phb, PCI_HOST_PROP_SYSTEM_MEM,
- OBJECT(system_memory), &error_fatal);
- object_property_set_link(phb, PCI_HOST_PROP_IO_MEM,
- OBJECT(system_io), &error_fatal);
- object_property_set_uint(phb, PCI_HOST_BELOW_4G_MEM_SIZE,
- x86ms->below_4g_mem_size, &error_fatal);
- object_property_set_uint(phb, PCI_HOST_ABOVE_4G_MEM_SIZE,
- x86ms->above_4g_mem_size, &error_fatal);
- object_property_set_str(phb, I440FX_HOST_PROP_PCI_TYPE, pci_type,
- &error_fatal);
- sysbus_realize_and_unref(SYS_BUS_DEVICE(phb), &error_fatal);
-
- pcms->pcibus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pci.0"));
- pci_bus_map_irqs(pcms->pcibus,
- xen_enabled() ? xen_pci_slot_get_pirq
- : pc_pci_slot_get_pirq);
-
- hole64_size = object_property_get_uint(phb,
- PCI_HOST_PROP_PCI_HOLE64_SIZE,
- &error_abort);
- }
-
/* allocate ram and load rom/bios */
if (!xen_enabled()) {
pc_memory_init(pcms, system_memory, rom_memory, hole64_size);
@@ -553,74 +517,21 @@ static void pc_init_isa(MachineState *machine)
gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
- if (pcmc->pci_enabled) {
- PCIDevice *pci_dev;
- DeviceState *dev;
- size_t i;
-
- pci_dev = pci_new_multifunction(-1, pcms->south_bridge);
- object_property_set_bool(OBJECT(pci_dev), "has-usb",
- machine_usb(machine), &error_abort);
- object_property_set_bool(OBJECT(pci_dev), "has-acpi",
- x86_machine_is_acpi_enabled(x86ms),
- &error_abort);
- object_property_set_bool(OBJECT(pci_dev), "has-pic", false,
- &error_abort);
- object_property_set_bool(OBJECT(pci_dev), "has-pit", false,
- &error_abort);
- qdev_prop_set_uint32(DEVICE(pci_dev), "smb_io_base", 0xb100);
- object_property_set_bool(OBJECT(pci_dev), "smm-enabled",
- x86_machine_is_smm_enabled(x86ms),
- &error_abort);
- dev = DEVICE(pci_dev);
- for (i = 0; i < ISA_NUM_IRQS; i++) {
- qdev_connect_gpio_out_named(dev, "isa-irqs", i, x86ms->gsi[i]);
- }
- pci_realize_and_unref(pci_dev, pcms->pcibus, &error_fatal);
-
- if (xen_enabled()) {
- pci_device_set_intx_routing_notifier(
- pci_dev, piix_intx_routing_notifier_xen);
-
- /*
- * Xen supports additional interrupt routes from the PCI devices to
- * the IOAPIC: the four pins of each PCI device on the bus are also
- * connected to the IOAPIC directly.
- * These additional routes can be discovered through ACPI.
- */
- pci_bus_irqs(pcms->pcibus, xen_intx_set_irq, pci_dev,
- XEN_IOAPIC_NUM_PIRQS);
- }
-
- isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(pci_dev), "isa.0"));
- x86ms->rtc = ISA_DEVICE(object_resolve_path_component(OBJECT(pci_dev),
- "rtc"));
- piix4_pm = object_resolve_path_component(OBJECT(pci_dev), "pm");
- dev = DEVICE(object_resolve_path_component(OBJECT(pci_dev), "ide"));
- pci_ide_create_devs(PCI_DEVICE(dev));
- pcms->idebus[0] = qdev_get_child_bus(dev, "ide.0");
- pcms->idebus[1] = qdev_get_child_bus(dev, "ide.1");
- } else {
- isa_bus = isa_bus_new(NULL, system_memory, system_io,
- &error_abort);
- isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
+ isa_bus = isa_bus_new(NULL, system_memory, system_io,
+ &error_abort);
+ isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
- x86ms->rtc = isa_new(TYPE_MC146818_RTC);
- qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
- isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
+ x86ms->rtc = isa_new(TYPE_MC146818_RTC);
+ qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
+ isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
- i8257_dma_init(OBJECT(machine), isa_bus, 0);
- pcms->hpet_enabled = false;
- }
+ i8257_dma_init(OBJECT(machine), isa_bus, 0);
+ pcms->hpet_enabled = false;
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
pc_i8259_create(isa_bus, gsi_state->i8259_irq);
}
- if (phb) {
- ioapic_init_gsi(gsi_state, phb);
- }
-
if (tcg_enabled()) {
x86_register_ferr_irq(x86ms->gsi[13]);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm initialisation from pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init() Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa() Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 04/12] hw/i386/pc_piix.c: remove SGX " Mark Cave-Ayland
` (8 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
These are based upon the PIIX4 PCI chipset and so can never be used on an isapc machine.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 19 -------------------
1 file changed, 19 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 102e785d27..2ce3a3463f 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -424,8 +424,6 @@ static void pc_init_isa(MachineState *machine)
MemoryRegion *system_memory = get_system_memory();
MemoryRegion *system_io = get_system_io();
ISABus *isa_bus;
- Object *piix4_pm = NULL;
- qemu_irq smi_irq;
GSIState *gsi_state;
MemoryRegion *ram_memory;
MemoryRegion *rom_memory = system_memory;
@@ -566,23 +564,6 @@ static void pc_init_isa(MachineState *machine)
}
#endif
- if (piix4_pm) {
- smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
-
- qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
- pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
- /* TODO: Populate SPD eeprom data. */
- smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
-
- object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
- TYPE_HOTPLUG_HANDLER,
- (Object **)&x86ms->acpi_dev,
- object_property_allow_set_link,
- OBJ_PROP_LINK_STRONG);
- object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
- piix4_pm, &error_abort);
- }
-
if (machine->nvdimms_state->is_enabled) {
nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
x86_nvdimm_acpi_dsmio,
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 04/12] hw/i386/pc_piix.c: remove SGX initialisation from pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (2 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm " Mark Cave-Ayland
` (7 subsequent siblings)
11 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
The Intel SGX instructions only exist on recent CPUs and so would never be available
on a CPU from the pre-PCI era.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 2ce3a3463f..d4fb9787cb 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -492,7 +492,6 @@ static void pc_init_isa(MachineState *machine)
}
}
- pc_machine_init_sgx_epc(pcms);
x86_cpus_init(x86ms, pcmc->default_cpu_version);
if (kvm_enabled()) {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm initialisation from pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (3 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 04/12] hw/i386/pc_piix.c: remove SGX " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa() Mark Cave-Ayland
` (6 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
NVDIMMs cannot be used by PCs from a pre-PCI era.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index d4fb9787cb..640583e163 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -562,12 +562,6 @@ static void pc_init_isa(MachineState *machine)
}
}
#endif
-
- if (machine->nvdimms_state->is_enabled) {
- nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
- x86_nvdimm_acpi_dsmio,
- x86ms->fw_cfg, OBJECT(pcms));
- }
}
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (4 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 " Mark Cave-Ayland
` (5 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
All isapc machines must have 32-bit CPUs and so the RAM split logic can be hardcoded
accordingly.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 58 ++++-------------------------------------------
1 file changed, 4 insertions(+), 54 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 640583e163..168469457e 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -427,69 +427,19 @@ static void pc_init_isa(MachineState *machine)
GSIState *gsi_state;
MemoryRegion *ram_memory;
MemoryRegion *rom_memory = system_memory;
- ram_addr_t lowmem;
uint64_t hole64_size = 0;
/*
- * Calculate ram split, for memory below and above 4G. It's a bit
- * complicated for backward compatibility reasons ...
- *
- * - Traditional split is 3.5G (lowmem = 0xe0000000). This is the
- * default value for max_ram_below_4g now.
- *
- * - Then, to gigabyte align the memory, we move the split to 3G
- * (lowmem = 0xc0000000). But only in case we have to split in
- * the first place, i.e. ram_size is larger than (traditional)
- * lowmem. And for new machine types (gigabyte_align = true)
- * only, for live migration compatibility reasons.
- *
- * - Next the max-ram-below-4g option was added, which allowed to
- * reduce lowmem to a smaller value, to allow a larger PCI I/O
- * window below 4G. qemu doesn't enforce gigabyte alignment here,
- * but prints a warning.
- *
- * - Finally max-ram-below-4g got updated to also allow raising lowmem,
- * so legacy non-PAE guests can get as much memory as possible in
- * the 32bit address space below 4G.
- *
- * - Note that Xen has its own ram setup code in xen_ram_init(),
- * called via xen_hvm_init_pc().
- *
- * Examples:
- * qemu -M pc-1.7 -m 4G (old default) -> 3584M low, 512M high
- * qemu -M pc -m 4G (new default) -> 3072M low, 1024M high
- * qemu -M pc,max-ram-below-4g=2G -m 4G -> 2048M low, 2048M high
- * qemu -M pc,max-ram-below-4g=4G -m 3968M -> 3968M low (=4G-128M)
+ * There is no RAM split for the isapc machine
*/
if (xen_enabled()) {
xen_hvm_init_pc(pcms, &ram_memory);
} else {
ram_memory = machine->ram;
- if (!pcms->max_ram_below_4g) {
- pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
- }
- lowmem = pcms->max_ram_below_4g;
- if (machine->ram_size >= pcms->max_ram_below_4g) {
- if (pcmc->gigabyte_align) {
- if (lowmem > 0xc0000000) {
- lowmem = 0xc0000000;
- }
- if (lowmem & (1 * GiB - 1)) {
- warn_report("Large machine and max_ram_below_4g "
- "(%" PRIu64 ") not a multiple of 1G; "
- "possible bad performance.",
- pcms->max_ram_below_4g);
- }
- }
- }
- if (machine->ram_size >= lowmem) {
- x86ms->above_4g_mem_size = machine->ram_size - lowmem;
- x86ms->below_4g_mem_size = lowmem;
- } else {
- x86ms->above_4g_mem_size = 0;
- x86ms->below_4g_mem_size = machine->ram_size;
- }
+ pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
+ x86ms->above_4g_mem_size = 0;
+ x86ms->below_4g_mem_size = machine->ram_size;
}
x86_cpus_init(x86ms, pcmc->default_cpu_version);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 in pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (5 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa() Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:44 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 08/12] hw/i386/pc_piix.c: remove pc_system_flash_cleanup_unused() from pc_init_isa() Mark Cave-Ayland
` (4 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
All isapc machines must have 32-bit CPUs and have no PCI 64-bit hole so it can be
hardcoded to 0.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 168469457e..cd9a89f7ff 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -427,7 +427,6 @@ static void pc_init_isa(MachineState *machine)
GSIState *gsi_state;
MemoryRegion *ram_memory;
MemoryRegion *rom_memory = system_memory;
- uint64_t hole64_size = 0;
/*
* There is no RAM split for the isapc machine
@@ -450,7 +449,7 @@ static void pc_init_isa(MachineState *machine)
/* allocate ram and load rom/bios */
if (!xen_enabled()) {
- pc_memory_init(pcms, system_memory, rom_memory, hole64_size);
+ pc_memory_init(pcms, system_memory, rom_memory, 0);
} else {
assert(machine->ram_size == x86ms->below_4g_mem_size +
x86ms->above_4g_mem_size);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 08/12] hw/i386/pc_piix.c: remove pc_system_flash_cleanup_unused() from pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (6 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa() Mark Cave-Ayland
` (3 subsequent siblings)
11 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
This function contains 'assert(PC_MACHINE_GET_CLASS(pcms)->pci_enabled)' and so we can
safely assume that it should never be used for the isapc machine.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index cd9a89f7ff..69c4c001cf 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -454,7 +454,6 @@ static void pc_init_isa(MachineState *machine)
assert(machine->ram_size == x86ms->below_4g_mem_size +
x86ms->above_4g_mem_size);
- pc_system_flash_cleanup_unused(pcms);
if (machine->kernel_filename != NULL) {
/* For xen HVM direct kernel boot, load linux here */
xen_load_linux(pcms);
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (7 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 08/12] hw/i386/pc_piix.c: remove pc_system_flash_cleanup_unused() from pc_init_isa() Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:43 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false " Mark Cave-Ayland
` (2 subsequent siblings)
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
By definition an isapc machine must always use ISA IDE drives so ensure that they
are always enabled. At the same time also remove the surrounding CONFIG_IDE_ISA
define since it will be enabled via the ISAPC Kconfig.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 35 +++++++++++++++--------------------
1 file changed, 15 insertions(+), 20 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 69c4c001cf..03bd09f680 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -427,6 +427,8 @@ static void pc_init_isa(MachineState *machine)
GSIState *gsi_state;
MemoryRegion *ram_memory;
MemoryRegion *rom_memory = system_memory;
+ DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+ int i;
/*
* There is no RAM split for the isapc machine
@@ -489,27 +491,20 @@ static void pc_init_isa(MachineState *machine)
pc_nic_init(pcmc, isa_bus, pcms->pcibus);
-#ifdef CONFIG_IDE_ISA
- if (!pcmc->pci_enabled) {
- DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
- int i;
-
- ide_drive_get(hd, ARRAY_SIZE(hd));
- for (i = 0; i < MAX_IDE_BUS; i++) {
- ISADevice *dev;
- char busname[] = "ide.0";
- dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
- ide_irq[i],
- hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
- /*
- * The ide bus name is ide.0 for the first bus and ide.1 for the
- * second one.
- */
- busname[4] = '0' + i;
- pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
- }
+ ide_drive_get(hd, ARRAY_SIZE(hd));
+ for (i = 0; i < MAX_IDE_BUS; i++) {
+ ISADevice *dev;
+ char busname[] = "ide.0";
+ dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+ ide_irq[i],
+ hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+ /*
+ * The ide bus name is ide.0 for the first bus and ide.1 for the
+ * second one.
+ */
+ busname[4] = '0' + i;
+ pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
}
-#endif
}
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false in pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (8 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa() Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:42 ` Philippe Mathieu-Daudé
2025-06-23 10:51 ` Bernhard Beschow
2025-06-18 11:27 ` [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL " Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file Mark Cave-Ayland
11 siblings, 2 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
By definition PCI can never be enabled on an isapc machine so hardcode the relevant values
set via pcmc->pci_enabled.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 03bd09f680..279eab10ce 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -462,7 +462,7 @@ static void pc_init_isa(MachineState *machine)
}
}
- gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
+ gsi_state = pc_gsi_create(&x86ms->gsi, false);
isa_bus = isa_bus_new(NULL, system_memory, system_io,
&error_abort);
@@ -483,7 +483,7 @@ static void pc_init_isa(MachineState *machine)
x86_register_ferr_irq(x86ms->gsi[13]);
}
- pc_vga_init(isa_bus, pcmc->pci_enabled ? pcms->pcibus : NULL);
+ pc_vga_init(isa_bus, NULL);
/* init basic PC hardware */
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL in pc_init_isa()
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (9 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:42 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file Mark Cave-Ayland
11 siblings, 1 reply; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
By definition PCI can never be enabled on an isapc machine so hardcode the PCIBus argument
of pc_nic_init() to NULL.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/pc_piix.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 279eab10ce..f9d7967dee 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -489,7 +489,7 @@ static void pc_init_isa(MachineState *machine)
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
!MACHINE_CLASS(pcmc)->no_floppy, 0x4);
- pc_nic_init(pcmc, isa_bus, pcms->pcibus);
+ pc_nic_init(pcmc, isa_bus, NULL);
ide_drive_get(hd, ARRAY_SIZE(hd));
for (i = 0; i < MAX_IDE_BUS; i++) {
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
` (10 preceding siblings ...)
2025-06-18 11:27 ` [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL " Mark Cave-Ayland
@ 2025-06-18 11:27 ` Mark Cave-Ayland
2025-06-19 20:45 ` Philippe Mathieu-Daudé
2025-06-23 10:47 ` Bernhard Beschow
11 siblings, 2 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-06-18 11:27 UTC (permalink / raw)
To: pbonzini, mst, marcel.apfelbaum, eduardo, imammedo, qemu-devel
Now that pc_init_isa() is independent of any PCI initialisation, move it into a
separate isapc.c file. This enables us to finally fix the dependency of ISAPC on
I440FX in hw/i386/Kconfig.
Note that as part of the move to a separate file we can see that the licence text
is a verbatim copy of the MIT licence. The text originates from commit 1df912cf9e
("VL license of the day is MIT/BSD") so we can be sure that this was the original
intent. As a consequence we can update the file header to use a SPDX tag as per
the current project contribution guidelines.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
---
hw/i386/Kconfig | 3 -
hw/i386/isapc.c | 145 ++++++++++++++++++++++++++++++++++++++++++++
hw/i386/meson.build | 1 +
hw/i386/pc_piix.c | 117 -----------------------------------
4 files changed, 146 insertions(+), 120 deletions(-)
create mode 100644 hw/i386/isapc.c
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
index eb65bda6e0..a7c746fe9e 100644
--- a/hw/i386/Kconfig
+++ b/hw/i386/Kconfig
@@ -96,9 +96,6 @@ config ISAPC
select ISA_BUS
select PC
select IDE_ISA
- # FIXME: it is in the same file as i440fx, and does not compile
- # if separated
- depends on I440FX
config Q35
bool
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
new file mode 100644
index 0000000000..74ffd19307
--- /dev/null
+++ b/hw/i386/isapc.c
@@ -0,0 +1,145 @@
+/*
+ * QEMU PC System Emulator
+ *
+ * Copyright (c) 2003-2004 Fabrice Bellard
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "qemu/osdep.h"
+
+#include "hw/char/parallel-isa.h"
+#include "hw/dma/i8257.h"
+#include "hw/loader.h"
+#include "hw/i386/pc.h"
+#include "hw/ide/isa.h"
+#include "hw/ide/ide-bus.h"
+#include "system/kvm.h"
+#include "hw/i386/kvm/clock.h"
+#include "hw/xen/xen-x86.h"
+#include "system/xen.h"
+#include "hw/rtc/mc146818rtc.h"
+#include "target/i386/cpu.h"
+
+static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
+static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
+static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
+
+
+static void pc_init_isa(MachineState *machine)
+{
+ PCMachineState *pcms = PC_MACHINE(machine);
+ PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+ X86MachineState *x86ms = X86_MACHINE(machine);
+ MemoryRegion *system_memory = get_system_memory();
+ MemoryRegion *system_io = get_system_io();
+ ISABus *isa_bus;
+ GSIState *gsi_state;
+ MemoryRegion *ram_memory;
+ MemoryRegion *rom_memory = system_memory;
+ DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+ uint32_t irq;
+ int i;
+
+ /*
+ * There is no RAM split for the isapc machine
+ */
+ if (xen_enabled()) {
+ xen_hvm_init_pc(pcms, &ram_memory);
+ } else {
+ ram_memory = machine->ram;
+
+ pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
+ x86ms->above_4g_mem_size = 0;
+ x86ms->below_4g_mem_size = machine->ram_size;
+ }
+
+ x86_cpus_init(x86ms, pcmc->default_cpu_version);
+
+ if (kvm_enabled()) {
+ kvmclock_create(pcmc->kvmclock_create_always);
+ }
+
+ /* allocate ram and load rom/bios */
+ if (!xen_enabled()) {
+ pc_memory_init(pcms, system_memory, rom_memory, 0);
+ } else {
+ assert(machine->ram_size == x86ms->below_4g_mem_size +
+ x86ms->above_4g_mem_size);
+
+ if (machine->kernel_filename != NULL) {
+ /* For xen HVM direct kernel boot, load linux here */
+ xen_load_linux(pcms);
+ }
+ }
+
+ gsi_state = pc_gsi_create(&x86ms->gsi, false);
+
+ isa_bus = isa_bus_new(NULL, system_memory, system_io,
+ &error_abort);
+ isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
+
+ x86ms->rtc = isa_new(TYPE_MC146818_RTC);
+ qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
+ isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
+ irq = object_property_get_uint(OBJECT(x86ms->rtc), "irq",
+ &error_fatal);
+ isa_connect_gpio_out(ISA_DEVICE(x86ms->rtc), 0, irq);
+
+ i8257_dma_init(OBJECT(machine), isa_bus, 0);
+ pcms->hpet_enabled = false;
+
+ if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
+ pc_i8259_create(isa_bus, gsi_state->i8259_irq);
+ }
+
+ if (tcg_enabled()) {
+ x86_register_ferr_irq(x86ms->gsi[13]);
+ }
+
+ pc_vga_init(isa_bus, NULL);
+
+ /* init basic PC hardware */
+ pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
+ !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
+
+ pc_nic_init(pcmc, isa_bus, NULL);
+
+ ide_drive_get(hd, ARRAY_SIZE(hd));
+ for (i = 0; i < MAX_IDE_BUS; i++) {
+ ISADevice *dev;
+ char busname[] = "ide.0";
+ dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+ ide_irq[i],
+ hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+ /*
+ * The ide bus name is ide.0 for the first bus and ide.1 for the
+ * second one.
+ */
+ busname[4] = '0' + i;
+ pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
+ }
+}
+
+static void isapc_machine_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+
+ m->desc = "ISA-only PC";
+ m->max_cpus = 1;
+ m->option_rom_has_mr = true;
+ m->rom_file_has_mr = false;
+ pcmc->pci_enabled = false;
+ pcmc->has_acpi_build = false;
+ pcmc->smbios_defaults = false;
+ pcmc->gigabyte_align = false;
+ pcmc->smbios_legacy_mode = true;
+ pcmc->has_reserved_memory = false;
+ m->default_nic = "ne2k_isa";
+ m->default_cpu_type = X86_CPU_TYPE_NAME("486");
+ m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
+ m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
+}
+
+DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
+ isapc_machine_options);
diff --git a/hw/i386/meson.build b/hw/i386/meson.build
index 7896f348cf..436b3ce52d 100644
--- a/hw/i386/meson.build
+++ b/hw/i386/meson.build
@@ -14,6 +14,7 @@ i386_ss.add(when: 'CONFIG_X86_IOMMU', if_true: files('x86-iommu.c'),
i386_ss.add(when: 'CONFIG_AMD_IOMMU', if_true: files('amd_iommu.c'),
if_false: files('amd_iommu-stub.c'))
i386_ss.add(when: 'CONFIG_I440FX', if_true: files('pc_piix.c'))
+i386_ss.add(when: 'CONFIG_ISAPC', if_true: files('isapc.c'))
i386_ss.add(when: 'CONFIG_MICROVM', if_true: files('x86-common.c', 'microvm.c', 'acpi-microvm.c', 'microvm-dt.c'))
i386_ss.add(when: 'CONFIG_NITRO_ENCLAVE', if_true: files('nitro_enclave.c'))
i386_ss.add(when: 'CONFIG_Q35', if_true: files('pc_q35.c'))
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index f9d7967dee..8cfb228f13 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -415,99 +415,6 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp)
pcms->south_bridge = PCSouthBridgeOption_lookup.array[value];
}
-#ifdef CONFIG_ISAPC
-static void pc_init_isa(MachineState *machine)
-{
- PCMachineState *pcms = PC_MACHINE(machine);
- PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
- X86MachineState *x86ms = X86_MACHINE(machine);
- MemoryRegion *system_memory = get_system_memory();
- MemoryRegion *system_io = get_system_io();
- ISABus *isa_bus;
- GSIState *gsi_state;
- MemoryRegion *ram_memory;
- MemoryRegion *rom_memory = system_memory;
- DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
- int i;
-
- /*
- * There is no RAM split for the isapc machine
- */
- if (xen_enabled()) {
- xen_hvm_init_pc(pcms, &ram_memory);
- } else {
- ram_memory = machine->ram;
-
- pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
- x86ms->above_4g_mem_size = 0;
- x86ms->below_4g_mem_size = machine->ram_size;
- }
-
- x86_cpus_init(x86ms, pcmc->default_cpu_version);
-
- if (kvm_enabled()) {
- kvmclock_create(pcmc->kvmclock_create_always);
- }
-
- /* allocate ram and load rom/bios */
- if (!xen_enabled()) {
- pc_memory_init(pcms, system_memory, rom_memory, 0);
- } else {
- assert(machine->ram_size == x86ms->below_4g_mem_size +
- x86ms->above_4g_mem_size);
-
- if (machine->kernel_filename != NULL) {
- /* For xen HVM direct kernel boot, load linux here */
- xen_load_linux(pcms);
- }
- }
-
- gsi_state = pc_gsi_create(&x86ms->gsi, false);
-
- isa_bus = isa_bus_new(NULL, system_memory, system_io,
- &error_abort);
- isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
-
- x86ms->rtc = isa_new(TYPE_MC146818_RTC);
- qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
- isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
-
- i8257_dma_init(OBJECT(machine), isa_bus, 0);
- pcms->hpet_enabled = false;
-
- if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
- pc_i8259_create(isa_bus, gsi_state->i8259_irq);
- }
-
- if (tcg_enabled()) {
- x86_register_ferr_irq(x86ms->gsi[13]);
- }
-
- pc_vga_init(isa_bus, NULL);
-
- /* init basic PC hardware */
- pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
- !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
-
- pc_nic_init(pcmc, isa_bus, NULL);
-
- ide_drive_get(hd, ARRAY_SIZE(hd));
- for (i = 0; i < MAX_IDE_BUS; i++) {
- ISADevice *dev;
- char busname[] = "ide.0";
- dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
- ide_irq[i],
- hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
- /*
- * The ide bus name is ide.0 for the first bus and ide.1 for the
- * second one.
- */
- busname[4] = '0' + i;
- pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
- }
-}
-#endif
-
#ifdef CONFIG_XEN
static void pc_xen_hvm_init_pci(MachineState *machine)
{
@@ -869,30 +776,6 @@ static void pc_i440fx_machine_2_6_options(MachineClass *m)
DEFINE_I440FX_MACHINE(2, 6);
-#ifdef CONFIG_ISAPC
-static void isapc_machine_options(MachineClass *m)
-{
- PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
- m->desc = "ISA-only PC";
- m->max_cpus = 1;
- m->option_rom_has_mr = true;
- m->rom_file_has_mr = false;
- pcmc->pci_enabled = false;
- pcmc->has_acpi_build = false;
- pcmc->smbios_defaults = false;
- pcmc->gigabyte_align = false;
- pcmc->smbios_legacy_mode = true;
- pcmc->has_reserved_memory = false;
- m->default_nic = "ne2k_isa";
- m->default_cpu_type = X86_CPU_TYPE_NAME("486");
- m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
- m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
-}
-
-DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
- isapc_machine_options);
-#endif
-
#ifdef CONFIG_XEN
static void xenfv_machine_4_2_options(MachineClass *m)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL " Mark Cave-Ayland
@ 2025-06-19 20:42 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:42 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> By definition PCI can never be enabled on an isapc machine so hardcode the PCIBus argument
> of pc_nic_init() to NULL.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false " Mark Cave-Ayland
@ 2025-06-19 20:42 ` Philippe Mathieu-Daudé
2025-06-23 10:51 ` Bernhard Beschow
1 sibling, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:42 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> By definition PCI can never be enabled on an isapc machine so hardcode the relevant values
> set via pcmc->pci_enabled.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa() Mark Cave-Ayland
@ 2025-06-19 20:43 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:43 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> By definition an isapc machine must always use ISA IDE drives
ISA: yes, IDE: not necessarily. Anyhow,
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> so ensure that they
> are always enabled. At the same time also remove the surrounding CONFIG_IDE_ISA
> define since it will be enabled via the ISAPC Kconfig.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 35 +++++++++++++++--------------------
> 1 file changed, 15 insertions(+), 20 deletions(-)
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 " Mark Cave-Ayland
@ 2025-06-19 20:44 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:44 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> All isapc machines must have 32-bit CPUs and have no PCI 64-bit hole so it can be
> hardcoded to 0.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file
2025-06-18 11:27 ` [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file Mark Cave-Ayland
@ 2025-06-19 20:45 ` Philippe Mathieu-Daudé
2025-06-23 10:47 ` Bernhard Beschow
1 sibling, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:45 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> Now that pc_init_isa() is independent of any PCI initialisation, move it into a
> separate isapc.c file. This enables us to finally fix the dependency of ISAPC on
> I440FX in hw/i386/Kconfig.
>
> Note that as part of the move to a separate file we can see that the licence text
> is a verbatim copy of the MIT licence. The text originates from commit 1df912cf9e
> ("VL license of the day is MIT/BSD") so we can be sure that this was the original
> intent. As a consequence we can update the file header to use a SPDX tag as per
> the current project contribution guidelines.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/Kconfig | 3 -
> hw/i386/isapc.c | 145 ++++++++++++++++++++++++++++++++++++++++++++
> hw/i386/meson.build | 1 +
> hw/i386/pc_piix.c | 117 -----------------------------------
> 4 files changed, 146 insertions(+), 120 deletions(-)
> create mode 100644 hw/i386/isapc.c
> diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
> new file mode 100644
> index 0000000000..74ffd19307
> --- /dev/null
> +++ b/hw/i386/isapc.c
> @@ -0,0 +1,145 @@
> +/*
> + * QEMU PC System Emulator
> + *
> + * Copyright (c) 2003-2004 Fabrice Bellard
> + *
> + * SPDX-License-Identifier: MIT
> + */
> +
> +#include "qemu/osdep.h"
> +
> +#include "hw/char/parallel-isa.h"
> +#include "hw/dma/i8257.h"
> +#include "hw/loader.h"
> +#include "hw/i386/pc.h"
> +#include "hw/ide/isa.h"
> +#include "hw/ide/ide-bus.h"
> +#include "system/kvm.h"
> +#include "hw/i386/kvm/clock.h"
> +#include "hw/xen/xen-x86.h"
> +#include "system/xen.h"
> +#include "hw/rtc/mc146818rtc.h"
> +#include "target/i386/cpu.h"
> +
> +static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
> +static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
> +static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
> +
> +
> +static void pc_init_isa(MachineState *machine)
> +{
> + PCMachineState *pcms = PC_MACHINE(machine);
> + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
> + X86MachineState *x86ms = X86_MACHINE(machine);
> + MemoryRegion *system_memory = get_system_memory();
> + MemoryRegion *system_io = get_system_io();
> + ISABus *isa_bus;
> + GSIState *gsi_state;
> + MemoryRegion *ram_memory;
> + MemoryRegion *rom_memory = system_memory;
> + DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
> + uint32_t irq;
> + int i;
> +
> + /*
> + * There is no RAM split for the isapc machine
> + */
> + if (xen_enabled()) {
> + xen_hvm_init_pc(pcms, &ram_memory);
> + } else {
> + ram_memory = machine->ram;
> +
> + pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
> + x86ms->above_4g_mem_size = 0;
> + x86ms->below_4g_mem_size = machine->ram_size;
> + }
> +
> + x86_cpus_init(x86ms, pcmc->default_cpu_version);
Should we check the CPU is 32-bit or is it OK to use 64-bit CPUs?
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa() Mark Cave-Ayland
@ 2025-06-19 20:46 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:46 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> All isapc machines must have 32-bit CPUs and so the RAM split logic can be hardcoded
> accordingly.
s/32-bit CPUs/32-bit address space/?
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 58 ++++-------------------------------------------
> 1 file changed, 4 insertions(+), 54 deletions(-)
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm initialisation from pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm " Mark Cave-Ayland
@ 2025-06-19 20:46 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:46 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> NVDIMMs cannot be used by PCs from a pre-PCI era.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 6 ------
> 1 file changed, 6 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm initialisation from pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm " Mark Cave-Ayland
@ 2025-06-19 20:46 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:46 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> These are based upon the PIIX4 PCI chipset and so can never be used on an isapc machine.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 19 -------------------
> 1 file changed, 19 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa() Mark Cave-Ayland
@ 2025-06-19 20:47 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:47 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> This code will never be used for an isapc machine.
s/This/PCI/
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 105 ++++------------------------------------------
> 1 file changed, 8 insertions(+), 97 deletions(-)
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init()
2025-06-18 11:27 ` [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init() Mark Cave-Ayland
@ 2025-06-19 20:47 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 27+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-06-19 20:47 UTC (permalink / raw)
To: Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum, eduardo,
imammedo, qemu-devel
On 18/6/25 13:27, Mark Cave-Ayland wrote:
> This is to prepare for splitting the isapc machine into its own separate file.
>
> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
> ---
> hw/i386/pc_piix.c | 260 +++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 259 insertions(+), 1 deletion(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file
2025-06-18 11:27 ` [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file Mark Cave-Ayland
2025-06-19 20:45 ` Philippe Mathieu-Daudé
@ 2025-06-23 10:47 ` Bernhard Beschow
2025-07-04 13:58 ` Mark Cave-Ayland
1 sibling, 1 reply; 27+ messages in thread
From: Bernhard Beschow @ 2025-06-23 10:47 UTC (permalink / raw)
To: qemu-devel, Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum,
eduardo, imammedo
Am 18. Juni 2025 11:27:17 UTC schrieb Mark Cave-Ayland <mark.caveayland@nutanix.com>:
>Now that pc_init_isa() is independent of any PCI initialisation, move it into a
>separate isapc.c file. This enables us to finally fix the dependency of ISAPC on
>I440FX in hw/i386/Kconfig.
>
>Note that as part of the move to a separate file we can see that the licence text
>is a verbatim copy of the MIT licence. The text originates from commit 1df912cf9e
>("VL license of the day is MIT/BSD") so we can be sure that this was the original
>intent. As a consequence we can update the file header to use a SPDX tag as per
>the current project contribution guidelines.
>
>Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>---
> hw/i386/Kconfig | 3 -
> hw/i386/isapc.c | 145 ++++++++++++++++++++++++++++++++++++++++++++
> hw/i386/meson.build | 1 +
> hw/i386/pc_piix.c | 117 -----------------------------------
> 4 files changed, 146 insertions(+), 120 deletions(-)
> create mode 100644 hw/i386/isapc.c
>
>diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
>index eb65bda6e0..a7c746fe9e 100644
>--- a/hw/i386/Kconfig
>+++ b/hw/i386/Kconfig
>@@ -96,9 +96,6 @@ config ISAPC
> select ISA_BUS
> select PC
> select IDE_ISA
>- # FIXME: it is in the same file as i440fx, and does not compile
>- # if separated
>- depends on I440FX
>
> config Q35
> bool
>diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
>new file mode 100644
>index 0000000000..74ffd19307
>--- /dev/null
>+++ b/hw/i386/isapc.c
>@@ -0,0 +1,145 @@
>+/*
>+ * QEMU PC System Emulator
>+ *
>+ * Copyright (c) 2003-2004 Fabrice Bellard
>+ *
>+ * SPDX-License-Identifier: MIT
>+ */
>+
>+#include "qemu/osdep.h"
>+
>+#include "hw/char/parallel-isa.h"
>+#include "hw/dma/i8257.h"
>+#include "hw/loader.h"
>+#include "hw/i386/pc.h"
>+#include "hw/ide/isa.h"
>+#include "hw/ide/ide-bus.h"
>+#include "system/kvm.h"
>+#include "hw/i386/kvm/clock.h"
>+#include "hw/xen/xen-x86.h"
>+#include "system/xen.h"
I believe that Xen can be pruned from the machine as well since it requires PCI AFAIR.
Best regards,
Bernhard
>+#include "hw/rtc/mc146818rtc.h"
>+#include "target/i386/cpu.h"
>+
>+static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
>+static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
>+static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
>+
>+
>+static void pc_init_isa(MachineState *machine)
>+{
>+ PCMachineState *pcms = PC_MACHINE(machine);
>+ PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>+ X86MachineState *x86ms = X86_MACHINE(machine);
>+ MemoryRegion *system_memory = get_system_memory();
>+ MemoryRegion *system_io = get_system_io();
>+ ISABus *isa_bus;
>+ GSIState *gsi_state;
>+ MemoryRegion *ram_memory;
>+ MemoryRegion *rom_memory = system_memory;
>+ DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>+ uint32_t irq;
>+ int i;
>+
>+ /*
>+ * There is no RAM split for the isapc machine
>+ */
>+ if (xen_enabled()) {
>+ xen_hvm_init_pc(pcms, &ram_memory);
>+ } else {
>+ ram_memory = machine->ram;
>+
>+ pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
>+ x86ms->above_4g_mem_size = 0;
>+ x86ms->below_4g_mem_size = machine->ram_size;
>+ }
>+
>+ x86_cpus_init(x86ms, pcmc->default_cpu_version);
>+
>+ if (kvm_enabled()) {
>+ kvmclock_create(pcmc->kvmclock_create_always);
>+ }
>+
>+ /* allocate ram and load rom/bios */
>+ if (!xen_enabled()) {
>+ pc_memory_init(pcms, system_memory, rom_memory, 0);
>+ } else {
>+ assert(machine->ram_size == x86ms->below_4g_mem_size +
>+ x86ms->above_4g_mem_size);
>+
>+ if (machine->kernel_filename != NULL) {
>+ /* For xen HVM direct kernel boot, load linux here */
>+ xen_load_linux(pcms);
>+ }
>+ }
>+
>+ gsi_state = pc_gsi_create(&x86ms->gsi, false);
>+
>+ isa_bus = isa_bus_new(NULL, system_memory, system_io,
>+ &error_abort);
>+ isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
>+
>+ x86ms->rtc = isa_new(TYPE_MC146818_RTC);
>+ qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
>+ isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
>+ irq = object_property_get_uint(OBJECT(x86ms->rtc), "irq",
>+ &error_fatal);
>+ isa_connect_gpio_out(ISA_DEVICE(x86ms->rtc), 0, irq);
>+
>+ i8257_dma_init(OBJECT(machine), isa_bus, 0);
>+ pcms->hpet_enabled = false;
>+
>+ if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
>+ pc_i8259_create(isa_bus, gsi_state->i8259_irq);
>+ }
>+
>+ if (tcg_enabled()) {
>+ x86_register_ferr_irq(x86ms->gsi[13]);
>+ }
>+
>+ pc_vga_init(isa_bus, NULL);
>+
>+ /* init basic PC hardware */
>+ pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
>+ !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
>+
>+ pc_nic_init(pcmc, isa_bus, NULL);
>+
>+ ide_drive_get(hd, ARRAY_SIZE(hd));
>+ for (i = 0; i < MAX_IDE_BUS; i++) {
>+ ISADevice *dev;
>+ char busname[] = "ide.0";
>+ dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
>+ ide_irq[i],
>+ hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
>+ /*
>+ * The ide bus name is ide.0 for the first bus and ide.1 for the
>+ * second one.
>+ */
>+ busname[4] = '0' + i;
>+ pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
>+ }
>+}
>+
>+static void isapc_machine_options(MachineClass *m)
>+{
>+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>+
>+ m->desc = "ISA-only PC";
>+ m->max_cpus = 1;
>+ m->option_rom_has_mr = true;
>+ m->rom_file_has_mr = false;
>+ pcmc->pci_enabled = false;
>+ pcmc->has_acpi_build = false;
>+ pcmc->smbios_defaults = false;
>+ pcmc->gigabyte_align = false;
>+ pcmc->smbios_legacy_mode = true;
>+ pcmc->has_reserved_memory = false;
>+ m->default_nic = "ne2k_isa";
>+ m->default_cpu_type = X86_CPU_TYPE_NAME("486");
>+ m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
>+ m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
>+}
>+
>+DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
>+ isapc_machine_options);
>diff --git a/hw/i386/meson.build b/hw/i386/meson.build
>index 7896f348cf..436b3ce52d 100644
>--- a/hw/i386/meson.build
>+++ b/hw/i386/meson.build
>@@ -14,6 +14,7 @@ i386_ss.add(when: 'CONFIG_X86_IOMMU', if_true: files('x86-iommu.c'),
> i386_ss.add(when: 'CONFIG_AMD_IOMMU', if_true: files('amd_iommu.c'),
> if_false: files('amd_iommu-stub.c'))
> i386_ss.add(when: 'CONFIG_I440FX', if_true: files('pc_piix.c'))
>+i386_ss.add(when: 'CONFIG_ISAPC', if_true: files('isapc.c'))
> i386_ss.add(when: 'CONFIG_MICROVM', if_true: files('x86-common.c', 'microvm.c', 'acpi-microvm.c', 'microvm-dt.c'))
> i386_ss.add(when: 'CONFIG_NITRO_ENCLAVE', if_true: files('nitro_enclave.c'))
> i386_ss.add(when: 'CONFIG_Q35', if_true: files('pc_q35.c'))
>diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>index f9d7967dee..8cfb228f13 100644
>--- a/hw/i386/pc_piix.c
>+++ b/hw/i386/pc_piix.c
>@@ -415,99 +415,6 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp)
> pcms->south_bridge = PCSouthBridgeOption_lookup.array[value];
> }
>
>-#ifdef CONFIG_ISAPC
>-static void pc_init_isa(MachineState *machine)
>-{
>- PCMachineState *pcms = PC_MACHINE(machine);
>- PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>- X86MachineState *x86ms = X86_MACHINE(machine);
>- MemoryRegion *system_memory = get_system_memory();
>- MemoryRegion *system_io = get_system_io();
>- ISABus *isa_bus;
>- GSIState *gsi_state;
>- MemoryRegion *ram_memory;
>- MemoryRegion *rom_memory = system_memory;
>- DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>- int i;
>-
>- /*
>- * There is no RAM split for the isapc machine
>- */
>- if (xen_enabled()) {
>- xen_hvm_init_pc(pcms, &ram_memory);
>- } else {
>- ram_memory = machine->ram;
>-
>- pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
>- x86ms->above_4g_mem_size = 0;
>- x86ms->below_4g_mem_size = machine->ram_size;
>- }
>-
>- x86_cpus_init(x86ms, pcmc->default_cpu_version);
>-
>- if (kvm_enabled()) {
>- kvmclock_create(pcmc->kvmclock_create_always);
>- }
>-
>- /* allocate ram and load rom/bios */
>- if (!xen_enabled()) {
>- pc_memory_init(pcms, system_memory, rom_memory, 0);
>- } else {
>- assert(machine->ram_size == x86ms->below_4g_mem_size +
>- x86ms->above_4g_mem_size);
>-
>- if (machine->kernel_filename != NULL) {
>- /* For xen HVM direct kernel boot, load linux here */
>- xen_load_linux(pcms);
>- }
>- }
>-
>- gsi_state = pc_gsi_create(&x86ms->gsi, false);
>-
>- isa_bus = isa_bus_new(NULL, system_memory, system_io,
>- &error_abort);
>- isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
>-
>- x86ms->rtc = isa_new(TYPE_MC146818_RTC);
>- qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
>- isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
>-
>- i8257_dma_init(OBJECT(machine), isa_bus, 0);
>- pcms->hpet_enabled = false;
>-
>- if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
>- pc_i8259_create(isa_bus, gsi_state->i8259_irq);
>- }
>-
>- if (tcg_enabled()) {
>- x86_register_ferr_irq(x86ms->gsi[13]);
>- }
>-
>- pc_vga_init(isa_bus, NULL);
>-
>- /* init basic PC hardware */
>- pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
>- !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
>-
>- pc_nic_init(pcmc, isa_bus, NULL);
>-
>- ide_drive_get(hd, ARRAY_SIZE(hd));
>- for (i = 0; i < MAX_IDE_BUS; i++) {
>- ISADevice *dev;
>- char busname[] = "ide.0";
>- dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
>- ide_irq[i],
>- hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
>- /*
>- * The ide bus name is ide.0 for the first bus and ide.1 for the
>- * second one.
>- */
>- busname[4] = '0' + i;
>- pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
>- }
>-}
>-#endif
>-
> #ifdef CONFIG_XEN
> static void pc_xen_hvm_init_pci(MachineState *machine)
> {
>@@ -869,30 +776,6 @@ static void pc_i440fx_machine_2_6_options(MachineClass *m)
>
> DEFINE_I440FX_MACHINE(2, 6);
>
>-#ifdef CONFIG_ISAPC
>-static void isapc_machine_options(MachineClass *m)
>-{
>- PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>- m->desc = "ISA-only PC";
>- m->max_cpus = 1;
>- m->option_rom_has_mr = true;
>- m->rom_file_has_mr = false;
>- pcmc->pci_enabled = false;
>- pcmc->has_acpi_build = false;
>- pcmc->smbios_defaults = false;
>- pcmc->gigabyte_align = false;
>- pcmc->smbios_legacy_mode = true;
>- pcmc->has_reserved_memory = false;
>- m->default_nic = "ne2k_isa";
>- m->default_cpu_type = X86_CPU_TYPE_NAME("486");
>- m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
>- m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
>-}
>-
>-DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
>- isapc_machine_options);
>-#endif
>-
> #ifdef CONFIG_XEN
> static void xenfv_machine_4_2_options(MachineClass *m)
> {
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false in pc_init_isa()
2025-06-18 11:27 ` [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false " Mark Cave-Ayland
2025-06-19 20:42 ` Philippe Mathieu-Daudé
@ 2025-06-23 10:51 ` Bernhard Beschow
2025-07-04 14:00 ` Mark Cave-Ayland
1 sibling, 1 reply; 27+ messages in thread
From: Bernhard Beschow @ 2025-06-23 10:51 UTC (permalink / raw)
To: qemu-devel, Mark Cave-Ayland, pbonzini, mst, marcel.apfelbaum,
eduardo, imammedo
Am 18. Juni 2025 11:27:15 UTC schrieb Mark Cave-Ayland <mark.caveayland@nutanix.com>:
>By definition PCI can never be enabled on an isapc machine so hardcode the relevant values
>set via pcmc->pci_enabled.
The inverse should be true now for pc-i440fx, so a similar patch is needed there as well.
Best regards,
Bernhard
>
>Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>---
> hw/i386/pc_piix.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
>diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>index 03bd09f680..279eab10ce 100644
>--- a/hw/i386/pc_piix.c
>+++ b/hw/i386/pc_piix.c
>@@ -462,7 +462,7 @@ static void pc_init_isa(MachineState *machine)
> }
> }
>
>- gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
>+ gsi_state = pc_gsi_create(&x86ms->gsi, false);
>
> isa_bus = isa_bus_new(NULL, system_memory, system_io,
> &error_abort);
>@@ -483,7 +483,7 @@ static void pc_init_isa(MachineState *machine)
> x86_register_ferr_irq(x86ms->gsi[13]);
> }
>
>- pc_vga_init(isa_bus, pcmc->pci_enabled ? pcms->pcibus : NULL);
>+ pc_vga_init(isa_bus, NULL);
>
> /* init basic PC hardware */
> pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file
2025-06-23 10:47 ` Bernhard Beschow
@ 2025-07-04 13:58 ` Mark Cave-Ayland
0 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-07-04 13:58 UTC (permalink / raw)
To: Bernhard Beschow, qemu-devel, pbonzini, mst, marcel.apfelbaum,
eduardo, imammedo
On 23/06/2025 11:47, Bernhard Beschow wrote:
> Am 18. Juni 2025 11:27:17 UTC schrieb Mark Cave-Ayland <mark.caveayland@nutanix.com>:
>> Now that pc_init_isa() is independent of any PCI initialisation, move it into a
>> separate isapc.c file. This enables us to finally fix the dependency of ISAPC on
>> I440FX in hw/i386/Kconfig.
>>
>> Note that as part of the move to a separate file we can see that the licence text
>> is a verbatim copy of the MIT licence. The text originates from commit 1df912cf9e
>> ("VL license of the day is MIT/BSD") so we can be sure that this was the original
>> intent. As a consequence we can update the file header to use a SPDX tag as per
>> the current project contribution guidelines.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
>> ---
>> hw/i386/Kconfig | 3 -
>> hw/i386/isapc.c | 145 ++++++++++++++++++++++++++++++++++++++++++++
>> hw/i386/meson.build | 1 +
>> hw/i386/pc_piix.c | 117 -----------------------------------
>> 4 files changed, 146 insertions(+), 120 deletions(-)
>> create mode 100644 hw/i386/isapc.c
>>
>> diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
>> index eb65bda6e0..a7c746fe9e 100644
>> --- a/hw/i386/Kconfig
>> +++ b/hw/i386/Kconfig
>> @@ -96,9 +96,6 @@ config ISAPC
>> select ISA_BUS
>> select PC
>> select IDE_ISA
>> - # FIXME: it is in the same file as i440fx, and does not compile
>> - # if separated
>> - depends on I440FX
>>
>> config Q35
>> bool
>> diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
>> new file mode 100644
>> index 0000000000..74ffd19307
>> --- /dev/null
>> +++ b/hw/i386/isapc.c
>> @@ -0,0 +1,145 @@
>> +/*
>> + * QEMU PC System Emulator
>> + *
>> + * Copyright (c) 2003-2004 Fabrice Bellard
>> + *
>> + * SPDX-License-Identifier: MIT
>> + */
>> +
>> +#include "qemu/osdep.h"
>> +
>> +#include "hw/char/parallel-isa.h"
>> +#include "hw/dma/i8257.h"
>> +#include "hw/loader.h"
>> +#include "hw/i386/pc.h"
>> +#include "hw/ide/isa.h"
>> +#include "hw/ide/ide-bus.h"
>> +#include "system/kvm.h"
>> +#include "hw/i386/kvm/clock.h"
>> +#include "hw/xen/xen-x86.h"
>> +#include "system/xen.h"
>
> I believe that Xen can be pruned from the machine as well since it requires PCI AFAIR.
>
> Best regards,
> Bernhard
Thanks for the suggestion! I got in touch with the Xen folks over Matrix
to ask about this, and the feedback I received was that Xen does support
non-PCI IO and that in theory it "should work". So I've left this in for
now.
ATB,
Mark.
>> +#include "hw/rtc/mc146818rtc.h"
>> +#include "target/i386/cpu.h"
>> +
>> +static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
>> +static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
>> +static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
>> +
>> +
>> +static void pc_init_isa(MachineState *machine)
>> +{
>> + PCMachineState *pcms = PC_MACHINE(machine);
>> + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>> + X86MachineState *x86ms = X86_MACHINE(machine);
>> + MemoryRegion *system_memory = get_system_memory();
>> + MemoryRegion *system_io = get_system_io();
>> + ISABus *isa_bus;
>> + GSIState *gsi_state;
>> + MemoryRegion *ram_memory;
>> + MemoryRegion *rom_memory = system_memory;
>> + DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>> + uint32_t irq;
>> + int i;
>> +
>> + /*
>> + * There is no RAM split for the isapc machine
>> + */
>> + if (xen_enabled()) {
>> + xen_hvm_init_pc(pcms, &ram_memory);
>> + } else {
>> + ram_memory = machine->ram;
>> +
>> + pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
>> + x86ms->above_4g_mem_size = 0;
>> + x86ms->below_4g_mem_size = machine->ram_size;
>> + }
>> +
>> + x86_cpus_init(x86ms, pcmc->default_cpu_version);
>> +
>> + if (kvm_enabled()) {
>> + kvmclock_create(pcmc->kvmclock_create_always);
>> + }
>> +
>> + /* allocate ram and load rom/bios */
>> + if (!xen_enabled()) {
>> + pc_memory_init(pcms, system_memory, rom_memory, 0);
>> + } else {
>> + assert(machine->ram_size == x86ms->below_4g_mem_size +
>> + x86ms->above_4g_mem_size);
>> +
>> + if (machine->kernel_filename != NULL) {
>> + /* For xen HVM direct kernel boot, load linux here */
>> + xen_load_linux(pcms);
>> + }
>> + }
>> +
>> + gsi_state = pc_gsi_create(&x86ms->gsi, false);
>> +
>> + isa_bus = isa_bus_new(NULL, system_memory, system_io,
>> + &error_abort);
>> + isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
>> +
>> + x86ms->rtc = isa_new(TYPE_MC146818_RTC);
>> + qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
>> + isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
>> + irq = object_property_get_uint(OBJECT(x86ms->rtc), "irq",
>> + &error_fatal);
>> + isa_connect_gpio_out(ISA_DEVICE(x86ms->rtc), 0, irq);
>> +
>> + i8257_dma_init(OBJECT(machine), isa_bus, 0);
>> + pcms->hpet_enabled = false;
>> +
>> + if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
>> + pc_i8259_create(isa_bus, gsi_state->i8259_irq);
>> + }
>> +
>> + if (tcg_enabled()) {
>> + x86_register_ferr_irq(x86ms->gsi[13]);
>> + }
>> +
>> + pc_vga_init(isa_bus, NULL);
>> +
>> + /* init basic PC hardware */
>> + pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
>> + !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
>> +
>> + pc_nic_init(pcmc, isa_bus, NULL);
>> +
>> + ide_drive_get(hd, ARRAY_SIZE(hd));
>> + for (i = 0; i < MAX_IDE_BUS; i++) {
>> + ISADevice *dev;
>> + char busname[] = "ide.0";
>> + dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
>> + ide_irq[i],
>> + hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
>> + /*
>> + * The ide bus name is ide.0 for the first bus and ide.1 for the
>> + * second one.
>> + */
>> + busname[4] = '0' + i;
>> + pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
>> + }
>> +}
>> +
>> +static void isapc_machine_options(MachineClass *m)
>> +{
>> + PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>> +
>> + m->desc = "ISA-only PC";
>> + m->max_cpus = 1;
>> + m->option_rom_has_mr = true;
>> + m->rom_file_has_mr = false;
>> + pcmc->pci_enabled = false;
>> + pcmc->has_acpi_build = false;
>> + pcmc->smbios_defaults = false;
>> + pcmc->gigabyte_align = false;
>> + pcmc->smbios_legacy_mode = true;
>> + pcmc->has_reserved_memory = false;
>> + m->default_nic = "ne2k_isa";
>> + m->default_cpu_type = X86_CPU_TYPE_NAME("486");
>> + m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
>> + m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
>> +}
>> +
>> +DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
>> + isapc_machine_options);
>> diff --git a/hw/i386/meson.build b/hw/i386/meson.build
>> index 7896f348cf..436b3ce52d 100644
>> --- a/hw/i386/meson.build
>> +++ b/hw/i386/meson.build
>> @@ -14,6 +14,7 @@ i386_ss.add(when: 'CONFIG_X86_IOMMU', if_true: files('x86-iommu.c'),
>> i386_ss.add(when: 'CONFIG_AMD_IOMMU', if_true: files('amd_iommu.c'),
>> if_false: files('amd_iommu-stub.c'))
>> i386_ss.add(when: 'CONFIG_I440FX', if_true: files('pc_piix.c'))
>> +i386_ss.add(when: 'CONFIG_ISAPC', if_true: files('isapc.c'))
>> i386_ss.add(when: 'CONFIG_MICROVM', if_true: files('x86-common.c', 'microvm.c', 'acpi-microvm.c', 'microvm-dt.c'))
>> i386_ss.add(when: 'CONFIG_NITRO_ENCLAVE', if_true: files('nitro_enclave.c'))
>> i386_ss.add(when: 'CONFIG_Q35', if_true: files('pc_q35.c'))
>> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> index f9d7967dee..8cfb228f13 100644
>> --- a/hw/i386/pc_piix.c
>> +++ b/hw/i386/pc_piix.c
>> @@ -415,99 +415,6 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp)
>> pcms->south_bridge = PCSouthBridgeOption_lookup.array[value];
>> }
>>
>> -#ifdef CONFIG_ISAPC
>> -static void pc_init_isa(MachineState *machine)
>> -{
>> - PCMachineState *pcms = PC_MACHINE(machine);
>> - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>> - X86MachineState *x86ms = X86_MACHINE(machine);
>> - MemoryRegion *system_memory = get_system_memory();
>> - MemoryRegion *system_io = get_system_io();
>> - ISABus *isa_bus;
>> - GSIState *gsi_state;
>> - MemoryRegion *ram_memory;
>> - MemoryRegion *rom_memory = system_memory;
>> - DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>> - int i;
>> -
>> - /*
>> - * There is no RAM split for the isapc machine
>> - */
>> - if (xen_enabled()) {
>> - xen_hvm_init_pc(pcms, &ram_memory);
>> - } else {
>> - ram_memory = machine->ram;
>> -
>> - pcms->max_ram_below_4g = 0xe0000000; /* default: 3.5G */
>> - x86ms->above_4g_mem_size = 0;
>> - x86ms->below_4g_mem_size = machine->ram_size;
>> - }
>> -
>> - x86_cpus_init(x86ms, pcmc->default_cpu_version);
>> -
>> - if (kvm_enabled()) {
>> - kvmclock_create(pcmc->kvmclock_create_always);
>> - }
>> -
>> - /* allocate ram and load rom/bios */
>> - if (!xen_enabled()) {
>> - pc_memory_init(pcms, system_memory, rom_memory, 0);
>> - } else {
>> - assert(machine->ram_size == x86ms->below_4g_mem_size +
>> - x86ms->above_4g_mem_size);
>> -
>> - if (machine->kernel_filename != NULL) {
>> - /* For xen HVM direct kernel boot, load linux here */
>> - xen_load_linux(pcms);
>> - }
>> - }
>> -
>> - gsi_state = pc_gsi_create(&x86ms->gsi, false);
>> -
>> - isa_bus = isa_bus_new(NULL, system_memory, system_io,
>> - &error_abort);
>> - isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
>> -
>> - x86ms->rtc = isa_new(TYPE_MC146818_RTC);
>> - qdev_prop_set_int32(DEVICE(x86ms->rtc), "base_year", 2000);
>> - isa_realize_and_unref(x86ms->rtc, isa_bus, &error_fatal);
>> -
>> - i8257_dma_init(OBJECT(machine), isa_bus, 0);
>> - pcms->hpet_enabled = false;
>> -
>> - if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
>> - pc_i8259_create(isa_bus, gsi_state->i8259_irq);
>> - }
>> -
>> - if (tcg_enabled()) {
>> - x86_register_ferr_irq(x86ms->gsi[13]);
>> - }
>> -
>> - pc_vga_init(isa_bus, NULL);
>> -
>> - /* init basic PC hardware */
>> - pc_basic_device_init(pcms, isa_bus, x86ms->gsi, x86ms->rtc,
>> - !MACHINE_CLASS(pcmc)->no_floppy, 0x4);
>> -
>> - pc_nic_init(pcmc, isa_bus, NULL);
>> -
>> - ide_drive_get(hd, ARRAY_SIZE(hd));
>> - for (i = 0; i < MAX_IDE_BUS; i++) {
>> - ISADevice *dev;
>> - char busname[] = "ide.0";
>> - dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
>> - ide_irq[i],
>> - hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
>> - /*
>> - * The ide bus name is ide.0 for the first bus and ide.1 for the
>> - * second one.
>> - */
>> - busname[4] = '0' + i;
>> - pcms->idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
>> - }
>> -}
>> -#endif
>> -
>> #ifdef CONFIG_XEN
>> static void pc_xen_hvm_init_pci(MachineState *machine)
>> {
>> @@ -869,30 +776,6 @@ static void pc_i440fx_machine_2_6_options(MachineClass *m)
>>
>> DEFINE_I440FX_MACHINE(2, 6);
>>
>> -#ifdef CONFIG_ISAPC
>> -static void isapc_machine_options(MachineClass *m)
>> -{
>> - PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>> - m->desc = "ISA-only PC";
>> - m->max_cpus = 1;
>> - m->option_rom_has_mr = true;
>> - m->rom_file_has_mr = false;
>> - pcmc->pci_enabled = false;
>> - pcmc->has_acpi_build = false;
>> - pcmc->smbios_defaults = false;
>> - pcmc->gigabyte_align = false;
>> - pcmc->smbios_legacy_mode = true;
>> - pcmc->has_reserved_memory = false;
>> - m->default_nic = "ne2k_isa";
>> - m->default_cpu_type = X86_CPU_TYPE_NAME("486");
>> - m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
>> - m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
>> -}
>> -
>> -DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
>> - isapc_machine_options);
>> -#endif
>> -
>> #ifdef CONFIG_XEN
>> static void xenfv_machine_4_2_options(MachineClass *m)
>> {
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false in pc_init_isa()
2025-06-23 10:51 ` Bernhard Beschow
@ 2025-07-04 14:00 ` Mark Cave-Ayland
0 siblings, 0 replies; 27+ messages in thread
From: Mark Cave-Ayland @ 2025-07-04 14:00 UTC (permalink / raw)
To: Bernhard Beschow, qemu-devel, pbonzini, mst, marcel.apfelbaum,
eduardo, imammedo
On 23/06/2025 11:51, Bernhard Beschow wrote:
> Am 18. Juni 2025 11:27:15 UTC schrieb Mark Cave-Ayland <mark.caveayland@nutanix.com>:
>> By definition PCI can never be enabled on an isapc machine so hardcode the relevant values
>> set via pcmc->pci_enabled.
>
> The inverse should be true now for pc-i440fx, so a similar patch is needed there as well.
>
> Best regards,
> Bernhard
Good point. I've added a new patch that does this in v3 (soon to be
posted). It certainly seems like a nice cleanup, and I think that
further tidy-ups are possible in future if you can assume that PCI is
always present.
ATB,
Mark.
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2025-07-04 14:03 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-18 11:27 [PATCH v2 00/12] hw/i386: separate isapc out from pc_piix Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 01/12] hw/i386/pc_piix.c: duplicate pc_init1() into pc_isa_init() Mark Cave-Ayland
2025-06-19 20:47 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 02/12] hw/i386/pc_piix.c: remove pcmc->pci_enabled dependent initialisation from pc_init_isa() Mark Cave-Ayland
2025-06-19 20:47 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 03/12] hw/i386/pc_piix.c: remove SMI and piix4_pm " Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 04/12] hw/i386/pc_piix.c: remove SGX " Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 05/12] hw/i386/pc_piix.c: remove nvdimm " Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 06/12] hw/i386/pc_piix.c: simplify RAM size logic in pc_init_isa() Mark Cave-Ayland
2025-06-19 20:46 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 07/12] hw/i386/pc_piix.c: hardcode hole64_size to 0 " Mark Cave-Ayland
2025-06-19 20:44 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 08/12] hw/i386/pc_piix.c: remove pc_system_flash_cleanup_unused() from pc_init_isa() Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 09/12] hw/i386/pc_piix.c: always initialise ISA IDE drives in pc_init_isa() Mark Cave-Ayland
2025-06-19 20:43 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 10/12] hw/i386/pc_piix.c: assume pcmc->pci_enabled is always false " Mark Cave-Ayland
2025-06-19 20:42 ` Philippe Mathieu-Daudé
2025-06-23 10:51 ` Bernhard Beschow
2025-07-04 14:00 ` Mark Cave-Ayland
2025-06-18 11:27 ` [PATCH v2 11/12] hw/i386/pc_piix.c: hardcode pcms->pci_bus to NULL " Mark Cave-Ayland
2025-06-19 20:42 ` Philippe Mathieu-Daudé
2025-06-18 11:27 ` [PATCH v2 12/12] hw/i386: move isapc machine to separate isapc.c file Mark Cave-Ayland
2025-06-19 20:45 ` Philippe Mathieu-Daudé
2025-06-23 10:47 ` Bernhard Beschow
2025-07-04 13:58 ` Mark Cave-Ayland
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).