/* * Memory manager for remote device * * Copyright © 2018, 2021 Oracle and/or its affiliates. * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #include "qemu/osdep.h" #include "hw/remote/memory.h" #include "exec/ram_addr.h" #include "qapi/error.h" static void remote_sysmem_reset(void) { MemoryRegion *sysmem, *subregion, *next; sysmem = get_system_memory(); QTAILQ_FOREACH_SAFE(subregion, &sysmem->subregions, subregions_link, next) { if (subregion->ram) { memory_region_del_subregion(sysmem, subregion); object_unparent(OBJECT(subregion)); } } } void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp) { ERRP_GUARD(); SyncSysmemMsg *sysmem_info = &msg->data.sync_sysmem; MemoryRegion *sysmem, *subregion; static unsigned int suffix; int region; sysmem = get_system_memory(); remote_sysmem_reset(); for (region = 0; region < msg->num_fds; region++, suffix++) { g_autofree char *name = g_strdup_printf("remote-mem-%u", suffix); subregion = g_new(MemoryRegion, 1); memory_region_init_ram_from_fd(subregion, NULL, name, sysmem_info->sizes[region], RAM_SHARED, msg->fds[region], sysmem_info->offsets[region], errp); if (*errp) { g_free(subregion); remote_sysmem_reset(); return; } memory_region_add_subregion(sysmem, sysmem_info->gpas[region], subregion); } }