mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'v7.2.0' into sync/qemu-7.2.0
v7.2.0 release
This commit is contained in:
+94
-10
@@ -61,7 +61,20 @@ static inline void fuzz_dma_read_cb(size_t addr,
|
||||
}
|
||||
#endif
|
||||
|
||||
extern bool global_dirty_log;
|
||||
/* Possible bits for global_dirty_log_{start|stop} */
|
||||
|
||||
/* Dirty tracking enabled because migration is running */
|
||||
#define GLOBAL_DIRTY_MIGRATION (1U << 0)
|
||||
|
||||
/* Dirty tracking enabled because measuring dirty rate */
|
||||
#define GLOBAL_DIRTY_DIRTY_RATE (1U << 1)
|
||||
|
||||
/* Dirty tracking enabled because dirty limit */
|
||||
#define GLOBAL_DIRTY_LIMIT (1U << 2)
|
||||
|
||||
#define GLOBAL_DIRTY_MASK (0x7)
|
||||
|
||||
extern unsigned int global_dirty_tracking;
|
||||
|
||||
typedef struct MemoryRegionOps MemoryRegionOps;
|
||||
|
||||
@@ -190,6 +203,9 @@ typedef struct IOMMUTLBEvent {
|
||||
*/
|
||||
#define RAM_NORESERVE (1 << 7)
|
||||
|
||||
/* RAM that isn't accessible through normal means. */
|
||||
#define RAM_PROTECTED (1 << 8)
|
||||
|
||||
static inline void iommu_notifier_init(IOMMUNotifier *n, IOMMUNotify fn,
|
||||
IOMMUNotifierFlag flags,
|
||||
hwaddr start, hwaddr end,
|
||||
@@ -537,6 +553,7 @@ static inline void ram_discard_listener_init(RamDiscardListener *rdl,
|
||||
}
|
||||
|
||||
typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
||||
typedef void (*ReplayRamDiscard)(MemoryRegionSection *section, void *opaque);
|
||||
|
||||
/*
|
||||
* RamDiscardManagerClass:
|
||||
@@ -544,7 +561,7 @@ typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
||||
* A #RamDiscardManager coordinates which parts of specific RAM #MemoryRegion
|
||||
* regions are currently populated to be used/accessed by the VM, notifying
|
||||
* after parts were discarded (freeing up memory) and before parts will be
|
||||
* populated (consuming memory), to be used/acessed by the VM.
|
||||
* populated (consuming memory), to be used/accessed by the VM.
|
||||
*
|
||||
* A #RamDiscardManager can only be set for a RAM #MemoryRegion while the
|
||||
* #MemoryRegion isn't mapped yet; it cannot change while the #MemoryRegion is
|
||||
@@ -568,7 +585,7 @@ typedef int (*ReplayRamPopulate)(MemoryRegionSection *section, void *opaque);
|
||||
* Listeners are called in multiples of the minimum granularity (unless it
|
||||
* would exceed the registered range) and changes are aligned to the minimum
|
||||
* granularity within the #MemoryRegion. Listeners have to prepare for memory
|
||||
* becomming discarded in a different granularity than it was populated and the
|
||||
* becoming discarded in a different granularity than it was populated and the
|
||||
* other way around.
|
||||
*/
|
||||
struct RamDiscardManagerClass {
|
||||
@@ -625,6 +642,21 @@ struct RamDiscardManagerClass {
|
||||
MemoryRegionSection *section,
|
||||
ReplayRamPopulate replay_fn, void *opaque);
|
||||
|
||||
/**
|
||||
* @replay_discarded:
|
||||
*
|
||||
* Call the #ReplayRamDiscard callback for all discarded parts within the
|
||||
* #MemoryRegionSection via the #RamDiscardManager.
|
||||
*
|
||||
* @rdm: the #RamDiscardManager
|
||||
* @section: the #MemoryRegionSection
|
||||
* @replay_fn: the #ReplayRamDiscard callback
|
||||
* @opaque: pointer to forward to the callback
|
||||
*/
|
||||
void (*replay_discarded)(const RamDiscardManager *rdm,
|
||||
MemoryRegionSection *section,
|
||||
ReplayRamDiscard replay_fn, void *opaque);
|
||||
|
||||
/**
|
||||
* @register_listener:
|
||||
*
|
||||
@@ -669,6 +701,11 @@ int ram_discard_manager_replay_populated(const RamDiscardManager *rdm,
|
||||
ReplayRamPopulate replay_fn,
|
||||
void *opaque);
|
||||
|
||||
void ram_discard_manager_replay_discarded(const RamDiscardManager *rdm,
|
||||
MemoryRegionSection *section,
|
||||
ReplayRamDiscard replay_fn,
|
||||
void *opaque);
|
||||
|
||||
void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
||||
RamDiscardListener *rdl,
|
||||
MemoryRegionSection *section);
|
||||
@@ -676,6 +713,10 @@ void ram_discard_manager_register_listener(RamDiscardManager *rdm,
|
||||
void ram_discard_manager_unregister_listener(RamDiscardManager *rdm,
|
||||
RamDiscardListener *rdl);
|
||||
|
||||
bool memory_get_xlat_addr(IOMMUTLBEntry *iotlb, void **vaddr,
|
||||
ram_addr_t *ram_addr, bool *read_only,
|
||||
bool *mr_has_discard_manager);
|
||||
|
||||
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
|
||||
typedef struct MemoryRegionIoeventfd MemoryRegionIoeventfd;
|
||||
|
||||
@@ -704,6 +745,7 @@ struct MemoryRegion {
|
||||
const MemoryRegionOps *ops;
|
||||
void *opaque;
|
||||
MemoryRegion *container;
|
||||
int mapped_via_alias; /* Mapped via an alias, container might be NULL */
|
||||
Int128 size;
|
||||
hwaddr addr;
|
||||
void (*destructor)(MemoryRegion *mr);
|
||||
@@ -979,6 +1021,14 @@ struct MemoryListener {
|
||||
*/
|
||||
unsigned priority;
|
||||
|
||||
/**
|
||||
* @name:
|
||||
*
|
||||
* Name of the listener. It can be used in contexts where we'd like to
|
||||
* identify one memory listener with the rest.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/* private: */
|
||||
AddressSpace *address_space;
|
||||
QTAILQ_ENTRY(MemoryListener) link;
|
||||
@@ -1203,7 +1253,7 @@ void memory_region_init_ram_flags_nomigrate(MemoryRegion *mr,
|
||||
Error **errp);
|
||||
|
||||
/**
|
||||
* memory_region_init_resizeable_ram: Initialize memory region with resizeable
|
||||
* memory_region_init_resizeable_ram: Initialize memory region with resizable
|
||||
* RAM. Accesses into the region will
|
||||
* modify memory directly. Only an initial
|
||||
* portion of this RAM is actually used.
|
||||
@@ -1273,7 +1323,7 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
|
||||
* @name: the name of the region.
|
||||
* @size: size of the region.
|
||||
* @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM,
|
||||
* RAM_NORESERVE.
|
||||
* RAM_NORESERVE, RAM_PROTECTED.
|
||||
* @fd: the fd to mmap.
|
||||
* @offset: offset within the file referenced by fd
|
||||
* @errp: pointer to Error*, to store an error if it happens.
|
||||
@@ -1574,6 +1624,16 @@ static inline bool memory_region_is_romd(MemoryRegion *mr)
|
||||
return mr->rom_device && mr->romd_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* memory_region_is_protected: check whether a memory region is protected
|
||||
*
|
||||
* Returns %true if a memory region is protected RAM and cannot be accessed
|
||||
* via standard mechanisms, e.g. DMA.
|
||||
*
|
||||
* @mr: the memory region being queried
|
||||
*/
|
||||
bool memory_region_is_protected(MemoryRegion *mr);
|
||||
|
||||
/**
|
||||
* memory_region_get_iommu: check whether a memory region is an iommu
|
||||
*
|
||||
@@ -1939,7 +1999,7 @@ void memory_region_clear_dirty_bitmap(MemoryRegion *mr, hwaddr start,
|
||||
* querying the same page multiple times, which is especially useful for
|
||||
* display updates where the scanlines often are not page aligned.
|
||||
*
|
||||
* The dirty bitmap region which gets copyed into the snapshot (and
|
||||
* The dirty bitmap region which gets copied into the snapshot (and
|
||||
* cleared afterwards) can be larger than requested. The boundaries
|
||||
* are rounded up/down so complete bitmap longs (covering 64 pages on
|
||||
* 64bit hosts) can be copied over into the bitmap snapshot. Which
|
||||
@@ -2269,7 +2329,8 @@ bool memory_region_present(MemoryRegion *container, hwaddr addr);
|
||||
|
||||
/**
|
||||
* memory_region_is_mapped: returns true if #MemoryRegion is mapped
|
||||
* into any address space.
|
||||
* into another memory region, which does not necessarily imply that it is
|
||||
* mapped into an address space.
|
||||
*
|
||||
* @mr: a #MemoryRegion which should be checked if it's mapped
|
||||
*/
|
||||
@@ -2392,13 +2453,17 @@ void memory_listener_unregister(MemoryListener *listener);
|
||||
|
||||
/**
|
||||
* memory_global_dirty_log_start: begin dirty logging for all regions
|
||||
*
|
||||
* @flags: purpose of starting dirty log, migration or dirty rate
|
||||
*/
|
||||
void memory_global_dirty_log_start(void);
|
||||
void memory_global_dirty_log_start(unsigned int flags);
|
||||
|
||||
/**
|
||||
* memory_global_dirty_log_stop: end dirty logging for all regions
|
||||
*
|
||||
* @flags: purpose of stopping dirty log, migration or dirty rate
|
||||
*/
|
||||
void memory_global_dirty_log_stop(void);
|
||||
void memory_global_dirty_log_stop(unsigned int flags);
|
||||
|
||||
void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled);
|
||||
|
||||
@@ -2777,6 +2842,9 @@ MemTxResult address_space_write_cached_slow(MemoryRegionCache *cache,
|
||||
hwaddr addr, const void *buf,
|
||||
hwaddr len);
|
||||
|
||||
int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr);
|
||||
bool prepare_mmio_access(MemoryRegion *mr);
|
||||
|
||||
static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
|
||||
{
|
||||
if (is_write) {
|
||||
@@ -2875,6 +2943,22 @@ address_space_write_cached(MemoryRegionCache *cache, hwaddr addr,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* address_space_set: Fill address space with a constant byte.
|
||||
*
|
||||
* Return a MemTxResult indicating whether the operation succeeded
|
||||
* or failed (eg unassigned memory, device rejected the transaction,
|
||||
* IOMMU fault).
|
||||
*
|
||||
* @as: #AddressSpace to be accessed
|
||||
* @addr: address within that address space
|
||||
* @c: constant byte to fill the memory
|
||||
* @len: the number of bytes to fill with the constant byte
|
||||
* @attrs: memory transaction attributes
|
||||
*/
|
||||
MemTxResult address_space_set(AddressSpace *as, hwaddr addr,
|
||||
uint8_t c, hwaddr len, MemTxAttrs attrs);
|
||||
|
||||
#ifdef NEED_CPU_H
|
||||
/* enum device_endian to MemOp. */
|
||||
static inline MemOp devend_memop(enum device_endian end)
|
||||
@@ -2882,7 +2966,7 @@ static inline MemOp devend_memop(enum device_endian end)
|
||||
QEMU_BUILD_BUG_ON(DEVICE_HOST_ENDIAN != DEVICE_LITTLE_ENDIAN &&
|
||||
DEVICE_HOST_ENDIAN != DEVICE_BIG_ENDIAN);
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
|
||||
#if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
|
||||
/* Swap if non-host endianness or native (target) endianness */
|
||||
return (end == DEVICE_HOST_ENDIAN) ? 0 : MO_BSWAP;
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user