Hi Gavin, On 9/22/22 01:13, Gavin Shan wrote: > This introduces virt_set_high_memmap() helper. The logic of high > memory region address assignment is moved to the helper. The intention > is to make the subsequent optimization for high memory region address > assignment easier. > > No functional change intended. > > Signed-off-by: Gavin Shan <gs...@redhat.com> Reviewed-by: Eric Auger <eric.au...@redhat.com>
Thanks Eric > --- > hw/arm/virt.c | 74 ++++++++++++++++++++++++++++----------------------- > 1 file changed, 41 insertions(+), 33 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 0961e053e5..4dab528b82 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -1689,6 +1689,46 @@ 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) > +{ > + int i; > + > + for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) { > + hwaddr size = extended_memmap[i].size; > + bool fits; > + > + base = ROUND_UP(base, size); > + vms->memmap[i].base = base; > + vms->memmap[i].size = size; > + > + /* > + * 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 = (base + size) <= BIT_ULL(pa_bits); > + if (fits) { > + vms->highest_gpa = base + size - 1; > + } > + > + switch (i) { > + case VIRT_HIGH_GIC_REDIST2: > + vms->highmem_redists &= fits; > + break; > + case VIRT_HIGH_PCIE_ECAM: > + vms->highmem_ecam &= fits; > + break; > + case VIRT_HIGH_PCIE_MMIO: > + vms->highmem_mmio &= fits; > + break; > + } > + > + base += size; > + } > +} > + > static void virt_set_memmap(VirtMachineState *vms, int pa_bits) > { > MachineState *ms = MACHINE(vms); > @@ -1744,39 +1784,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 size = extended_memmap[i].size; > - bool fits; > - > - base = ROUND_UP(base, size); > - vms->memmap[i].base = base; > - vms->memmap[i].size = size; > - > - /* > - * 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 = (base + size) <= BIT_ULL(pa_bits); > - if (fits) { > - vms->highest_gpa = base + size - 1; > - } > - > - switch (i) { > - case VIRT_HIGH_GIC_REDIST2: > - vms->highmem_redists &= fits; > - break; > - case VIRT_HIGH_PCIE_ECAM: > - vms->highmem_ecam &= fits; > - break; > - case VIRT_HIGH_PCIE_MMIO: > - vms->highmem_mmio &= fits; > - break; > - } > - > - base += size; > - } > + virt_set_high_memmap(vms, base, pa_bits); > > if (device_memory_size > 0) { > ms->device_memory = g_malloc0(sizeof(*ms->device_memory));