root / memory.h @ c0424934
History | View | Annotate | Download (25.3 kB)
1 | 093bc2cd | Avi Kivity | /*
|
---|---|---|---|
2 | 093bc2cd | Avi Kivity | * Physical memory management API
|
3 | 093bc2cd | Avi Kivity | *
|
4 | 093bc2cd | Avi Kivity | * Copyright 2011 Red Hat, Inc. and/or its affiliates
|
5 | 093bc2cd | Avi Kivity | *
|
6 | 093bc2cd | Avi Kivity | * Authors:
|
7 | 093bc2cd | Avi Kivity | * Avi Kivity <avi@redhat.com>
|
8 | 093bc2cd | Avi Kivity | *
|
9 | 093bc2cd | Avi Kivity | * This work is licensed under the terms of the GNU GPL, version 2. See
|
10 | 093bc2cd | Avi Kivity | * the COPYING file in the top-level directory.
|
11 | 093bc2cd | Avi Kivity | *
|
12 | 093bc2cd | Avi Kivity | */
|
13 | 093bc2cd | Avi Kivity | |
14 | 093bc2cd | Avi Kivity | #ifndef MEMORY_H
|
15 | 093bc2cd | Avi Kivity | #define MEMORY_H
|
16 | 093bc2cd | Avi Kivity | |
17 | 093bc2cd | Avi Kivity | #ifndef CONFIG_USER_ONLY
|
18 | 093bc2cd | Avi Kivity | |
19 | 093bc2cd | Avi Kivity | #include <stdint.h> |
20 | 093bc2cd | Avi Kivity | #include <stdbool.h> |
21 | 093bc2cd | Avi Kivity | #include "qemu-common.h" |
22 | 093bc2cd | Avi Kivity | #include "cpu-common.h" |
23 | 093bc2cd | Avi Kivity | #include "targphys.h" |
24 | 093bc2cd | Avi Kivity | #include "qemu-queue.h" |
25 | 658b2224 | Avi Kivity | #include "iorange.h" |
26 | 627a0e90 | Avi Kivity | #include "ioport.h" |
27 | 08dafab4 | Avi Kivity | #include "int128.h" |
28 | 093bc2cd | Avi Kivity | |
29 | 093bc2cd | Avi Kivity | typedef struct MemoryRegionOps MemoryRegionOps; |
30 | 093bc2cd | Avi Kivity | typedef struct MemoryRegion MemoryRegion; |
31 | 627a0e90 | Avi Kivity | typedef struct MemoryRegionPortio MemoryRegionPortio; |
32 | 74901c3b | Avi Kivity | typedef struct MemoryRegionMmio MemoryRegionMmio; |
33 | 093bc2cd | Avi Kivity | |
34 | 093bc2cd | Avi Kivity | /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic
|
35 | 093bc2cd | Avi Kivity | * registration.
|
36 | 093bc2cd | Avi Kivity | */
|
37 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_VGA 0 |
38 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_CODE 1 |
39 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_MIGRATION 3 |
40 | 093bc2cd | Avi Kivity | |
41 | 74901c3b | Avi Kivity | struct MemoryRegionMmio {
|
42 | 74901c3b | Avi Kivity | CPUReadMemoryFunc *read[3];
|
43 | 74901c3b | Avi Kivity | CPUWriteMemoryFunc *write[3];
|
44 | 74901c3b | Avi Kivity | }; |
45 | 74901c3b | Avi Kivity | |
46 | a2d33521 | Avi Kivity | /* Internal use; thunks between old-style IORange and MemoryRegions. */
|
47 | a2d33521 | Avi Kivity | typedef struct MemoryRegionIORange MemoryRegionIORange; |
48 | a2d33521 | Avi Kivity | struct MemoryRegionIORange {
|
49 | a2d33521 | Avi Kivity | IORange iorange; |
50 | a2d33521 | Avi Kivity | MemoryRegion *mr; |
51 | a2d33521 | Avi Kivity | target_phys_addr_t offset; |
52 | a2d33521 | Avi Kivity | }; |
53 | a2d33521 | Avi Kivity | |
54 | 093bc2cd | Avi Kivity | /*
|
55 | 093bc2cd | Avi Kivity | * Memory region callbacks
|
56 | 093bc2cd | Avi Kivity | */
|
57 | 093bc2cd | Avi Kivity | struct MemoryRegionOps {
|
58 | 093bc2cd | Avi Kivity | /* Read from the memory region. @addr is relative to @mr; @size is
|
59 | 093bc2cd | Avi Kivity | * in bytes. */
|
60 | 093bc2cd | Avi Kivity | uint64_t (*read)(void *opaque,
|
61 | 093bc2cd | Avi Kivity | target_phys_addr_t addr, |
62 | 093bc2cd | Avi Kivity | unsigned size);
|
63 | 093bc2cd | Avi Kivity | /* Write to the memory region. @addr is relative to @mr; @size is
|
64 | 093bc2cd | Avi Kivity | * in bytes. */
|
65 | 093bc2cd | Avi Kivity | void (*write)(void *opaque, |
66 | 093bc2cd | Avi Kivity | target_phys_addr_t addr, |
67 | 093bc2cd | Avi Kivity | uint64_t data, |
68 | 093bc2cd | Avi Kivity | unsigned size);
|
69 | 093bc2cd | Avi Kivity | |
70 | 093bc2cd | Avi Kivity | enum device_endian endianness;
|
71 | 093bc2cd | Avi Kivity | /* Guest-visible constraints: */
|
72 | 093bc2cd | Avi Kivity | struct {
|
73 | 093bc2cd | Avi Kivity | /* If nonzero, specify bounds on access sizes beyond which a machine
|
74 | 093bc2cd | Avi Kivity | * check is thrown.
|
75 | 093bc2cd | Avi Kivity | */
|
76 | 093bc2cd | Avi Kivity | unsigned min_access_size;
|
77 | 093bc2cd | Avi Kivity | unsigned max_access_size;
|
78 | 093bc2cd | Avi Kivity | /* If true, unaligned accesses are supported. Otherwise unaligned
|
79 | 093bc2cd | Avi Kivity | * accesses throw machine checks.
|
80 | 093bc2cd | Avi Kivity | */
|
81 | 093bc2cd | Avi Kivity | bool unaligned;
|
82 | 897fa7cf | Avi Kivity | /*
|
83 | 897fa7cf | Avi Kivity | * If present, and returns #false, the transaction is not accepted
|
84 | 897fa7cf | Avi Kivity | * by the device (and results in machine dependent behaviour such
|
85 | 897fa7cf | Avi Kivity | * as a machine check exception).
|
86 | 897fa7cf | Avi Kivity | */
|
87 | 897fa7cf | Avi Kivity | bool (*accepts)(void *opaque, target_phys_addr_t addr, |
88 | 897fa7cf | Avi Kivity | unsigned size, bool is_write); |
89 | 093bc2cd | Avi Kivity | } valid; |
90 | 093bc2cd | Avi Kivity | /* Internal implementation constraints: */
|
91 | 093bc2cd | Avi Kivity | struct {
|
92 | 093bc2cd | Avi Kivity | /* If nonzero, specifies the minimum size implemented. Smaller sizes
|
93 | 093bc2cd | Avi Kivity | * will be rounded upwards and a partial result will be returned.
|
94 | 093bc2cd | Avi Kivity | */
|
95 | 093bc2cd | Avi Kivity | unsigned min_access_size;
|
96 | 093bc2cd | Avi Kivity | /* If nonzero, specifies the maximum size implemented. Larger sizes
|
97 | 093bc2cd | Avi Kivity | * will be done as a series of accesses with smaller sizes.
|
98 | 093bc2cd | Avi Kivity | */
|
99 | 093bc2cd | Avi Kivity | unsigned max_access_size;
|
100 | 093bc2cd | Avi Kivity | /* If true, unaligned accesses are supported. Otherwise all accesses
|
101 | 093bc2cd | Avi Kivity | * are converted to (possibly multiple) naturally aligned accesses.
|
102 | 093bc2cd | Avi Kivity | */
|
103 | 093bc2cd | Avi Kivity | bool unaligned;
|
104 | 093bc2cd | Avi Kivity | } impl; |
105 | 627a0e90 | Avi Kivity | |
106 | 627a0e90 | Avi Kivity | /* If .read and .write are not present, old_portio may be used for
|
107 | 627a0e90 | Avi Kivity | * backwards compatibility with old portio registration
|
108 | 627a0e90 | Avi Kivity | */
|
109 | 627a0e90 | Avi Kivity | const MemoryRegionPortio *old_portio;
|
110 | 74901c3b | Avi Kivity | /* If .read and .write are not present, old_mmio may be used for
|
111 | 74901c3b | Avi Kivity | * backwards compatibility with old mmio registration
|
112 | 74901c3b | Avi Kivity | */
|
113 | 74901c3b | Avi Kivity | const MemoryRegionMmio old_mmio;
|
114 | 093bc2cd | Avi Kivity | }; |
115 | 093bc2cd | Avi Kivity | |
116 | 093bc2cd | Avi Kivity | typedef struct CoalescedMemoryRange CoalescedMemoryRange; |
117 | 3e9d69e7 | Avi Kivity | typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; |
118 | 093bc2cd | Avi Kivity | |
119 | 093bc2cd | Avi Kivity | struct MemoryRegion {
|
120 | 093bc2cd | Avi Kivity | /* All fields are private - violators will be prosecuted */
|
121 | 093bc2cd | Avi Kivity | const MemoryRegionOps *ops;
|
122 | 093bc2cd | Avi Kivity | void *opaque;
|
123 | 093bc2cd | Avi Kivity | MemoryRegion *parent; |
124 | 08dafab4 | Avi Kivity | Int128 size; |
125 | 093bc2cd | Avi Kivity | target_phys_addr_t addr; |
126 | 545e92e0 | Avi Kivity | void (*destructor)(MemoryRegion *mr);
|
127 | 093bc2cd | Avi Kivity | ram_addr_t ram_addr; |
128 | b3b00c78 | Avi Kivity | bool subpage;
|
129 | 14a3c10a | Avi Kivity | bool terminates;
|
130 | d0a9b5bc | Avi Kivity | bool readable;
|
131 | 8ea9252a | Avi Kivity | bool ram;
|
132 | fb1cd6f9 | Avi Kivity | bool readonly; /* For RAM regions */ |
133 | 6bba19ba | Avi Kivity | bool enabled;
|
134 | 75c578dc | Avi Kivity | bool rom_device;
|
135 | 1660e72d | Jan Kiszka | bool warning_printed; /* For reservations */ |
136 | 093bc2cd | Avi Kivity | MemoryRegion *alias; |
137 | 093bc2cd | Avi Kivity | target_phys_addr_t alias_offset; |
138 | 093bc2cd | Avi Kivity | unsigned priority;
|
139 | 093bc2cd | Avi Kivity | bool may_overlap;
|
140 | 093bc2cd | Avi Kivity | QTAILQ_HEAD(subregions, MemoryRegion) subregions; |
141 | 093bc2cd | Avi Kivity | QTAILQ_ENTRY(MemoryRegion) subregions_link; |
142 | 093bc2cd | Avi Kivity | QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced; |
143 | 093bc2cd | Avi Kivity | const char *name; |
144 | 5a583347 | Avi Kivity | uint8_t dirty_log_mask; |
145 | 3e9d69e7 | Avi Kivity | unsigned ioeventfd_nb;
|
146 | 3e9d69e7 | Avi Kivity | MemoryRegionIoeventfd *ioeventfds; |
147 | 093bc2cd | Avi Kivity | }; |
148 | 093bc2cd | Avi Kivity | |
149 | 627a0e90 | Avi Kivity | struct MemoryRegionPortio {
|
150 | 627a0e90 | Avi Kivity | uint32_t offset; |
151 | 627a0e90 | Avi Kivity | uint32_t len; |
152 | 627a0e90 | Avi Kivity | unsigned size;
|
153 | 627a0e90 | Avi Kivity | IOPortReadFunc *read; |
154 | 627a0e90 | Avi Kivity | IOPortWriteFunc *write; |
155 | 627a0e90 | Avi Kivity | }; |
156 | 627a0e90 | Avi Kivity | |
157 | 2dd30228 | Avi Kivity | #define PORTIO_END_OF_LIST() { }
|
158 | 627a0e90 | Avi Kivity | |
159 | e2177955 | Avi Kivity | typedef struct MemoryRegionSection MemoryRegionSection; |
160 | e2177955 | Avi Kivity | |
161 | e2177955 | Avi Kivity | /**
|
162 | e2177955 | Avi Kivity | * MemoryRegionSection: describes a fragment of a #MemoryRegion
|
163 | e2177955 | Avi Kivity | *
|
164 | e2177955 | Avi Kivity | * @mr: the region, or %NULL if empty
|
165 | 7664e80c | Avi Kivity | * @address_space: the address space the region is mapped in
|
166 | e2177955 | Avi Kivity | * @offset_within_region: the beginning of the section, relative to @mr's start
|
167 | e2177955 | Avi Kivity | * @size: the size of the section; will not exceed @mr's boundaries
|
168 | e2177955 | Avi Kivity | * @offset_within_address_space: the address of the first byte of the section
|
169 | e2177955 | Avi Kivity | * relative to the region's address space
|
170 | 7a8499e8 | Avi Kivity | * @readonly: writes to this section are ignored
|
171 | e2177955 | Avi Kivity | */
|
172 | e2177955 | Avi Kivity | struct MemoryRegionSection {
|
173 | e2177955 | Avi Kivity | MemoryRegion *mr; |
174 | 7664e80c | Avi Kivity | MemoryRegion *address_space; |
175 | e2177955 | Avi Kivity | target_phys_addr_t offset_within_region; |
176 | e2177955 | Avi Kivity | uint64_t size; |
177 | e2177955 | Avi Kivity | target_phys_addr_t offset_within_address_space; |
178 | 7a8499e8 | Avi Kivity | bool readonly;
|
179 | e2177955 | Avi Kivity | }; |
180 | e2177955 | Avi Kivity | |
181 | 7664e80c | Avi Kivity | typedef struct MemoryListener MemoryListener; |
182 | 7664e80c | Avi Kivity | |
183 | 7664e80c | Avi Kivity | /**
|
184 | 7664e80c | Avi Kivity | * MemoryListener: callbacks structure for updates to the physical memory map
|
185 | 7664e80c | Avi Kivity | *
|
186 | 7664e80c | Avi Kivity | * Allows a component to adjust to changes in the guest-visible memory map.
|
187 | 7664e80c | Avi Kivity | * Use with memory_listener_register() and memory_listener_unregister().
|
188 | 7664e80c | Avi Kivity | */
|
189 | 7664e80c | Avi Kivity | struct MemoryListener {
|
190 | 50c1e149 | Avi Kivity | void (*begin)(MemoryListener *listener);
|
191 | 50c1e149 | Avi Kivity | void (*commit)(MemoryListener *listener);
|
192 | 7664e80c | Avi Kivity | void (*region_add)(MemoryListener *listener, MemoryRegionSection *section);
|
193 | 7664e80c | Avi Kivity | void (*region_del)(MemoryListener *listener, MemoryRegionSection *section);
|
194 | 50c1e149 | Avi Kivity | void (*region_nop)(MemoryListener *listener, MemoryRegionSection *section);
|
195 | 7664e80c | Avi Kivity | void (*log_start)(MemoryListener *listener, MemoryRegionSection *section);
|
196 | 7664e80c | Avi Kivity | void (*log_stop)(MemoryListener *listener, MemoryRegionSection *section);
|
197 | 7664e80c | Avi Kivity | void (*log_sync)(MemoryListener *listener, MemoryRegionSection *section);
|
198 | 7664e80c | Avi Kivity | void (*log_global_start)(MemoryListener *listener);
|
199 | 7664e80c | Avi Kivity | void (*log_global_stop)(MemoryListener *listener);
|
200 | 80a1ea37 | Avi Kivity | void (*eventfd_add)(MemoryListener *listener, MemoryRegionSection *section,
|
201 | 80a1ea37 | Avi Kivity | bool match_data, uint64_t data, int fd); |
202 | 80a1ea37 | Avi Kivity | void (*eventfd_del)(MemoryListener *listener, MemoryRegionSection *section,
|
203 | 80a1ea37 | Avi Kivity | bool match_data, uint64_t data, int fd); |
204 | 72e22d2f | Avi Kivity | /* Lower = earlier (during add), later (during del) */
|
205 | 72e22d2f | Avi Kivity | unsigned priority;
|
206 | 7376e582 | Avi Kivity | MemoryRegion *address_space_filter; |
207 | 72e22d2f | Avi Kivity | QTAILQ_ENTRY(MemoryListener) link; |
208 | 7664e80c | Avi Kivity | }; |
209 | 7664e80c | Avi Kivity | |
210 | 093bc2cd | Avi Kivity | /**
|
211 | 093bc2cd | Avi Kivity | * memory_region_init: Initialize a memory region
|
212 | 093bc2cd | Avi Kivity | *
|
213 | 69ddaf66 | Ademar de Souza Reis Jr | * The region typically acts as a container for other memory regions. Use
|
214 | 093bc2cd | Avi Kivity | * memory_region_add_subregion() to add subregions.
|
215 | 093bc2cd | Avi Kivity | *
|
216 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized
|
217 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
218 | 093bc2cd | Avi Kivity | * @size: size of the region; any subregions beyond this size will be clipped
|
219 | 093bc2cd | Avi Kivity | */
|
220 | 093bc2cd | Avi Kivity | void memory_region_init(MemoryRegion *mr,
|
221 | 093bc2cd | Avi Kivity | const char *name, |
222 | 093bc2cd | Avi Kivity | uint64_t size); |
223 | 093bc2cd | Avi Kivity | /**
|
224 | 093bc2cd | Avi Kivity | * memory_region_init_io: Initialize an I/O memory region.
|
225 | 093bc2cd | Avi Kivity | *
|
226 | 69ddaf66 | Ademar de Souza Reis Jr | * Accesses into the region will cause the callbacks in @ops to be called.
|
227 | 093bc2cd | Avi Kivity | * if @size is nonzero, subregions will be clipped to @size.
|
228 | 093bc2cd | Avi Kivity | *
|
229 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
230 | 093bc2cd | Avi Kivity | * @ops: a structure containing read and write callbacks to be used when
|
231 | 093bc2cd | Avi Kivity | * I/O is performed on the region.
|
232 | 093bc2cd | Avi Kivity | * @opaque: passed to to the read and write callbacks of the @ops structure.
|
233 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
234 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
235 | 093bc2cd | Avi Kivity | */
|
236 | 093bc2cd | Avi Kivity | void memory_region_init_io(MemoryRegion *mr,
|
237 | 093bc2cd | Avi Kivity | const MemoryRegionOps *ops,
|
238 | 093bc2cd | Avi Kivity | void *opaque,
|
239 | 093bc2cd | Avi Kivity | const char *name, |
240 | 093bc2cd | Avi Kivity | uint64_t size); |
241 | 093bc2cd | Avi Kivity | |
242 | 093bc2cd | Avi Kivity | /**
|
243 | 093bc2cd | Avi Kivity | * memory_region_init_ram: Initialize RAM memory region. Accesses into the
|
244 | 69ddaf66 | Ademar de Souza Reis Jr | * region will modify memory directly.
|
245 | 093bc2cd | Avi Kivity | *
|
246 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
247 | c5705a77 | Avi Kivity | * @name: the name of the region.
|
248 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
249 | 093bc2cd | Avi Kivity | */
|
250 | 093bc2cd | Avi Kivity | void memory_region_init_ram(MemoryRegion *mr,
|
251 | 093bc2cd | Avi Kivity | const char *name, |
252 | 093bc2cd | Avi Kivity | uint64_t size); |
253 | 093bc2cd | Avi Kivity | |
254 | 093bc2cd | Avi Kivity | /**
|
255 | 093bc2cd | Avi Kivity | * memory_region_init_ram: Initialize RAM memory region from a user-provided.
|
256 | 69ddaf66 | Ademar de Souza Reis Jr | * pointer. Accesses into the region will modify
|
257 | 093bc2cd | Avi Kivity | * memory directly.
|
258 | 093bc2cd | Avi Kivity | *
|
259 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
260 | c5705a77 | Avi Kivity | * @name: the name of the region.
|
261 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
262 | 093bc2cd | Avi Kivity | * @ptr: memory to be mapped; must contain at least @size bytes.
|
263 | 093bc2cd | Avi Kivity | */
|
264 | 093bc2cd | Avi Kivity | void memory_region_init_ram_ptr(MemoryRegion *mr,
|
265 | 093bc2cd | Avi Kivity | const char *name, |
266 | 093bc2cd | Avi Kivity | uint64_t size, |
267 | 093bc2cd | Avi Kivity | void *ptr);
|
268 | 093bc2cd | Avi Kivity | |
269 | 093bc2cd | Avi Kivity | /**
|
270 | 093bc2cd | Avi Kivity | * memory_region_init_alias: Initialize a memory region that aliases all or a
|
271 | 093bc2cd | Avi Kivity | * part of another memory region.
|
272 | 093bc2cd | Avi Kivity | *
|
273 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
274 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
275 | 093bc2cd | Avi Kivity | * @orig: the region to be referenced; @mr will be equivalent to
|
276 | 093bc2cd | Avi Kivity | * @orig between @offset and @offset + @size - 1.
|
277 | 093bc2cd | Avi Kivity | * @offset: start of the section in @orig to be referenced.
|
278 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
279 | 093bc2cd | Avi Kivity | */
|
280 | 093bc2cd | Avi Kivity | void memory_region_init_alias(MemoryRegion *mr,
|
281 | 093bc2cd | Avi Kivity | const char *name, |
282 | 093bc2cd | Avi Kivity | MemoryRegion *orig, |
283 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
284 | 093bc2cd | Avi Kivity | uint64_t size); |
285 | d0a9b5bc | Avi Kivity | |
286 | d0a9b5bc | Avi Kivity | /**
|
287 | d0a9b5bc | Avi Kivity | * memory_region_init_rom_device: Initialize a ROM memory region. Writes are
|
288 | d0a9b5bc | Avi Kivity | * handled via callbacks.
|
289 | d0a9b5bc | Avi Kivity | *
|
290 | d0a9b5bc | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
291 | d0a9b5bc | Avi Kivity | * @ops: callbacks for write access handling.
|
292 | c5705a77 | Avi Kivity | * @name: the name of the region.
|
293 | d0a9b5bc | Avi Kivity | * @size: size of the region.
|
294 | d0a9b5bc | Avi Kivity | */
|
295 | d0a9b5bc | Avi Kivity | void memory_region_init_rom_device(MemoryRegion *mr,
|
296 | d0a9b5bc | Avi Kivity | const MemoryRegionOps *ops,
|
297 | 75f5941c | Avi Kivity | void *opaque,
|
298 | d0a9b5bc | Avi Kivity | const char *name, |
299 | d0a9b5bc | Avi Kivity | uint64_t size); |
300 | d0a9b5bc | Avi Kivity | |
301 | 093bc2cd | Avi Kivity | /**
|
302 | 1660e72d | Jan Kiszka | * memory_region_init_reservation: Initialize a memory region that reserves
|
303 | 1660e72d | Jan Kiszka | * I/O space.
|
304 | 1660e72d | Jan Kiszka | *
|
305 | 1660e72d | Jan Kiszka | * A reservation region primariy serves debugging purposes. It claims I/O
|
306 | 1660e72d | Jan Kiszka | * space that is not supposed to be handled by QEMU itself. Any access via
|
307 | 1660e72d | Jan Kiszka | * the memory API will cause an abort().
|
308 | 1660e72d | Jan Kiszka | *
|
309 | 1660e72d | Jan Kiszka | * @mr: the #MemoryRegion to be initialized
|
310 | 1660e72d | Jan Kiszka | * @name: used for debugging; not visible to the user or ABI
|
311 | 1660e72d | Jan Kiszka | * @size: size of the region.
|
312 | 1660e72d | Jan Kiszka | */
|
313 | 1660e72d | Jan Kiszka | void memory_region_init_reservation(MemoryRegion *mr,
|
314 | 1660e72d | Jan Kiszka | const char *name, |
315 | 1660e72d | Jan Kiszka | uint64_t size); |
316 | 1660e72d | Jan Kiszka | /**
|
317 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_destroy: Destroy a memory region and reclaim all resources.
|
318 | 093bc2cd | Avi Kivity | *
|
319 | 093bc2cd | Avi Kivity | * @mr: the region to be destroyed. May not currently be a subregion
|
320 | 093bc2cd | Avi Kivity | * (see memory_region_add_subregion()) or referenced in an alias
|
321 | 093bc2cd | Avi Kivity | * (see memory_region_init_alias()).
|
322 | 093bc2cd | Avi Kivity | */
|
323 | 093bc2cd | Avi Kivity | void memory_region_destroy(MemoryRegion *mr);
|
324 | 093bc2cd | Avi Kivity | |
325 | 093bc2cd | Avi Kivity | /**
|
326 | 093bc2cd | Avi Kivity | * memory_region_size: get a memory region's size.
|
327 | 093bc2cd | Avi Kivity | *
|
328 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
329 | 093bc2cd | Avi Kivity | */
|
330 | 093bc2cd | Avi Kivity | uint64_t memory_region_size(MemoryRegion *mr); |
331 | 093bc2cd | Avi Kivity | |
332 | 093bc2cd | Avi Kivity | /**
|
333 | 8ea9252a | Avi Kivity | * memory_region_is_ram: check whether a memory region is random access
|
334 | 8ea9252a | Avi Kivity | *
|
335 | 8ea9252a | Avi Kivity | * Returns %true is a memory region is random access.
|
336 | 8ea9252a | Avi Kivity | *
|
337 | 8ea9252a | Avi Kivity | * @mr: the memory region being queried
|
338 | 8ea9252a | Avi Kivity | */
|
339 | 8ea9252a | Avi Kivity | bool memory_region_is_ram(MemoryRegion *mr);
|
340 | 8ea9252a | Avi Kivity | |
341 | 8ea9252a | Avi Kivity | /**
|
342 | 8991c79b | Avi Kivity | * memory_region_name: get a memory region's name
|
343 | 8991c79b | Avi Kivity | *
|
344 | 8991c79b | Avi Kivity | * Returns the string that was used to initialize the memory region.
|
345 | 8991c79b | Avi Kivity | *
|
346 | 8991c79b | Avi Kivity | * @mr: the memory region being queried
|
347 | 8991c79b | Avi Kivity | */
|
348 | 8991c79b | Avi Kivity | const char *memory_region_name(MemoryRegion *mr); |
349 | 8991c79b | Avi Kivity | |
350 | 8991c79b | Avi Kivity | /**
|
351 | 55043ba3 | Avi Kivity | * memory_region_is_logging: return whether a memory region is logging writes
|
352 | 55043ba3 | Avi Kivity | *
|
353 | 55043ba3 | Avi Kivity | * Returns %true if the memory region is logging writes
|
354 | 55043ba3 | Avi Kivity | *
|
355 | 55043ba3 | Avi Kivity | * @mr: the memory region being queried
|
356 | 55043ba3 | Avi Kivity | */
|
357 | 55043ba3 | Avi Kivity | bool memory_region_is_logging(MemoryRegion *mr);
|
358 | 55043ba3 | Avi Kivity | |
359 | 55043ba3 | Avi Kivity | /**
|
360 | ce7923da | Avi Kivity | * memory_region_is_rom: check whether a memory region is ROM
|
361 | ce7923da | Avi Kivity | *
|
362 | ce7923da | Avi Kivity | * Returns %true is a memory region is read-only memory.
|
363 | ce7923da | Avi Kivity | *
|
364 | ce7923da | Avi Kivity | * @mr: the memory region being queried
|
365 | ce7923da | Avi Kivity | */
|
366 | ce7923da | Avi Kivity | bool memory_region_is_rom(MemoryRegion *mr);
|
367 | ce7923da | Avi Kivity | |
368 | ce7923da | Avi Kivity | /**
|
369 | 093bc2cd | Avi Kivity | * memory_region_get_ram_ptr: Get a pointer into a RAM memory region.
|
370 | 093bc2cd | Avi Kivity | *
|
371 | 093bc2cd | Avi Kivity | * Returns a host pointer to a RAM memory region (created with
|
372 | 093bc2cd | Avi Kivity | * memory_region_init_ram() or memory_region_init_ram_ptr()). Use with
|
373 | 093bc2cd | Avi Kivity | * care.
|
374 | 093bc2cd | Avi Kivity | *
|
375 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
376 | 093bc2cd | Avi Kivity | */
|
377 | 093bc2cd | Avi Kivity | void *memory_region_get_ram_ptr(MemoryRegion *mr);
|
378 | 093bc2cd | Avi Kivity | |
379 | 093bc2cd | Avi Kivity | /**
|
380 | 093bc2cd | Avi Kivity | * memory_region_set_log: Turn dirty logging on or off for a region.
|
381 | 093bc2cd | Avi Kivity | *
|
382 | 093bc2cd | Avi Kivity | * Turns dirty logging on or off for a specified client (display, migration).
|
383 | 093bc2cd | Avi Kivity | * Only meaningful for RAM regions.
|
384 | 093bc2cd | Avi Kivity | *
|
385 | 093bc2cd | Avi Kivity | * @mr: the memory region being updated.
|
386 | 093bc2cd | Avi Kivity | * @log: whether dirty logging is to be enabled or disabled.
|
387 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
388 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
389 | 093bc2cd | Avi Kivity | */
|
390 | 093bc2cd | Avi Kivity | void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client); |
391 | 093bc2cd | Avi Kivity | |
392 | 093bc2cd | Avi Kivity | /**
|
393 | cd7a45c9 | Blue Swirl | * memory_region_get_dirty: Check whether a range of bytes is dirty
|
394 | cd7a45c9 | Blue Swirl | * for a specified client.
|
395 | 093bc2cd | Avi Kivity | *
|
396 | cd7a45c9 | Blue Swirl | * Checks whether a range of bytes has been written to since the last
|
397 | 093bc2cd | Avi Kivity | * call to memory_region_reset_dirty() with the same @client. Dirty logging
|
398 | 093bc2cd | Avi Kivity | * must be enabled.
|
399 | 093bc2cd | Avi Kivity | *
|
400 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
401 | 093bc2cd | Avi Kivity | * @addr: the address (relative to the start of the region) being queried.
|
402 | cd7a45c9 | Blue Swirl | * @size: the size of the range being queried.
|
403 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
404 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
405 | 093bc2cd | Avi Kivity | */
|
406 | 093bc2cd | Avi Kivity | bool memory_region_get_dirty(MemoryRegion *mr, target_phys_addr_t addr,
|
407 | cd7a45c9 | Blue Swirl | target_phys_addr_t size, unsigned client);
|
408 | 093bc2cd | Avi Kivity | |
409 | 093bc2cd | Avi Kivity | /**
|
410 | fd4aa979 | Blue Swirl | * memory_region_set_dirty: Mark a range of bytes as dirty in a memory region.
|
411 | 093bc2cd | Avi Kivity | *
|
412 | fd4aa979 | Blue Swirl | * Marks a range of bytes as dirty, after it has been dirtied outside
|
413 | fd4aa979 | Blue Swirl | * guest code.
|
414 | 093bc2cd | Avi Kivity | *
|
415 | fd4aa979 | Blue Swirl | * @mr: the memory region being dirtied.
|
416 | 093bc2cd | Avi Kivity | * @addr: the address (relative to the start of the region) being dirtied.
|
417 | fd4aa979 | Blue Swirl | * @size: size of the range being dirtied.
|
418 | 093bc2cd | Avi Kivity | */
|
419 | fd4aa979 | Blue Swirl | void memory_region_set_dirty(MemoryRegion *mr, target_phys_addr_t addr,
|
420 | fd4aa979 | Blue Swirl | target_phys_addr_t size); |
421 | 093bc2cd | Avi Kivity | |
422 | 093bc2cd | Avi Kivity | /**
|
423 | 093bc2cd | Avi Kivity | * memory_region_sync_dirty_bitmap: Synchronize a region's dirty bitmap with
|
424 | 093bc2cd | Avi Kivity | * any external TLBs (e.g. kvm)
|
425 | 093bc2cd | Avi Kivity | *
|
426 | 093bc2cd | Avi Kivity | * Flushes dirty information from accelerators such as kvm and vhost-net
|
427 | 093bc2cd | Avi Kivity | * and makes it available to users of the memory API.
|
428 | 093bc2cd | Avi Kivity | *
|
429 | 093bc2cd | Avi Kivity | * @mr: the region being flushed.
|
430 | 093bc2cd | Avi Kivity | */
|
431 | 093bc2cd | Avi Kivity | void memory_region_sync_dirty_bitmap(MemoryRegion *mr);
|
432 | 093bc2cd | Avi Kivity | |
433 | 093bc2cd | Avi Kivity | /**
|
434 | 093bc2cd | Avi Kivity | * memory_region_reset_dirty: Mark a range of pages as clean, for a specified
|
435 | 093bc2cd | Avi Kivity | * client.
|
436 | 093bc2cd | Avi Kivity | *
|
437 | 093bc2cd | Avi Kivity | * Marks a range of pages as no longer dirty.
|
438 | 093bc2cd | Avi Kivity | *
|
439 | 093bc2cd | Avi Kivity | * @mr: the region being updated.
|
440 | 093bc2cd | Avi Kivity | * @addr: the start of the subrange being cleaned.
|
441 | 093bc2cd | Avi Kivity | * @size: the size of the subrange being cleaned.
|
442 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
443 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
444 | 093bc2cd | Avi Kivity | */
|
445 | 093bc2cd | Avi Kivity | void memory_region_reset_dirty(MemoryRegion *mr, target_phys_addr_t addr,
|
446 | 093bc2cd | Avi Kivity | target_phys_addr_t size, unsigned client);
|
447 | 093bc2cd | Avi Kivity | |
448 | 093bc2cd | Avi Kivity | /**
|
449 | 093bc2cd | Avi Kivity | * memory_region_set_readonly: Turn a memory region read-only (or read-write)
|
450 | 093bc2cd | Avi Kivity | *
|
451 | 093bc2cd | Avi Kivity | * Allows a memory region to be marked as read-only (turning it into a ROM).
|
452 | 093bc2cd | Avi Kivity | * only useful on RAM regions.
|
453 | 093bc2cd | Avi Kivity | *
|
454 | 093bc2cd | Avi Kivity | * @mr: the region being updated.
|
455 | 093bc2cd | Avi Kivity | * @readonly: whether rhe region is to be ROM or RAM.
|
456 | 093bc2cd | Avi Kivity | */
|
457 | 093bc2cd | Avi Kivity | void memory_region_set_readonly(MemoryRegion *mr, bool readonly); |
458 | 093bc2cd | Avi Kivity | |
459 | 093bc2cd | Avi Kivity | /**
|
460 | d0a9b5bc | Avi Kivity | * memory_region_rom_device_set_readable: enable/disable ROM readability
|
461 | d0a9b5bc | Avi Kivity | *
|
462 | d0a9b5bc | Avi Kivity | * Allows a ROM device (initialized with memory_region_init_rom_device() to
|
463 | d0a9b5bc | Avi Kivity | * to be marked as readable (default) or not readable. When it is readable,
|
464 | d0a9b5bc | Avi Kivity | * the device is mapped to guest memory. When not readable, reads are
|
465 | d0a9b5bc | Avi Kivity | * forwarded to the #MemoryRegion.read function.
|
466 | d0a9b5bc | Avi Kivity | *
|
467 | d0a9b5bc | Avi Kivity | * @mr: the memory region to be updated
|
468 | d0a9b5bc | Avi Kivity | * @readable: whether reads are satisified directly (%true) or via callbacks
|
469 | d0a9b5bc | Avi Kivity | * (%false)
|
470 | d0a9b5bc | Avi Kivity | */
|
471 | d0a9b5bc | Avi Kivity | void memory_region_rom_device_set_readable(MemoryRegion *mr, bool readable); |
472 | d0a9b5bc | Avi Kivity | |
473 | d0a9b5bc | Avi Kivity | /**
|
474 | 093bc2cd | Avi Kivity | * memory_region_set_coalescing: Enable memory coalescing for the region.
|
475 | 093bc2cd | Avi Kivity | *
|
476 | 093bc2cd | Avi Kivity | * Enabled writes to a region to be queued for later processing. MMIO ->write
|
477 | 093bc2cd | Avi Kivity | * callbacks may be delayed until a non-coalesced MMIO is issued.
|
478 | 093bc2cd | Avi Kivity | * Only useful for IO regions. Roughly similar to write-combining hardware.
|
479 | 093bc2cd | Avi Kivity | *
|
480 | 093bc2cd | Avi Kivity | * @mr: the memory region to be write coalesced
|
481 | 093bc2cd | Avi Kivity | */
|
482 | 093bc2cd | Avi Kivity | void memory_region_set_coalescing(MemoryRegion *mr);
|
483 | 093bc2cd | Avi Kivity | |
484 | 093bc2cd | Avi Kivity | /**
|
485 | 093bc2cd | Avi Kivity | * memory_region_add_coalescing: Enable memory coalescing for a sub-range of
|
486 | 093bc2cd | Avi Kivity | * a region.
|
487 | 093bc2cd | Avi Kivity | *
|
488 | 093bc2cd | Avi Kivity | * Like memory_region_set_coalescing(), but works on a sub-range of a region.
|
489 | 093bc2cd | Avi Kivity | * Multiple calls can be issued coalesced disjoint ranges.
|
490 | 093bc2cd | Avi Kivity | *
|
491 | 093bc2cd | Avi Kivity | * @mr: the memory region to be updated.
|
492 | 093bc2cd | Avi Kivity | * @offset: the start of the range within the region to be coalesced.
|
493 | 093bc2cd | Avi Kivity | * @size: the size of the subrange to be coalesced.
|
494 | 093bc2cd | Avi Kivity | */
|
495 | 093bc2cd | Avi Kivity | void memory_region_add_coalescing(MemoryRegion *mr,
|
496 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
497 | 093bc2cd | Avi Kivity | uint64_t size); |
498 | 093bc2cd | Avi Kivity | |
499 | 093bc2cd | Avi Kivity | /**
|
500 | 093bc2cd | Avi Kivity | * memory_region_clear_coalescing: Disable MMIO coalescing for the region.
|
501 | 093bc2cd | Avi Kivity | *
|
502 | 093bc2cd | Avi Kivity | * Disables any coalescing caused by memory_region_set_coalescing() or
|
503 | 093bc2cd | Avi Kivity | * memory_region_add_coalescing(). Roughly equivalent to uncacheble memory
|
504 | 093bc2cd | Avi Kivity | * hardware.
|
505 | 093bc2cd | Avi Kivity | *
|
506 | 093bc2cd | Avi Kivity | * @mr: the memory region to be updated.
|
507 | 093bc2cd | Avi Kivity | */
|
508 | 093bc2cd | Avi Kivity | void memory_region_clear_coalescing(MemoryRegion *mr);
|
509 | 093bc2cd | Avi Kivity | |
510 | 093bc2cd | Avi Kivity | /**
|
511 | 3e9d69e7 | Avi Kivity | * memory_region_add_eventfd: Request an eventfd to be triggered when a word
|
512 | 3e9d69e7 | Avi Kivity | * is written to a location.
|
513 | 3e9d69e7 | Avi Kivity | *
|
514 | 3e9d69e7 | Avi Kivity | * Marks a word in an IO region (initialized with memory_region_init_io())
|
515 | 3e9d69e7 | Avi Kivity | * as a trigger for an eventfd event. The I/O callback will not be called.
|
516 | 69ddaf66 | Ademar de Souza Reis Jr | * The caller must be prepared to handle failure (that is, take the required
|
517 | 3e9d69e7 | Avi Kivity | * action if the callback _is_ called).
|
518 | 3e9d69e7 | Avi Kivity | *
|
519 | 3e9d69e7 | Avi Kivity | * @mr: the memory region being updated.
|
520 | 3e9d69e7 | Avi Kivity | * @addr: the address within @mr that is to be monitored
|
521 | 3e9d69e7 | Avi Kivity | * @size: the size of the access to trigger the eventfd
|
522 | 3e9d69e7 | Avi Kivity | * @match_data: whether to match against @data, instead of just @addr
|
523 | 3e9d69e7 | Avi Kivity | * @data: the data to match against the guest write
|
524 | 3e9d69e7 | Avi Kivity | * @fd: the eventfd to be triggered when @addr, @size, and @data all match.
|
525 | 3e9d69e7 | Avi Kivity | **/
|
526 | 3e9d69e7 | Avi Kivity | void memory_region_add_eventfd(MemoryRegion *mr,
|
527 | 3e9d69e7 | Avi Kivity | target_phys_addr_t addr, |
528 | 3e9d69e7 | Avi Kivity | unsigned size,
|
529 | 3e9d69e7 | Avi Kivity | bool match_data,
|
530 | 3e9d69e7 | Avi Kivity | uint64_t data, |
531 | 3e9d69e7 | Avi Kivity | int fd);
|
532 | 3e9d69e7 | Avi Kivity | |
533 | 3e9d69e7 | Avi Kivity | /**
|
534 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_del_eventfd: Cancel an eventfd.
|
535 | 3e9d69e7 | Avi Kivity | *
|
536 | 69ddaf66 | Ademar de Souza Reis Jr | * Cancels an eventfd trigger requested by a previous
|
537 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_add_eventfd() call.
|
538 | 3e9d69e7 | Avi Kivity | *
|
539 | 3e9d69e7 | Avi Kivity | * @mr: the memory region being updated.
|
540 | 3e9d69e7 | Avi Kivity | * @addr: the address within @mr that is to be monitored
|
541 | 3e9d69e7 | Avi Kivity | * @size: the size of the access to trigger the eventfd
|
542 | 3e9d69e7 | Avi Kivity | * @match_data: whether to match against @data, instead of just @addr
|
543 | 3e9d69e7 | Avi Kivity | * @data: the data to match against the guest write
|
544 | 3e9d69e7 | Avi Kivity | * @fd: the eventfd to be triggered when @addr, @size, and @data all match.
|
545 | 3e9d69e7 | Avi Kivity | */
|
546 | 3e9d69e7 | Avi Kivity | void memory_region_del_eventfd(MemoryRegion *mr,
|
547 | 3e9d69e7 | Avi Kivity | target_phys_addr_t addr, |
548 | 3e9d69e7 | Avi Kivity | unsigned size,
|
549 | 3e9d69e7 | Avi Kivity | bool match_data,
|
550 | 3e9d69e7 | Avi Kivity | uint64_t data, |
551 | 3e9d69e7 | Avi Kivity | int fd);
|
552 | 3e9d69e7 | Avi Kivity | /**
|
553 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_add_subregion: Add a subregion to a container.
|
554 | 093bc2cd | Avi Kivity | *
|
555 | 69ddaf66 | Ademar de Souza Reis Jr | * Adds a subregion at @offset. The subregion may not overlap with other
|
556 | 093bc2cd | Avi Kivity | * subregions (except for those explicitly marked as overlapping). A region
|
557 | 093bc2cd | Avi Kivity | * may only be added once as a subregion (unless removed with
|
558 | 093bc2cd | Avi Kivity | * memory_region_del_subregion()); use memory_region_init_alias() if you
|
559 | 093bc2cd | Avi Kivity | * want a region to be a subregion in multiple locations.
|
560 | 093bc2cd | Avi Kivity | *
|
561 | 093bc2cd | Avi Kivity | * @mr: the region to contain the new subregion; must be a container
|
562 | 093bc2cd | Avi Kivity | * initialized with memory_region_init().
|
563 | 093bc2cd | Avi Kivity | * @offset: the offset relative to @mr where @subregion is added.
|
564 | 093bc2cd | Avi Kivity | * @subregion: the subregion to be added.
|
565 | 093bc2cd | Avi Kivity | */
|
566 | 093bc2cd | Avi Kivity | void memory_region_add_subregion(MemoryRegion *mr,
|
567 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
568 | 093bc2cd | Avi Kivity | MemoryRegion *subregion); |
569 | 093bc2cd | Avi Kivity | /**
|
570 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_add_subregion: Add a subregion to a container, with overlap.
|
571 | 093bc2cd | Avi Kivity | *
|
572 | 69ddaf66 | Ademar de Souza Reis Jr | * Adds a subregion at @offset. The subregion may overlap with other
|
573 | 093bc2cd | Avi Kivity | * subregions. Conflicts are resolved by having a higher @priority hide a
|
574 | 093bc2cd | Avi Kivity | * lower @priority. Subregions without priority are taken as @priority 0.
|
575 | 093bc2cd | Avi Kivity | * A region may only be added once as a subregion (unless removed with
|
576 | 093bc2cd | Avi Kivity | * memory_region_del_subregion()); use memory_region_init_alias() if you
|
577 | 093bc2cd | Avi Kivity | * want a region to be a subregion in multiple locations.
|
578 | 093bc2cd | Avi Kivity | *
|
579 | 093bc2cd | Avi Kivity | * @mr: the region to contain the new subregion; must be a container
|
580 | 093bc2cd | Avi Kivity | * initialized with memory_region_init().
|
581 | 093bc2cd | Avi Kivity | * @offset: the offset relative to @mr where @subregion is added.
|
582 | 093bc2cd | Avi Kivity | * @subregion: the subregion to be added.
|
583 | 093bc2cd | Avi Kivity | * @priority: used for resolving overlaps; highest priority wins.
|
584 | 093bc2cd | Avi Kivity | */
|
585 | 093bc2cd | Avi Kivity | void memory_region_add_subregion_overlap(MemoryRegion *mr,
|
586 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
587 | 093bc2cd | Avi Kivity | MemoryRegion *subregion, |
588 | 093bc2cd | Avi Kivity | unsigned priority);
|
589 | e34911c4 | Avi Kivity | |
590 | e34911c4 | Avi Kivity | /**
|
591 | e34911c4 | Avi Kivity | * memory_region_get_ram_addr: Get the ram address associated with a memory
|
592 | e34911c4 | Avi Kivity | * region
|
593 | e34911c4 | Avi Kivity | *
|
594 | dabdf394 | Stefan Weil | * DO NOT USE THIS FUNCTION. This is a temporary workaround while the Xen
|
595 | e34911c4 | Avi Kivity | * code is being reworked.
|
596 | e34911c4 | Avi Kivity | */
|
597 | e34911c4 | Avi Kivity | ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr); |
598 | e34911c4 | Avi Kivity | |
599 | 093bc2cd | Avi Kivity | /**
|
600 | 093bc2cd | Avi Kivity | * memory_region_del_subregion: Remove a subregion.
|
601 | 093bc2cd | Avi Kivity | *
|
602 | 093bc2cd | Avi Kivity | * Removes a subregion from its container.
|
603 | 093bc2cd | Avi Kivity | *
|
604 | 093bc2cd | Avi Kivity | * @mr: the container to be updated.
|
605 | 093bc2cd | Avi Kivity | * @subregion: the region being removed; must be a current subregion of @mr.
|
606 | 093bc2cd | Avi Kivity | */
|
607 | 093bc2cd | Avi Kivity | void memory_region_del_subregion(MemoryRegion *mr,
|
608 | 093bc2cd | Avi Kivity | MemoryRegion *subregion); |
609 | 093bc2cd | Avi Kivity | |
610 | 6bba19ba | Avi Kivity | /*
|
611 | 6bba19ba | Avi Kivity | * memory_region_set_enabled: dynamically enable or disable a region
|
612 | 6bba19ba | Avi Kivity | *
|
613 | 6bba19ba | Avi Kivity | * Enables or disables a memory region. A disabled memory region
|
614 | 6bba19ba | Avi Kivity | * ignores all accesses to itself and its subregions. It does not
|
615 | 6bba19ba | Avi Kivity | * obscure sibling subregions with lower priority - it simply behaves as
|
616 | 6bba19ba | Avi Kivity | * if it was removed from the hierarchy.
|
617 | 6bba19ba | Avi Kivity | *
|
618 | 6bba19ba | Avi Kivity | * Regions default to being enabled.
|
619 | 6bba19ba | Avi Kivity | *
|
620 | 6bba19ba | Avi Kivity | * @mr: the region to be updated
|
621 | 6bba19ba | Avi Kivity | * @enabled: whether to enable or disable the region
|
622 | 6bba19ba | Avi Kivity | */
|
623 | 6bba19ba | Avi Kivity | void memory_region_set_enabled(MemoryRegion *mr, bool enabled); |
624 | 6bba19ba | Avi Kivity | |
625 | 2282e1af | Avi Kivity | /*
|
626 | 2282e1af | Avi Kivity | * memory_region_set_address: dynamically update the address of a region
|
627 | 2282e1af | Avi Kivity | *
|
628 | 2282e1af | Avi Kivity | * Dynamically updates the address of a region, relative to its parent.
|
629 | 2282e1af | Avi Kivity | * May be used on regions are currently part of a memory hierarchy.
|
630 | 2282e1af | Avi Kivity | *
|
631 | 2282e1af | Avi Kivity | * @mr: the region to be updated
|
632 | 2282e1af | Avi Kivity | * @addr: new address, relative to parent region
|
633 | 2282e1af | Avi Kivity | */
|
634 | 2282e1af | Avi Kivity | void memory_region_set_address(MemoryRegion *mr, target_phys_addr_t addr);
|
635 | 2282e1af | Avi Kivity | |
636 | 4703359e | Avi Kivity | /*
|
637 | 4703359e | Avi Kivity | * memory_region_set_alias_offset: dynamically update a memory alias's offset
|
638 | 4703359e | Avi Kivity | *
|
639 | 4703359e | Avi Kivity | * Dynamically updates the offset into the target region that an alias points
|
640 | 4703359e | Avi Kivity | * to, as if the fourth argument to memory_region_init_alias() has changed.
|
641 | 4703359e | Avi Kivity | *
|
642 | 4703359e | Avi Kivity | * @mr: the #MemoryRegion to be updated; should be an alias.
|
643 | 4703359e | Avi Kivity | * @offset: the new offset into the target memory region
|
644 | 4703359e | Avi Kivity | */
|
645 | 4703359e | Avi Kivity | void memory_region_set_alias_offset(MemoryRegion *mr,
|
646 | 4703359e | Avi Kivity | target_phys_addr_t offset); |
647 | 4703359e | Avi Kivity | |
648 | 69ddaf66 | Ademar de Souza Reis Jr | /**
|
649 | e2177955 | Avi Kivity | * memory_region_find: locate a MemoryRegion in an address space
|
650 | e2177955 | Avi Kivity | *
|
651 | e2177955 | Avi Kivity | * Locates the first #MemoryRegion within an address space given by
|
652 | e2177955 | Avi Kivity | * @address_space that overlaps the range given by @addr and @size.
|
653 | e2177955 | Avi Kivity | *
|
654 | e2177955 | Avi Kivity | * Returns a #MemoryRegionSection that describes a contiguous overlap.
|
655 | e2177955 | Avi Kivity | * It will have the following characteristics:
|
656 | e2177955 | Avi Kivity | * .@offset_within_address_space >= @addr
|
657 | e2177955 | Avi Kivity | * .@offset_within_address_space + .@size <= @addr + @size
|
658 | e2177955 | Avi Kivity | * .@size = 0 iff no overlap was found
|
659 | e2177955 | Avi Kivity | * .@mr is non-%NULL iff an overlap was found
|
660 | e2177955 | Avi Kivity | *
|
661 | e2177955 | Avi Kivity | * @address_space: a top-level (i.e. parentless) region that contains
|
662 | e2177955 | Avi Kivity | * the region to be found
|
663 | e2177955 | Avi Kivity | * @addr: start of the area within @address_space to be searched
|
664 | e2177955 | Avi Kivity | * @size: size of the area to be searched
|
665 | e2177955 | Avi Kivity | */
|
666 | e2177955 | Avi Kivity | MemoryRegionSection memory_region_find(MemoryRegion *address_space, |
667 | e2177955 | Avi Kivity | target_phys_addr_t addr, uint64_t size); |
668 | e2177955 | Avi Kivity | |
669 | 86e775c6 | Avi Kivity | |
670 | 86e775c6 | Avi Kivity | /**
|
671 | 86e775c6 | Avi Kivity | * memory_global_sync_dirty_bitmap: synchronize the dirty log for all memory
|
672 | 86e775c6 | Avi Kivity | *
|
673 | 86e775c6 | Avi Kivity | * Synchronizes the dirty page log for an entire address space.
|
674 | 86e775c6 | Avi Kivity | * @address_space: a top-level (i.e. parentless) region that contains the
|
675 | 86e775c6 | Avi Kivity | * memory being synchronized
|
676 | 86e775c6 | Avi Kivity | */
|
677 | 86e775c6 | Avi Kivity | void memory_global_sync_dirty_bitmap(MemoryRegion *address_space);
|
678 | 86e775c6 | Avi Kivity | |
679 | e2177955 | Avi Kivity | /**
|
680 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_transaction_begin: Start a transaction.
|
681 | 69ddaf66 | Ademar de Souza Reis Jr | *
|
682 | 69ddaf66 | Ademar de Souza Reis Jr | * During a transaction, changes will be accumulated and made visible
|
683 | dabdf394 | Stefan Weil | * only when the transaction ends (is committed).
|
684 | 4ef4db86 | Avi Kivity | */
|
685 | 4ef4db86 | Avi Kivity | void memory_region_transaction_begin(void); |
686 | 69ddaf66 | Ademar de Souza Reis Jr | |
687 | 69ddaf66 | Ademar de Souza Reis Jr | /**
|
688 | 69ddaf66 | Ademar de Souza Reis Jr | * memory_region_transaction_commit: Commit a transaction and make changes
|
689 | 69ddaf66 | Ademar de Souza Reis Jr | * visible to the guest.
|
690 | 4ef4db86 | Avi Kivity | */
|
691 | 4ef4db86 | Avi Kivity | void memory_region_transaction_commit(void); |
692 | 4ef4db86 | Avi Kivity | |
693 | 7664e80c | Avi Kivity | /**
|
694 | 7664e80c | Avi Kivity | * memory_listener_register: register callbacks to be called when memory
|
695 | 7664e80c | Avi Kivity | * sections are mapped or unmapped into an address
|
696 | 7664e80c | Avi Kivity | * space
|
697 | 7664e80c | Avi Kivity | *
|
698 | 7664e80c | Avi Kivity | * @listener: an object containing the callbacks to be called
|
699 | 7376e582 | Avi Kivity | * @filter: if non-%NULL, only regions in this address space will be observed
|
700 | 7664e80c | Avi Kivity | */
|
701 | 7376e582 | Avi Kivity | void memory_listener_register(MemoryListener *listener, MemoryRegion *filter);
|
702 | 7664e80c | Avi Kivity | |
703 | 7664e80c | Avi Kivity | /**
|
704 | 7664e80c | Avi Kivity | * memory_listener_unregister: undo the effect of memory_listener_register()
|
705 | 7664e80c | Avi Kivity | *
|
706 | 7664e80c | Avi Kivity | * @listener: an object containing the callbacks to be removed
|
707 | 7664e80c | Avi Kivity | */
|
708 | 7664e80c | Avi Kivity | void memory_listener_unregister(MemoryListener *listener);
|
709 | 7664e80c | Avi Kivity | |
710 | 7664e80c | Avi Kivity | /**
|
711 | 7664e80c | Avi Kivity | * memory_global_dirty_log_start: begin dirty logging for all regions
|
712 | 7664e80c | Avi Kivity | */
|
713 | 7664e80c | Avi Kivity | void memory_global_dirty_log_start(void); |
714 | 7664e80c | Avi Kivity | |
715 | 7664e80c | Avi Kivity | /**
|
716 | 7664e80c | Avi Kivity | * memory_global_dirty_log_stop: begin dirty logging for all regions
|
717 | 7664e80c | Avi Kivity | */
|
718 | 7664e80c | Avi Kivity | void memory_global_dirty_log_stop(void); |
719 | 7664e80c | Avi Kivity | |
720 | 314e2987 | Blue Swirl | void mtree_info(fprintf_function mon_printf, void *f); |
721 | 314e2987 | Blue Swirl | |
722 | 093bc2cd | Avi Kivity | #endif
|
723 | 093bc2cd | Avi Kivity | |
724 | 093bc2cd | Avi Kivity | #endif |