diff --git a/qemu/aarch64.h b/qemu/aarch64.h index aba5a963..6e17c390 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_aarch64 #define memory_region_add_subregion memory_region_add_subregion_aarch64 #define memory_region_del_subregion memory_region_del_subregion_aarch64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_aarch64 #define memory_region_find memory_region_find_aarch64 #define memory_listener_register memory_listener_register_aarch64 #define memory_listener_unregister memory_listener_unregister_aarch64 diff --git a/qemu/arm.h b/qemu/arm.h index be8271c6..3676b360 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_arm #define memory_region_add_subregion memory_region_add_subregion_arm #define memory_region_del_subregion memory_region_del_subregion_arm +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_arm #define memory_region_find memory_region_find_arm #define memory_listener_register memory_listener_register_arm #define memory_listener_unregister memory_listener_unregister_arm diff --git a/qemu/include/exec/memory.h b/qemu/include/exec/memory.h index a4b36e53..88da991e 100644 --- a/qemu/include/exec/memory.h +++ b/qemu/include/exec/memory.h @@ -1186,6 +1186,7 @@ MemoryRegion *memory_map(struct uc_struct *uc, hwaddr begin, size_t size, uint32 MemoryRegion *memory_map_ptr(struct uc_struct *uc, hwaddr begin, size_t size, uint32_t perms, void *ptr); MemoryRegion *memory_map_io(struct uc_struct *uc, ram_addr_t begin, size_t size, uc_cb_mmio_read_t read_cb, uc_cb_mmio_write_t write_cb, void *user_data_read, void *user_data_write); +MemoryRegion *memory_cow(struct uc_struct *uc, MemoryRegion *parrent, hwaddr begin, size_t size); void memory_unmap(struct uc_struct *uc, MemoryRegion *mr); int memory_free(struct uc_struct *uc); diff --git a/qemu/m68k.h b/qemu/m68k.h index ab97771b..061297d6 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_m68k #define memory_region_add_subregion memory_region_add_subregion_m68k #define memory_region_del_subregion memory_region_del_subregion_m68k +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_m68k #define memory_region_find memory_region_find_m68k #define memory_listener_register memory_listener_register_m68k #define memory_listener_unregister memory_listener_unregister_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 95f0abda..98447291 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_mips #define memory_region_add_subregion memory_region_add_subregion_mips #define memory_region_del_subregion memory_region_del_subregion_mips +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips #define memory_region_find memory_region_find_mips #define memory_listener_register memory_listener_register_mips #define memory_listener_unregister memory_listener_unregister_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index e29e20e5..8a7dbe77 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_mips64 #define memory_region_add_subregion memory_region_add_subregion_mips64 #define memory_region_del_subregion memory_region_del_subregion_mips64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64 #define memory_region_find memory_region_find_mips64 #define memory_listener_register memory_listener_register_mips64 #define memory_listener_unregister memory_listener_unregister_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index 6f94f431..5ae511bc 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_mips64el #define memory_region_add_subregion memory_region_add_subregion_mips64el #define memory_region_del_subregion memory_region_del_subregion_mips64el +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64el #define memory_region_find memory_region_find_mips64el #define memory_listener_register memory_listener_register_mips64el #define memory_listener_unregister memory_listener_unregister_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index 1b313d4b..dc0a2a41 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_mipsel #define memory_region_add_subregion memory_region_add_subregion_mipsel #define memory_region_del_subregion memory_region_del_subregion_mipsel +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mipsel #define memory_region_find memory_region_find_mipsel #define memory_listener_register memory_listener_register_mipsel #define memory_listener_unregister memory_listener_unregister_mipsel diff --git a/qemu/ppc.h b/qemu/ppc.h index a3a339fb..d2761616 100644 --- a/qemu/ppc.h +++ b/qemu/ppc.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_ppc #define memory_region_add_subregion memory_region_add_subregion_ppc #define memory_region_del_subregion memory_region_del_subregion_ppc +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_ppc #define memory_region_find memory_region_find_ppc #define memory_listener_register memory_listener_register_ppc #define memory_listener_unregister memory_listener_unregister_ppc diff --git a/qemu/ppc64.h b/qemu/ppc64.h index 04564484..51f94d12 100644 --- a/qemu/ppc64.h +++ b/qemu/ppc64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_ppc64 #define memory_region_add_subregion memory_region_add_subregion_ppc64 #define memory_region_del_subregion memory_region_del_subregion_ppc64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_ppc64 #define memory_region_find memory_region_find_ppc64 #define memory_listener_register memory_listener_register_ppc64 #define memory_listener_unregister memory_listener_unregister_ppc64 diff --git a/qemu/riscv32.h b/qemu/riscv32.h index a7a91fa7..8d373290 100644 --- a/qemu/riscv32.h +++ b/qemu/riscv32.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_riscv32 #define memory_region_add_subregion memory_region_add_subregion_riscv32 #define memory_region_del_subregion memory_region_del_subregion_riscv32 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_riscv32 #define memory_region_find memory_region_find_riscv32 #define memory_listener_register memory_listener_register_riscv32 #define memory_listener_unregister memory_listener_unregister_riscv32 diff --git a/qemu/riscv64.h b/qemu/riscv64.h index 6934d749..e1593cde 100644 --- a/qemu/riscv64.h +++ b/qemu/riscv64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_riscv64 #define memory_region_add_subregion memory_region_add_subregion_riscv64 #define memory_region_del_subregion memory_region_del_subregion_riscv64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_riscv64 #define memory_region_find memory_region_find_riscv64 #define memory_listener_register memory_listener_register_riscv64 #define memory_listener_unregister memory_listener_unregister_riscv64 diff --git a/qemu/s390x.h b/qemu/s390x.h index e00bcae9..b2350ce2 100644 --- a/qemu/s390x.h +++ b/qemu/s390x.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_s390x #define memory_region_add_subregion memory_region_add_subregion_s390x #define memory_region_del_subregion memory_region_del_subregion_s390x +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_s390x #define memory_region_find memory_region_find_s390x #define memory_listener_register memory_listener_register_s390x #define memory_listener_unregister memory_listener_unregister_s390x diff --git a/qemu/softmmu/memory.c b/qemu/softmmu/memory.c index bf6341d9..a0fdf5fb 100644 --- a/qemu/softmmu/memory.c +++ b/qemu/softmmu/memory.c @@ -1116,8 +1116,10 @@ static void memory_region_update_container_subregions(MemoryRegion *subregion) memory_region_transaction_begin(); QTAILQ_FOREACH(other, &mr->subregions, subregions_link) { - QTAILQ_INSERT_BEFORE(other, subregion, subregions_link); - goto done; + if (subregion->priority >= other->priority) { + QTAILQ_INSERT_BEFORE(other, subregion, subregions_link); + goto done; + } } QTAILQ_INSERT_TAIL(&mr->subregions, subregion, subregions_link); @@ -1141,6 +1143,16 @@ void memory_region_add_subregion(MemoryRegion *mr, hwaddr offset, MemoryRegion *subregion) { + subregion->priority = 0; + memory_region_add_subregion_common(mr, offset, subregion); +} + +void memory_region_add_subregion_overlap(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion, + int priority) +{ + subregion->priority = priority; memory_region_add_subregion_common(mr, offset, subregion); } diff --git a/qemu/sparc.h b/qemu/sparc.h index 596d8328..75ec3b29 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_sparc #define memory_region_add_subregion memory_region_add_subregion_sparc #define memory_region_del_subregion memory_region_del_subregion_sparc +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc #define memory_region_find memory_region_find_sparc #define memory_listener_register memory_listener_register_sparc #define memory_listener_unregister memory_listener_unregister_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index 223832ee..89ad6790 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_sparc64 #define memory_region_add_subregion memory_region_add_subregion_sparc64 #define memory_region_del_subregion memory_region_del_subregion_sparc64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc64 #define memory_region_find memory_region_find_sparc64 #define memory_listener_register memory_listener_register_sparc64 #define memory_listener_unregister memory_listener_unregister_sparc64 diff --git a/qemu/tricore.h b/qemu/tricore.h index a953ce0b..560e868e 100644 --- a/qemu/tricore.h +++ b/qemu/tricore.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_tricore #define memory_region_add_subregion memory_region_add_subregion_tricore #define memory_region_del_subregion memory_region_del_subregion_tricore +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_tricore #define memory_region_find memory_region_find_tricore #define memory_listener_register memory_listener_register_tricore #define memory_listener_unregister memory_listener_unregister_tricore diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 860707b1..a52f8e13 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -142,6 +142,7 @@ #define memory_region_get_ram_addr memory_region_get_ram_addr_x86_64 #define memory_region_add_subregion memory_region_add_subregion_x86_64 #define memory_region_del_subregion memory_region_del_subregion_x86_64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_x86_64 #define memory_region_find memory_region_find_x86_64 #define memory_listener_register memory_listener_register_x86_64 #define memory_listener_unregister memory_listener_unregister_x86_64 diff --git a/symbols.sh b/symbols.sh index 1c4f31f2..6a21a98b 100755 --- a/symbols.sh +++ b/symbols.sh @@ -142,6 +142,7 @@ memory_region_from_host \ memory_region_get_ram_addr \ memory_region_add_subregion \ memory_region_del_subregion \ +memory_region_add_subregion_overlap \ memory_region_find \ memory_listener_register \ memory_listener_unregister \