aboutsummaryrefslogtreecommitdiffstats
path: root/community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2022-04-20 15:17:38 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2022-04-20 15:33:43 +0200
commit5adbe4930461bef37687ee064aa82533a1bdf3c9 (patch)
tree224dbc4a708f800bd43f50d64d0b25986eee99e4 /community/qemu/0004-hw-arm-virt-Use-the-PA-range-to-compute-the-memory-m.patch
parentf4d03a7ca40a19ccfae035ff519aa9bb1720ea40 (diff)
community/qemu: upgrade to 7.0.0
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.patch151
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
-