1022c62cbSPaolo Bonzini /* 2022c62cbSPaolo Bonzini * Physical memory management API 3022c62cbSPaolo Bonzini * 4022c62cbSPaolo Bonzini * Copyright 2011 Red Hat, Inc. and/or its affiliates 5022c62cbSPaolo Bonzini * 6022c62cbSPaolo Bonzini * Authors: 7022c62cbSPaolo Bonzini * Avi Kivity <avi@redhat.com> 8022c62cbSPaolo Bonzini * 9022c62cbSPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2. See 10022c62cbSPaolo Bonzini * the COPYING file in the top-level directory. 11022c62cbSPaolo Bonzini * 12022c62cbSPaolo Bonzini */ 13022c62cbSPaolo Bonzini 14022c62cbSPaolo Bonzini #ifndef MEMORY_H 15022c62cbSPaolo Bonzini #define MEMORY_H 16022c62cbSPaolo Bonzini 17022c62cbSPaolo Bonzini #ifndef CONFIG_USER_ONLY 18022c62cbSPaolo Bonzini 191ab4c8ceSJuan Quintela #define DIRTY_MEMORY_VGA 0 201ab4c8ceSJuan Quintela #define DIRTY_MEMORY_CODE 1 211ab4c8ceSJuan Quintela #define DIRTY_MEMORY_MIGRATION 2 221ab4c8ceSJuan Quintela #define DIRTY_MEMORY_NUM 3 /* num of dirty bits */ 231ab4c8ceSJuan Quintela 24022c62cbSPaolo Bonzini #include <stdint.h> 25022c62cbSPaolo Bonzini #include <stdbool.h> 26022c62cbSPaolo Bonzini #include "qemu-common.h" 27022c62cbSPaolo Bonzini #include "exec/cpu-common.h" 28ce927ed9SAndreas Färber #ifndef CONFIG_USER_ONLY 29022c62cbSPaolo Bonzini #include "exec/hwaddr.h" 30ce927ed9SAndreas Färber #endif 31cc05c43aSPeter Maydell #include "exec/memattrs.h" 321de7afc9SPaolo Bonzini #include "qemu/queue.h" 331de7afc9SPaolo Bonzini #include "qemu/int128.h" 3406866575SDavid Gibson #include "qemu/notify.h" 357f56e740SPaolo Bonzini #include "qapi/error.h" 36b4fefef9SPeter Crosthwaite #include "qom/object.h" 37374f2981SPaolo Bonzini #include "qemu/rcu.h" 38022c62cbSPaolo Bonzini 39052e87b0SPaolo Bonzini #define MAX_PHYS_ADDR_SPACE_BITS 62 40052e87b0SPaolo Bonzini #define MAX_PHYS_ADDR (((hwaddr)1 << MAX_PHYS_ADDR_SPACE_BITS) - 1) 41052e87b0SPaolo Bonzini 42b4fefef9SPeter Crosthwaite #define TYPE_MEMORY_REGION "qemu:memory-region" 43b4fefef9SPeter Crosthwaite #define MEMORY_REGION(obj) \ 44b4fefef9SPeter Crosthwaite OBJECT_CHECK(MemoryRegion, (obj), TYPE_MEMORY_REGION) 45b4fefef9SPeter Crosthwaite 46022c62cbSPaolo Bonzini typedef struct MemoryRegionOps MemoryRegionOps; 47022c62cbSPaolo Bonzini typedef struct MemoryRegionMmio MemoryRegionMmio; 48022c62cbSPaolo Bonzini 49022c62cbSPaolo Bonzini struct MemoryRegionMmio { 50022c62cbSPaolo Bonzini CPUReadMemoryFunc *read[3]; 51022c62cbSPaolo Bonzini CPUWriteMemoryFunc *write[3]; 52022c62cbSPaolo Bonzini }; 53022c62cbSPaolo Bonzini 5430951157SAvi Kivity typedef struct IOMMUTLBEntry IOMMUTLBEntry; 5530951157SAvi Kivity 5630951157SAvi Kivity /* See address_space_translate: bit 0 is read, bit 1 is write. */ 5730951157SAvi Kivity typedef enum { 5830951157SAvi Kivity IOMMU_NONE = 0, 5930951157SAvi Kivity IOMMU_RO = 1, 6030951157SAvi Kivity IOMMU_WO = 2, 6130951157SAvi Kivity IOMMU_RW = 3, 6230951157SAvi Kivity } IOMMUAccessFlags; 6330951157SAvi Kivity 6430951157SAvi Kivity struct IOMMUTLBEntry { 6530951157SAvi Kivity AddressSpace *target_as; 6630951157SAvi Kivity hwaddr iova; 6730951157SAvi Kivity hwaddr translated_addr; 6830951157SAvi Kivity hwaddr addr_mask; /* 0xfff = 4k translation */ 6930951157SAvi Kivity IOMMUAccessFlags perm; 7030951157SAvi Kivity }; 7130951157SAvi Kivity 72cc05c43aSPeter Maydell /* New-style MMIO accessors can indicate that the transaction failed. 73cc05c43aSPeter Maydell * A zero (MEMTX_OK) response means success; anything else is a failure 74cc05c43aSPeter Maydell * of some kind. The memory subsystem will bitwise-OR together results 75cc05c43aSPeter Maydell * if it is synthesizing an operation from multiple smaller accesses. 76cc05c43aSPeter Maydell */ 77cc05c43aSPeter Maydell #define MEMTX_OK 0 78cc05c43aSPeter Maydell #define MEMTX_ERROR (1U << 0) /* device returned an error */ 79cc05c43aSPeter Maydell #define MEMTX_DECODE_ERROR (1U << 1) /* nothing at that address */ 80cc05c43aSPeter Maydell typedef uint32_t MemTxResult; 81cc05c43aSPeter Maydell 82022c62cbSPaolo Bonzini /* 83022c62cbSPaolo Bonzini * Memory region callbacks 84022c62cbSPaolo Bonzini */ 85022c62cbSPaolo Bonzini struct MemoryRegionOps { 86022c62cbSPaolo Bonzini /* Read from the memory region. @addr is relative to @mr; @size is 87022c62cbSPaolo Bonzini * in bytes. */ 88022c62cbSPaolo Bonzini uint64_t (*read)(void *opaque, 89022c62cbSPaolo Bonzini hwaddr addr, 90022c62cbSPaolo Bonzini unsigned size); 91022c62cbSPaolo Bonzini /* Write to the memory region. @addr is relative to @mr; @size is 92022c62cbSPaolo Bonzini * in bytes. */ 93022c62cbSPaolo Bonzini void (*write)(void *opaque, 94022c62cbSPaolo Bonzini hwaddr addr, 95022c62cbSPaolo Bonzini uint64_t data, 96022c62cbSPaolo Bonzini unsigned size); 97022c62cbSPaolo Bonzini 98cc05c43aSPeter Maydell MemTxResult (*read_with_attrs)(void *opaque, 99cc05c43aSPeter Maydell hwaddr addr, 100cc05c43aSPeter Maydell uint64_t *data, 101cc05c43aSPeter Maydell unsigned size, 102cc05c43aSPeter Maydell MemTxAttrs attrs); 103cc05c43aSPeter Maydell MemTxResult (*write_with_attrs)(void *opaque, 104cc05c43aSPeter Maydell hwaddr addr, 105cc05c43aSPeter Maydell uint64_t data, 106cc05c43aSPeter Maydell unsigned size, 107cc05c43aSPeter Maydell MemTxAttrs attrs); 108cc05c43aSPeter Maydell 109022c62cbSPaolo Bonzini enum device_endian endianness; 110022c62cbSPaolo Bonzini /* Guest-visible constraints: */ 111022c62cbSPaolo Bonzini struct { 112022c62cbSPaolo Bonzini /* If nonzero, specify bounds on access sizes beyond which a machine 113022c62cbSPaolo Bonzini * check is thrown. 114022c62cbSPaolo Bonzini */ 115022c62cbSPaolo Bonzini unsigned min_access_size; 116022c62cbSPaolo Bonzini unsigned max_access_size; 117022c62cbSPaolo Bonzini /* If true, unaligned accesses are supported. Otherwise unaligned 118022c62cbSPaolo Bonzini * accesses throw machine checks. 119022c62cbSPaolo Bonzini */ 120022c62cbSPaolo Bonzini bool unaligned; 121022c62cbSPaolo Bonzini /* 122022c62cbSPaolo Bonzini * If present, and returns #false, the transaction is not accepted 123022c62cbSPaolo Bonzini * by the device (and results in machine dependent behaviour such 124022c62cbSPaolo Bonzini * as a machine check exception). 125022c62cbSPaolo Bonzini */ 126022c62cbSPaolo Bonzini bool (*accepts)(void *opaque, hwaddr addr, 127022c62cbSPaolo Bonzini unsigned size, bool is_write); 128022c62cbSPaolo Bonzini } valid; 129022c62cbSPaolo Bonzini /* Internal implementation constraints: */ 130022c62cbSPaolo Bonzini struct { 131022c62cbSPaolo Bonzini /* If nonzero, specifies the minimum size implemented. Smaller sizes 132022c62cbSPaolo Bonzini * will be rounded upwards and a partial result will be returned. 133022c62cbSPaolo Bonzini */ 134022c62cbSPaolo Bonzini unsigned min_access_size; 135022c62cbSPaolo Bonzini /* If nonzero, specifies the maximum size implemented. Larger sizes 136022c62cbSPaolo Bonzini * will be done as a series of accesses with smaller sizes. 137022c62cbSPaolo Bonzini */ 138022c62cbSPaolo Bonzini unsigned max_access_size; 139022c62cbSPaolo Bonzini /* If true, unaligned accesses are supported. Otherwise all accesses 140022c62cbSPaolo Bonzini * are converted to (possibly multiple) naturally aligned accesses. 141022c62cbSPaolo Bonzini */ 142022c62cbSPaolo Bonzini bool unaligned; 143022c62cbSPaolo Bonzini } impl; 144022c62cbSPaolo Bonzini 145022c62cbSPaolo Bonzini /* If .read and .write are not present, old_mmio may be used for 146022c62cbSPaolo Bonzini * backwards compatibility with old mmio registration 147022c62cbSPaolo Bonzini */ 148022c62cbSPaolo Bonzini const MemoryRegionMmio old_mmio; 149022c62cbSPaolo Bonzini }; 150022c62cbSPaolo Bonzini 15130951157SAvi Kivity typedef struct MemoryRegionIOMMUOps MemoryRegionIOMMUOps; 15230951157SAvi Kivity 15330951157SAvi Kivity struct MemoryRegionIOMMUOps { 15430951157SAvi Kivity /* Return a TLB entry that contains a given address. */ 1558d7b8cb9SLe Tan IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, bool is_write); 15630951157SAvi Kivity }; 15730951157SAvi Kivity 158022c62cbSPaolo Bonzini typedef struct CoalescedMemoryRange CoalescedMemoryRange; 159022c62cbSPaolo Bonzini typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd; 160022c62cbSPaolo Bonzini 161022c62cbSPaolo Bonzini struct MemoryRegion { 162b4fefef9SPeter Crosthwaite Object parent_obj; 163022c62cbSPaolo Bonzini /* All fields are private - violators will be prosecuted */ 164022c62cbSPaolo Bonzini const MemoryRegionOps *ops; 16530951157SAvi Kivity const MemoryRegionIOMMUOps *iommu_ops; 166022c62cbSPaolo Bonzini void *opaque; 167feca4ac1SPaolo Bonzini MemoryRegion *container; 168022c62cbSPaolo Bonzini Int128 size; 169022c62cbSPaolo Bonzini hwaddr addr; 170022c62cbSPaolo Bonzini void (*destructor)(MemoryRegion *mr); 171022c62cbSPaolo Bonzini ram_addr_t ram_addr; 172a2b257d6SIgor Mammedov uint64_t align; 173022c62cbSPaolo Bonzini bool subpage; 174022c62cbSPaolo Bonzini bool terminates; 1755f9a5ea1SJan Kiszka bool romd_mode; 176022c62cbSPaolo Bonzini bool ram; 177e4dc3f59SNikunj A Dadhania bool skip_dump; 178022c62cbSPaolo Bonzini bool readonly; /* For RAM regions */ 179022c62cbSPaolo Bonzini bool enabled; 180022c62cbSPaolo Bonzini bool rom_device; 181022c62cbSPaolo Bonzini bool warning_printed; /* For reservations */ 182022c62cbSPaolo Bonzini bool flush_coalesced_mmio; 183022c62cbSPaolo Bonzini MemoryRegion *alias; 184022c62cbSPaolo Bonzini hwaddr alias_offset; 185d33382daSPeter Crosthwaite int32_t priority; 186022c62cbSPaolo Bonzini bool may_overlap; 187022c62cbSPaolo Bonzini QTAILQ_HEAD(subregions, MemoryRegion) subregions; 188022c62cbSPaolo Bonzini QTAILQ_ENTRY(MemoryRegion) subregions_link; 189022c62cbSPaolo Bonzini QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced; 190302fa283SPeter Maydell const char *name; 191022c62cbSPaolo Bonzini uint8_t dirty_log_mask; 192022c62cbSPaolo Bonzini unsigned ioeventfd_nb; 193022c62cbSPaolo Bonzini MemoryRegionIoeventfd *ioeventfds; 19406866575SDavid Gibson NotifierList iommu_notify; 195022c62cbSPaolo Bonzini }; 196022c62cbSPaolo Bonzini 197c2fc83e8SPaolo Bonzini /** 198c2fc83e8SPaolo Bonzini * MemoryListener: callbacks structure for updates to the physical memory map 199c2fc83e8SPaolo Bonzini * 200c2fc83e8SPaolo Bonzini * Allows a component to adjust to changes in the guest-visible memory map. 201c2fc83e8SPaolo Bonzini * Use with memory_listener_register() and memory_listener_unregister(). 202c2fc83e8SPaolo Bonzini */ 203c2fc83e8SPaolo Bonzini struct MemoryListener { 204c2fc83e8SPaolo Bonzini void (*begin)(MemoryListener *listener); 205c2fc83e8SPaolo Bonzini void (*commit)(MemoryListener *listener); 206c2fc83e8SPaolo Bonzini void (*region_add)(MemoryListener *listener, MemoryRegionSection *section); 207c2fc83e8SPaolo Bonzini void (*region_del)(MemoryListener *listener, MemoryRegionSection *section); 208c2fc83e8SPaolo Bonzini void (*region_nop)(MemoryListener *listener, MemoryRegionSection *section); 209b2dfd71cSPaolo Bonzini void (*log_start)(MemoryListener *listener, MemoryRegionSection *section, 210b2dfd71cSPaolo Bonzini int old, int new); 211b2dfd71cSPaolo Bonzini void (*log_stop)(MemoryListener *listener, MemoryRegionSection *section, 212b2dfd71cSPaolo Bonzini int old, int new); 213c2fc83e8SPaolo Bonzini void (*log_sync)(MemoryListener *listener, MemoryRegionSection *section); 214c2fc83e8SPaolo Bonzini void (*log_global_start)(MemoryListener *listener); 215c2fc83e8SPaolo Bonzini void (*log_global_stop)(MemoryListener *listener); 216c2fc83e8SPaolo Bonzini void (*eventfd_add)(MemoryListener *listener, MemoryRegionSection *section, 217c2fc83e8SPaolo Bonzini bool match_data, uint64_t data, EventNotifier *e); 218c2fc83e8SPaolo Bonzini void (*eventfd_del)(MemoryListener *listener, MemoryRegionSection *section, 219c2fc83e8SPaolo Bonzini bool match_data, uint64_t data, EventNotifier *e); 220c2fc83e8SPaolo Bonzini void (*coalesced_mmio_add)(MemoryListener *listener, MemoryRegionSection *section, 221c2fc83e8SPaolo Bonzini hwaddr addr, hwaddr len); 222c2fc83e8SPaolo Bonzini void (*coalesced_mmio_del)(MemoryListener *listener, MemoryRegionSection *section, 223c2fc83e8SPaolo Bonzini hwaddr addr, hwaddr len); 224c2fc83e8SPaolo Bonzini /* Lower = earlier (during add), later (during del) */ 225c2fc83e8SPaolo Bonzini unsigned priority; 226c2fc83e8SPaolo Bonzini AddressSpace *address_space_filter; 227c2fc83e8SPaolo Bonzini QTAILQ_ENTRY(MemoryListener) link; 228c2fc83e8SPaolo Bonzini }; 229c2fc83e8SPaolo Bonzini 230022c62cbSPaolo Bonzini /** 231022c62cbSPaolo Bonzini * AddressSpace: describes a mapping of addresses to #MemoryRegion objects 232022c62cbSPaolo Bonzini */ 233022c62cbSPaolo Bonzini struct AddressSpace { 234022c62cbSPaolo Bonzini /* All fields are private. */ 235374f2981SPaolo Bonzini struct rcu_head rcu; 2367dca8043SAlexey Kardashevskiy char *name; 237022c62cbSPaolo Bonzini MemoryRegion *root; 238374f2981SPaolo Bonzini 239374f2981SPaolo Bonzini /* Accessed via RCU. */ 240022c62cbSPaolo Bonzini struct FlatView *current_map; 241374f2981SPaolo Bonzini 242022c62cbSPaolo Bonzini int ioeventfd_nb; 243022c62cbSPaolo Bonzini struct MemoryRegionIoeventfd *ioeventfds; 244022c62cbSPaolo Bonzini struct AddressSpaceDispatch *dispatch; 24500752703SPaolo Bonzini struct AddressSpaceDispatch *next_dispatch; 24689ae337aSPaolo Bonzini MemoryListener dispatch_listener; 24789ae337aSPaolo Bonzini 248022c62cbSPaolo Bonzini QTAILQ_ENTRY(AddressSpace) address_spaces_link; 249022c62cbSPaolo Bonzini }; 250022c62cbSPaolo Bonzini 251022c62cbSPaolo Bonzini /** 252022c62cbSPaolo Bonzini * MemoryRegionSection: describes a fragment of a #MemoryRegion 253022c62cbSPaolo Bonzini * 254022c62cbSPaolo Bonzini * @mr: the region, or %NULL if empty 255022c62cbSPaolo Bonzini * @address_space: the address space the region is mapped in 256022c62cbSPaolo Bonzini * @offset_within_region: the beginning of the section, relative to @mr's start 257022c62cbSPaolo Bonzini * @size: the size of the section; will not exceed @mr's boundaries 258022c62cbSPaolo Bonzini * @offset_within_address_space: the address of the first byte of the section 259022c62cbSPaolo Bonzini * relative to the region's address space 260022c62cbSPaolo Bonzini * @readonly: writes to this section are ignored 261022c62cbSPaolo Bonzini */ 262022c62cbSPaolo Bonzini struct MemoryRegionSection { 263022c62cbSPaolo Bonzini MemoryRegion *mr; 264022c62cbSPaolo Bonzini AddressSpace *address_space; 265022c62cbSPaolo Bonzini hwaddr offset_within_region; 266052e87b0SPaolo Bonzini Int128 size; 267022c62cbSPaolo Bonzini hwaddr offset_within_address_space; 268022c62cbSPaolo Bonzini bool readonly; 269022c62cbSPaolo Bonzini }; 270022c62cbSPaolo Bonzini 271022c62cbSPaolo Bonzini /** 272022c62cbSPaolo Bonzini * memory_region_init: Initialize a memory region 273022c62cbSPaolo Bonzini * 274022c62cbSPaolo Bonzini * The region typically acts as a container for other memory regions. Use 275022c62cbSPaolo Bonzini * memory_region_add_subregion() to add subregions. 276022c62cbSPaolo Bonzini * 277022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized 2782c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 279022c62cbSPaolo Bonzini * @name: used for debugging; not visible to the user or ABI 280022c62cbSPaolo Bonzini * @size: size of the region; any subregions beyond this size will be clipped 281022c62cbSPaolo Bonzini */ 282022c62cbSPaolo Bonzini void memory_region_init(MemoryRegion *mr, 2832c9b15caSPaolo Bonzini struct Object *owner, 284022c62cbSPaolo Bonzini const char *name, 285022c62cbSPaolo Bonzini uint64_t size); 28646637be2SPaolo Bonzini 28746637be2SPaolo Bonzini /** 28846637be2SPaolo Bonzini * memory_region_ref: Add 1 to a memory region's reference count 28946637be2SPaolo Bonzini * 29046637be2SPaolo Bonzini * Whenever memory regions are accessed outside the BQL, they need to be 29146637be2SPaolo Bonzini * preserved against hot-unplug. MemoryRegions actually do not have their 29246637be2SPaolo Bonzini * own reference count; they piggyback on a QOM object, their "owner". 29346637be2SPaolo Bonzini * This function adds a reference to the owner. 29446637be2SPaolo Bonzini * 29546637be2SPaolo Bonzini * All MemoryRegions must have an owner if they can disappear, even if the 29646637be2SPaolo Bonzini * device they belong to operates exclusively under the BQL. This is because 29746637be2SPaolo Bonzini * the region could be returned at any time by memory_region_find, and this 29846637be2SPaolo Bonzini * is usually under guest control. 29946637be2SPaolo Bonzini * 30046637be2SPaolo Bonzini * @mr: the #MemoryRegion 30146637be2SPaolo Bonzini */ 30246637be2SPaolo Bonzini void memory_region_ref(MemoryRegion *mr); 30346637be2SPaolo Bonzini 30446637be2SPaolo Bonzini /** 30546637be2SPaolo Bonzini * memory_region_unref: Remove 1 to a memory region's reference count 30646637be2SPaolo Bonzini * 30746637be2SPaolo Bonzini * Whenever memory regions are accessed outside the BQL, they need to be 30846637be2SPaolo Bonzini * preserved against hot-unplug. MemoryRegions actually do not have their 30946637be2SPaolo Bonzini * own reference count; they piggyback on a QOM object, their "owner". 31046637be2SPaolo Bonzini * This function removes a reference to the owner and possibly destroys it. 31146637be2SPaolo Bonzini * 31246637be2SPaolo Bonzini * @mr: the #MemoryRegion 31346637be2SPaolo Bonzini */ 31446637be2SPaolo Bonzini void memory_region_unref(MemoryRegion *mr); 31546637be2SPaolo Bonzini 316022c62cbSPaolo Bonzini /** 317022c62cbSPaolo Bonzini * memory_region_init_io: Initialize an I/O memory region. 318022c62cbSPaolo Bonzini * 319022c62cbSPaolo Bonzini * Accesses into the region will cause the callbacks in @ops to be called. 320022c62cbSPaolo Bonzini * if @size is nonzero, subregions will be clipped to @size. 321022c62cbSPaolo Bonzini * 322022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 3232c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 324022c62cbSPaolo Bonzini * @ops: a structure containing read and write callbacks to be used when 325022c62cbSPaolo Bonzini * I/O is performed on the region. 326022c62cbSPaolo Bonzini * @opaque: passed to to the read and write callbacks of the @ops structure. 327022c62cbSPaolo Bonzini * @name: used for debugging; not visible to the user or ABI 328022c62cbSPaolo Bonzini * @size: size of the region. 329022c62cbSPaolo Bonzini */ 330022c62cbSPaolo Bonzini void memory_region_init_io(MemoryRegion *mr, 3312c9b15caSPaolo Bonzini struct Object *owner, 332022c62cbSPaolo Bonzini const MemoryRegionOps *ops, 333022c62cbSPaolo Bonzini void *opaque, 334022c62cbSPaolo Bonzini const char *name, 335022c62cbSPaolo Bonzini uint64_t size); 336022c62cbSPaolo Bonzini 337022c62cbSPaolo Bonzini /** 338022c62cbSPaolo Bonzini * memory_region_init_ram: Initialize RAM memory region. Accesses into the 339022c62cbSPaolo Bonzini * region will modify memory directly. 340022c62cbSPaolo Bonzini * 341022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 3422c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 343022c62cbSPaolo Bonzini * @name: the name of the region. 344022c62cbSPaolo Bonzini * @size: size of the region. 34549946538SHu Tao * @errp: pointer to Error*, to store an error if it happens. 346022c62cbSPaolo Bonzini */ 347022c62cbSPaolo Bonzini void memory_region_init_ram(MemoryRegion *mr, 3482c9b15caSPaolo Bonzini struct Object *owner, 349022c62cbSPaolo Bonzini const char *name, 35049946538SHu Tao uint64_t size, 35149946538SHu Tao Error **errp); 352022c62cbSPaolo Bonzini 35360786ef3SMichael S. Tsirkin /** 35460786ef3SMichael S. Tsirkin * memory_region_init_resizeable_ram: Initialize memory region with resizeable 35560786ef3SMichael S. Tsirkin * RAM. Accesses into the region will 35660786ef3SMichael S. Tsirkin * modify memory directly. Only an initial 35760786ef3SMichael S. Tsirkin * portion of this RAM is actually used. 35860786ef3SMichael S. Tsirkin * The used size can change across reboots. 35960786ef3SMichael S. Tsirkin * 36060786ef3SMichael S. Tsirkin * @mr: the #MemoryRegion to be initialized. 36160786ef3SMichael S. Tsirkin * @owner: the object that tracks the region's reference count 36260786ef3SMichael S. Tsirkin * @name: the name of the region. 36360786ef3SMichael S. Tsirkin * @size: used size of the region. 36460786ef3SMichael S. Tsirkin * @max_size: max size of the region. 36560786ef3SMichael S. Tsirkin * @resized: callback to notify owner about used size change. 36660786ef3SMichael S. Tsirkin * @errp: pointer to Error*, to store an error if it happens. 36760786ef3SMichael S. Tsirkin */ 36860786ef3SMichael S. Tsirkin void memory_region_init_resizeable_ram(MemoryRegion *mr, 36960786ef3SMichael S. Tsirkin struct Object *owner, 37060786ef3SMichael S. Tsirkin const char *name, 37160786ef3SMichael S. Tsirkin uint64_t size, 37260786ef3SMichael S. Tsirkin uint64_t max_size, 37360786ef3SMichael S. Tsirkin void (*resized)(const char*, 37460786ef3SMichael S. Tsirkin uint64_t length, 37560786ef3SMichael S. Tsirkin void *host), 37660786ef3SMichael S. Tsirkin Error **errp); 3770b183fc8SPaolo Bonzini #ifdef __linux__ 3780b183fc8SPaolo Bonzini /** 3790b183fc8SPaolo Bonzini * memory_region_init_ram_from_file: Initialize RAM memory region with a 3800b183fc8SPaolo Bonzini * mmap-ed backend. 3810b183fc8SPaolo Bonzini * 3820b183fc8SPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 3830b183fc8SPaolo Bonzini * @owner: the object that tracks the region's reference count 3840b183fc8SPaolo Bonzini * @name: the name of the region. 3850b183fc8SPaolo Bonzini * @size: size of the region. 386dbcb8981SPaolo Bonzini * @share: %true if memory must be mmaped with the MAP_SHARED flag 3870b183fc8SPaolo Bonzini * @path: the path in which to allocate the RAM. 3887f56e740SPaolo Bonzini * @errp: pointer to Error*, to store an error if it happens. 3890b183fc8SPaolo Bonzini */ 3900b183fc8SPaolo Bonzini void memory_region_init_ram_from_file(MemoryRegion *mr, 3910b183fc8SPaolo Bonzini struct Object *owner, 3920b183fc8SPaolo Bonzini const char *name, 3930b183fc8SPaolo Bonzini uint64_t size, 394dbcb8981SPaolo Bonzini bool share, 3957f56e740SPaolo Bonzini const char *path, 3967f56e740SPaolo Bonzini Error **errp); 3970b183fc8SPaolo Bonzini #endif 3980b183fc8SPaolo Bonzini 399022c62cbSPaolo Bonzini /** 400022c62cbSPaolo Bonzini * memory_region_init_ram_ptr: Initialize RAM memory region from a 401022c62cbSPaolo Bonzini * user-provided pointer. Accesses into the 402022c62cbSPaolo Bonzini * region will modify memory directly. 403022c62cbSPaolo Bonzini * 404022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 4052c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 406022c62cbSPaolo Bonzini * @name: the name of the region. 407022c62cbSPaolo Bonzini * @size: size of the region. 408022c62cbSPaolo Bonzini * @ptr: memory to be mapped; must contain at least @size bytes. 409022c62cbSPaolo Bonzini */ 410022c62cbSPaolo Bonzini void memory_region_init_ram_ptr(MemoryRegion *mr, 4112c9b15caSPaolo Bonzini struct Object *owner, 412022c62cbSPaolo Bonzini const char *name, 413022c62cbSPaolo Bonzini uint64_t size, 414022c62cbSPaolo Bonzini void *ptr); 415022c62cbSPaolo Bonzini 416022c62cbSPaolo Bonzini /** 417022c62cbSPaolo Bonzini * memory_region_init_alias: Initialize a memory region that aliases all or a 418022c62cbSPaolo Bonzini * part of another memory region. 419022c62cbSPaolo Bonzini * 420022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 4212c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 422022c62cbSPaolo Bonzini * @name: used for debugging; not visible to the user or ABI 423022c62cbSPaolo Bonzini * @orig: the region to be referenced; @mr will be equivalent to 424022c62cbSPaolo Bonzini * @orig between @offset and @offset + @size - 1. 425022c62cbSPaolo Bonzini * @offset: start of the section in @orig to be referenced. 426022c62cbSPaolo Bonzini * @size: size of the region. 427022c62cbSPaolo Bonzini */ 428022c62cbSPaolo Bonzini void memory_region_init_alias(MemoryRegion *mr, 4292c9b15caSPaolo Bonzini struct Object *owner, 430022c62cbSPaolo Bonzini const char *name, 431022c62cbSPaolo Bonzini MemoryRegion *orig, 432022c62cbSPaolo Bonzini hwaddr offset, 433022c62cbSPaolo Bonzini uint64_t size); 434022c62cbSPaolo Bonzini 435022c62cbSPaolo Bonzini /** 436022c62cbSPaolo Bonzini * memory_region_init_rom_device: Initialize a ROM memory region. Writes are 437022c62cbSPaolo Bonzini * handled via callbacks. 438022c62cbSPaolo Bonzini * 439022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized. 4402c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 441022c62cbSPaolo Bonzini * @ops: callbacks for write access handling. 442022c62cbSPaolo Bonzini * @name: the name of the region. 443022c62cbSPaolo Bonzini * @size: size of the region. 44433e0eb52SHu Tao * @errp: pointer to Error*, to store an error if it happens. 445022c62cbSPaolo Bonzini */ 446022c62cbSPaolo Bonzini void memory_region_init_rom_device(MemoryRegion *mr, 4472c9b15caSPaolo Bonzini struct Object *owner, 448022c62cbSPaolo Bonzini const MemoryRegionOps *ops, 449022c62cbSPaolo Bonzini void *opaque, 450022c62cbSPaolo Bonzini const char *name, 45133e0eb52SHu Tao uint64_t size, 45233e0eb52SHu Tao Error **errp); 453022c62cbSPaolo Bonzini 454022c62cbSPaolo Bonzini /** 455022c62cbSPaolo Bonzini * memory_region_init_reservation: Initialize a memory region that reserves 456022c62cbSPaolo Bonzini * I/O space. 457022c62cbSPaolo Bonzini * 458022c62cbSPaolo Bonzini * A reservation region primariy serves debugging purposes. It claims I/O 459022c62cbSPaolo Bonzini * space that is not supposed to be handled by QEMU itself. Any access via 460022c62cbSPaolo Bonzini * the memory API will cause an abort(). 461022c62cbSPaolo Bonzini * 462022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be initialized 4632c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 464022c62cbSPaolo Bonzini * @name: used for debugging; not visible to the user or ABI 465022c62cbSPaolo Bonzini * @size: size of the region. 466022c62cbSPaolo Bonzini */ 467022c62cbSPaolo Bonzini void memory_region_init_reservation(MemoryRegion *mr, 4682c9b15caSPaolo Bonzini struct Object *owner, 469022c62cbSPaolo Bonzini const char *name, 470022c62cbSPaolo Bonzini uint64_t size); 47130951157SAvi Kivity 47230951157SAvi Kivity /** 47330951157SAvi Kivity * memory_region_init_iommu: Initialize a memory region that translates 47430951157SAvi Kivity * addresses 47530951157SAvi Kivity * 47630951157SAvi Kivity * An IOMMU region translates addresses and forwards accesses to a target 47730951157SAvi Kivity * memory region. 47830951157SAvi Kivity * 47930951157SAvi Kivity * @mr: the #MemoryRegion to be initialized 4802c9b15caSPaolo Bonzini * @owner: the object that tracks the region's reference count 48130951157SAvi Kivity * @ops: a function that translates addresses into the @target region 48230951157SAvi Kivity * @name: used for debugging; not visible to the user or ABI 48330951157SAvi Kivity * @size: size of the region. 48430951157SAvi Kivity */ 48530951157SAvi Kivity void memory_region_init_iommu(MemoryRegion *mr, 4862c9b15caSPaolo Bonzini struct Object *owner, 48730951157SAvi Kivity const MemoryRegionIOMMUOps *ops, 48830951157SAvi Kivity const char *name, 48930951157SAvi Kivity uint64_t size); 49030951157SAvi Kivity 491022c62cbSPaolo Bonzini /** 492803c0816SPaolo Bonzini * memory_region_owner: get a memory region's owner. 493803c0816SPaolo Bonzini * 494803c0816SPaolo Bonzini * @mr: the memory region being queried. 495803c0816SPaolo Bonzini */ 496803c0816SPaolo Bonzini struct Object *memory_region_owner(MemoryRegion *mr); 497803c0816SPaolo Bonzini 498803c0816SPaolo Bonzini /** 499022c62cbSPaolo Bonzini * memory_region_size: get a memory region's size. 500022c62cbSPaolo Bonzini * 501022c62cbSPaolo Bonzini * @mr: the memory region being queried. 502022c62cbSPaolo Bonzini */ 503022c62cbSPaolo Bonzini uint64_t memory_region_size(MemoryRegion *mr); 504022c62cbSPaolo Bonzini 505022c62cbSPaolo Bonzini /** 506022c62cbSPaolo Bonzini * memory_region_is_ram: check whether a memory region is random access 507022c62cbSPaolo Bonzini * 508022c62cbSPaolo Bonzini * Returns %true is a memory region is random access. 509022c62cbSPaolo Bonzini * 510022c62cbSPaolo Bonzini * @mr: the memory region being queried 511022c62cbSPaolo Bonzini */ 512022c62cbSPaolo Bonzini bool memory_region_is_ram(MemoryRegion *mr); 513022c62cbSPaolo Bonzini 514022c62cbSPaolo Bonzini /** 515e4dc3f59SNikunj A Dadhania * memory_region_is_skip_dump: check whether a memory region should not be 516e4dc3f59SNikunj A Dadhania * dumped 517e4dc3f59SNikunj A Dadhania * 518e4dc3f59SNikunj A Dadhania * Returns %true is a memory region should not be dumped(e.g. VFIO BAR MMAP). 519e4dc3f59SNikunj A Dadhania * 520e4dc3f59SNikunj A Dadhania * @mr: the memory region being queried 521e4dc3f59SNikunj A Dadhania */ 522e4dc3f59SNikunj A Dadhania bool memory_region_is_skip_dump(MemoryRegion *mr); 523e4dc3f59SNikunj A Dadhania 524e4dc3f59SNikunj A Dadhania /** 525e4dc3f59SNikunj A Dadhania * memory_region_set_skip_dump: Set skip_dump flag, dump will ignore this memory 526e4dc3f59SNikunj A Dadhania * region 527e4dc3f59SNikunj A Dadhania * 528e4dc3f59SNikunj A Dadhania * @mr: the memory region being queried 529e4dc3f59SNikunj A Dadhania */ 530e4dc3f59SNikunj A Dadhania void memory_region_set_skip_dump(MemoryRegion *mr); 531e4dc3f59SNikunj A Dadhania 532e4dc3f59SNikunj A Dadhania /** 5335f9a5ea1SJan Kiszka * memory_region_is_romd: check whether a memory region is in ROMD mode 534022c62cbSPaolo Bonzini * 5355f9a5ea1SJan Kiszka * Returns %true if a memory region is a ROM device and currently set to allow 536022c62cbSPaolo Bonzini * direct reads. 537022c62cbSPaolo Bonzini * 538022c62cbSPaolo Bonzini * @mr: the memory region being queried 539022c62cbSPaolo Bonzini */ 540022c62cbSPaolo Bonzini static inline bool memory_region_is_romd(MemoryRegion *mr) 541022c62cbSPaolo Bonzini { 5425f9a5ea1SJan Kiszka return mr->rom_device && mr->romd_mode; 543022c62cbSPaolo Bonzini } 544022c62cbSPaolo Bonzini 545022c62cbSPaolo Bonzini /** 54630951157SAvi Kivity * memory_region_is_iommu: check whether a memory region is an iommu 54730951157SAvi Kivity * 54830951157SAvi Kivity * Returns %true is a memory region is an iommu. 54930951157SAvi Kivity * 55030951157SAvi Kivity * @mr: the memory region being queried 55130951157SAvi Kivity */ 55230951157SAvi Kivity bool memory_region_is_iommu(MemoryRegion *mr); 55330951157SAvi Kivity 55430951157SAvi Kivity /** 55506866575SDavid Gibson * memory_region_notify_iommu: notify a change in an IOMMU translation entry. 55606866575SDavid Gibson * 55706866575SDavid Gibson * @mr: the memory region that was changed 55806866575SDavid Gibson * @entry: the new entry in the IOMMU translation table. The entry 55906866575SDavid Gibson * replaces all old entries for the same virtual I/O address range. 56006866575SDavid Gibson * Deleted entries have .@perm == 0. 56106866575SDavid Gibson */ 56206866575SDavid Gibson void memory_region_notify_iommu(MemoryRegion *mr, 56306866575SDavid Gibson IOMMUTLBEntry entry); 56406866575SDavid Gibson 56506866575SDavid Gibson /** 56606866575SDavid Gibson * memory_region_register_iommu_notifier: register a notifier for changes to 56706866575SDavid Gibson * IOMMU translation entries. 56806866575SDavid Gibson * 56906866575SDavid Gibson * @mr: the memory region to observe 57006866575SDavid Gibson * @n: the notifier to be added; the notifier receives a pointer to an 57106866575SDavid Gibson * #IOMMUTLBEntry as the opaque value; the pointer ceases to be 57206866575SDavid Gibson * valid on exit from the notifier. 57306866575SDavid Gibson */ 57406866575SDavid Gibson void memory_region_register_iommu_notifier(MemoryRegion *mr, Notifier *n); 57506866575SDavid Gibson 57606866575SDavid Gibson /** 57706866575SDavid Gibson * memory_region_unregister_iommu_notifier: unregister a notifier for 57806866575SDavid Gibson * changes to IOMMU translation entries. 57906866575SDavid Gibson * 58006866575SDavid Gibson * @n: the notifier to be removed. 58106866575SDavid Gibson */ 58206866575SDavid Gibson void memory_region_unregister_iommu_notifier(Notifier *n); 58306866575SDavid Gibson 58406866575SDavid Gibson /** 585022c62cbSPaolo Bonzini * memory_region_name: get a memory region's name 586022c62cbSPaolo Bonzini * 587022c62cbSPaolo Bonzini * Returns the string that was used to initialize the memory region. 588022c62cbSPaolo Bonzini * 589022c62cbSPaolo Bonzini * @mr: the memory region being queried 590022c62cbSPaolo Bonzini */ 5915d546d4bSPeter Crosthwaite const char *memory_region_name(const MemoryRegion *mr); 592022c62cbSPaolo Bonzini 593022c62cbSPaolo Bonzini /** 594022c62cbSPaolo Bonzini * memory_region_is_logging: return whether a memory region is logging writes 595022c62cbSPaolo Bonzini * 5962d1a35beSPaolo Bonzini * Returns %true if the memory region is logging writes for the given client 5972d1a35beSPaolo Bonzini * 5982d1a35beSPaolo Bonzini * @mr: the memory region being queried 5992d1a35beSPaolo Bonzini * @client: the client being queried 6002d1a35beSPaolo Bonzini */ 6012d1a35beSPaolo Bonzini bool memory_region_is_logging(MemoryRegion *mr, uint8_t client); 6022d1a35beSPaolo Bonzini 6032d1a35beSPaolo Bonzini /** 6042d1a35beSPaolo Bonzini * memory_region_get_dirty_log_mask: return the clients for which a 6052d1a35beSPaolo Bonzini * memory region is logging writes. 6062d1a35beSPaolo Bonzini * 607*677e7805SPaolo Bonzini * Returns a bitmap of clients, in which the DIRTY_MEMORY_* constants 608*677e7805SPaolo Bonzini * are the bit indices. 609022c62cbSPaolo Bonzini * 610022c62cbSPaolo Bonzini * @mr: the memory region being queried 611022c62cbSPaolo Bonzini */ 6122d1a35beSPaolo Bonzini uint8_t memory_region_get_dirty_log_mask(MemoryRegion *mr); 613022c62cbSPaolo Bonzini 614022c62cbSPaolo Bonzini /** 615022c62cbSPaolo Bonzini * memory_region_is_rom: check whether a memory region is ROM 616022c62cbSPaolo Bonzini * 617022c62cbSPaolo Bonzini * Returns %true is a memory region is read-only memory. 618022c62cbSPaolo Bonzini * 619022c62cbSPaolo Bonzini * @mr: the memory region being queried 620022c62cbSPaolo Bonzini */ 621022c62cbSPaolo Bonzini bool memory_region_is_rom(MemoryRegion *mr); 622022c62cbSPaolo Bonzini 623022c62cbSPaolo Bonzini /** 624a35ba7beSPaolo Bonzini * memory_region_get_fd: Get a file descriptor backing a RAM memory region. 625a35ba7beSPaolo Bonzini * 626a35ba7beSPaolo Bonzini * Returns a file descriptor backing a file-based RAM memory region, 627a35ba7beSPaolo Bonzini * or -1 if the region is not a file-based RAM memory region. 628a35ba7beSPaolo Bonzini * 629a35ba7beSPaolo Bonzini * @mr: the RAM or alias memory region being queried. 630a35ba7beSPaolo Bonzini */ 631a35ba7beSPaolo Bonzini int memory_region_get_fd(MemoryRegion *mr); 632a35ba7beSPaolo Bonzini 633a35ba7beSPaolo Bonzini /** 634022c62cbSPaolo Bonzini * memory_region_get_ram_ptr: Get a pointer into a RAM memory region. 635022c62cbSPaolo Bonzini * 636022c62cbSPaolo Bonzini * Returns a host pointer to a RAM memory region (created with 637022c62cbSPaolo Bonzini * memory_region_init_ram() or memory_region_init_ram_ptr()). Use with 638022c62cbSPaolo Bonzini * care. 639022c62cbSPaolo Bonzini * 640022c62cbSPaolo Bonzini * @mr: the memory region being queried. 641022c62cbSPaolo Bonzini */ 642022c62cbSPaolo Bonzini void *memory_region_get_ram_ptr(MemoryRegion *mr); 643022c62cbSPaolo Bonzini 64437d7c084SPaolo Bonzini /* memory_region_ram_resize: Resize a RAM region. 64537d7c084SPaolo Bonzini * 64637d7c084SPaolo Bonzini * Only legal before guest might have detected the memory size: e.g. on 64737d7c084SPaolo Bonzini * incoming migration, or right after reset. 64837d7c084SPaolo Bonzini * 64937d7c084SPaolo Bonzini * @mr: a memory region created with @memory_region_init_resizeable_ram. 65037d7c084SPaolo Bonzini * @newsize: the new size the region 65137d7c084SPaolo Bonzini * @errp: pointer to Error*, to store an error if it happens. 65237d7c084SPaolo Bonzini */ 65337d7c084SPaolo Bonzini void memory_region_ram_resize(MemoryRegion *mr, ram_addr_t newsize, 65437d7c084SPaolo Bonzini Error **errp); 65537d7c084SPaolo Bonzini 656022c62cbSPaolo Bonzini /** 657022c62cbSPaolo Bonzini * memory_region_set_log: Turn dirty logging on or off for a region. 658022c62cbSPaolo Bonzini * 659022c62cbSPaolo Bonzini * Turns dirty logging on or off for a specified client (display, migration). 660022c62cbSPaolo Bonzini * Only meaningful for RAM regions. 661022c62cbSPaolo Bonzini * 662022c62cbSPaolo Bonzini * @mr: the memory region being updated. 663022c62cbSPaolo Bonzini * @log: whether dirty logging is to be enabled or disabled. 664dbddac6dSPaolo Bonzini * @client: the user of the logging information; %DIRTY_MEMORY_VGA only. 665022c62cbSPaolo Bonzini */ 666022c62cbSPaolo Bonzini void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client); 667022c62cbSPaolo Bonzini 668022c62cbSPaolo Bonzini /** 669022c62cbSPaolo Bonzini * memory_region_get_dirty: Check whether a range of bytes is dirty 670022c62cbSPaolo Bonzini * for a specified client. 671022c62cbSPaolo Bonzini * 672022c62cbSPaolo Bonzini * Checks whether a range of bytes has been written to since the last 673022c62cbSPaolo Bonzini * call to memory_region_reset_dirty() with the same @client. Dirty logging 674022c62cbSPaolo Bonzini * must be enabled. 675022c62cbSPaolo Bonzini * 676022c62cbSPaolo Bonzini * @mr: the memory region being queried. 677022c62cbSPaolo Bonzini * @addr: the address (relative to the start of the region) being queried. 678022c62cbSPaolo Bonzini * @size: the size of the range being queried. 679022c62cbSPaolo Bonzini * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or 680022c62cbSPaolo Bonzini * %DIRTY_MEMORY_VGA. 681022c62cbSPaolo Bonzini */ 682022c62cbSPaolo Bonzini bool memory_region_get_dirty(MemoryRegion *mr, hwaddr addr, 683022c62cbSPaolo Bonzini hwaddr size, unsigned client); 684022c62cbSPaolo Bonzini 685022c62cbSPaolo Bonzini /** 686022c62cbSPaolo Bonzini * memory_region_set_dirty: Mark a range of bytes as dirty in a memory region. 687022c62cbSPaolo Bonzini * 688022c62cbSPaolo Bonzini * Marks a range of bytes as dirty, after it has been dirtied outside 689022c62cbSPaolo Bonzini * guest code. 690022c62cbSPaolo Bonzini * 691022c62cbSPaolo Bonzini * @mr: the memory region being dirtied. 692022c62cbSPaolo Bonzini * @addr: the address (relative to the start of the region) being dirtied. 693022c62cbSPaolo Bonzini * @size: size of the range being dirtied. 694022c62cbSPaolo Bonzini */ 695022c62cbSPaolo Bonzini void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, 696022c62cbSPaolo Bonzini hwaddr size); 697022c62cbSPaolo Bonzini 698022c62cbSPaolo Bonzini /** 6996c279db8SJuan Quintela * memory_region_test_and_clear_dirty: Check whether a range of bytes is dirty 7006c279db8SJuan Quintela * for a specified client. It clears them. 7016c279db8SJuan Quintela * 7026c279db8SJuan Quintela * Checks whether a range of bytes has been written to since the last 7036c279db8SJuan Quintela * call to memory_region_reset_dirty() with the same @client. Dirty logging 7046c279db8SJuan Quintela * must be enabled. 7056c279db8SJuan Quintela * 7066c279db8SJuan Quintela * @mr: the memory region being queried. 7076c279db8SJuan Quintela * @addr: the address (relative to the start of the region) being queried. 7086c279db8SJuan Quintela * @size: the size of the range being queried. 7096c279db8SJuan Quintela * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or 7106c279db8SJuan Quintela * %DIRTY_MEMORY_VGA. 7116c279db8SJuan Quintela */ 7126c279db8SJuan Quintela bool memory_region_test_and_clear_dirty(MemoryRegion *mr, hwaddr addr, 7136c279db8SJuan Quintela hwaddr size, unsigned client); 7146c279db8SJuan Quintela /** 715022c62cbSPaolo Bonzini * memory_region_sync_dirty_bitmap: Synchronize a region's dirty bitmap with 716022c62cbSPaolo Bonzini * any external TLBs (e.g. kvm) 717022c62cbSPaolo Bonzini * 718022c62cbSPaolo Bonzini * Flushes dirty information from accelerators such as kvm and vhost-net 719022c62cbSPaolo Bonzini * and makes it available to users of the memory API. 720022c62cbSPaolo Bonzini * 721022c62cbSPaolo Bonzini * @mr: the region being flushed. 722022c62cbSPaolo Bonzini */ 723022c62cbSPaolo Bonzini void memory_region_sync_dirty_bitmap(MemoryRegion *mr); 724022c62cbSPaolo Bonzini 725022c62cbSPaolo Bonzini /** 726022c62cbSPaolo Bonzini * memory_region_reset_dirty: Mark a range of pages as clean, for a specified 727022c62cbSPaolo Bonzini * client. 728022c62cbSPaolo Bonzini * 729022c62cbSPaolo Bonzini * Marks a range of pages as no longer dirty. 730022c62cbSPaolo Bonzini * 731022c62cbSPaolo Bonzini * @mr: the region being updated. 732022c62cbSPaolo Bonzini * @addr: the start of the subrange being cleaned. 733022c62cbSPaolo Bonzini * @size: the size of the subrange being cleaned. 734022c62cbSPaolo Bonzini * @client: the user of the logging information; %DIRTY_MEMORY_MIGRATION or 735022c62cbSPaolo Bonzini * %DIRTY_MEMORY_VGA. 736022c62cbSPaolo Bonzini */ 737022c62cbSPaolo Bonzini void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr, 738022c62cbSPaolo Bonzini hwaddr size, unsigned client); 739022c62cbSPaolo Bonzini 740022c62cbSPaolo Bonzini /** 741022c62cbSPaolo Bonzini * memory_region_set_readonly: Turn a memory region read-only (or read-write) 742022c62cbSPaolo Bonzini * 743022c62cbSPaolo Bonzini * Allows a memory region to be marked as read-only (turning it into a ROM). 744022c62cbSPaolo Bonzini * only useful on RAM regions. 745022c62cbSPaolo Bonzini * 746022c62cbSPaolo Bonzini * @mr: the region being updated. 747022c62cbSPaolo Bonzini * @readonly: whether rhe region is to be ROM or RAM. 748022c62cbSPaolo Bonzini */ 749022c62cbSPaolo Bonzini void memory_region_set_readonly(MemoryRegion *mr, bool readonly); 750022c62cbSPaolo Bonzini 751022c62cbSPaolo Bonzini /** 7525f9a5ea1SJan Kiszka * memory_region_rom_device_set_romd: enable/disable ROMD mode 753022c62cbSPaolo Bonzini * 754022c62cbSPaolo Bonzini * Allows a ROM device (initialized with memory_region_init_rom_device() to 7555f9a5ea1SJan Kiszka * set to ROMD mode (default) or MMIO mode. When it is in ROMD mode, the 7565f9a5ea1SJan Kiszka * device is mapped to guest memory and satisfies read access directly. 7575f9a5ea1SJan Kiszka * When in MMIO mode, reads are forwarded to the #MemoryRegion.read function. 7585f9a5ea1SJan Kiszka * Writes are always handled by the #MemoryRegion.write function. 759022c62cbSPaolo Bonzini * 760022c62cbSPaolo Bonzini * @mr: the memory region to be updated 7615f9a5ea1SJan Kiszka * @romd_mode: %true to put the region into ROMD mode 762022c62cbSPaolo Bonzini */ 7635f9a5ea1SJan Kiszka void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode); 764022c62cbSPaolo Bonzini 765022c62cbSPaolo Bonzini /** 766022c62cbSPaolo Bonzini * memory_region_set_coalescing: Enable memory coalescing for the region. 767022c62cbSPaolo Bonzini * 768022c62cbSPaolo Bonzini * Enabled writes to a region to be queued for later processing. MMIO ->write 769022c62cbSPaolo Bonzini * callbacks may be delayed until a non-coalesced MMIO is issued. 770022c62cbSPaolo Bonzini * Only useful for IO regions. Roughly similar to write-combining hardware. 771022c62cbSPaolo Bonzini * 772022c62cbSPaolo Bonzini * @mr: the memory region to be write coalesced 773022c62cbSPaolo Bonzini */ 774022c62cbSPaolo Bonzini void memory_region_set_coalescing(MemoryRegion *mr); 775022c62cbSPaolo Bonzini 776022c62cbSPaolo Bonzini /** 777022c62cbSPaolo Bonzini * memory_region_add_coalescing: Enable memory coalescing for a sub-range of 778022c62cbSPaolo Bonzini * a region. 779022c62cbSPaolo Bonzini * 780022c62cbSPaolo Bonzini * Like memory_region_set_coalescing(), but works on a sub-range of a region. 781022c62cbSPaolo Bonzini * Multiple calls can be issued coalesced disjoint ranges. 782022c62cbSPaolo Bonzini * 783022c62cbSPaolo Bonzini * @mr: the memory region to be updated. 784022c62cbSPaolo Bonzini * @offset: the start of the range within the region to be coalesced. 785022c62cbSPaolo Bonzini * @size: the size of the subrange to be coalesced. 786022c62cbSPaolo Bonzini */ 787022c62cbSPaolo Bonzini void memory_region_add_coalescing(MemoryRegion *mr, 788022c62cbSPaolo Bonzini hwaddr offset, 789022c62cbSPaolo Bonzini uint64_t size); 790022c62cbSPaolo Bonzini 791022c62cbSPaolo Bonzini /** 792022c62cbSPaolo Bonzini * memory_region_clear_coalescing: Disable MMIO coalescing for the region. 793022c62cbSPaolo Bonzini * 794022c62cbSPaolo Bonzini * Disables any coalescing caused by memory_region_set_coalescing() or 795022c62cbSPaolo Bonzini * memory_region_add_coalescing(). Roughly equivalent to uncacheble memory 796022c62cbSPaolo Bonzini * hardware. 797022c62cbSPaolo Bonzini * 798022c62cbSPaolo Bonzini * @mr: the memory region to be updated. 799022c62cbSPaolo Bonzini */ 800022c62cbSPaolo Bonzini void memory_region_clear_coalescing(MemoryRegion *mr); 801022c62cbSPaolo Bonzini 802022c62cbSPaolo Bonzini /** 803022c62cbSPaolo Bonzini * memory_region_set_flush_coalesced: Enforce memory coalescing flush before 804022c62cbSPaolo Bonzini * accesses. 805022c62cbSPaolo Bonzini * 806022c62cbSPaolo Bonzini * Ensure that pending coalesced MMIO request are flushed before the memory 807022c62cbSPaolo Bonzini * region is accessed. This property is automatically enabled for all regions 808022c62cbSPaolo Bonzini * passed to memory_region_set_coalescing() and memory_region_add_coalescing(). 809022c62cbSPaolo Bonzini * 810022c62cbSPaolo Bonzini * @mr: the memory region to be updated. 811022c62cbSPaolo Bonzini */ 812022c62cbSPaolo Bonzini void memory_region_set_flush_coalesced(MemoryRegion *mr); 813022c62cbSPaolo Bonzini 814022c62cbSPaolo Bonzini /** 815022c62cbSPaolo Bonzini * memory_region_clear_flush_coalesced: Disable memory coalescing flush before 816022c62cbSPaolo Bonzini * accesses. 817022c62cbSPaolo Bonzini * 818022c62cbSPaolo Bonzini * Clear the automatic coalesced MMIO flushing enabled via 819022c62cbSPaolo Bonzini * memory_region_set_flush_coalesced. Note that this service has no effect on 820022c62cbSPaolo Bonzini * memory regions that have MMIO coalescing enabled for themselves. For them, 821022c62cbSPaolo Bonzini * automatic flushing will stop once coalescing is disabled. 822022c62cbSPaolo Bonzini * 823022c62cbSPaolo Bonzini * @mr: the memory region to be updated. 824022c62cbSPaolo Bonzini */ 825022c62cbSPaolo Bonzini void memory_region_clear_flush_coalesced(MemoryRegion *mr); 826022c62cbSPaolo Bonzini 827022c62cbSPaolo Bonzini /** 828022c62cbSPaolo Bonzini * memory_region_add_eventfd: Request an eventfd to be triggered when a word 829022c62cbSPaolo Bonzini * is written to a location. 830022c62cbSPaolo Bonzini * 831022c62cbSPaolo Bonzini * Marks a word in an IO region (initialized with memory_region_init_io()) 832022c62cbSPaolo Bonzini * as a trigger for an eventfd event. The I/O callback will not be called. 833022c62cbSPaolo Bonzini * The caller must be prepared to handle failure (that is, take the required 834022c62cbSPaolo Bonzini * action if the callback _is_ called). 835022c62cbSPaolo Bonzini * 836022c62cbSPaolo Bonzini * @mr: the memory region being updated. 837022c62cbSPaolo Bonzini * @addr: the address within @mr that is to be monitored 838022c62cbSPaolo Bonzini * @size: the size of the access to trigger the eventfd 839022c62cbSPaolo Bonzini * @match_data: whether to match against @data, instead of just @addr 840022c62cbSPaolo Bonzini * @data: the data to match against the guest write 841022c62cbSPaolo Bonzini * @fd: the eventfd to be triggered when @addr, @size, and @data all match. 842022c62cbSPaolo Bonzini **/ 843022c62cbSPaolo Bonzini void memory_region_add_eventfd(MemoryRegion *mr, 844022c62cbSPaolo Bonzini hwaddr addr, 845022c62cbSPaolo Bonzini unsigned size, 846022c62cbSPaolo Bonzini bool match_data, 847022c62cbSPaolo Bonzini uint64_t data, 848022c62cbSPaolo Bonzini EventNotifier *e); 849022c62cbSPaolo Bonzini 850022c62cbSPaolo Bonzini /** 851022c62cbSPaolo Bonzini * memory_region_del_eventfd: Cancel an eventfd. 852022c62cbSPaolo Bonzini * 853022c62cbSPaolo Bonzini * Cancels an eventfd trigger requested by a previous 854022c62cbSPaolo Bonzini * memory_region_add_eventfd() call. 855022c62cbSPaolo Bonzini * 856022c62cbSPaolo Bonzini * @mr: the memory region being updated. 857022c62cbSPaolo Bonzini * @addr: the address within @mr that is to be monitored 858022c62cbSPaolo Bonzini * @size: the size of the access to trigger the eventfd 859022c62cbSPaolo Bonzini * @match_data: whether to match against @data, instead of just @addr 860022c62cbSPaolo Bonzini * @data: the data to match against the guest write 861022c62cbSPaolo Bonzini * @fd: the eventfd to be triggered when @addr, @size, and @data all match. 862022c62cbSPaolo Bonzini */ 863022c62cbSPaolo Bonzini void memory_region_del_eventfd(MemoryRegion *mr, 864022c62cbSPaolo Bonzini hwaddr addr, 865022c62cbSPaolo Bonzini unsigned size, 866022c62cbSPaolo Bonzini bool match_data, 867022c62cbSPaolo Bonzini uint64_t data, 868022c62cbSPaolo Bonzini EventNotifier *e); 869022c62cbSPaolo Bonzini 870022c62cbSPaolo Bonzini /** 871022c62cbSPaolo Bonzini * memory_region_add_subregion: Add a subregion to a container. 872022c62cbSPaolo Bonzini * 873022c62cbSPaolo Bonzini * Adds a subregion at @offset. The subregion may not overlap with other 874022c62cbSPaolo Bonzini * subregions (except for those explicitly marked as overlapping). A region 875022c62cbSPaolo Bonzini * may only be added once as a subregion (unless removed with 876022c62cbSPaolo Bonzini * memory_region_del_subregion()); use memory_region_init_alias() if you 877022c62cbSPaolo Bonzini * want a region to be a subregion in multiple locations. 878022c62cbSPaolo Bonzini * 879022c62cbSPaolo Bonzini * @mr: the region to contain the new subregion; must be a container 880022c62cbSPaolo Bonzini * initialized with memory_region_init(). 881022c62cbSPaolo Bonzini * @offset: the offset relative to @mr where @subregion is added. 882022c62cbSPaolo Bonzini * @subregion: the subregion to be added. 883022c62cbSPaolo Bonzini */ 884022c62cbSPaolo Bonzini void memory_region_add_subregion(MemoryRegion *mr, 885022c62cbSPaolo Bonzini hwaddr offset, 886022c62cbSPaolo Bonzini MemoryRegion *subregion); 887022c62cbSPaolo Bonzini /** 888022c62cbSPaolo Bonzini * memory_region_add_subregion_overlap: Add a subregion to a container 889022c62cbSPaolo Bonzini * with overlap. 890022c62cbSPaolo Bonzini * 891022c62cbSPaolo Bonzini * Adds a subregion at @offset. The subregion may overlap with other 892022c62cbSPaolo Bonzini * subregions. Conflicts are resolved by having a higher @priority hide a 893022c62cbSPaolo Bonzini * lower @priority. Subregions without priority are taken as @priority 0. 894022c62cbSPaolo Bonzini * A region may only be added once as a subregion (unless removed with 895022c62cbSPaolo Bonzini * memory_region_del_subregion()); use memory_region_init_alias() if you 896022c62cbSPaolo Bonzini * want a region to be a subregion in multiple locations. 897022c62cbSPaolo Bonzini * 898022c62cbSPaolo Bonzini * @mr: the region to contain the new subregion; must be a container 899022c62cbSPaolo Bonzini * initialized with memory_region_init(). 900022c62cbSPaolo Bonzini * @offset: the offset relative to @mr where @subregion is added. 901022c62cbSPaolo Bonzini * @subregion: the subregion to be added. 902022c62cbSPaolo Bonzini * @priority: used for resolving overlaps; highest priority wins. 903022c62cbSPaolo Bonzini */ 904022c62cbSPaolo Bonzini void memory_region_add_subregion_overlap(MemoryRegion *mr, 905022c62cbSPaolo Bonzini hwaddr offset, 906022c62cbSPaolo Bonzini MemoryRegion *subregion, 907a1ff8ae0SMarcel Apfelbaum int priority); 908022c62cbSPaolo Bonzini 909022c62cbSPaolo Bonzini /** 910022c62cbSPaolo Bonzini * memory_region_get_ram_addr: Get the ram address associated with a memory 911022c62cbSPaolo Bonzini * region 912022c62cbSPaolo Bonzini * 913022c62cbSPaolo Bonzini * DO NOT USE THIS FUNCTION. This is a temporary workaround while the Xen 914022c62cbSPaolo Bonzini * code is being reworked. 915022c62cbSPaolo Bonzini */ 916022c62cbSPaolo Bonzini ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr); 917022c62cbSPaolo Bonzini 918a2b257d6SIgor Mammedov uint64_t memory_region_get_alignment(const MemoryRegion *mr); 919022c62cbSPaolo Bonzini /** 920022c62cbSPaolo Bonzini * memory_region_del_subregion: Remove a subregion. 921022c62cbSPaolo Bonzini * 922022c62cbSPaolo Bonzini * Removes a subregion from its container. 923022c62cbSPaolo Bonzini * 924022c62cbSPaolo Bonzini * @mr: the container to be updated. 925022c62cbSPaolo Bonzini * @subregion: the region being removed; must be a current subregion of @mr. 926022c62cbSPaolo Bonzini */ 927022c62cbSPaolo Bonzini void memory_region_del_subregion(MemoryRegion *mr, 928022c62cbSPaolo Bonzini MemoryRegion *subregion); 929022c62cbSPaolo Bonzini 930022c62cbSPaolo Bonzini /* 931022c62cbSPaolo Bonzini * memory_region_set_enabled: dynamically enable or disable a region 932022c62cbSPaolo Bonzini * 933022c62cbSPaolo Bonzini * Enables or disables a memory region. A disabled memory region 934022c62cbSPaolo Bonzini * ignores all accesses to itself and its subregions. It does not 935022c62cbSPaolo Bonzini * obscure sibling subregions with lower priority - it simply behaves as 936022c62cbSPaolo Bonzini * if it was removed from the hierarchy. 937022c62cbSPaolo Bonzini * 938022c62cbSPaolo Bonzini * Regions default to being enabled. 939022c62cbSPaolo Bonzini * 940022c62cbSPaolo Bonzini * @mr: the region to be updated 941022c62cbSPaolo Bonzini * @enabled: whether to enable or disable the region 942022c62cbSPaolo Bonzini */ 943022c62cbSPaolo Bonzini void memory_region_set_enabled(MemoryRegion *mr, bool enabled); 944022c62cbSPaolo Bonzini 945022c62cbSPaolo Bonzini /* 946022c62cbSPaolo Bonzini * memory_region_set_address: dynamically update the address of a region 947022c62cbSPaolo Bonzini * 948feca4ac1SPaolo Bonzini * Dynamically updates the address of a region, relative to its container. 949022c62cbSPaolo Bonzini * May be used on regions are currently part of a memory hierarchy. 950022c62cbSPaolo Bonzini * 951022c62cbSPaolo Bonzini * @mr: the region to be updated 952feca4ac1SPaolo Bonzini * @addr: new address, relative to container region 953022c62cbSPaolo Bonzini */ 954022c62cbSPaolo Bonzini void memory_region_set_address(MemoryRegion *mr, hwaddr addr); 955022c62cbSPaolo Bonzini 956022c62cbSPaolo Bonzini /* 957e7af4c67SMichael S. Tsirkin * memory_region_set_size: dynamically update the size of a region. 958e7af4c67SMichael S. Tsirkin * 959e7af4c67SMichael S. Tsirkin * Dynamically updates the size of a region. 960e7af4c67SMichael S. Tsirkin * 961e7af4c67SMichael S. Tsirkin * @mr: the region to be updated 962e7af4c67SMichael S. Tsirkin * @size: used size of the region. 963e7af4c67SMichael S. Tsirkin */ 964e7af4c67SMichael S. Tsirkin void memory_region_set_size(MemoryRegion *mr, uint64_t size); 965e7af4c67SMichael S. Tsirkin 966e7af4c67SMichael S. Tsirkin /* 967022c62cbSPaolo Bonzini * memory_region_set_alias_offset: dynamically update a memory alias's offset 968022c62cbSPaolo Bonzini * 969022c62cbSPaolo Bonzini * Dynamically updates the offset into the target region that an alias points 970022c62cbSPaolo Bonzini * to, as if the fourth argument to memory_region_init_alias() has changed. 971022c62cbSPaolo Bonzini * 972022c62cbSPaolo Bonzini * @mr: the #MemoryRegion to be updated; should be an alias. 973022c62cbSPaolo Bonzini * @offset: the new offset into the target memory region 974022c62cbSPaolo Bonzini */ 975022c62cbSPaolo Bonzini void memory_region_set_alias_offset(MemoryRegion *mr, 976022c62cbSPaolo Bonzini hwaddr offset); 977022c62cbSPaolo Bonzini 978022c62cbSPaolo Bonzini /** 979feca4ac1SPaolo Bonzini * memory_region_present: checks if an address relative to a @container 980feca4ac1SPaolo Bonzini * translates into #MemoryRegion within @container 9813ce10901SPaolo Bonzini * 982feca4ac1SPaolo Bonzini * Answer whether a #MemoryRegion within @container covers the address 9833ce10901SPaolo Bonzini * @addr. 9843ce10901SPaolo Bonzini * 985feca4ac1SPaolo Bonzini * @container: a #MemoryRegion within which @addr is a relative address 986feca4ac1SPaolo Bonzini * @addr: the area within @container to be searched 9873ce10901SPaolo Bonzini */ 988feca4ac1SPaolo Bonzini bool memory_region_present(MemoryRegion *container, hwaddr addr); 9893ce10901SPaolo Bonzini 9903ce10901SPaolo Bonzini /** 991eed2bacfSIgor Mammedov * memory_region_is_mapped: returns true if #MemoryRegion is mapped 992eed2bacfSIgor Mammedov * into any address space. 993eed2bacfSIgor Mammedov * 994eed2bacfSIgor Mammedov * @mr: a #MemoryRegion which should be checked if it's mapped 995eed2bacfSIgor Mammedov */ 996eed2bacfSIgor Mammedov bool memory_region_is_mapped(MemoryRegion *mr); 997eed2bacfSIgor Mammedov 998eed2bacfSIgor Mammedov /** 99973034e9eSPaolo Bonzini * memory_region_find: translate an address/size relative to a 100073034e9eSPaolo Bonzini * MemoryRegion into a #MemoryRegionSection. 1001022c62cbSPaolo Bonzini * 100273034e9eSPaolo Bonzini * Locates the first #MemoryRegion within @mr that overlaps the range 100373034e9eSPaolo Bonzini * given by @addr and @size. 1004022c62cbSPaolo Bonzini * 1005022c62cbSPaolo Bonzini * Returns a #MemoryRegionSection that describes a contiguous overlap. 1006022c62cbSPaolo Bonzini * It will have the following characteristics: 1007022c62cbSPaolo Bonzini * .@size = 0 iff no overlap was found 1008022c62cbSPaolo Bonzini * .@mr is non-%NULL iff an overlap was found 1009022c62cbSPaolo Bonzini * 101073034e9eSPaolo Bonzini * Remember that in the return value the @offset_within_region is 101173034e9eSPaolo Bonzini * relative to the returned region (in the .@mr field), not to the 101273034e9eSPaolo Bonzini * @mr argument. 101373034e9eSPaolo Bonzini * 101473034e9eSPaolo Bonzini * Similarly, the .@offset_within_address_space is relative to the 101573034e9eSPaolo Bonzini * address space that contains both regions, the passed and the 101673034e9eSPaolo Bonzini * returned one. However, in the special case where the @mr argument 1017feca4ac1SPaolo Bonzini * has no container (and thus is the root of the address space), the 101873034e9eSPaolo Bonzini * following will hold: 101973034e9eSPaolo Bonzini * .@offset_within_address_space >= @addr 102073034e9eSPaolo Bonzini * .@offset_within_address_space + .@size <= @addr + @size 102173034e9eSPaolo Bonzini * 102273034e9eSPaolo Bonzini * @mr: a MemoryRegion within which @addr is a relative address 102373034e9eSPaolo Bonzini * @addr: start of the area within @as to be searched 1024022c62cbSPaolo Bonzini * @size: size of the area to be searched 1025022c62cbSPaolo Bonzini */ 102673034e9eSPaolo Bonzini MemoryRegionSection memory_region_find(MemoryRegion *mr, 1027022c62cbSPaolo Bonzini hwaddr addr, uint64_t size); 1028022c62cbSPaolo Bonzini 1029022c62cbSPaolo Bonzini /** 10301d671369SPaolo Bonzini * address_space_sync_dirty_bitmap: synchronize the dirty log for all memory 1031022c62cbSPaolo Bonzini * 1032022c62cbSPaolo Bonzini * Synchronizes the dirty page log for an entire address space. 10331d671369SPaolo Bonzini * @as: the address space that contains the memory being synchronized 1034022c62cbSPaolo Bonzini */ 10351d671369SPaolo Bonzini void address_space_sync_dirty_bitmap(AddressSpace *as); 1036022c62cbSPaolo Bonzini 1037022c62cbSPaolo Bonzini /** 1038022c62cbSPaolo Bonzini * memory_region_transaction_begin: Start a transaction. 1039022c62cbSPaolo Bonzini * 1040022c62cbSPaolo Bonzini * During a transaction, changes will be accumulated and made visible 1041022c62cbSPaolo Bonzini * only when the transaction ends (is committed). 1042022c62cbSPaolo Bonzini */ 1043022c62cbSPaolo Bonzini void memory_region_transaction_begin(void); 1044022c62cbSPaolo Bonzini 1045022c62cbSPaolo Bonzini /** 1046022c62cbSPaolo Bonzini * memory_region_transaction_commit: Commit a transaction and make changes 1047022c62cbSPaolo Bonzini * visible to the guest. 1048022c62cbSPaolo Bonzini */ 1049022c62cbSPaolo Bonzini void memory_region_transaction_commit(void); 1050022c62cbSPaolo Bonzini 1051022c62cbSPaolo Bonzini /** 1052022c62cbSPaolo Bonzini * memory_listener_register: register callbacks to be called when memory 1053022c62cbSPaolo Bonzini * sections are mapped or unmapped into an address 1054022c62cbSPaolo Bonzini * space 1055022c62cbSPaolo Bonzini * 1056022c62cbSPaolo Bonzini * @listener: an object containing the callbacks to be called 1057022c62cbSPaolo Bonzini * @filter: if non-%NULL, only regions in this address space will be observed 1058022c62cbSPaolo Bonzini */ 1059022c62cbSPaolo Bonzini void memory_listener_register(MemoryListener *listener, AddressSpace *filter); 1060022c62cbSPaolo Bonzini 1061022c62cbSPaolo Bonzini /** 1062022c62cbSPaolo Bonzini * memory_listener_unregister: undo the effect of memory_listener_register() 1063022c62cbSPaolo Bonzini * 1064022c62cbSPaolo Bonzini * @listener: an object containing the callbacks to be removed 1065022c62cbSPaolo Bonzini */ 1066022c62cbSPaolo Bonzini void memory_listener_unregister(MemoryListener *listener); 1067022c62cbSPaolo Bonzini 1068022c62cbSPaolo Bonzini /** 1069022c62cbSPaolo Bonzini * memory_global_dirty_log_start: begin dirty logging for all regions 1070022c62cbSPaolo Bonzini */ 1071022c62cbSPaolo Bonzini void memory_global_dirty_log_start(void); 1072022c62cbSPaolo Bonzini 1073022c62cbSPaolo Bonzini /** 1074022c62cbSPaolo Bonzini * memory_global_dirty_log_stop: end dirty logging for all regions 1075022c62cbSPaolo Bonzini */ 1076022c62cbSPaolo Bonzini void memory_global_dirty_log_stop(void); 1077022c62cbSPaolo Bonzini 1078022c62cbSPaolo Bonzini void mtree_info(fprintf_function mon_printf, void *f); 1079022c62cbSPaolo Bonzini 1080022c62cbSPaolo Bonzini /** 10813b643495SPeter Maydell * memory_region_dispatch_read: perform a read directly to the specified 10823b643495SPeter Maydell * MemoryRegion. 10833b643495SPeter Maydell * 10843b643495SPeter Maydell * @mr: #MemoryRegion to access 10853b643495SPeter Maydell * @addr: address within that region 10863b643495SPeter Maydell * @pval: pointer to uint64_t which the data is written to 10873b643495SPeter Maydell * @size: size of the access in bytes 10883b643495SPeter Maydell * @attrs: memory transaction attributes to use for the access 10893b643495SPeter Maydell */ 10903b643495SPeter Maydell MemTxResult memory_region_dispatch_read(MemoryRegion *mr, 10913b643495SPeter Maydell hwaddr addr, 10923b643495SPeter Maydell uint64_t *pval, 10933b643495SPeter Maydell unsigned size, 10943b643495SPeter Maydell MemTxAttrs attrs); 10953b643495SPeter Maydell /** 10963b643495SPeter Maydell * memory_region_dispatch_write: perform a write directly to the specified 10973b643495SPeter Maydell * MemoryRegion. 10983b643495SPeter Maydell * 10993b643495SPeter Maydell * @mr: #MemoryRegion to access 11003b643495SPeter Maydell * @addr: address within that region 11013b643495SPeter Maydell * @data: data to write 11023b643495SPeter Maydell * @size: size of the access in bytes 11033b643495SPeter Maydell * @attrs: memory transaction attributes to use for the access 11043b643495SPeter Maydell */ 11053b643495SPeter Maydell MemTxResult memory_region_dispatch_write(MemoryRegion *mr, 11063b643495SPeter Maydell hwaddr addr, 11073b643495SPeter Maydell uint64_t data, 11083b643495SPeter Maydell unsigned size, 11093b643495SPeter Maydell MemTxAttrs attrs); 11103b643495SPeter Maydell 11113b643495SPeter Maydell /** 1112022c62cbSPaolo Bonzini * address_space_init: initializes an address space 1113022c62cbSPaolo Bonzini * 1114022c62cbSPaolo Bonzini * @as: an uninitialized #AddressSpace 1115022c62cbSPaolo Bonzini * @root: a #MemoryRegion that routes addesses for the address space 11167dca8043SAlexey Kardashevskiy * @name: an address space name. The name is only used for debugging 11177dca8043SAlexey Kardashevskiy * output. 1118022c62cbSPaolo Bonzini */ 11197dca8043SAlexey Kardashevskiy void address_space_init(AddressSpace *as, MemoryRegion *root, const char *name); 1120022c62cbSPaolo Bonzini 1121022c62cbSPaolo Bonzini 1122022c62cbSPaolo Bonzini /** 1123022c62cbSPaolo Bonzini * address_space_destroy: destroy an address space 1124022c62cbSPaolo Bonzini * 1125022c62cbSPaolo Bonzini * Releases all resources associated with an address space. After an address space 1126022c62cbSPaolo Bonzini * is destroyed, its root memory region (given by address_space_init()) may be destroyed 1127022c62cbSPaolo Bonzini * as well. 1128022c62cbSPaolo Bonzini * 1129022c62cbSPaolo Bonzini * @as: address space to be destroyed 1130022c62cbSPaolo Bonzini */ 1131022c62cbSPaolo Bonzini void address_space_destroy(AddressSpace *as); 1132022c62cbSPaolo Bonzini 1133022c62cbSPaolo Bonzini /** 1134022c62cbSPaolo Bonzini * address_space_rw: read from or write to an address space. 1135022c62cbSPaolo Bonzini * 11365c9eb028SPeter Maydell * Return a MemTxResult indicating whether the operation succeeded 11375c9eb028SPeter Maydell * or failed (eg unassigned memory, device rejected the transaction, 11385c9eb028SPeter Maydell * IOMMU fault). 1139fd8aaa76SPaolo Bonzini * 1140022c62cbSPaolo Bonzini * @as: #AddressSpace to be accessed 1141022c62cbSPaolo Bonzini * @addr: address within that address space 11425c9eb028SPeter Maydell * @attrs: memory transaction attributes 1143022c62cbSPaolo Bonzini * @buf: buffer with the data transferred 1144022c62cbSPaolo Bonzini * @is_write: indicates the transfer direction 1145022c62cbSPaolo Bonzini */ 11465c9eb028SPeter Maydell MemTxResult address_space_rw(AddressSpace *as, hwaddr addr, 11475c9eb028SPeter Maydell MemTxAttrs attrs, uint8_t *buf, 1148022c62cbSPaolo Bonzini int len, bool is_write); 1149022c62cbSPaolo Bonzini 1150022c62cbSPaolo Bonzini /** 1151022c62cbSPaolo Bonzini * address_space_write: write to address space. 1152022c62cbSPaolo Bonzini * 11535c9eb028SPeter Maydell * Return a MemTxResult indicating whether the operation succeeded 11545c9eb028SPeter Maydell * or failed (eg unassigned memory, device rejected the transaction, 11555c9eb028SPeter Maydell * IOMMU fault). 1156022c62cbSPaolo Bonzini * 1157022c62cbSPaolo Bonzini * @as: #AddressSpace to be accessed 1158022c62cbSPaolo Bonzini * @addr: address within that address space 11595c9eb028SPeter Maydell * @attrs: memory transaction attributes 1160022c62cbSPaolo Bonzini * @buf: buffer with the data transferred 1161022c62cbSPaolo Bonzini */ 11625c9eb028SPeter Maydell MemTxResult address_space_write(AddressSpace *as, hwaddr addr, 11635c9eb028SPeter Maydell MemTxAttrs attrs, 1164fd8aaa76SPaolo Bonzini const uint8_t *buf, int len); 1165fd8aaa76SPaolo Bonzini 1166fd8aaa76SPaolo Bonzini /** 1167fd8aaa76SPaolo Bonzini * address_space_read: read from an address space. 1168fd8aaa76SPaolo Bonzini * 11695c9eb028SPeter Maydell * Return a MemTxResult indicating whether the operation succeeded 11705c9eb028SPeter Maydell * or failed (eg unassigned memory, device rejected the transaction, 11715c9eb028SPeter Maydell * IOMMU fault). 1172fd8aaa76SPaolo Bonzini * 1173fd8aaa76SPaolo Bonzini * @as: #AddressSpace to be accessed 1174fd8aaa76SPaolo Bonzini * @addr: address within that address space 11755c9eb028SPeter Maydell * @attrs: memory transaction attributes 1176fd8aaa76SPaolo Bonzini * @buf: buffer with the data transferred 1177fd8aaa76SPaolo Bonzini */ 11785c9eb028SPeter Maydell MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs, 11795c9eb028SPeter Maydell uint8_t *buf, int len); 1180022c62cbSPaolo Bonzini 118150013115SPeter Maydell /** 118250013115SPeter Maydell * address_space_ld*: load from an address space 118350013115SPeter Maydell * address_space_st*: store to an address space 118450013115SPeter Maydell * 118550013115SPeter Maydell * These functions perform a load or store of the byte, word, 118650013115SPeter Maydell * longword or quad to the specified address within the AddressSpace. 118750013115SPeter Maydell * The _le suffixed functions treat the data as little endian; 118850013115SPeter Maydell * _be indicates big endian; no suffix indicates "same endianness 118950013115SPeter Maydell * as guest CPU". 119050013115SPeter Maydell * 119150013115SPeter Maydell * The "guest CPU endianness" accessors are deprecated for use outside 119250013115SPeter Maydell * target-* code; devices should be CPU-agnostic and use either the LE 119350013115SPeter Maydell * or the BE accessors. 119450013115SPeter Maydell * 119550013115SPeter Maydell * @as #AddressSpace to be accessed 119650013115SPeter Maydell * @addr: address within that address space 119750013115SPeter Maydell * @val: data value, for stores 119850013115SPeter Maydell * @attrs: memory transaction attributes 119950013115SPeter Maydell * @result: location to write the success/failure of the transaction; 120050013115SPeter Maydell * if NULL, this information is discarded 120150013115SPeter Maydell */ 120250013115SPeter Maydell uint32_t address_space_ldub(AddressSpace *as, hwaddr addr, 120350013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 120450013115SPeter Maydell uint32_t address_space_lduw_le(AddressSpace *as, hwaddr addr, 120550013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 120650013115SPeter Maydell uint32_t address_space_lduw_be(AddressSpace *as, hwaddr addr, 120750013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 120850013115SPeter Maydell uint32_t address_space_ldl_le(AddressSpace *as, hwaddr addr, 120950013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 121050013115SPeter Maydell uint32_t address_space_ldl_be(AddressSpace *as, hwaddr addr, 121150013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 121250013115SPeter Maydell uint64_t address_space_ldq_le(AddressSpace *as, hwaddr addr, 121350013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 121450013115SPeter Maydell uint64_t address_space_ldq_be(AddressSpace *as, hwaddr addr, 121550013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 121650013115SPeter Maydell void address_space_stb(AddressSpace *as, hwaddr addr, uint32_t val, 121750013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 121850013115SPeter Maydell void address_space_stw_le(AddressSpace *as, hwaddr addr, uint32_t val, 121950013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 122050013115SPeter Maydell void address_space_stw_be(AddressSpace *as, hwaddr addr, uint32_t val, 122150013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 122250013115SPeter Maydell void address_space_stl_le(AddressSpace *as, hwaddr addr, uint32_t val, 122350013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 122450013115SPeter Maydell void address_space_stl_be(AddressSpace *as, hwaddr addr, uint32_t val, 122550013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 122650013115SPeter Maydell void address_space_stq_le(AddressSpace *as, hwaddr addr, uint64_t val, 122750013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 122850013115SPeter Maydell void address_space_stq_be(AddressSpace *as, hwaddr addr, uint64_t val, 122950013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 123050013115SPeter Maydell 123150013115SPeter Maydell #ifdef NEED_CPU_H 123250013115SPeter Maydell uint32_t address_space_lduw(AddressSpace *as, hwaddr addr, 123350013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 123450013115SPeter Maydell uint32_t address_space_ldl(AddressSpace *as, hwaddr addr, 123550013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 123650013115SPeter Maydell uint64_t address_space_ldq(AddressSpace *as, hwaddr addr, 123750013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 123850013115SPeter Maydell void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val, 123950013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 124050013115SPeter Maydell void address_space_stw(AddressSpace *as, hwaddr addr, uint32_t val, 124150013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 124250013115SPeter Maydell void address_space_stl(AddressSpace *as, hwaddr addr, uint32_t val, 124350013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 124450013115SPeter Maydell void address_space_stq(AddressSpace *as, hwaddr addr, uint64_t val, 124550013115SPeter Maydell MemTxAttrs attrs, MemTxResult *result); 124650013115SPeter Maydell #endif 124750013115SPeter Maydell 1248149f54b5SPaolo Bonzini /* address_space_translate: translate an address range into an address space 124941063e1eSPaolo Bonzini * into a MemoryRegion and an address range into that section. Should be 125041063e1eSPaolo Bonzini * called from an RCU critical section, to avoid that the last reference 125141063e1eSPaolo Bonzini * to the returned region disappears after address_space_translate returns. 1252149f54b5SPaolo Bonzini * 1253149f54b5SPaolo Bonzini * @as: #AddressSpace to be accessed 1254149f54b5SPaolo Bonzini * @addr: address within that address space 1255149f54b5SPaolo Bonzini * @xlat: pointer to address within the returned memory region section's 1256149f54b5SPaolo Bonzini * #MemoryRegion. 1257149f54b5SPaolo Bonzini * @len: pointer to length 1258149f54b5SPaolo Bonzini * @is_write: indicates the transfer direction 1259149f54b5SPaolo Bonzini */ 12605c8a00ceSPaolo Bonzini MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr, 1261149f54b5SPaolo Bonzini hwaddr *xlat, hwaddr *len, 1262149f54b5SPaolo Bonzini bool is_write); 1263149f54b5SPaolo Bonzini 126451644ab7SPaolo Bonzini /* address_space_access_valid: check for validity of accessing an address 126551644ab7SPaolo Bonzini * space range 126651644ab7SPaolo Bonzini * 126730951157SAvi Kivity * Check whether memory is assigned to the given address space range, and 126830951157SAvi Kivity * access is permitted by any IOMMU regions that are active for the address 126930951157SAvi Kivity * space. 127051644ab7SPaolo Bonzini * 127151644ab7SPaolo Bonzini * For now, addr and len should be aligned to a page size. This limitation 127251644ab7SPaolo Bonzini * will be lifted in the future. 127351644ab7SPaolo Bonzini * 127451644ab7SPaolo Bonzini * @as: #AddressSpace to be accessed 127551644ab7SPaolo Bonzini * @addr: address within that address space 127651644ab7SPaolo Bonzini * @len: length of the area to be checked 127751644ab7SPaolo Bonzini * @is_write: indicates the transfer direction 127851644ab7SPaolo Bonzini */ 127951644ab7SPaolo Bonzini bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write); 128051644ab7SPaolo Bonzini 1281022c62cbSPaolo Bonzini /* address_space_map: map a physical memory region into a host virtual address 1282022c62cbSPaolo Bonzini * 1283022c62cbSPaolo Bonzini * May map a subset of the requested range, given by and returned in @plen. 1284022c62cbSPaolo Bonzini * May return %NULL if resources needed to perform the mapping are exhausted. 1285022c62cbSPaolo Bonzini * Use only for reads OR writes - not for read-modify-write operations. 1286022c62cbSPaolo Bonzini * Use cpu_register_map_client() to know when retrying the map operation is 1287022c62cbSPaolo Bonzini * likely to succeed. 1288022c62cbSPaolo Bonzini * 1289022c62cbSPaolo Bonzini * @as: #AddressSpace to be accessed 1290022c62cbSPaolo Bonzini * @addr: address within that address space 1291022c62cbSPaolo Bonzini * @plen: pointer to length of buffer; updated on return 1292022c62cbSPaolo Bonzini * @is_write: indicates the transfer direction 1293022c62cbSPaolo Bonzini */ 1294022c62cbSPaolo Bonzini void *address_space_map(AddressSpace *as, hwaddr addr, 1295022c62cbSPaolo Bonzini hwaddr *plen, bool is_write); 1296022c62cbSPaolo Bonzini 1297022c62cbSPaolo Bonzini /* address_space_unmap: Unmaps a memory region previously mapped by address_space_map() 1298022c62cbSPaolo Bonzini * 1299022c62cbSPaolo Bonzini * Will also mark the memory as dirty if @is_write == %true. @access_len gives 1300022c62cbSPaolo Bonzini * the amount of memory that was actually read or written by the caller. 1301022c62cbSPaolo Bonzini * 1302022c62cbSPaolo Bonzini * @as: #AddressSpace used 1303022c62cbSPaolo Bonzini * @addr: address within that address space 1304022c62cbSPaolo Bonzini * @len: buffer length as returned by address_space_map() 1305022c62cbSPaolo Bonzini * @access_len: amount of data actually transferred 1306022c62cbSPaolo Bonzini * @is_write: indicates the transfer direction 1307022c62cbSPaolo Bonzini */ 1308022c62cbSPaolo Bonzini void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len, 1309022c62cbSPaolo Bonzini int is_write, hwaddr access_len); 1310022c62cbSPaolo Bonzini 1311022c62cbSPaolo Bonzini 1312022c62cbSPaolo Bonzini #endif 1313022c62cbSPaolo Bonzini 1314022c62cbSPaolo Bonzini #endif 1315