diff options
author | Chenyi Qiang <chenyi.qiang@intel.com> | 2025-06-12 16:27:42 +0800 |
---|---|---|
committer | Peter Xu <peterx@redhat.com> | 2025-06-23 16:03:59 -0400 |
commit | f47a672a72acd6e2712031f0bc4d4f3ae4b6302c (patch) | |
tree | c3d2ecceba0bba3db610fc95c134008c1c15ad19 /include | |
parent | 983899eab4939dc4dff67fa4d822c5b4df7eae21 (diff) | |
download | qemu-f47a672a72acd6e2712031f0bc4d4f3ae4b6302c.zip qemu-f47a672a72acd6e2712031f0bc4d4f3ae4b6302c.tar.gz qemu-f47a672a72acd6e2712031f0bc4d4f3ae4b6302c.tar.bz2 |
memory: Export a helper to get intersection of a MemoryRegionSection with a given range
Rename the helper to memory_region_section_intersect_range() to make it
more generic. Meanwhile, define the @end as Int128 and replace the
related operations with Int128_* format since the helper is exported as
a wider API.
Suggested-by: Alexey Kardashevskiy <aik@amd.com>
Reviewed-by: Alexey Kardashevskiy <aik@amd.com>
Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com>
Link: https://lore.kernel.org/r/20250612082747.51539-2-chenyi.qiang@intel.com
Signed-off-by: Peter Xu <peterx@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/system/memory.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/include/system/memory.h b/include/system/memory.h index 0848690..da97753 100644 --- a/include/system/memory.h +++ b/include/system/memory.h @@ -1212,6 +1212,36 @@ MemoryRegionSection *memory_region_section_new_copy(MemoryRegionSection *s); void memory_region_section_free_copy(MemoryRegionSection *s); /** + * memory_region_section_intersect_range: Adjust the memory section to cover + * the intersection with the given range. + * + * @s: the #MemoryRegionSection to be adjusted + * @offset: the offset of the given range in the memory region + * @size: the size of the given range + * + * Returns false if the intersection is empty, otherwise returns true. + */ +static inline bool memory_region_section_intersect_range(MemoryRegionSection *s, + uint64_t offset, + uint64_t size) +{ + uint64_t start = MAX(s->offset_within_region, offset); + Int128 end = int128_min(int128_add(int128_make64(s->offset_within_region), + s->size), + int128_add(int128_make64(offset), + int128_make64(size))); + + if (int128_le(end, int128_make64(start))) { + return false; + } + + s->offset_within_address_space += start - s->offset_within_region; + s->offset_within_region = start; + s->size = int128_sub(end, int128_make64(start)); + return true; +} + +/** * memory_region_init: Initialize a memory region * * The region typically acts as a container for other memory regions. Use |