Avoid range comparisons on io index types
The code sometimes uses range comparisons on io indexes (e.g. index =< IO_MEM_ROM). Avoid these as they make moving to objects harder. Signed-off-by: Avi Kivity <avi@redhat.com> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
2774c6d0ae
commit
1d393fa2d1
|
@ -354,7 +354,7 @@ static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong add
|
||||||
ldub_code(addr);
|
ldub_code(addr);
|
||||||
}
|
}
|
||||||
pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
|
pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
|
||||||
if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
|
if (pd != IO_MEM_RAM && pd != IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
|
||||||
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
|
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
|
||||||
cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
|
cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
|
||||||
#else
|
#else
|
||||||
|
|
37
exec.c
37
exec.c
|
@ -2084,6 +2084,17 @@ static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
|
||||||
env->tlb_flush_mask = mask;
|
env->tlb_flush_mask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_ram_rom(ram_addr_t pd)
|
||||||
|
{
|
||||||
|
pd &= ~TARGET_PAGE_MASK;
|
||||||
|
return pd == IO_MEM_RAM || pd == IO_MEM_ROM;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_ram_rom_romd(ram_addr_t pd)
|
||||||
|
{
|
||||||
|
return is_ram_rom(pd) || (pd & IO_MEM_ROMD);
|
||||||
|
}
|
||||||
|
|
||||||
/* Add a new TLB entry. At most one entry for a given virtual address
|
/* Add a new TLB entry. At most one entry for a given virtual address
|
||||||
is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
|
is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
|
||||||
supplied size is only used by tlb_flush_page. */
|
supplied size is only used by tlb_flush_page. */
|
||||||
|
@ -2114,12 +2125,12 @@ void tlb_set_page(CPUState *env, target_ulong vaddr,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
address = vaddr;
|
address = vaddr;
|
||||||
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
|
if (!is_ram_rom_romd(pd)) {
|
||||||
/* IO memory case (romd handled later) */
|
/* IO memory case (romd handled later) */
|
||||||
address |= TLB_MMIO;
|
address |= TLB_MMIO;
|
||||||
}
|
}
|
||||||
addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
|
addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
|
||||||
if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
|
if (is_ram_rom(pd)) {
|
||||||
/* Normal RAM. */
|
/* Normal RAM. */
|
||||||
iotlb = pd & TARGET_PAGE_MASK;
|
iotlb = pd & TARGET_PAGE_MASK;
|
||||||
if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
|
if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
|
||||||
|
@ -2543,16 +2554,14 @@ void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
|
||||||
} else {
|
} else {
|
||||||
p->phys_offset = phys_offset;
|
p->phys_offset = phys_offset;
|
||||||
p->region_offset = region_offset;
|
p->region_offset = region_offset;
|
||||||
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
|
if (is_ram_rom_romd(phys_offset))
|
||||||
(phys_offset & IO_MEM_ROMD))
|
|
||||||
phys_offset += TARGET_PAGE_SIZE;
|
phys_offset += TARGET_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
|
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
|
||||||
p->phys_offset = phys_offset;
|
p->phys_offset = phys_offset;
|
||||||
p->region_offset = region_offset;
|
p->region_offset = region_offset;
|
||||||
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
|
if (is_ram_rom_romd(phys_offset)) {
|
||||||
(phys_offset & IO_MEM_ROMD)) {
|
|
||||||
phys_offset += TARGET_PAGE_SIZE;
|
phys_offset += TARGET_PAGE_SIZE;
|
||||||
} else {
|
} else {
|
||||||
target_phys_addr_t start_addr2, end_addr2;
|
target_phys_addr_t start_addr2, end_addr2;
|
||||||
|
@ -3727,8 +3736,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
|
||||||
qemu_put_ram_ptr(ptr);
|
qemu_put_ram_ptr(ptr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
|
if (!is_ram_rom_romd(pd)) {
|
||||||
!(pd & IO_MEM_ROMD)) {
|
|
||||||
target_phys_addr_t addr1;
|
target_phys_addr_t addr1;
|
||||||
/* I/O case */
|
/* I/O case */
|
||||||
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
|
@ -3780,9 +3788,7 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr,
|
||||||
p = phys_page_find(page >> TARGET_PAGE_BITS);
|
p = phys_page_find(page >> TARGET_PAGE_BITS);
|
||||||
pd = p.phys_offset;
|
pd = p.phys_offset;
|
||||||
|
|
||||||
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
|
if (!is_ram_rom_romd(pd)) {
|
||||||
(pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
|
|
||||||
!(pd & IO_MEM_ROMD)) {
|
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
} else {
|
} else {
|
||||||
unsigned long addr1;
|
unsigned long addr1;
|
||||||
|
@ -3953,8 +3959,7 @@ static inline uint32_t ldl_phys_internal(target_phys_addr_t addr,
|
||||||
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
||||||
pd = p.phys_offset;
|
pd = p.phys_offset;
|
||||||
|
|
||||||
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
|
if (!is_ram_rom_romd(pd)) {
|
||||||
!(pd & IO_MEM_ROMD)) {
|
|
||||||
/* I/O case */
|
/* I/O case */
|
||||||
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
||||||
|
@ -4015,8 +4020,7 @@ static inline uint64_t ldq_phys_internal(target_phys_addr_t addr,
|
||||||
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
||||||
pd = p.phys_offset;
|
pd = p.phys_offset;
|
||||||
|
|
||||||
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
|
if (!is_ram_rom_romd(pd)) {
|
||||||
!(pd & IO_MEM_ROMD)) {
|
|
||||||
/* I/O case */
|
/* I/O case */
|
||||||
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
||||||
|
@ -4085,8 +4089,7 @@ static inline uint32_t lduw_phys_internal(target_phys_addr_t addr,
|
||||||
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
p = phys_page_find(addr >> TARGET_PAGE_BITS);
|
||||||
pd = p.phys_offset;
|
pd = p.phys_offset;
|
||||||
|
|
||||||
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
|
if (!is_ram_rom_romd(pd)) {
|
||||||
!(pd & IO_MEM_ROMD)) {
|
|
||||||
/* I/O case */
|
/* I/O case */
|
||||||
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
|
||||||
|
|
3
memory.c
3
memory.c
|
@ -312,7 +312,8 @@ static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
|
||||||
/* cpu_register_physical_memory_log() wants region_offset for
|
/* cpu_register_physical_memory_log() wants region_offset for
|
||||||
* mmio, but prefers offseting phys_offset for RAM. Humour it.
|
* mmio, but prefers offseting phys_offset for RAM. Humour it.
|
||||||
*/
|
*/
|
||||||
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
|
if ((phys_offset & ~TARGET_PAGE_MASK) == IO_MEM_RAM
|
||||||
|
|| (phys_offset & ~TARGET_PAGE_MASK) == IO_MEM_ROM) {
|
||||||
phys_offset += region_offset;
|
phys_offset += region_offset;
|
||||||
region_offset = 0;
|
region_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,8 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(target_phys_addr_t physaddr,
|
||||||
index = (physaddr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
index = (physaddr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
|
physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
|
||||||
env->mem_io_pc = (unsigned long)retaddr;
|
env->mem_io_pc = (unsigned long)retaddr;
|
||||||
if (index > (IO_MEM_NOTDIRTY >> IO_MEM_SHIFT)
|
if (index != IO_MEM_RAM && index != IO_MEM_ROM
|
||||||
|
&& index != IO_MEM_UNASSIGNED && index != IO_MEM_NOTDIRTY
|
||||||
&& !can_do_io(env)) {
|
&& !can_do_io(env)) {
|
||||||
cpu_io_recompile(env, retaddr);
|
cpu_io_recompile(env, retaddr);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +208,8 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr,
|
||||||
int index;
|
int index;
|
||||||
index = (physaddr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
index = (physaddr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
|
||||||
physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
|
physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
|
||||||
if (index > (IO_MEM_NOTDIRTY >> IO_MEM_SHIFT)
|
if (index != IO_MEM_RAM && index != IO_MEM_ROM
|
||||||
|
&& index != IO_MEM_UNASSIGNED && index != IO_MEM_NOTDIRTY
|
||||||
&& !can_do_io(env)) {
|
&& !can_do_io(env)) {
|
||||||
cpu_io_recompile(env, retaddr);
|
cpu_io_recompile(env, retaddr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue