Drop IO_MEM_ROMD
Unlike ->readonly, ->readable is not inherited from aliase, so we can simply query the memory region. Signed-off-by: Avi Kivity <avi@redhat.com> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
b3b00c78d8
commit
75c578dcaa
@ -114,9 +114,6 @@ extern struct MemoryRegion io_mem_rom;
|
||||
extern struct MemoryRegion io_mem_unassigned;
|
||||
extern struct MemoryRegion io_mem_notdirty;
|
||||
|
||||
/* Acts like a ROM when read and like a device when written. */
|
||||
#define IO_MEM_ROMD (1)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* !CPU_COMMON_H */
|
||||
|
20
exec.c
20
exec.c
@ -2091,9 +2091,18 @@ static bool is_ram_rom(ram_addr_t pd)
|
||||
return pd == io_mem_ram.ram_addr || pd == io_mem_rom.ram_addr;
|
||||
}
|
||||
|
||||
static bool is_romd(ram_addr_t pd)
|
||||
{
|
||||
MemoryRegion *mr;
|
||||
|
||||
pd &= ~TARGET_PAGE_MASK;
|
||||
mr = io_mem_region[pd >> IO_MEM_SHIFT];
|
||||
return mr->rom_device && mr->readable;
|
||||
}
|
||||
|
||||
static bool is_ram_rom_romd(ram_addr_t pd)
|
||||
{
|
||||
return is_ram_rom(pd) || (pd & IO_MEM_ROMD);
|
||||
return is_ram_rom(pd) || is_romd(pd);
|
||||
}
|
||||
|
||||
/* Add a new TLB entry. At most one entry for a given virtual address
|
||||
@ -2179,8 +2188,7 @@ void tlb_set_page(CPUState *env, target_ulong vaddr,
|
||||
te->addr_code = -1;
|
||||
}
|
||||
if (prot & PAGE_WRITE) {
|
||||
if ((pd & ~TARGET_PAGE_MASK) == io_mem_rom.ram_addr ||
|
||||
(pd & IO_MEM_ROMD)) {
|
||||
if ((pd & ~TARGET_PAGE_MASK) == io_mem_rom.ram_addr || is_romd(pd)) {
|
||||
/* Write access calls the I/O callback. */
|
||||
te->addr_write = address | TLB_MMIO;
|
||||
} else if ((pd & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr &&
|
||||
@ -2528,10 +2536,6 @@ void cpu_register_physical_memory_log(MemoryRegionSection *section,
|
||||
region_offset = 0;
|
||||
}
|
||||
|
||||
if (!readable) {
|
||||
phys_offset &= ~TARGET_PAGE_MASK & ~IO_MEM_ROMD;
|
||||
}
|
||||
|
||||
if (readonly) {
|
||||
phys_offset |= io_mem_rom.ram_addr;
|
||||
}
|
||||
@ -4379,7 +4383,7 @@ tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
|
||||
}
|
||||
pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
|
||||
if (pd != io_mem_ram.ram_addr && pd != io_mem_rom.ram_addr
|
||||
&& !(pd & IO_MEM_ROMD)) {
|
||||
&& !is_romd(pd)) {
|
||||
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
|
||||
cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
|
||||
#else
|
||||
|
5
memory.c
5
memory.c
@ -838,7 +838,7 @@ static void memory_region_destructor_iomem(MemoryRegion *mr)
|
||||
static void memory_region_destructor_rom_device(MemoryRegion *mr)
|
||||
{
|
||||
qemu_ram_free(mr->ram_addr & TARGET_PAGE_MASK);
|
||||
cpu_unregister_io_memory(mr->ram_addr & ~(TARGET_PAGE_MASK | IO_MEM_ROMD));
|
||||
cpu_unregister_io_memory(mr->ram_addr & ~TARGET_PAGE_MASK);
|
||||
}
|
||||
|
||||
static bool memory_region_wrong_endianness(MemoryRegion *mr)
|
||||
@ -868,6 +868,7 @@ void memory_region_init(MemoryRegion *mr,
|
||||
mr->ram = false;
|
||||
mr->readable = true;
|
||||
mr->readonly = false;
|
||||
mr->rom_device = false;
|
||||
mr->destructor = memory_region_destructor_none;
|
||||
mr->priority = 0;
|
||||
mr->may_overlap = false;
|
||||
@ -1039,10 +1040,10 @@ void memory_region_init_rom_device(MemoryRegion *mr,
|
||||
mr->ops = ops;
|
||||
mr->opaque = opaque;
|
||||
mr->terminates = true;
|
||||
mr->rom_device = true;
|
||||
mr->destructor = memory_region_destructor_rom_device;
|
||||
mr->ram_addr = qemu_ram_alloc(size, mr);
|
||||
mr->ram_addr |= cpu_register_io_memory(mr);
|
||||
mr->ram_addr |= IO_MEM_ROMD;
|
||||
}
|
||||
|
||||
void memory_region_destroy(MemoryRegion *mr)
|
||||
|
Loading…
Reference in New Issue
Block a user