exec: eliminate io_mem_ram

It is never used, the IOTLB always goes through io_mem_notdirty.

In fact in softmmu_template.h, if it were, QEMU would crash just
below the tests, as soon as io_mem_read/write dispatches to
error_mem_read/write.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: drop useless #if

This code is only compiled for softmmu targets.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
cputlb: simplify tlb_set_page

The same "if" condition is repeated twice.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: make io_mem_unassigned private

There is no reason to avoid a recompile before accessing unassigned
memory.  In the end it will be treated as MMIO anyway.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: do not use error_mem_read

We will soon reach this case when doing (unaligned) accesses that
span partly past the end of memory.  We do not want to crash in
that case.

unassigned_mem_ops and rom_mem_ops are now the same.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: dispatch unassigned accesses based on .valid.accepts

This provides the basics for detecting accesses to unassigned memory
as soon as they happen, and also for a simple implementation of
address_space_access_valid.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: add address_space_translate

Using phys_page_find to translate an AddressSpace to a MemoryRegionSection
is unwieldy.  It requires to pass the page index rather than the address,
and later memory_region_section_addr has to be called.  Replace
memory_region_section_addr with a function that does all of it: call
phys_page_find, compute the offset within the region, and check how
big the current mapping is.  This way, a large flat region can be written
with a single lookup rather than a page at a time.

address_space_translate will also provide a single point where IOMMU
forwarding is implemented.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: move unassigned_mem_ops to memory.c

reservation_ops is already doing the same thing.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
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 will
go through mr->ops without any special intervention.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: expect mr->ops to be initialized for ROM

There is no need to use the special phys_section_rom section.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: introduce memory_access_is_direct

After the previous patches, this is a common test for all read/write
functions.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: introduce memory_access_size

This will be used by address_space_access_valid too.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: export memory_region_access_valid to exec.c

We'll use it to implement address_space_access_valid.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: implement .valid.accepts for subpages

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: add address_space_access_valid

The old-style IOMMU lets you check whether an access is valid in a
given DMAContext.  There is no equivalent for AddressSpace in the
memory API, implement it with a lookup of the dispatch tree.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
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 accepts
callback is still free to reject those accesses.

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.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: split accesses even when the old MMIO callbacks are used

This is useful for 64-bit memory accesses.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
memory: correctly handle endian-swapped 64-bit accesses

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
exec: just use io_mem_read/io_mem_write for 8-byte I/O accesses

The memory API is able to split it in two 4-byte accesses.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>