summaryrefslogtreecommitdiffstats
path: root/meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch')
-rw-r--r--meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch153
1 files changed, 153 insertions, 0 deletions
diff --git a/meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch b/meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch
new file mode 100644
index 00000000..a43748fe
--- /dev/null
+++ b/meta-xilinx-virtualization/recipes-devtools/qemu/qemu-xilinx-8.1/0006-xen-add-pseudo-RAM-region-for-grant-mappings.patch
@@ -0,0 +1,153 @@
1From 637d10471fef76a7ab0e8f5631ea3c85ff5ce9db Mon Sep 17 00:00:00 2001
2From: Juergen Gross <jgross@suse.com>
3Date: Thu, 20 May 2021 11:19:58 +0200
4Subject: [PATCH 06/11] xen: add pseudo RAM region for grant mappings
5
6Add a memory region which can be used to automatically map granted
7memory. It is starting at 0x8000000000000000ULL in order to be able to
8distinguish it from normal RAM.
9
10For this reason the xen.ram memory region is expanded, which has no
11further impact as it is used just as a container of the real RAM
12regions and now the grant region.
13
14Signed-off-by: Juergen Gross <jgross@suse.com>
15Signed-off-by: Vikram Garhwal <vikram.garhwal@amd.com>
16Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
17---
18 hw/i386/xen/xen-hvm.c | 3 +++
19 hw/xen/xen-hvm-common.c | 4 ++--
20 hw/xen/xen-mapcache.c | 27 +++++++++++++++++++++++++++
21 include/hw/xen/xen-hvm-common.h | 2 ++
22 include/hw/xen/xen_pvdev.h | 3 +++
23 include/sysemu/xen-mapcache.h | 3 +++
24 6 files changed, 40 insertions(+), 2 deletions(-)
25
26diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
27index f42621e674..67a55558a6 100644
28--- a/hw/i386/xen/xen-hvm.c
29+++ b/hw/i386/xen/xen-hvm.c
30@@ -172,6 +172,9 @@ static void xen_ram_init(PCMachineState *pcms,
31 x86ms->above_4g_mem_size);
32 memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
33 }
34+
35+ /* Add grant mappings as a pseudo RAM region. */
36+ ram_grants = *xen_init_grant_ram();
37 }
38
39 static XenPhysmap *get_physmapping(hwaddr start_addr, ram_addr_t size)
40diff --git a/hw/xen/xen-hvm-common.c b/hw/xen/xen-hvm-common.c
41index 565dc39c8f..b7255977a5 100644
42--- a/hw/xen/xen-hvm-common.c
43+++ b/hw/xen/xen-hvm-common.c
44@@ -9,7 +9,7 @@
45 #include "hw/boards.h"
46 #include "hw/xen/arch_hvm.h"
47
48-MemoryRegion ram_memory;
49+MemoryRegion ram_memory, ram_grants;
50
51 void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
52 Error **errp)
53@@ -26,7 +26,7 @@ void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
54 return;
55 }
56
57- if (mr == &ram_memory) {
58+ if (mr == &ram_memory || mr == &ram_grants) {
59 return;
60 }
61
62diff --git a/hw/xen/xen-mapcache.c b/hw/xen/xen-mapcache.c
63index f7d974677d..8115c44c00 100644
64--- a/hw/xen/xen-mapcache.c
65+++ b/hw/xen/xen-mapcache.c
66@@ -14,7 +14,9 @@
67
68 #include <sys/resource.h>
69
70+#include "hw/xen/xen-hvm-common.h"
71 #include "hw/xen/xen_native.h"
72+#include "hw/xen/xen_pvdev.h"
73 #include "qemu/bitmap.h"
74
75 #include "sysemu/runstate.h"
76@@ -597,3 +599,28 @@ uint8_t *xen_replace_cache_entry(hwaddr old_phys_addr,
77 mapcache_unlock();
78 return p;
79 }
80+
81+MemoryRegion *xen_init_grant_ram(void)
82+{
83+ RAMBlock *block;
84+
85+ memory_region_init(&ram_grants, NULL, "xen.grants",
86+ XEN_MAX_VIRTIO_GRANTS * XC_PAGE_SIZE);
87+ block = g_malloc0(sizeof(*block));
88+ block->mr = &ram_grants;
89+ block->used_length = XEN_MAX_VIRTIO_GRANTS * XC_PAGE_SIZE;
90+ block->max_length = XEN_MAX_VIRTIO_GRANTS * XC_PAGE_SIZE;
91+ block->fd = -1;
92+ block->page_size = XC_PAGE_SIZE;
93+ block->host = (void *)XEN_GRANT_ADDR_OFF;
94+ block->offset = XEN_GRANT_ADDR_OFF;
95+ block->flags = RAM_PREALLOC;
96+ ram_grants.ram_block = block;
97+ ram_grants.ram = true;
98+ ram_grants.terminates = true;
99+ ram_block_add_list(block);
100+ memory_region_add_subregion(get_system_memory(), XEN_GRANT_ADDR_OFF,
101+ &ram_grants);
102+
103+ return &ram_grants;
104+}
105diff --git a/include/hw/xen/xen-hvm-common.h b/include/hw/xen/xen-hvm-common.h
106index 4e9904f1a6..0d300ba898 100644
107--- a/include/hw/xen/xen-hvm-common.h
108+++ b/include/hw/xen/xen-hvm-common.h
109@@ -17,6 +17,8 @@
110 #include <xen/hvm/ioreq.h>
111
112 extern MemoryRegion ram_memory;
113+
114+extern MemoryRegion ram_grants;
115 extern MemoryListener xen_io_listener;
116 extern DeviceListener xen_device_listener;
117
118diff --git a/include/hw/xen/xen_pvdev.h b/include/hw/xen/xen_pvdev.h
119index ddad4b9f36..0f1b5edfa9 100644
120--- a/include/hw/xen/xen_pvdev.h
121+++ b/include/hw/xen/xen_pvdev.h
122@@ -80,4 +80,7 @@ int xen_pv_send_notify(struct XenLegacyDevice *xendev);
123 void xen_pv_printf(struct XenLegacyDevice *xendev, int msg_level,
124 const char *fmt, ...) G_GNUC_PRINTF(3, 4);
125
126+#define XEN_GRANT_ADDR_OFF 0x8000000000000000ULL
127+#define XEN_MAX_VIRTIO_GRANTS 65536
128+
129 #endif /* QEMU_HW_XEN_PVDEV_H */
130diff --git a/include/sysemu/xen-mapcache.h b/include/sysemu/xen-mapcache.h
131index c8e7c2f6cf..f4bedb1c11 100644
132--- a/include/sysemu/xen-mapcache.h
133+++ b/include/sysemu/xen-mapcache.h
134@@ -10,6 +10,7 @@
135 #define XEN_MAPCACHE_H
136
137 #include "exec/cpu-common.h"
138+#include "exec/ram_addr.h"
139
140 typedef hwaddr (*phys_offset_to_gaddr_t)(hwaddr phys_offset,
141 ram_addr_t size);
142@@ -25,6 +26,8 @@ void xen_invalidate_map_cache(void);
143 uint8_t *xen_replace_cache_entry(hwaddr old_phys_addr,
144 hwaddr new_phys_addr,
145 hwaddr size);
146+MemoryRegion *xen_init_grant_ram(void);
147+
148 #else
149
150 static inline void xen_map_cache_init(phys_offset_to_gaddr_t f,
151--
1522.39.2
153