@@ -1544,6 +1544,7 @@ ram_addr_t qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
error_propagate(errp, local_err);
return -1;
}
+ mr->ram_block = new_block;
return addr;
}
@@ -1817,6 +1818,11 @@ found:
return mr;
}
+void *qemu_get_ram_ptr_from_block(RAMBlock *block, hwaddr addr)
+{
+ return ramblock_ptr(block, addr - block->offset);
+}
+
static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
uint64_t val, unsigned size)
{
@@ -2350,7 +2356,7 @@ bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
} else {
addr1 += memory_region_get_ram_addr(mr);
/* RAM case */
- ptr = qemu_get_ram_ptr(addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, addr1);
memcpy(ptr, buf, l);
invalidate_and_set_dirty(addr1, l);
}
@@ -2384,7 +2390,7 @@ bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
}
} else {
/* RAM case */
- ptr = qemu_get_ram_ptr(mr->ram_addr + addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, mr->ram_addr + addr1);
memcpy(buf, ptr, l);
}
}
@@ -2437,7 +2443,7 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
} else {
addr1 += memory_region_get_ram_addr(mr);
/* ROM/RAM case */
- ptr = qemu_get_ram_ptr(addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, addr1);
switch (type) {
case WRITE_DATA:
memcpy(ptr, buf, l);
@@ -2681,9 +2687,10 @@ static inline uint32_t ldl_phys_internal(AddressSpace *as, hwaddr addr,
#endif
} else {
/* RAM case */
- ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
- & TARGET_PAGE_MASK)
- + addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block,
+ (memory_region_get_ram_addr(mr)
+ & TARGET_PAGE_MASK)
+ + addr1);
switch (endian) {
case DEVICE_LITTLE_ENDIAN:
val = ldl_le_p(ptr);
@@ -2740,9 +2747,10 @@ static inline uint64_t ldq_phys_internal(AddressSpace *as, hwaddr addr,
#endif
} else {
/* RAM case */
- ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
- & TARGET_PAGE_MASK)
- + addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block,
+ (memory_region_get_ram_addr(mr)
+ & TARGET_PAGE_MASK)
+ + addr1);
switch (endian) {
case DEVICE_LITTLE_ENDIAN:
val = ldq_le_p(ptr);
@@ -2807,9 +2815,10 @@ static inline uint32_t lduw_phys_internal(AddressSpace *as, hwaddr addr,
#endif
} else {
/* RAM case */
- ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
- & TARGET_PAGE_MASK)
- + addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block,
+ (memory_region_get_ram_addr(mr)
+ & TARGET_PAGE_MASK)
+ + addr1);
switch (endian) {
case DEVICE_LITTLE_ENDIAN:
val = lduw_le_p(ptr);
@@ -2856,7 +2865,7 @@ void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val)
io_mem_write(mr, addr1, val, 4);
} else {
addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
- ptr = qemu_get_ram_ptr(addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, addr1);
stl_p(ptr, val);
if (unlikely(in_migration)) {
@@ -2896,7 +2905,7 @@ static inline void stl_phys_internal(AddressSpace *as,
} else {
/* RAM case */
addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
- ptr = qemu_get_ram_ptr(addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, addr1);
switch (endian) {
case DEVICE_LITTLE_ENDIAN:
stl_le_p(ptr, val);
@@ -2959,7 +2968,7 @@ static inline void stw_phys_internal(AddressSpace *as,
} else {
/* RAM case */
addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
- ptr = qemu_get_ram_ptr(addr1);
+ ptr = qemu_get_ram_ptr_from_block(mr->ram_block, addr1);
switch (endian) {
case DEVICE_LITTLE_ENDIAN:
stw_le_p(ptr, val);
@@ -146,6 +146,7 @@ struct MemoryRegion {
Int128 size;
hwaddr addr;
void (*destructor)(MemoryRegion *mr);
+ void *ram_block; /* RAMBlock pointer */
ram_addr_t ram_addr;
uint64_t align;
bool subpage;
@@ -38,6 +38,7 @@ void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
void *qemu_get_ram_ptr(ram_addr_t addr);
void qemu_ram_free(ram_addr_t addr);
void qemu_ram_free_from_ptr(ram_addr_t addr);
+void *qemu_get_ram_ptr_from_block(RAMBlock *block, hwaddr addr);
int qemu_ram_resize(ram_addr_t base, ram_addr_t newsize, Error **errp);
@@ -877,6 +877,7 @@ void memory_region_init(MemoryRegion *mr,
mr->size = int128_2_64();
}
mr->name = g_strdup(name);
+ mr->ram_block = NULL;
if (name) {
char *escaped_name = memory_region_escape_name(name);
@@ -1449,7 +1450,8 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
assert(mr->terminates);
- return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK);
+ return qemu_get_ram_ptr_from_block(mr->ram_block,
+ mr->ram_addr & TARGET_PAGE_MASK);
}
static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpace *as)