diff options
Diffstat (limited to 'community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch')
-rw-r--r-- | community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch | 151 |
1 files changed, 0 insertions, 151 deletions
diff --git a/community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch b/community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch deleted file mode 100644 index c7c1ae6ef29..00000000000 --- a/community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 3715c251cc781b263fbd7f7c535fde7a4da401c3 Mon Sep 17 00:00:00 2001 -From: Marc Zyngier <maz@kernel.org> -Date: Fri, 14 Jan 2022 14:07:39 +0000 -Subject: [PATCH 4/6] hw/arm/virt: Use the PA range to compute the memory map - -The highmem attribute is nothing but another way to express the -PA range of a VM. To support HW that has a smaller PA range then -what QEMU assumes, pass this PA range to the virt_set_memmap() -function, allowing it to correctly exclude highmem devices -if they are outside of the PA range. - -Signed-off-by: Marc Zyngier <maz@kernel.org> -Reviewed-by: Eric Auger <eric.auger@redhat.com> -Message-id: 20220114140741.1358263-5-maz@kernel.org -Signed-off-by: Peter Maydell <peter.maydell@linaro.org> ---- - hw/arm/virt.c | 64 +++++++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 52 insertions(+), 12 deletions(-) - -diff --git a/hw/arm/virt.c b/hw/arm/virt.c -index 3b839ba78b..8627f5ab95 100644 ---- a/hw/arm/virt.c -+++ b/hw/arm/virt.c -@@ -1667,7 +1667,7 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx) - return arm_cpu_mp_affinity(idx, clustersz); - } - --static void virt_set_memmap(VirtMachineState *vms) -+static void virt_set_memmap(VirtMachineState *vms, int pa_bits) - { - MachineState *ms = MACHINE(vms); - hwaddr base, device_memory_base, device_memory_size, memtop; -@@ -1685,6 +1685,14 @@ static void virt_set_memmap(VirtMachineState *vms) - exit(EXIT_FAILURE); - } - -+ /* -+ * !highmem is exactly the same as limiting the PA space to 32bit, -+ * irrespective of the underlying capabilities of the HW. -+ */ -+ if (!vms->highmem) { -+ pa_bits = 32; -+ } -+ - /* - * We compute the base of the high IO region depending on the - * amount of initial and device memory. The device memory start/size -@@ -1698,8 +1706,9 @@ static void virt_set_memmap(VirtMachineState *vms) - - /* Base address of the high IO region */ - memtop = base = device_memory_base + ROUND_UP(device_memory_size, GiB); -- if (!vms->highmem && memtop > 4 * GiB) { -- error_report("highmem=off, but memory crosses the 4GiB limit\n"); -+ if (memtop > BIT_ULL(pa_bits)) { -+ error_report("Addressing limited to %d bits, but memory exceeds it by %llu bytes\n", -+ pa_bits, memtop - BIT_ULL(pa_bits)); - exit(EXIT_FAILURE); - } - if (base < device_memory_base) { -@@ -1718,7 +1727,13 @@ static void virt_set_memmap(VirtMachineState *vms) - vms->memmap[i].size = size; - base += size; - } -- vms->highest_gpa = (vms->highmem ? base : memtop) - 1; -+ -+ /* -+ * If base fits within pa_bits, all good. If it doesn't, limit it -+ * to the end of RAM, which is guaranteed to fit within pa_bits. -+ */ -+ vms->highest_gpa = (base <= BIT_ULL(pa_bits) ? base : memtop) - 1; -+ - if (device_memory_size > 0) { - ms->device_memory = g_malloc0(sizeof(*ms->device_memory)); - ms->device_memory->base = device_memory_base; -@@ -1909,12 +1924,43 @@ static void machvirt_init(MachineState *machine) - unsigned int smp_cpus = machine->smp.cpus; - unsigned int max_cpus = machine->smp.max_cpus; - -+ if (!cpu_type_valid(machine->cpu_type)) { -+ error_report("mach-virt: CPU type %s not supported", machine->cpu_type); -+ exit(1); -+ } -+ -+ possible_cpus = mc->possible_cpu_arch_ids(machine); -+ - /* - * In accelerated mode, the memory map is computed earlier in kvm_type() - * to create a VM with the right number of IPA bits. - */ - if (!vms->memmap) { -- virt_set_memmap(vms); -+ Object *cpuobj; -+ ARMCPU *armcpu; -+ int pa_bits; -+ -+ /* -+ * Instanciate a temporary CPU object to find out about what -+ * we are about to deal with. Once this is done, get rid of -+ * the object. -+ */ -+ cpuobj = object_new(possible_cpus->cpus[0].type); -+ armcpu = ARM_CPU(cpuobj); -+ -+ if (object_property_get_bool(cpuobj, "aarch64", NULL)) { -+ pa_bits = arm_pamax(armcpu); -+ } else if (arm_feature(&armcpu->env, ARM_FEATURE_LPAE)) { -+ /* v7 with LPAE */ -+ pa_bits = 40; -+ } else { -+ /* Anything else */ -+ pa_bits = 32; -+ } -+ -+ object_unref(cpuobj); -+ -+ virt_set_memmap(vms, pa_bits); - } - - /* We can probe only here because during property set -@@ -1922,11 +1968,6 @@ static void machvirt_init(MachineState *machine) - */ - finalize_gic_version(vms); - -- if (!cpu_type_valid(machine->cpu_type)) { -- error_report("mach-virt: CPU type %s not supported", machine->cpu_type); -- exit(1); -- } -- - if (vms->secure) { - /* - * The Secure view of the world is the same as the NonSecure, -@@ -1996,7 +2037,6 @@ static void machvirt_init(MachineState *machine) - - create_fdt(vms); - -- possible_cpus = mc->possible_cpu_arch_ids(machine); - assert(possible_cpus->len == max_cpus); - for (n = 0; n < possible_cpus->len; n++) { - Object *cpuobj; -@@ -2735,7 +2775,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str) - max_vm_pa_size = kvm_arm_get_max_vm_ipa_size(ms, &fixed_ipa); - - /* we freeze the memory map to compute the highest gpa */ -- virt_set_memmap(vms); -+ virt_set_memmap(vms, max_vm_pa_size); - - requested_pa_size = 64 - clz64(vms->highest_gpa); - --- -2.35.0 - |