Switch cpu_register_physical_memory_log() to use MemoryRegions
Still internally using ram_addr. Signed-off-by: Avi Kivity <avi@redhat.com> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
0e0df1e24d
commit
dd81124bf6
|
@ -36,27 +36,9 @@ int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
void cpu_unregister_io_memory(int table_address);
|
void cpu_unregister_io_memory(int table_address);
|
||||||
|
|
||||||
void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
|
struct MemoryRegionSection;
|
||||||
ram_addr_t size,
|
void cpu_register_physical_memory_log(struct MemoryRegionSection *section,
|
||||||
ram_addr_t phys_offset,
|
bool readable, bool readonly);
|
||||||
ram_addr_t region_offset,
|
|
||||||
bool log_dirty);
|
|
||||||
|
|
||||||
static inline void cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
|
|
||||||
ram_addr_t size,
|
|
||||||
ram_addr_t phys_offset,
|
|
||||||
ram_addr_t region_offset)
|
|
||||||
{
|
|
||||||
cpu_register_physical_memory_log(start_addr, size, phys_offset,
|
|
||||||
region_offset, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpu_register_physical_memory(target_phys_addr_t start_addr,
|
|
||||||
ram_addr_t size,
|
|
||||||
ram_addr_t phys_offset)
|
|
||||||
{
|
|
||||||
cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
||||||
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
||||||
|
|
24
exec.c
24
exec.c
|
@ -2510,18 +2510,32 @@ static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
|
||||||
start_addr and region_offset are rounded down to a page boundary
|
start_addr and region_offset are rounded down to a page boundary
|
||||||
before calculating this offset. This should not be a problem unless
|
before calculating this offset. This should not be a problem unless
|
||||||
the low bits of start_addr and region_offset differ. */
|
the low bits of start_addr and region_offset differ. */
|
||||||
void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
|
void cpu_register_physical_memory_log(MemoryRegionSection *section,
|
||||||
ram_addr_t size,
|
bool readable, bool readonly)
|
||||||
ram_addr_t phys_offset,
|
|
||||||
ram_addr_t region_offset,
|
|
||||||
bool log_dirty)
|
|
||||||
{
|
{
|
||||||
|
target_phys_addr_t start_addr = section->offset_within_address_space;
|
||||||
|
ram_addr_t size = section->size;
|
||||||
|
ram_addr_t phys_offset = section->mr->ram_addr;
|
||||||
|
ram_addr_t region_offset = section->offset_within_region;
|
||||||
target_phys_addr_t addr, end_addr;
|
target_phys_addr_t addr, end_addr;
|
||||||
PhysPageDesc *p;
|
PhysPageDesc *p;
|
||||||
CPUState *env;
|
CPUState *env;
|
||||||
ram_addr_t orig_size = size;
|
ram_addr_t orig_size = size;
|
||||||
subpage_t *subpage;
|
subpage_t *subpage;
|
||||||
|
|
||||||
|
if (memory_region_is_ram(section->mr)) {
|
||||||
|
phys_offset += region_offset;
|
||||||
|
region_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!readable) {
|
||||||
|
phys_offset &= ~TARGET_PAGE_MASK & ~IO_MEM_ROMD;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readonly) {
|
||||||
|
phys_offset |= io_mem_rom.ram_addr;
|
||||||
|
}
|
||||||
|
|
||||||
assert(size);
|
assert(size);
|
||||||
|
|
||||||
if (phys_offset == io_mem_unassigned.ram_addr) {
|
if (phys_offset == io_mem_unassigned.ram_addr) {
|
||||||
|
|
42
memory.c
42
memory.c
|
@ -305,38 +305,26 @@ static void access_with_adjusted_size(target_phys_addr_t addr,
|
||||||
|
|
||||||
static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
|
static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
|
||||||
{
|
{
|
||||||
ram_addr_t phys_offset, region_offset;
|
MemoryRegionSection section = {
|
||||||
|
.mr = fr->mr,
|
||||||
|
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||||
|
.offset_within_region = fr->offset_in_region,
|
||||||
|
.size = int128_get64(fr->addr.size),
|
||||||
|
};
|
||||||
|
|
||||||
phys_offset = fr->mr->ram_addr;
|
cpu_register_physical_memory_log(§ion, fr->readable, fr->readonly);
|
||||||
region_offset = fr->offset_in_region;
|
|
||||||
/* cpu_register_physical_memory_log() wants region_offset for
|
|
||||||
* mmio, but prefers offseting phys_offset for RAM. Humour it.
|
|
||||||
*/
|
|
||||||
if (memory_region_is_ram(fr->mr)) {
|
|
||||||
phys_offset += region_offset;
|
|
||||||
region_offset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fr->readable) {
|
|
||||||
phys_offset &= ~TARGET_PAGE_MASK & ~IO_MEM_ROMD;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fr->readonly) {
|
|
||||||
phys_offset |= io_mem_rom.ram_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu_register_physical_memory_log(int128_get64(fr->addr.start),
|
|
||||||
int128_get64(fr->addr.size),
|
|
||||||
phys_offset,
|
|
||||||
region_offset,
|
|
||||||
fr->dirty_log_mask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void as_memory_range_del(AddressSpace *as, FlatRange *fr)
|
static void as_memory_range_del(AddressSpace *as, FlatRange *fr)
|
||||||
{
|
{
|
||||||
cpu_register_physical_memory(int128_get64(fr->addr.start),
|
MemoryRegionSection section = {
|
||||||
int128_get64(fr->addr.size),
|
.mr = &io_mem_unassigned,
|
||||||
io_mem_unassigned.ram_addr);
|
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||||
|
.offset_within_region = int128_get64(fr->addr.start),
|
||||||
|
.size = int128_get64(fr->addr.size),
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu_register_physical_memory_log(§ion, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void as_memory_log_start(AddressSpace *as, FlatRange *fr)
|
static void as_memory_log_start(AddressSpace *as, FlatRange *fr)
|
||||||
|
|
Loading…
Reference in New Issue