[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 09/18] hw/arm/virt: Implement kvm_type function f
From: |
Eric Auger |
Subject: |
[Qemu-devel] [PATCH v5 09/18] hw/arm/virt: Implement kvm_type function for 4.0 machine |
Date: |
Wed, 23 Jan 2019 11:14:49 +0100 |
This patch implements the machine class kvm_type() callback.
It returns the max IPA shift needed to implement the whole GPA
range including the RAM and IO regions located beyond.
The returned value in passed though the KVM_CREATE_VM ioctl and
this allows KVM to set the stage2 tables dynamically.
At this stage the RAM limit still is 255GB.
Setting all the existing highmem IO regions beyond the RAM
allows to have a single contiguous RAM region (initial RAM and
possible hotpluggable device memory). That way we do not need
to do invasive changes in the EDK2 FW to support a dynamic
RAM base.
Signed-off-by: Eric Auger <address@hidden>
---
hw/arm/virt.c | 30 ++++++++++++++++++++++++++++++
include/hw/arm/virt.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index ea1fb3ddfd..a89ffbf4d7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1771,6 +1771,32 @@ static HotplugHandler
*virt_machine_get_hotplug_handler(MachineState *machine,
return NULL;
}
+/*
+ * for arm64 kvm_type [7-0] encodes the IPA size shift
+ */
+static int virt_kvm_type(MachineState *ms, const char *type_str)
+{
+ VirtMachineState *vms = VIRT_MACHINE(ms);
+ int max_vm_phys_shift = kvm_arm_get_max_vm_phys_shift(ms);
+ int max_pa_shift;
+
+ vms->extended_memmap = true;
+ /* device memory start/size aligned on 1GiB */
+ vms->high_io_base = ROUND_UP(GiB + ms->ram_size, GiB) +
+ ROUND_UP(ms->maxram_size - ms->ram_size, GiB);
+
+ max_pa_shift = 64 - clz64(vms->high_io_base + TiB);
+
+ if (max_pa_shift > max_vm_phys_shift) {
+ error_report("-m and ,maxmem option values "
+ "require an IPA range (%d bits) larger than "
+ "the one supported by the host (%d bits)",
+ max_pa_shift, max_vm_phys_shift);
+ exit(1);
+ }
+ return max_pa_shift;
+}
+
static void virt_machine_class_init(ObjectClass *oc, void *data)
{
MachineClass *mc = MACHINE_CLASS(oc);
@@ -1795,6 +1821,7 @@ static void virt_machine_class_init(ObjectClass *oc, void
*data)
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
+ mc->kvm_type = virt_kvm_type;
assert(!mc->get_hotplug_handler);
mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
hc->plug = virt_machine_device_plug_cb;
@@ -1899,6 +1926,9 @@ static void virt_machine_3_1_options(MachineClass *mc)
{
virt_machine_4_0_options(mc);
compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
+
+ /* extended memory map is enabled from 4.0 onwards */
+ mc->kvm_type = NULL;
}
DEFINE_VIRT_MACHINE(3, 1)
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 3dc7a6c5d5..86d4c93120 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -132,6 +132,7 @@ typedef struct {
uint32_t iommu_phandle;
int psci_conduit;
hwaddr high_io_base;
+ bool extended_memmap;
} VirtMachineState;
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
--
2.20.1
- [Qemu-devel] [PATCH v5 00/18] ARM virt: Initial RAM expansion and PCDIMM/NVDIMM support, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 07/18] kvm: add kvm_arm_get_max_vm_phys_shift, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 05/18] hw/arm/virt: Move memory map initialization into machvirt_init, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 03/18] hw/arm/boot: introduce fdt_add_memory_node helper, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 06/18] hw/boards: Add a MachineState parameter to kvm_type callback, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 04/18] hw/arm/virt: Split the memory map description, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 09/18] hw/arm/virt: Implement kvm_type function for 4.0 machine,
Eric Auger <=
- [Qemu-devel] [PATCH v5 08/18] vl: Set machine ram_size, maxram_size and ram_slots earlier, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 12/18] hw/arm/boot: Expose the PC-DIMM nodes in the DT, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 11/18] hw/arm/virt: Add memory hotplug framework, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 10/18] hw/arm/virt: Bump the 255GB initial RAM limit, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 02/18] linux-headers: Update to v5.0-rc2, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 13/18] hw/arm/virt-acpi-build: Add PC-DIMM in SRAT, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 15/18] nvdimm: use configurable ACPI IO base and size, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 14/18] hw/arm/virt: Allocate device_memory, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 17/18] hw/arm/boot: Expose the pmem nodes in the DT, Eric Auger, 2019/01/23
- [Qemu-devel] [PATCH v5 16/18] hw/arm/virt: Add nvdimm hot-plug infrastructure, Eric Auger, 2019/01/23