root / memory.h @ 92f562ec
History | View | Annotate | Download (18 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 | 093bc2cd | Avi Kivity | |
28 | 093bc2cd | Avi Kivity | typedef struct MemoryRegionOps MemoryRegionOps; |
29 | 093bc2cd | Avi Kivity | typedef struct MemoryRegion MemoryRegion; |
30 | 627a0e90 | Avi Kivity | typedef struct MemoryRegionPortio MemoryRegionPortio; |
31 | 74901c3b | Avi Kivity | typedef struct MemoryRegionMmio MemoryRegionMmio; |
32 | 093bc2cd | Avi Kivity | |
33 | 093bc2cd | Avi Kivity | /* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic
|
34 | 093bc2cd | Avi Kivity | * registration.
|
35 | 093bc2cd | Avi Kivity | */
|
36 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_VGA 0 |
37 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_CODE 1 |
38 | 093bc2cd | Avi Kivity | #define DIRTY_MEMORY_MIGRATION 3 |
39 | 093bc2cd | Avi Kivity | |
40 | 74901c3b | Avi Kivity | struct MemoryRegionMmio {
|
41 | 74901c3b | Avi Kivity | CPUReadMemoryFunc *read[3];
|
42 | 74901c3b | Avi Kivity | CPUWriteMemoryFunc *write[3];
|
43 | 74901c3b | Avi Kivity | }; |
44 | 74901c3b | Avi Kivity | |
45 | 093bc2cd | Avi Kivity | /*
|
46 | 093bc2cd | Avi Kivity | * Memory region callbacks
|
47 | 093bc2cd | Avi Kivity | */
|
48 | 093bc2cd | Avi Kivity | struct MemoryRegionOps {
|
49 | 093bc2cd | Avi Kivity | /* Read from the memory region. @addr is relative to @mr; @size is
|
50 | 093bc2cd | Avi Kivity | * in bytes. */
|
51 | 093bc2cd | Avi Kivity | uint64_t (*read)(void *opaque,
|
52 | 093bc2cd | Avi Kivity | target_phys_addr_t addr, |
53 | 093bc2cd | Avi Kivity | unsigned size);
|
54 | 093bc2cd | Avi Kivity | /* Write to the memory region. @addr is relative to @mr; @size is
|
55 | 093bc2cd | Avi Kivity | * in bytes. */
|
56 | 093bc2cd | Avi Kivity | void (*write)(void *opaque, |
57 | 093bc2cd | Avi Kivity | target_phys_addr_t addr, |
58 | 093bc2cd | Avi Kivity | uint64_t data, |
59 | 093bc2cd | Avi Kivity | unsigned size);
|
60 | 093bc2cd | Avi Kivity | |
61 | 093bc2cd | Avi Kivity | enum device_endian endianness;
|
62 | 093bc2cd | Avi Kivity | /* Guest-visible constraints: */
|
63 | 093bc2cd | Avi Kivity | struct {
|
64 | 093bc2cd | Avi Kivity | /* If nonzero, specify bounds on access sizes beyond which a machine
|
65 | 093bc2cd | Avi Kivity | * check is thrown.
|
66 | 093bc2cd | Avi Kivity | */
|
67 | 093bc2cd | Avi Kivity | unsigned min_access_size;
|
68 | 093bc2cd | Avi Kivity | unsigned max_access_size;
|
69 | 093bc2cd | Avi Kivity | /* If true, unaligned accesses are supported. Otherwise unaligned
|
70 | 093bc2cd | Avi Kivity | * accesses throw machine checks.
|
71 | 093bc2cd | Avi Kivity | */
|
72 | 093bc2cd | Avi Kivity | bool unaligned;
|
73 | 093bc2cd | Avi Kivity | } valid; |
74 | 093bc2cd | Avi Kivity | /* Internal implementation constraints: */
|
75 | 093bc2cd | Avi Kivity | struct {
|
76 | 093bc2cd | Avi Kivity | /* If nonzero, specifies the minimum size implemented. Smaller sizes
|
77 | 093bc2cd | Avi Kivity | * will be rounded upwards and a partial result will be returned.
|
78 | 093bc2cd | Avi Kivity | */
|
79 | 093bc2cd | Avi Kivity | unsigned min_access_size;
|
80 | 093bc2cd | Avi Kivity | /* If nonzero, specifies the maximum size implemented. Larger sizes
|
81 | 093bc2cd | Avi Kivity | * will be done as a series of accesses with smaller sizes.
|
82 | 093bc2cd | Avi Kivity | */
|
83 | 093bc2cd | Avi Kivity | unsigned max_access_size;
|
84 | 093bc2cd | Avi Kivity | /* If true, unaligned accesses are supported. Otherwise all accesses
|
85 | 093bc2cd | Avi Kivity | * are converted to (possibly multiple) naturally aligned accesses.
|
86 | 093bc2cd | Avi Kivity | */
|
87 | 093bc2cd | Avi Kivity | bool unaligned;
|
88 | 093bc2cd | Avi Kivity | } impl; |
89 | 627a0e90 | Avi Kivity | |
90 | 627a0e90 | Avi Kivity | /* If .read and .write are not present, old_portio may be used for
|
91 | 627a0e90 | Avi Kivity | * backwards compatibility with old portio registration
|
92 | 627a0e90 | Avi Kivity | */
|
93 | 627a0e90 | Avi Kivity | const MemoryRegionPortio *old_portio;
|
94 | 74901c3b | Avi Kivity | /* If .read and .write are not present, old_mmio may be used for
|
95 | 74901c3b | Avi Kivity | * backwards compatibility with old mmio registration
|
96 | 74901c3b | Avi Kivity | */
|
97 | 74901c3b | Avi Kivity | const MemoryRegionMmio old_mmio;
|
98 | 093bc2cd | Avi Kivity | }; |
99 | 093bc2cd | Avi Kivity | |
100 | 093bc2cd | Avi Kivity | typedef struct CoalescedMemoryRange CoalescedMemoryRange; |
101 | 3e9d69e7 | Avi Kivity | typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; |
102 | 093bc2cd | Avi Kivity | |
103 | 093bc2cd | Avi Kivity | struct MemoryRegion {
|
104 | 093bc2cd | Avi Kivity | /* All fields are private - violators will be prosecuted */
|
105 | 093bc2cd | Avi Kivity | const MemoryRegionOps *ops;
|
106 | 093bc2cd | Avi Kivity | void *opaque;
|
107 | 093bc2cd | Avi Kivity | MemoryRegion *parent; |
108 | 093bc2cd | Avi Kivity | uint64_t size; |
109 | 093bc2cd | Avi Kivity | target_phys_addr_t addr; |
110 | 093bc2cd | Avi Kivity | target_phys_addr_t offset; |
111 | 16ef61c9 | Avi Kivity | bool backend_registered;
|
112 | 545e92e0 | Avi Kivity | void (*destructor)(MemoryRegion *mr);
|
113 | 093bc2cd | Avi Kivity | ram_addr_t ram_addr; |
114 | 658b2224 | Avi Kivity | IORange iorange; |
115 | 14a3c10a | Avi Kivity | bool terminates;
|
116 | d0a9b5bc | Avi Kivity | bool readable;
|
117 | 093bc2cd | Avi Kivity | MemoryRegion *alias; |
118 | 093bc2cd | Avi Kivity | target_phys_addr_t alias_offset; |
119 | 093bc2cd | Avi Kivity | unsigned priority;
|
120 | 093bc2cd | Avi Kivity | bool may_overlap;
|
121 | 093bc2cd | Avi Kivity | QTAILQ_HEAD(subregions, MemoryRegion) subregions; |
122 | 093bc2cd | Avi Kivity | QTAILQ_ENTRY(MemoryRegion) subregions_link; |
123 | 093bc2cd | Avi Kivity | QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced; |
124 | 093bc2cd | Avi Kivity | const char *name; |
125 | 5a583347 | Avi Kivity | uint8_t dirty_log_mask; |
126 | 3e9d69e7 | Avi Kivity | unsigned ioeventfd_nb;
|
127 | 3e9d69e7 | Avi Kivity | MemoryRegionIoeventfd *ioeventfds; |
128 | 093bc2cd | Avi Kivity | }; |
129 | 093bc2cd | Avi Kivity | |
130 | 627a0e90 | Avi Kivity | struct MemoryRegionPortio {
|
131 | 627a0e90 | Avi Kivity | uint32_t offset; |
132 | 627a0e90 | Avi Kivity | uint32_t len; |
133 | 627a0e90 | Avi Kivity | unsigned size;
|
134 | 627a0e90 | Avi Kivity | IOPortReadFunc *read; |
135 | 627a0e90 | Avi Kivity | IOPortWriteFunc *write; |
136 | 627a0e90 | Avi Kivity | }; |
137 | 627a0e90 | Avi Kivity | |
138 | 2dd30228 | Avi Kivity | #define PORTIO_END_OF_LIST() { }
|
139 | 627a0e90 | Avi Kivity | |
140 | 093bc2cd | Avi Kivity | /**
|
141 | 093bc2cd | Avi Kivity | * memory_region_init: Initialize a memory region
|
142 | 093bc2cd | Avi Kivity | *
|
143 | 093bc2cd | Avi Kivity | * The region typically acts as a container for other memory regions. Us
|
144 | 093bc2cd | Avi Kivity | * memory_region_add_subregion() to add subregions.
|
145 | 093bc2cd | Avi Kivity | *
|
146 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized
|
147 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
148 | 093bc2cd | Avi Kivity | * @size: size of the region; any subregions beyond this size will be clipped
|
149 | 093bc2cd | Avi Kivity | */
|
150 | 093bc2cd | Avi Kivity | void memory_region_init(MemoryRegion *mr,
|
151 | 093bc2cd | Avi Kivity | const char *name, |
152 | 093bc2cd | Avi Kivity | uint64_t size); |
153 | 093bc2cd | Avi Kivity | /**
|
154 | 093bc2cd | Avi Kivity | * memory_region_init_io: Initialize an I/O memory region.
|
155 | 093bc2cd | Avi Kivity | *
|
156 | 093bc2cd | Avi Kivity | * Accesses into the region will be cause the callbacks in @ops to be called.
|
157 | 093bc2cd | Avi Kivity | * if @size is nonzero, subregions will be clipped to @size.
|
158 | 093bc2cd | Avi Kivity | *
|
159 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
160 | 093bc2cd | Avi Kivity | * @ops: a structure containing read and write callbacks to be used when
|
161 | 093bc2cd | Avi Kivity | * I/O is performed on the region.
|
162 | 093bc2cd | Avi Kivity | * @opaque: passed to to the read and write callbacks of the @ops structure.
|
163 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
164 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
165 | 093bc2cd | Avi Kivity | */
|
166 | 093bc2cd | Avi Kivity | void memory_region_init_io(MemoryRegion *mr,
|
167 | 093bc2cd | Avi Kivity | const MemoryRegionOps *ops,
|
168 | 093bc2cd | Avi Kivity | void *opaque,
|
169 | 093bc2cd | Avi Kivity | const char *name, |
170 | 093bc2cd | Avi Kivity | uint64_t size); |
171 | 093bc2cd | Avi Kivity | |
172 | 093bc2cd | Avi Kivity | /**
|
173 | 093bc2cd | Avi Kivity | * memory_region_init_ram: Initialize RAM memory region. Accesses into the
|
174 | 093bc2cd | Avi Kivity | * region will be modify memory directly.
|
175 | 093bc2cd | Avi Kivity | *
|
176 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
177 | 093bc2cd | Avi Kivity | * @dev: a device associated with the region; may be %NULL.
|
178 | 093bc2cd | Avi Kivity | * @name: the name of the region; the pair (@dev, @name) must be globally
|
179 | 093bc2cd | Avi Kivity | * unique. The name is part of the save/restore ABI and so cannot be
|
180 | 093bc2cd | Avi Kivity | * changed.
|
181 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
182 | 093bc2cd | Avi Kivity | */
|
183 | 093bc2cd | Avi Kivity | void memory_region_init_ram(MemoryRegion *mr,
|
184 | 093bc2cd | Avi Kivity | DeviceState *dev, /* FIXME: layering violation */
|
185 | 093bc2cd | Avi Kivity | const char *name, |
186 | 093bc2cd | Avi Kivity | uint64_t size); |
187 | 093bc2cd | Avi Kivity | |
188 | 093bc2cd | Avi Kivity | /**
|
189 | 093bc2cd | Avi Kivity | * memory_region_init_ram: Initialize RAM memory region from a user-provided.
|
190 | 093bc2cd | Avi Kivity | * pointer. Accesses into the region will be modify
|
191 | 093bc2cd | Avi Kivity | * memory directly.
|
192 | 093bc2cd | Avi Kivity | *
|
193 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
194 | 093bc2cd | Avi Kivity | * @dev: a device associated with the region; may be %NULL.
|
195 | 093bc2cd | Avi Kivity | * @name: the name of the region; the pair (@dev, @name) must be globally
|
196 | 093bc2cd | Avi Kivity | * unique. The name is part of the save/restore ABI and so cannot be
|
197 | 093bc2cd | Avi Kivity | * changed.
|
198 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
199 | 093bc2cd | Avi Kivity | * @ptr: memory to be mapped; must contain at least @size bytes.
|
200 | 093bc2cd | Avi Kivity | */
|
201 | 093bc2cd | Avi Kivity | void memory_region_init_ram_ptr(MemoryRegion *mr,
|
202 | 093bc2cd | Avi Kivity | DeviceState *dev, /* FIXME: layering violation */
|
203 | 093bc2cd | Avi Kivity | const char *name, |
204 | 093bc2cd | Avi Kivity | uint64_t size, |
205 | 093bc2cd | Avi Kivity | void *ptr);
|
206 | 093bc2cd | Avi Kivity | |
207 | 093bc2cd | Avi Kivity | /**
|
208 | 093bc2cd | Avi Kivity | * memory_region_init_alias: Initialize a memory region that aliases all or a
|
209 | 093bc2cd | Avi Kivity | * part of another memory region.
|
210 | 093bc2cd | Avi Kivity | *
|
211 | 093bc2cd | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
212 | 093bc2cd | Avi Kivity | * @name: used for debugging; not visible to the user or ABI
|
213 | 093bc2cd | Avi Kivity | * @orig: the region to be referenced; @mr will be equivalent to
|
214 | 093bc2cd | Avi Kivity | * @orig between @offset and @offset + @size - 1.
|
215 | 093bc2cd | Avi Kivity | * @offset: start of the section in @orig to be referenced.
|
216 | 093bc2cd | Avi Kivity | * @size: size of the region.
|
217 | 093bc2cd | Avi Kivity | */
|
218 | 093bc2cd | Avi Kivity | void memory_region_init_alias(MemoryRegion *mr,
|
219 | 093bc2cd | Avi Kivity | const char *name, |
220 | 093bc2cd | Avi Kivity | MemoryRegion *orig, |
221 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
222 | 093bc2cd | Avi Kivity | uint64_t size); |
223 | d0a9b5bc | Avi Kivity | |
224 | d0a9b5bc | Avi Kivity | /**
|
225 | d0a9b5bc | Avi Kivity | * memory_region_init_rom_device: Initialize a ROM memory region. Writes are
|
226 | d0a9b5bc | Avi Kivity | * handled via callbacks.
|
227 | d0a9b5bc | Avi Kivity | *
|
228 | d0a9b5bc | Avi Kivity | * @mr: the #MemoryRegion to be initialized.
|
229 | d0a9b5bc | Avi Kivity | * @ops: callbacks for write access handling.
|
230 | d0a9b5bc | Avi Kivity | * @dev: a device associated with the region; may be %NULL.
|
231 | d0a9b5bc | Avi Kivity | * @name: the name of the region; the pair (@dev, @name) must be globally
|
232 | d0a9b5bc | Avi Kivity | * unique. The name is part of the save/restore ABI and so cannot be
|
233 | d0a9b5bc | Avi Kivity | * changed.
|
234 | d0a9b5bc | Avi Kivity | * @size: size of the region.
|
235 | d0a9b5bc | Avi Kivity | */
|
236 | d0a9b5bc | Avi Kivity | void memory_region_init_rom_device(MemoryRegion *mr,
|
237 | d0a9b5bc | Avi Kivity | const MemoryRegionOps *ops,
|
238 | d0a9b5bc | Avi Kivity | DeviceState *dev, /* FIXME: layering violation */
|
239 | d0a9b5bc | Avi Kivity | const char *name, |
240 | d0a9b5bc | Avi Kivity | uint64_t size); |
241 | d0a9b5bc | Avi Kivity | |
242 | 093bc2cd | Avi Kivity | /**
|
243 | 093bc2cd | Avi Kivity | * memory_region_destroy: Destroy a memory region and relaim all resources.
|
244 | 093bc2cd | Avi Kivity | *
|
245 | 093bc2cd | Avi Kivity | * @mr: the region to be destroyed. May not currently be a subregion
|
246 | 093bc2cd | Avi Kivity | * (see memory_region_add_subregion()) or referenced in an alias
|
247 | 093bc2cd | Avi Kivity | * (see memory_region_init_alias()).
|
248 | 093bc2cd | Avi Kivity | */
|
249 | 093bc2cd | Avi Kivity | void memory_region_destroy(MemoryRegion *mr);
|
250 | 093bc2cd | Avi Kivity | |
251 | 093bc2cd | Avi Kivity | /**
|
252 | 093bc2cd | Avi Kivity | * memory_region_size: get a memory region's size.
|
253 | 093bc2cd | Avi Kivity | *
|
254 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
255 | 093bc2cd | Avi Kivity | */
|
256 | 093bc2cd | Avi Kivity | uint64_t memory_region_size(MemoryRegion *mr); |
257 | 093bc2cd | Avi Kivity | |
258 | 093bc2cd | Avi Kivity | /**
|
259 | 093bc2cd | Avi Kivity | * memory_region_get_ram_ptr: Get a pointer into a RAM memory region.
|
260 | 093bc2cd | Avi Kivity | *
|
261 | 093bc2cd | Avi Kivity | * Returns a host pointer to a RAM memory region (created with
|
262 | 093bc2cd | Avi Kivity | * memory_region_init_ram() or memory_region_init_ram_ptr()). Use with
|
263 | 093bc2cd | Avi Kivity | * care.
|
264 | 093bc2cd | Avi Kivity | *
|
265 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
266 | 093bc2cd | Avi Kivity | */
|
267 | 093bc2cd | Avi Kivity | void *memory_region_get_ram_ptr(MemoryRegion *mr);
|
268 | 093bc2cd | Avi Kivity | |
269 | 093bc2cd | Avi Kivity | /**
|
270 | 093bc2cd | Avi Kivity | * memory_region_set_offset: Sets an offset to be added to MemoryRegionOps
|
271 | 093bc2cd | Avi Kivity | * callbacks.
|
272 | 093bc2cd | Avi Kivity | *
|
273 | 093bc2cd | Avi Kivity | * This function is deprecated and should not be used in new code.
|
274 | 093bc2cd | Avi Kivity | */
|
275 | 093bc2cd | Avi Kivity | void memory_region_set_offset(MemoryRegion *mr, target_phys_addr_t offset);
|
276 | 093bc2cd | Avi Kivity | |
277 | 093bc2cd | Avi Kivity | /**
|
278 | 093bc2cd | Avi Kivity | * memory_region_set_log: Turn dirty logging on or off for a region.
|
279 | 093bc2cd | Avi Kivity | *
|
280 | 093bc2cd | Avi Kivity | * Turns dirty logging on or off for a specified client (display, migration).
|
281 | 093bc2cd | Avi Kivity | * Only meaningful for RAM regions.
|
282 | 093bc2cd | Avi Kivity | *
|
283 | 093bc2cd | Avi Kivity | * @mr: the memory region being updated.
|
284 | 093bc2cd | Avi Kivity | * @log: whether dirty logging is to be enabled or disabled.
|
285 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
286 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
287 | 093bc2cd | Avi Kivity | */
|
288 | 093bc2cd | Avi Kivity | void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client); |
289 | 093bc2cd | Avi Kivity | |
290 | 093bc2cd | Avi Kivity | /**
|
291 | 093bc2cd | Avi Kivity | * memory_region_get_dirty: Check whether a page is dirty for a specified
|
292 | 093bc2cd | Avi Kivity | * client.
|
293 | 093bc2cd | Avi Kivity | *
|
294 | 093bc2cd | Avi Kivity | * Checks whether a page has been written to since the last
|
295 | 093bc2cd | Avi Kivity | * call to memory_region_reset_dirty() with the same @client. Dirty logging
|
296 | 093bc2cd | Avi Kivity | * must be enabled.
|
297 | 093bc2cd | Avi Kivity | *
|
298 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
299 | 093bc2cd | Avi Kivity | * @addr: the address (relative to the start of the region) being queried.
|
300 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
301 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
302 | 093bc2cd | Avi Kivity | */
|
303 | 093bc2cd | Avi Kivity | bool memory_region_get_dirty(MemoryRegion *mr, target_phys_addr_t addr,
|
304 | 093bc2cd | Avi Kivity | unsigned client);
|
305 | 093bc2cd | Avi Kivity | |
306 | 093bc2cd | Avi Kivity | /**
|
307 | 093bc2cd | Avi Kivity | * memory_region_set_dirty: Mark a page as dirty in a memory region.
|
308 | 093bc2cd | Avi Kivity | *
|
309 | 093bc2cd | Avi Kivity | * Marks a page as dirty, after it has been dirtied outside guest code.
|
310 | 093bc2cd | Avi Kivity | *
|
311 | 093bc2cd | Avi Kivity | * @mr: the memory region being queried.
|
312 | 093bc2cd | Avi Kivity | * @addr: the address (relative to the start of the region) being dirtied.
|
313 | 093bc2cd | Avi Kivity | */
|
314 | 093bc2cd | Avi Kivity | void memory_region_set_dirty(MemoryRegion *mr, target_phys_addr_t addr);
|
315 | 093bc2cd | Avi Kivity | |
316 | 093bc2cd | Avi Kivity | /**
|
317 | 093bc2cd | Avi Kivity | * memory_region_sync_dirty_bitmap: Synchronize a region's dirty bitmap with
|
318 | 093bc2cd | Avi Kivity | * any external TLBs (e.g. kvm)
|
319 | 093bc2cd | Avi Kivity | *
|
320 | 093bc2cd | Avi Kivity | * Flushes dirty information from accelerators such as kvm and vhost-net
|
321 | 093bc2cd | Avi Kivity | * and makes it available to users of the memory API.
|
322 | 093bc2cd | Avi Kivity | *
|
323 | 093bc2cd | Avi Kivity | * @mr: the region being flushed.
|
324 | 093bc2cd | Avi Kivity | */
|
325 | 093bc2cd | Avi Kivity | void memory_region_sync_dirty_bitmap(MemoryRegion *mr);
|
326 | 093bc2cd | Avi Kivity | |
327 | 093bc2cd | Avi Kivity | /**
|
328 | 093bc2cd | Avi Kivity | * memory_region_reset_dirty: Mark a range of pages as clean, for a specified
|
329 | 093bc2cd | Avi Kivity | * client.
|
330 | 093bc2cd | Avi Kivity | *
|
331 | 093bc2cd | Avi Kivity | * Marks a range of pages as no longer dirty.
|
332 | 093bc2cd | Avi Kivity | *
|
333 | 093bc2cd | Avi Kivity | * @mr: the region being updated.
|
334 | 093bc2cd | Avi Kivity | * @addr: the start of the subrange being cleaned.
|
335 | 093bc2cd | Avi Kivity | * @size: the size of the subrange being cleaned.
|
336 | 093bc2cd | Avi Kivity | * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or
|
337 | 093bc2cd | Avi Kivity | * %DIRTY_MEMORY_VGA.
|
338 | 093bc2cd | Avi Kivity | */
|
339 | 093bc2cd | Avi Kivity | void memory_region_reset_dirty(MemoryRegion *mr, target_phys_addr_t addr,
|
340 | 093bc2cd | Avi Kivity | target_phys_addr_t size, unsigned client);
|
341 | 093bc2cd | Avi Kivity | |
342 | 093bc2cd | Avi Kivity | /**
|
343 | 093bc2cd | Avi Kivity | * memory_region_set_readonly: Turn a memory region read-only (or read-write)
|
344 | 093bc2cd | Avi Kivity | *
|
345 | 093bc2cd | Avi Kivity | * Allows a memory region to be marked as read-only (turning it into a ROM).
|
346 | 093bc2cd | Avi Kivity | * only useful on RAM regions.
|
347 | 093bc2cd | Avi Kivity | *
|
348 | 093bc2cd | Avi Kivity | * @mr: the region being updated.
|
349 | 093bc2cd | Avi Kivity | * @readonly: whether rhe region is to be ROM or RAM.
|
350 | 093bc2cd | Avi Kivity | */
|
351 | 093bc2cd | Avi Kivity | void memory_region_set_readonly(MemoryRegion *mr, bool readonly); |
352 | 093bc2cd | Avi Kivity | |
353 | 093bc2cd | Avi Kivity | /**
|
354 | d0a9b5bc | Avi Kivity | * memory_region_rom_device_set_readable: enable/disable ROM readability
|
355 | d0a9b5bc | Avi Kivity | *
|
356 | d0a9b5bc | Avi Kivity | * Allows a ROM device (initialized with memory_region_init_rom_device() to
|
357 | d0a9b5bc | Avi Kivity | * to be marked as readable (default) or not readable. When it is readable,
|
358 | d0a9b5bc | Avi Kivity | * the device is mapped to guest memory. When not readable, reads are
|
359 | d0a9b5bc | Avi Kivity | * forwarded to the #MemoryRegion.read function.
|
360 | d0a9b5bc | Avi Kivity | *
|
361 | d0a9b5bc | Avi Kivity | * @mr: the memory region to be updated
|
362 | d0a9b5bc | Avi Kivity | * @readable: whether reads are satisified directly (%true) or via callbacks
|
363 | d0a9b5bc | Avi Kivity | * (%false)
|
364 | d0a9b5bc | Avi Kivity | */
|
365 | d0a9b5bc | Avi Kivity | void memory_region_rom_device_set_readable(MemoryRegion *mr, bool readable); |
366 | d0a9b5bc | Avi Kivity | |
367 | d0a9b5bc | Avi Kivity | /**
|
368 | 093bc2cd | Avi Kivity | * memory_region_set_coalescing: Enable memory coalescing for the region.
|
369 | 093bc2cd | Avi Kivity | *
|
370 | 093bc2cd | Avi Kivity | * Enabled writes to a region to be queued for later processing. MMIO ->write
|
371 | 093bc2cd | Avi Kivity | * callbacks may be delayed until a non-coalesced MMIO is issued.
|
372 | 093bc2cd | Avi Kivity | * Only useful for IO regions. Roughly similar to write-combining hardware.
|
373 | 093bc2cd | Avi Kivity | *
|
374 | 093bc2cd | Avi Kivity | * @mr: the memory region to be write coalesced
|
375 | 093bc2cd | Avi Kivity | */
|
376 | 093bc2cd | Avi Kivity | void memory_region_set_coalescing(MemoryRegion *mr);
|
377 | 093bc2cd | Avi Kivity | |
378 | 093bc2cd | Avi Kivity | /**
|
379 | 093bc2cd | Avi Kivity | * memory_region_add_coalescing: Enable memory coalescing for a sub-range of
|
380 | 093bc2cd | Avi Kivity | * a region.
|
381 | 093bc2cd | Avi Kivity | *
|
382 | 093bc2cd | Avi Kivity | * Like memory_region_set_coalescing(), but works on a sub-range of a region.
|
383 | 093bc2cd | Avi Kivity | * Multiple calls can be issued coalesced disjoint ranges.
|
384 | 093bc2cd | Avi Kivity | *
|
385 | 093bc2cd | Avi Kivity | * @mr: the memory region to be updated.
|
386 | 093bc2cd | Avi Kivity | * @offset: the start of the range within the region to be coalesced.
|
387 | 093bc2cd | Avi Kivity | * @size: the size of the subrange to be coalesced.
|
388 | 093bc2cd | Avi Kivity | */
|
389 | 093bc2cd | Avi Kivity | void memory_region_add_coalescing(MemoryRegion *mr,
|
390 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
391 | 093bc2cd | Avi Kivity | uint64_t size); |
392 | 093bc2cd | Avi Kivity | |
393 | 093bc2cd | Avi Kivity | /**
|
394 | 093bc2cd | Avi Kivity | * memory_region_clear_coalescing: Disable MMIO coalescing for the region.
|
395 | 093bc2cd | Avi Kivity | *
|
396 | 093bc2cd | Avi Kivity | * Disables any coalescing caused by memory_region_set_coalescing() or
|
397 | 093bc2cd | Avi Kivity | * memory_region_add_coalescing(). Roughly equivalent to uncacheble memory
|
398 | 093bc2cd | Avi Kivity | * hardware.
|
399 | 093bc2cd | Avi Kivity | *
|
400 | 093bc2cd | Avi Kivity | * @mr: the memory region to be updated.
|
401 | 093bc2cd | Avi Kivity | */
|
402 | 093bc2cd | Avi Kivity | void memory_region_clear_coalescing(MemoryRegion *mr);
|
403 | 093bc2cd | Avi Kivity | |
404 | 093bc2cd | Avi Kivity | /**
|
405 | 3e9d69e7 | Avi Kivity | * memory_region_add_eventfd: Request an eventfd to be triggered when a word
|
406 | 3e9d69e7 | Avi Kivity | * is written to a location.
|
407 | 3e9d69e7 | Avi Kivity | *
|
408 | 3e9d69e7 | Avi Kivity | * Marks a word in an IO region (initialized with memory_region_init_io())
|
409 | 3e9d69e7 | Avi Kivity | * as a trigger for an eventfd event. The I/O callback will not be called.
|
410 | 3e9d69e7 | Avi Kivity | * The caller must be prepared to handle failure (hat is, take the required
|
411 | 3e9d69e7 | Avi Kivity | * action if the callback _is_ called).
|
412 | 3e9d69e7 | Avi Kivity | *
|
413 | 3e9d69e7 | Avi Kivity | * @mr: the memory region being updated.
|
414 | 3e9d69e7 | Avi Kivity | * @addr: the address within @mr that is to be monitored
|
415 | 3e9d69e7 | Avi Kivity | * @size: the size of the access to trigger the eventfd
|
416 | 3e9d69e7 | Avi Kivity | * @match_data: whether to match against @data, instead of just @addr
|
417 | 3e9d69e7 | Avi Kivity | * @data: the data to match against the guest write
|
418 | 3e9d69e7 | Avi Kivity | * @fd: the eventfd to be triggered when @addr, @size, and @data all match.
|
419 | 3e9d69e7 | Avi Kivity | **/
|
420 | 3e9d69e7 | Avi Kivity | void memory_region_add_eventfd(MemoryRegion *mr,
|
421 | 3e9d69e7 | Avi Kivity | target_phys_addr_t addr, |
422 | 3e9d69e7 | Avi Kivity | unsigned size,
|
423 | 3e9d69e7 | Avi Kivity | bool match_data,
|
424 | 3e9d69e7 | Avi Kivity | uint64_t data, |
425 | 3e9d69e7 | Avi Kivity | int fd);
|
426 | 3e9d69e7 | Avi Kivity | |
427 | 3e9d69e7 | Avi Kivity | /**
|
428 | 3e9d69e7 | Avi Kivity | * memory_region_del_eventfd: Cancel and eventfd.
|
429 | 3e9d69e7 | Avi Kivity | *
|
430 | 3e9d69e7 | Avi Kivity | * Cancels an eventfd trigger request by a previous memory_region_add_eventfd()
|
431 | 3e9d69e7 | Avi Kivity | * call.
|
432 | 3e9d69e7 | Avi Kivity | *
|
433 | 3e9d69e7 | Avi Kivity | * @mr: the memory region being updated.
|
434 | 3e9d69e7 | Avi Kivity | * @addr: the address within @mr that is to be monitored
|
435 | 3e9d69e7 | Avi Kivity | * @size: the size of the access to trigger the eventfd
|
436 | 3e9d69e7 | Avi Kivity | * @match_data: whether to match against @data, instead of just @addr
|
437 | 3e9d69e7 | Avi Kivity | * @data: the data to match against the guest write
|
438 | 3e9d69e7 | Avi Kivity | * @fd: the eventfd to be triggered when @addr, @size, and @data all match.
|
439 | 3e9d69e7 | Avi Kivity | */
|
440 | 3e9d69e7 | Avi Kivity | void memory_region_del_eventfd(MemoryRegion *mr,
|
441 | 3e9d69e7 | Avi Kivity | target_phys_addr_t addr, |
442 | 3e9d69e7 | Avi Kivity | unsigned size,
|
443 | 3e9d69e7 | Avi Kivity | bool match_data,
|
444 | 3e9d69e7 | Avi Kivity | uint64_t data, |
445 | 3e9d69e7 | Avi Kivity | int fd);
|
446 | 3e9d69e7 | Avi Kivity | /**
|
447 | 093bc2cd | Avi Kivity | * memory_region_add_subregion: Add a sub-region to a container.
|
448 | 093bc2cd | Avi Kivity | *
|
449 | 093bc2cd | Avi Kivity | * Adds a sub-region at @offset. The sub-region may not overlap with other
|
450 | 093bc2cd | Avi Kivity | * subregions (except for those explicitly marked as overlapping). A region
|
451 | 093bc2cd | Avi Kivity | * may only be added once as a subregion (unless removed with
|
452 | 093bc2cd | Avi Kivity | * memory_region_del_subregion()); use memory_region_init_alias() if you
|
453 | 093bc2cd | Avi Kivity | * want a region to be a subregion in multiple locations.
|
454 | 093bc2cd | Avi Kivity | *
|
455 | 093bc2cd | Avi Kivity | * @mr: the region to contain the new subregion; must be a container
|
456 | 093bc2cd | Avi Kivity | * initialized with memory_region_init().
|
457 | 093bc2cd | Avi Kivity | * @offset: the offset relative to @mr where @subregion is added.
|
458 | 093bc2cd | Avi Kivity | * @subregion: the subregion to be added.
|
459 | 093bc2cd | Avi Kivity | */
|
460 | 093bc2cd | Avi Kivity | void memory_region_add_subregion(MemoryRegion *mr,
|
461 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
462 | 093bc2cd | Avi Kivity | MemoryRegion *subregion); |
463 | 093bc2cd | Avi Kivity | /**
|
464 | 093bc2cd | Avi Kivity | * memory_region_add_subregion: Add a sub-region to a container, with overlap.
|
465 | 093bc2cd | Avi Kivity | *
|
466 | 093bc2cd | Avi Kivity | * Adds a sub-region at @offset. The sub-region may overlap with other
|
467 | 093bc2cd | Avi Kivity | * subregions. Conflicts are resolved by having a higher @priority hide a
|
468 | 093bc2cd | Avi Kivity | * lower @priority. Subregions without priority are taken as @priority 0.
|
469 | 093bc2cd | Avi Kivity | * A region may only be added once as a subregion (unless removed with
|
470 | 093bc2cd | Avi Kivity | * memory_region_del_subregion()); use memory_region_init_alias() if you
|
471 | 093bc2cd | Avi Kivity | * want a region to be a subregion in multiple locations.
|
472 | 093bc2cd | Avi Kivity | *
|
473 | 093bc2cd | Avi Kivity | * @mr: the region to contain the new subregion; must be a container
|
474 | 093bc2cd | Avi Kivity | * initialized with memory_region_init().
|
475 | 093bc2cd | Avi Kivity | * @offset: the offset relative to @mr where @subregion is added.
|
476 | 093bc2cd | Avi Kivity | * @subregion: the subregion to be added.
|
477 | 093bc2cd | Avi Kivity | * @priority: used for resolving overlaps; highest priority wins.
|
478 | 093bc2cd | Avi Kivity | */
|
479 | 093bc2cd | Avi Kivity | void memory_region_add_subregion_overlap(MemoryRegion *mr,
|
480 | 093bc2cd | Avi Kivity | target_phys_addr_t offset, |
481 | 093bc2cd | Avi Kivity | MemoryRegion *subregion, |
482 | 093bc2cd | Avi Kivity | unsigned priority);
|
483 | 093bc2cd | Avi Kivity | /**
|
484 | 093bc2cd | Avi Kivity | * memory_region_del_subregion: Remove a subregion.
|
485 | 093bc2cd | Avi Kivity | *
|
486 | 093bc2cd | Avi Kivity | * Removes a subregion from its container.
|
487 | 093bc2cd | Avi Kivity | *
|
488 | 093bc2cd | Avi Kivity | * @mr: the container to be updated.
|
489 | 093bc2cd | Avi Kivity | * @subregion: the region being removed; must be a current subregion of @mr.
|
490 | 093bc2cd | Avi Kivity | */
|
491 | 093bc2cd | Avi Kivity | void memory_region_del_subregion(MemoryRegion *mr,
|
492 | 093bc2cd | Avi Kivity | MemoryRegion *subregion); |
493 | 093bc2cd | Avi Kivity | |
494 | 4ef4db86 | Avi Kivity | /* Start a transaction; changes will be accumulated and made visible only
|
495 | 4ef4db86 | Avi Kivity | * when the transaction ends.
|
496 | 4ef4db86 | Avi Kivity | */
|
497 | 4ef4db86 | Avi Kivity | void memory_region_transaction_begin(void); |
498 | 4ef4db86 | Avi Kivity | /* Commit a transaction and make changes visible to the guest.
|
499 | 4ef4db86 | Avi Kivity | */
|
500 | 4ef4db86 | Avi Kivity | void memory_region_transaction_commit(void); |
501 | 4ef4db86 | Avi Kivity | |
502 | 093bc2cd | Avi Kivity | #endif
|
503 | 093bc2cd | Avi Kivity | |
504 | 093bc2cd | Avi Kivity | #endif |