History | View | Annotate | Download (55.8 kB)
memory: split accesses even when the old MMIO callbacks are used
This is useful for 64-bit memory accesses.
Reviewed-by: Richard Henderson <rth@twiddle.net>Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: add big endian support to access_with_adjusted_size
This will be used to split 8-byte access down to two four-byte accesses.
memory: accept mismatching sizes in memory_region_access_valid
The memory API is able to use smaller/wider accesses than requested,match that in memory_region_access_valid. Of course, the acceptscallback is still free to reject those accesses.
Reviewed-by: Richard Henderson <rth@twiddle.net>...
memory: export memory_region_access_valid to exec.c
We'll use it to implement address_space_access_valid.
memory: assign MemoryRegionOps to all regions
This allows to remove the checks on section->readonly. Simply,write accesses to ROM will not be considered "direct" and willgo through mr->ops without any special intervention.
memory: move unassigned_mem_ops to memory.c
reservation_ops is already doing the same thing.
memory: dispatch unassigned accesses based on .valid.accepts
This provides the basics for detecting accesses to unassigned memoryas soon as they happen, and also for a simple implementation ofaddress_space_access_valid.
memory: populate FlatView for new address spaces
Even a new address space might have a non-empty FlatView. In orderto initialize it properly, address_space_init should (a) callmemory_region_transaction_commit after the address space is insertedinto the list; (b) force memory_region_transaction_commit to do something....
memory: fix address space initialization/destruction
A couple of fields were left uninitialized. This was not observed earlierbecause all address spaces were statically allocated. Also free allocationfor those fields.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>...
memory: make memory_global_sync_dirty_bitmap take an AddressSpace
Since this is a MemoryListener operation, it only makes senseon an AddressSpace granularity.
Suggested-by: Peter Maydell <peter.maydell@linaro.org>Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: do not duplicate memory_region_destructor_none
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: Rename readable flag to romd_mode
"Readable" is a very unfortunate name for this flag because even arom_device region will always be readable from the guest POV. Whatdiffers is the mapping, just like the comments had to explain already.Also, readable could currently be understood as being a generic region...
memory: allow memory_region_find() to run on non-root memory regions
memory_region_find() is similar to registering a MemoryListener andchecking for the MemoryRegionSections that come from a particularregion. There is no reason for this to be limited to a root memory...
memory: fix a bug of detection of memory region collision
The collision reports before and after this patch are:
before:
warning: subregion collision cfc/4 (pci-conf-data) vs cf8/4 (pci-conf-idx)warning: subregion collision 8000000/f8000000 (pci-hole) vs 0/8000000 (ram-below-4g)...
memory: Use non-bitops ctzl
A memory size of zero is invalid, and so that edge conditiondoes not occur.
Signed-off-by: Richard Henderson <rth@twiddle.net>Reviewed-by: Eric Blake <eblake@redhat.com>Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
bitops: unify bitops_ffsl with the one in host-utils.h, call it bitops_ctzl
We had two copies of a ffs function for longs with subtly differentsemantics and, for the one in bitops.h, a confusing name: the resultwas off-by-one compared to the library function ffsl....
memory: introduce memory_region_test_and_clear_dirty
This function avoids having to do two calls, one to test the dirty bit, andother to reset it.
Signed-off-by: Juan Quintela <quintela@redhat.com>
softmmu: move include files to include/sysemu/
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
misc: move include files to include/qemu/
exec: move include files to include/exec/
memory: Don't dump disabled regions
This makes "info mtree" output readable again.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
memory: Reintroduce dirty flag to optimize changes on disabled regions
Cirrus is triggering this, e.g. during Win2k boot: Changes only ondisabled regions require no topology update when transaction depth dropsto 0 again.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>...
memory: fix rendering of a region obscured by another
The memory core drops regions that are hidden by another region (for example,during BAR sizing), but it doesn't do so correctly if the lower address of theexisting range is below the lower address of the new range....
Rename target_phys_addr_t to hwaddr
target_phys_addr_t is unwieldly, violates the C standard (_t suffixes arereserved) and its purpose doesn't match the name (most target_phys_addr_taddresses are not target specific). Replace it with a finger-friendly,...
Merge remote-tracking branch 'qemu-kvm/memory/urgent' into staging
memory: per-AddressSpace dispatch
Currently we use a global radix tree to dispatch memory access. This onlyworks with a single address space; to support multiple address spaces wemake the radix tree a member of AddressSpace (via an intermediate structure...
memory: add address_space_destroy()
Since address spaces can be created dynamically by device hotplug, theycan also be destroyed dynamically.
Signed-off-by: Avi Kivity <avi@redhat.com>
memory: move address_space_memory and address_space_io out of memory core
With this change, memory.c no longer knows anything about special addressspaces, so it is prepared for AddressSpace based DMA.
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>Signed-off-by: Avi Kivity <avi@redhat.com>
memory: use AddressSpace for MemoryListener filtering
Using the AddressSpace type reduces confusion, as you can't accidentallysupply the MemoryRegion you're interested in.
memory: manage coalesced mmio via a MemoryListener
Instead of calling a global function on coalesced mmio changes, whichroutes the call to kvm if enabled, add coalesced mmio hooks toMemoryListener and make kvm use that instead.
The motivation is support for multiple address spaces (which means we...
memory: abort if a memory region is destroyed during a transaction
Destroying a memory region is illegal within a transaction, as untilthe transaction is committed, the memory core may hold references tothe region. Add an assert to check for violations of this rule....
memory: Make eventfd adhere to device endianness
Our memory API MMIO regions know the concept of device endianness. Thisis used to automatically swap endianness between devices and host CPU,depending on whether buses in between would swizzle the bits....
memory: prepare AddressSpace for exporting
AddressSpace contains a member, current_map, of type FlatView. Since wewant to limit the leakage of internal types to public headers, switch toa pointer to a FlatView. There is no performance impact as this isn't used...
memory: export AddressSpace
The DMA API will use an AddressSpace to differentiate among differentinitiators.
memory: maintain a list of address spaces
Instead of embedding knowledge of the memory and I/O address spaces in thememory core, maintain a list of all address spaces. This list will laterbe extended dynamically for other bus masters.
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>...
memory: provide defaults for MemoryListener operations
Many listeners don't need to respond to all MemoryListener callbacks;provide suitable no-op defaults instead.
memory: rename 'exec-obsolete.h'
exec-obsolete.h used to hold pre-memory-API functions that were used fromdevice code prior to the transition to the memory API. Now that thetransition is complete, the name no longer describes the file. Thefunctions still need to be merged better into the memory core, but there's...
memory: Flush coalesced MMIO on mapping and state changes
Flush pending coalesced MMIO before performing mapping or state changesthat could affect the event orderings or route the buffered requests toa wrong region.
memory: Fold memory_region_update_topology into memory_region_transaction_commit
Simplify the code as we are using now only a subset of the originalfeatures of memory_region_update_topology.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
memory: Use transaction_begin/commit also for single-step operations
Wrap also simple operations consisting only of a single step withmemory_region_transaction_begin/commit. This allows to performadditional steps like coalesced MMIO flushing from a single place....
memory: Flush coalesced MMIO on selected region access
Instead of flushing pending coalesced MMIO requests on every vmexit,this provides a mechanism to selectively flush when memory regionsrelated to the coalesced one are accessed. This first of all includes...
memory: Fix copy&paste mistake in memory_region_iorange_write
The last argument of find_portio is "write", so this must be true here.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
memory: pass EventNotifier, not eventfd
Under Win32, EventNotifiers will not have event_notifier_get_fd, so wecannot call it in common code such as hw/virtio-pci.c. Pass a pointer tothe notifier, and only retrieve the file descriptor in kvm-specific code....
memory: check address space when a listener is registered
This patch resolves a bug in memory listener registration."range_add" callback was called on each section of the bothaddress space (IO and memory space) even if it doesn't matchthe address space filter....
memory: print aliased IO ranges in info mtree
Print also I/O ports behind bridges and other aliases.
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>Signed-off-by: Avi Kivity <avi@redhat.com>
memory: get rid of cpu_register_io_memory()
The return value of cpu_register_io_memory() is no longer used anywhere, sowe can remove it and all associated data and code.
memory: dispatch directly via MemoryRegion
Instead of indirecting via io_mem_region, dispatch directlythrough the MemoryRegion obtained from the iotlb or phys_page_find().
memory: fix I/O port aliases
Commit e58ac72b6a0 ("ioport: change portio_list not to usememory_region_set_offset()") started using aliases of I/O memoryregions. Since the IORange used for the I/O was contained in thetarget region, the alias information (specifically, the offset...
memory: don't pass ->readable attribute to cpu_register_physical_memory_log
It can be derived from the MemoryRegion itself (which is why it is notused there).
Signed-off-by: Avi Kivity <avi@redhat.com>Reviewed-by: Richard Henderson <rth@twiddle.net>
memory: use a MemoryListener for core memory map updates too
This transforms memory.c into a library which can then be unit testedeasily, by feeding it inputs and listening to its outputs.
memory: drop AddressSpaceOps
All functionality has been moved to various MemoryListeners.
memory: allow MemoryListeners to observe a specific address space
Ignore any regions not belonging to a specified address space.
memory: support stateless memory listeners
Current memory listeners are incremental; that is, they are expected tomaintain their own state, and receive callbacks for changes to that state.
This patch adds support for stateless listeners; these work by receiving...
memory: remove memory_region_set_offset()
memory_region_set_offset() complicates the API, and has been deprecatedsince its introduction. Now that it is no longer used, remove it.
memory: add shorthand for invoking a callback on all listeners
memory: switch memory listeners to a QTAILQ
This allows reverse iteration, which in turns allows consistent orderingamong multiple listeners:
l1->add l2->add l2->del l1->del
memory: code motion: move MEMORY_LISTENER_CALL()
So it can be used in earlier code.
memory: move ioeventfd ops to MemoryListener
This way the accelerator (kvm) can handle them directly.
memory: add a readonly attribute to MemoryRegionSection
.readonly cannot be obtained from the MemoryRegion, since it isinherited from aliases (so you can have a MemoryRegion mapped RWat one address and RO at another). Record it in a MemoryRegionSection...
memory-region: Report if region is read-only or write-only on info mtree
Helpful to understand guest configurations of things like the i440FX'sPAM or the state of ROM devices.
memory: change dirty getting API to take a size
Instead of each device knowing or guessing the guest page size,just pass the desired size of dirtied memory area.
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
memory: change dirty setting APIs to take a size
Instead of each target knowing or guessing the guest page size,just pass the desired size of dirtied memory area.
memory: Introduce memory_region_init_reservation
Introduce a memory region type that can reserve I/O space. Such regionsare useful for modeling I/O that is only handled outside of QEMU, i.e.in the context of an accelerator like KVM.
Any access to such a region from QEMU is a bug, but could theoretically...
prepare for future GPLv2+ relicensing
All files under GPLv2 will get GPLv2+ changes starting tomorrow.event_notifier.c and exec-obsolete.h were only ever touched by Red Hatemployees and can be relicensed now.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>...
memory: Fix adjust_endianness()
Commit a621f38de85598a13d8d8524d1a94fc6a1818215 (Direct dispatchthrough MemoryRegion) moved byte swaps to a central function.
Add a missing break, so that long-sized byte swaps don't abort.
Signed-off-by: Andreas Färber <afaerber@suse.de>...
memory: Fix memory_region_wrong_endianness()
Since commit be675c972088eba210e18dc125613e9f205a6bfb (memory: moveendianness compensation to memory core) it was checking forTARGET_BIG_ENDIAN instead of TARGET_WORDS_BIGENDIAN, thereby notswapping correctly for Big Endian targets....
Convert IO_MEM_{RAM,ROM,UNASSIGNED,NOTDIRTY} to MemoryRegions
Convert the fixed-address IO_MEM_RAM, IO_MEM_ROM, IO_MEM_UNASSIGNED,and IO_MEM_NOTDIRTY io handlers to MemoryRegions. These aren't realregions, since they are never added to the memory hierarchy, but they...
Switch cpu_register_physical_memory_log() to use MemoryRegions
Still internally using ram_addr.
Direct dispatch through MemoryRegion
Now that all mmio goes through MemoryRegions, we can convertio_mem_opaque to be a MemoryRegion pointer, and remove the thunksthat convert from old-style CPU{Read,Write}MemoryFunc to MemoryRegionOps.
Signed-off-by: Avi Kivity <avi@redhat.com>...
Remove IO_MEM_SUBPAGE
Replace with a MemoryRegion flag.
Drop IO_MEM_ROMD
Unlike ->readonly, ->readable is not inherited from aliase, so we can simplyquery the memory region.
memory: obsolete cpu_physical_memory_[gs]et_dirty_tracking()
The getter is no longer used, so it is completely removed.
memory: move endianness compensation to memory core
Instead of doing device endianness compensation in cpu_register_io_memory(),do it in the memory core.
memory: move mmio access to functions
Currently mmio access goes directly to the io_mem_{read,write} arrays.In preparation for eliminating them, add indirection via a function.
memory: remove MemoryRegion::backend_registered
backend_registered was used to lazify the process of registering anmmio region, since the it is different for the I/O address space andthe memory address space. However, it also makes registration dependent...
Avoid range comparisons on io index types
The code sometimes uses range comparisons on io indexes (e.g.index =< IO_MEM_ROM). Avoid these as they make moving to objects harder.
vmstate, memory: decouple vmstate from memory API
Currently creating a memory region automatically registers it forlive migration. This differs from other state (which is enumeratedin a VMStateDescription structure) and ties the live migration codeinto the memory core....
memory: introduce memory_region_name()
Trivial accessor for the name attribute.
memory: remove CPUPhysMemoryClient
No longer used.
memory: temporarily add memory_region_get_ram_addr()
This is a layering violation, but needed while the code containsnaked calls to qemu_get_ram_ptr() and the like.
memory: introduce memory_region_find()
Given an address space (represented by the top-level memory region),returns the memory region that maps a given range. Useful for implementingDMA.
The implementation is a simplistic binary search. Once we have a tree...
memory: replace cpu_physical_sync_dirty_bitmap() with a memory API
The function is still used as the implementation.
memory: add API for observing updates to the physical memory map
Add an API that allows a client to observe changes in the globalmemory map: - region added (possibly with logging enabled) - region removed (possibly with logging enabled) - logging started on a region...
kvm: switch kvm slots to use host virtual address instead of ram_addr_t
This simplifies a later switch to the memory API in slot management.
memory: add memory_region_is_ram()
memory: add memory_region_is_rom()
memory: add memory_region_is_logging()
Merge remote-tracking branch 'qemu-kvm/memory/exec-obsolete' into staging
Merge remote-tracking branch 'qemu-kvm/memory/xen' into staging
memory: move obsolete exec.c functions to a private header
This will help avoid accidental usage.
memory, xen: pass MemoryRegion to xen_ram_alloc()
Currently xen_ram_alloc() relies on ram_addr, which is going away.Give it something else to use as a cookie.
memory: optimize empty transactions due to mutators
The mutating memory APIs can easily cause empty transactions,where the mutators don't actually change anything, or perhapsonly modify disabled regions. Detect these conditions andavoid regenerating the memory topology....
memory: introduce memory_region_set_alias_offset()
Add an API to update an alias offset of an active alias. This can beused to simplify implementation of dynamic memory banks.
memory: introduce memory_region_set_address()
Allow changing the address of a memory region while it isin the memory hierarchy.
memory: introduce memory_region_set_enabled()
This allows users to disable a memory region without removingit from the hierarchy, simplifying the implementation ofmemory routers.
memory: add MemoryRegionOps::valid.accepts
MemoryRegionOps::valid tries to declaratively specify which transactionsare accepted by the device/bus, however it is not completely generic. Adda callback for special cases.
memory: fix 'info mtree' segfaults
'info mtree' accesses invalid memory in two cases, both due to incorrect(and unsafe) usage of QTAILQ_FOREACH_SAFE().
Reported-by: Andreas Färber <afaerber@suse.de>Signed-off-by: Avi Kivity <avi@redhat.com>
memory: use 128-bit integers for sizes and intermediates
Since the memory API supports 64-bit buses, it needs a larger type to representintermediate results.
memory: Fix old portio word accesses
As we register old portio regions via ioport_register, we are alsoresponsible for providing the word access wrapper.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>Signed-off-by: Avi Kivity <avi@redhat.com>
Introduce PortioList
Add a type and methods for manipulating a list of disjoint I/O ports,used in some older hardware devices.
Based on original patch by Richard Henderson.
Signed-off-by: Richard Henderson <rth@twiddle.net>Signed-off-by: Avi Kivity <avi@redhat.com>