qemu/hw/remote/memory.c
<<
>>
Prefs
   1/*
   2 * Memory manager for remote device
   3 *
   4 * Copyright © 2018, 2021 Oracle and/or its affiliates.
   5 *
   6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
   7 * See the COPYING file in the top-level directory.
   8 *
   9 */
  10
  11#include "qemu/osdep.h"
  12#include "qemu-common.h"
  13
  14#include "hw/remote/memory.h"
  15#include "exec/address-spaces.h"
  16#include "exec/ram_addr.h"
  17#include "qapi/error.h"
  18
  19static void remote_sysmem_reset(void)
  20{
  21    MemoryRegion *sysmem, *subregion, *next;
  22
  23    sysmem = get_system_memory();
  24
  25    QTAILQ_FOREACH_SAFE(subregion, &sysmem->subregions, subregions_link, next) {
  26        if (subregion->ram) {
  27            memory_region_del_subregion(sysmem, subregion);
  28            object_unparent(OBJECT(subregion));
  29        }
  30    }
  31}
  32
  33void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp)
  34{
  35    ERRP_GUARD();
  36    SyncSysmemMsg *sysmem_info = &msg->data.sync_sysmem;
  37    MemoryRegion *sysmem, *subregion;
  38    static unsigned int suffix;
  39    int region;
  40
  41    sysmem = get_system_memory();
  42
  43    remote_sysmem_reset();
  44
  45    for (region = 0; region < msg->num_fds; region++) {
  46        g_autofree char *name;
  47        subregion = g_new(MemoryRegion, 1);
  48        name = g_strdup_printf("remote-mem-%u", suffix++);
  49        memory_region_init_ram_from_fd(subregion, NULL,
  50                                       name, sysmem_info->sizes[region],
  51                                       true, msg->fds[region],
  52                                       sysmem_info->offsets[region],
  53                                       errp);
  54
  55        if (*errp) {
  56            g_free(subregion);
  57            remote_sysmem_reset();
  58            return;
  59        }
  60
  61        memory_region_add_subregion(sysmem, sysmem_info->gpas[region],
  62                                    subregion);
  63
  64    }
  65}
  66