On Fri, 1 Mar 2019 14:47:08 +0100 Eric Auger <eric.au...@redhat.com> wrote:
> We are about to allow the memory map to grow beyond 1TB and > potentially overshoot the VCPU AA64MMFR0.PARANGE. > > In aarch64 mode and when highmem is set, let's check the VCPU > PA range is sufficient to address the highest GPA of the memory > map. > > Signed-off-by: Eric Auger <eric.au...@redhat.com> Reviewed-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/arm/virt.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 300eaae26f..ab70e4a657 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -60,6 +60,7 @@ > #include "standard-headers/linux/input.h" > #include "hw/arm/smmuv3.h" > #include "hw/acpi/acpi.h" > +#include "target/arm/internals.h" > > #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ > static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ > @@ -1608,6 +1609,22 @@ static void machvirt_init(MachineState *machine) > fdt_add_timer_nodes(vms); > fdt_add_cpu_nodes(vms); > > + if (!kvm_enabled()) { > + ARMCPU *cpu = ARM_CPU(first_cpu); > + bool aarch64 = object_property_get_bool(OBJECT(cpu), "aarch64", > NULL); > + > + if (aarch64 && vms->highmem) { > + int requested_pa_size, pamax = arm_pamax(cpu); > + > + requested_pa_size = 64 - clz64(vms->highest_gpa); > + if (pamax < requested_pa_size) { > + error_report("VCPU supports less PA bits (%d) than requested > " > + "by the memory map (%d)", pamax, > requested_pa_size); > + exit(1); > + } > + } > + } > + > memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram", > machine->ram_size); > memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);