summaryrefslogtreecommitdiff
path: root/hw/arm/virt.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/arm/virt.c')
-rw-r--r--hw/arm/virt.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index d2e5ecd234..52f64645bb 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -154,6 +154,7 @@ static const MemMapEntry base_memmap[] = {
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
[VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
+ [VIRT_SRAM] = { 0x090c0000, 0x00001000 },
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
@@ -861,6 +862,50 @@ static void create_uart(const VirtMachineState *vms, int uart,
g_free(nodename);
}
+static void create_inter_vm_sram(VirtMachineState *vms,
+ MemoryRegion *mem)
+{
+ MemoryRegion *sram;
+ char *nodename;
+ const char regionname[] = "virt_sram";
+ hwaddr base = vms->memmap[VIRT_SRAM].base;
+ hwaddr size = vms->memmap[VIRT_SRAM].size;
+ MachineState *ms = MACHINE(vms);
+ Object *backend;
+ ram_addr_t backend_size;
+ HostMemoryBackend *HostBackend;
+
+ backend = object_resolve_path_type(regionname, TYPE_MEMORY_BACKEND, NULL);
+ if (!backend) {
+ /* No memory-backend-file has been added for the region */
+ warn_report("Memory backend for '%s' not found", regionname);
+ sram = g_new(MemoryRegion, 1);
+ memory_region_init_ram(sram, NULL, regionname, size, &error_fatal);
+ } else {
+ backend_size = object_property_get_uint(backend, "size", &error_abort);
+ if (backend_size != size)
+ warn_report("Size specified by %s: %ld should match size of "
+ "explicitly specified 'memory-backend' property %ld", regionname, size, backend_size);
+
+ /* Get memory region of the Hostbackend */
+ HostBackend = MEMORY_BACKEND(backend);
+ sram = host_memory_backend_get_memory(HostBackend);
+ host_memory_backend_set_mapped(HostBackend, true);
+ }
+
+ memory_region_add_subregion(mem, base, sram);
+
+ /* Add device in DT*/
+ nodename = g_strdup_printf("/vmram@%" PRIx64, base);
+ qemu_fdt_add_subnode(ms->fdt, nodename);
+ qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory");
+ qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size);
+ qemu_fdt_setprop_string(ms->fdt, nodename, "status", "okay");
+
+ g_free(nodename);
+}
+
+
static void create_rtc(const VirtMachineState *vms)
{
char *nodename;
@@ -2196,6 +2241,8 @@ static void machvirt_init(MachineState *machine)
vms->highmem_ecam &= (!firmware_loaded || aarch64);
+ create_inter_vm_sram(vms, sysmem);
+
create_rtc(vms);
create_pcie(vms);