From fd6de3c5e97bdf13a39342fc71815a20c66867ae Mon Sep 17 00:00:00 2001 From: Bernhard Beschow Date: Wed, 8 May 2024 19:55:07 +0200 Subject: [PATCH 043/100] hw/i386/pc_sysfw: Alias rather than copy isa-bios region RH-Author: Paolo Bonzini RH-MergeRequest: 245: SEV-SNP support RH-Jira: RHEL-39544 RH-Acked-by: Thomas Huth RH-Acked-by: Bandan Das RH-Acked-by: Vitaly Kuznetsov RH-Commit: [43/91] f64dab2a091838a10a9b94e3d09ea11432b0809f (bonzini/rhel-qemu-kvm) In the -bios case the "isa-bios" memory region is an alias to the BIOS mapped to the top of the 4G memory boundary. Do the same in the -pflash case, but only for new machine versions for migration compatibility. This establishes common behavior and makes pflash commands work in the "isa-bios" region which some real-world legacy bioses rely on. Note that in the sev_enabled() case, the "isa-bios" memory region in the -pflash case will now also point to encrypted memory, just like it already does in the -bios case. When running `info mtree` before and after this commit with `qemu-system-x86_64 -S -drive \ if=pflash,format=raw,readonly=on,file=/usr/share/qemu/bios-256k.bin` and running `diff -u before.mtree after.mtree` results in the following changes in the memory tree: | --- before.mtree | +++ after.mtree | @@ -71,7 +71,7 @@ | 0000000000000000-ffffffffffffffff (prio -1, i/o): pci | 00000000000a0000-00000000000bffff (prio 1, i/o): vga-lowmem | 00000000000c0000-00000000000dffff (prio 1, rom): pc.rom | - 00000000000e0000-00000000000fffff (prio 1, rom): isa-bios | + 00000000000e0000-00000000000fffff (prio 1, romd): alias isa-bios @system.flash0 0000000000020000-000000000003ffff | 00000000000a0000-00000000000bffff (prio 1, i/o): alias smram-region @pci 00000000000a0000-00000000000bffff | 00000000000c0000-00000000000c3fff (prio 1, i/o): alias pam-pci @pci 00000000000c0000-00000000000c3fff | 00000000000c4000-00000000000c7fff (prio 1, i/o): alias pam-pci @pci 00000000000c4000-00000000000c7fff | @@ -108,7 +108,7 @@ | 0000000000000000-ffffffffffffffff (prio -1, i/o): pci | 00000000000a0000-00000000000bffff (prio 1, i/o): vga-lowmem | 00000000000c0000-00000000000dffff (prio 1, rom): pc.rom | - 00000000000e0000-00000000000fffff (prio 1, rom): isa-bios | + 00000000000e0000-00000000000fffff (prio 1, romd): alias isa-bios @system.flash0 0000000000020000-000000000003ffff | 00000000000a0000-00000000000bffff (prio 1, i/o): alias smram-region @pci 00000000000a0000-00000000000bffff | 00000000000c0000-00000000000c3fff (prio 1, i/o): alias pam-pci @pci 00000000000c0000-00000000000c3fff | 00000000000c4000-00000000000c7fff (prio 1, i/o): alias pam-pci @pci 00000000000c4000-00000000000c7fff | @@ -131,11 +131,14 @@ | memory-region: pc.ram | 0000000000000000-0000000007ffffff (prio 0, ram): pc.ram | | +memory-region: system.flash0 | + 00000000fffc0000-00000000ffffffff (prio 0, romd): system.flash0 | + | memory-region: pci | 0000000000000000-ffffffffffffffff (prio -1, i/o): pci | 00000000000a0000-00000000000bffff (prio 1, i/o): vga-lowmem | 00000000000c0000-00000000000dffff (prio 1, rom): pc.rom | - 00000000000e0000-00000000000fffff (prio 1, rom): isa-bios | + 00000000000e0000-00000000000fffff (prio 1, romd): alias isa-bios @system.flash0 0000000000020000-000000000003ffff | | memory-region: smram | 00000000000a0000-00000000000bffff (prio 0, ram): alias smram-low @pc.ram 00000000000a0000-00000000000bffff Note that in both cases the "system" memory region contains the entry 00000000fffc0000-00000000ffffffff (prio 0, romd): system.flash0 but the "system.flash0" memory region only appears standalone when "isa-bios" is an alias. Signed-off-by: Bernhard Beschow Message-ID: <20240508175507.22270-7-shentey@gmail.com> Signed-off-by: Paolo Bonzini (cherry picked from commit a44ea3fa7f2aa1d809fdca1b84a52695b53d8ad0) Signed-off-by: Paolo Bonzini --- hw/i386/pc.c | 1 + hw/i386/pc_piix.c | 1 + hw/i386/pc_q35.c | 1 + hw/i386/pc_sysfw.c | 8 +++++++- include/hw/i386/pc.h | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 1a34bc4522..660a59c63b 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1967,6 +1967,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) pcmc->has_reserved_memory = true; pcmc->enforce_aligned_dimm = true; pcmc->enforce_amd_1tb_hole = true; + pcmc->isa_bios_alias = true; /* BIOS ACPI tables: 128K. Other BIOS datastructures: less than 4K reported * to be used at the moment, 32K should be enough for a while. */ pcmc->acpi_data_size = 0x20000 + 0x8000; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index bef3e8b73e..dbb7f2ed17 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -975,6 +975,7 @@ static void pc_machine_rhel7_options(MachineClass *m) m->alias = "pc"; m->is_default = 1; m->smp_props.prefer_sockets = true; + pcmc->isa_bios_alias = false; } static void pc_init_rhel760(MachineState *machine) diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index dedc86eec9..f9900ad798 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -735,6 +735,7 @@ static void pc_q35_machine_rhel940_options(MachineClass *m) m->desc = "RHEL-9.4.0 PC (Q35 + ICH9, 2009)"; pcmc->smbios_stream_product = "RHEL"; pcmc->smbios_stream_version = "9.4.0"; + pcmc->isa_bios_alias = false; compat_props_add(m->compat_props, pc_rhel_9_5_compat, pc_rhel_9_5_compat_len); diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c index 82d37cb376..ac88ad4eb9 100644 --- a/hw/i386/pc_sysfw.c +++ b/hw/i386/pc_sysfw.c @@ -135,6 +135,7 @@ static void pc_system_flash_map(PCMachineState *pcms, MemoryRegion *rom_memory) { X86MachineState *x86ms = X86_MACHINE(pcms); + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); hwaddr total_size = 0; int i; BlockBackend *blk; @@ -184,7 +185,12 @@ static void pc_system_flash_map(PCMachineState *pcms, if (i == 0) { flash_mem = pflash_cfi01_get_memory(system_flash); - pc_isa_bios_init(&x86ms->isa_bios, rom_memory, flash_mem); + if (pcmc->isa_bios_alias) { + x86_isa_bios_init(&x86ms->isa_bios, rom_memory, flash_mem, + true); + } else { + pc_isa_bios_init(&x86ms->isa_bios, rom_memory, flash_mem); + } /* Encrypt the pflash boot ROM */ if (sev_enabled()) { diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 467e7fb52f..3f53ec73ac 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -122,6 +122,7 @@ struct PCMachineClass { bool enforce_aligned_dimm; bool broken_reserved_end; bool enforce_amd_1tb_hole; + bool isa_bios_alias; /* generate legacy CPU hotplug AML */ bool legacy_cpu_hotplug; -- 2.39.3