Statistics
| Branch: | Revision:

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