mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
memory: add a readonly attribute to MemoryRegionSection
.readonly cannot be obtained from the MemoryRegion, since it is inherited from aliases (so you can have a MemoryRegion mapped RW at one address and RO at another). Record it in a MemoryRegionSection for listeners. Signed-off-by: Avi Kivity <avi@redhat.com> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
80a1ea3748
commit
7a8499e88b
5
memory.c
5
memory.c
@ -112,6 +112,7 @@ enum ListenerDirection { Forward, Reverse };
|
||||
.offset_within_region = (fr)->offset_in_region, \
|
||||
.size = int128_get64((fr)->addr.size), \
|
||||
.offset_within_address_space = int128_get64((fr)->addr.start), \
|
||||
.readonly = (fr)->readonly, \
|
||||
})
|
||||
|
||||
struct CoalescedMemoryRange {
|
||||
@ -342,6 +343,7 @@ static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.offset_within_region = fr->offset_in_region,
|
||||
.size = int128_get64(fr->addr.size),
|
||||
.readonly = fr->readonly,
|
||||
};
|
||||
|
||||
cpu_register_physical_memory_log(§ion, fr->readable, fr->readonly);
|
||||
@ -354,6 +356,7 @@ static void as_memory_range_del(AddressSpace *as, FlatRange *fr)
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.offset_within_region = int128_get64(fr->addr.start),
|
||||
.size = int128_get64(fr->addr.size),
|
||||
.readonly = fr->readonly,
|
||||
};
|
||||
|
||||
cpu_register_physical_memory_log(§ion, true, false);
|
||||
@ -1437,6 +1440,7 @@ MemoryRegionSection memory_region_find(MemoryRegion *address_space,
|
||||
fr->addr.start));
|
||||
ret.size = int128_get64(range.size);
|
||||
ret.offset_within_address_space = int128_get64(range.start);
|
||||
ret.readonly = fr->readonly;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1479,6 +1483,7 @@ static void listener_add_address_space(MemoryListener *listener,
|
||||
.offset_within_region = fr->offset_in_region,
|
||||
.size = int128_get64(fr->addr.size),
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.readonly = fr->readonly,
|
||||
};
|
||||
listener->region_add(listener, §ion);
|
||||
}
|
||||
|
2
memory.h
2
memory.h
@ -160,6 +160,7 @@ typedef struct MemoryRegionSection MemoryRegionSection;
|
||||
* @size: the size of the section; will not exceed @mr's boundaries
|
||||
* @offset_within_address_space: the address of the first byte of the section
|
||||
* relative to the region's address space
|
||||
* @readonly: writes to this section are ignored
|
||||
*/
|
||||
struct MemoryRegionSection {
|
||||
MemoryRegion *mr;
|
||||
@ -167,6 +168,7 @@ struct MemoryRegionSection {
|
||||
target_phys_addr_t offset_within_region;
|
||||
uint64_t size;
|
||||
target_phys_addr_t offset_within_address_space;
|
||||
bool readonly;
|
||||
};
|
||||
|
||||
typedef struct MemoryListener MemoryListener;
|
||||
|
Loading…
Reference in New Issue
Block a user