[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