physmem: factor out RAM/ROMD check in memory_access_is_direct()

Let's factor more of the generic "is this directly accessible" check,
independent of the "write" condition out.

Note that the "!mr->rom_device" check in the write case essentially
disallows the memory_region_is_romd() condition again. Further note that
RAM DEVICE regions are also RAM regions, so we can check for RAM+ROMD
first.

This is a preparation for further changes.

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20250210084648.33798-3-david@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
David Hildenbrand 2025-02-10 09:46:43 +01:00 committed by Peter Xu
parent 52012209e1
commit e76d7b6b8c

View file

@ -2997,6 +2997,10 @@ bool prepare_mmio_access(MemoryRegion *mr);
static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
{
/* ROM DEVICE regions only allow direct access if in ROMD mode. */
if (!memory_region_is_ram(mr) && !memory_region_is_romd(mr)) {
return false;
}
/*
* RAM DEVICE regions can be accessed directly using memcpy, but it might
* be MMIO and access using mempy can be wrong (e.g., using instructions not
@ -3006,11 +3010,9 @@ static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
return false;
}
if (is_write) {
return memory_region_is_ram(mr) && !mr->readonly &&
!mr->rom_device;
} else {
return memory_region_is_ram(mr) || memory_region_is_romd(mr);
return !mr->readonly && !mr->rom_device;
}
return true;
}
/**