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