1
2
3
4
5
6
7
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