qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 4/4] virt/hw/virt: Add virt_set_high_memmap() helper


From: Gavin Shan
Subject: [PATCH v2 4/4] virt/hw/virt: Add virt_set_high_memmap() helper
Date: Mon, 15 Aug 2022 14:29:58 +0800

The logic to assign high memory region's address in virt_set_memmap()
is independent. Lets move the logic to virt_set_high_memmap() helper.
"each device" is replaced by "each region" in the comments.

No functional change intended.

Signed-off-by: Gavin Shan <gshan@redhat.com>
---
 hw/arm/virt.c | 92 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 50 insertions(+), 42 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index e38b6919c9..4dde08a924 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1688,6 +1688,55 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState 
*vms, int idx)
     return arm_cpu_mp_affinity(idx, clustersz);
 }
 
+static void virt_set_high_memmap(VirtMachineState *vms,
+                                 hwaddr base, int pa_bits)
+{
+    hwaddr region_base, region_size;
+    bool *region_enabled, fits;
+    int i;
+
+    for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
+        region_base = ROUND_UP(base, extended_memmap[i].size);
+        region_size = extended_memmap[i].size;
+
+        switch (i) {
+        case VIRT_HIGH_GIC_REDIST2:
+            region_enabled = &vms->highmem_redists;
+            break;
+        case VIRT_HIGH_PCIE_ECAM:
+            region_enabled = &vms->highmem_ecam;
+            break;
+        case VIRT_HIGH_PCIE_MMIO:
+            region_enabled = &vms->highmem_mmio;
+            break;
+        default:
+            region_enabled = NULL;
+        }
+
+        /* Skip unknwon or disabled regions */
+        if (!region_enabled || !*region_enabled) {
+            continue;
+        }
+
+        /*
+         * Check each region to see if they fit in the PA space,
+         * moving highest_gpa as we go.
+         *
+         * For each device that doesn't fit, disable it.
+         */
+        fits = (region_base + region_size) <= BIT_ULL(pa_bits);
+        if (fits) {
+            vms->memmap[i].base = region_base;
+            vms->memmap[i].size = region_size;
+
+            base = region_base + region_size;
+            vms->highest_gpa = region_base + region_size - 1;
+        } else {
+            *region_enabled = false;
+        }
+    }
+}
+
 static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
 {
     MachineState *ms = MACHINE(vms);
@@ -1742,48 +1791,7 @@ static void virt_set_memmap(VirtMachineState *vms, int 
pa_bits)
 
     /* We know for sure that at least the memory fits in the PA space */
     vms->highest_gpa = memtop - 1;
-
-    for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
-        hwaddr region_base = ROUND_UP(base, extended_memmap[i].size);
-        hwaddr region_size = extended_memmap[i].size;
-        bool *region_enabled, fits;
-
-        switch (i) {
-        case VIRT_HIGH_GIC_REDIST2:
-            region_enabled = &vms->highmem_redists;
-            break;
-        case VIRT_HIGH_PCIE_ECAM:
-            region_enabled = &vms->highmem_ecam;
-            break;
-        case VIRT_HIGH_PCIE_MMIO:
-            region_enabled = &vms->highmem_mmio;
-            break;
-        default:
-            region_enabled = NULL;
-        }
-
-        /* Skip unknwon or disabled regions */
-        if (!region_enabled || !*region_enabled) {
-            continue;
-        }
-
-        /*
-         * Check each device to see if they fit in the PA space,
-         * moving highest_gpa as we go.
-         *
-         * For each device that doesn't fit, disable it.
-         */
-        fits = (region_base + region_size) <= BIT_ULL(pa_bits);
-        if (fits) {
-            vms->memmap[i].base = region_base;
-            vms->memmap[i].size = region_size;
-
-            base = region_base + region_size;
-            vms->highest_gpa = region_base + region_size - 1;
-        } else {
-            *region_enabled = false;
-        }
-    }
+    virt_set_high_memmap(vms, base, pa_bits);
 
     if (device_memory_size > 0) {
         ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
-- 
2.23.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]