Revision 2a4188a3
b/cpu-all.h | ||
---|---|---|
828 | 828 |
#define IO_MEM_ROM (1 << IO_MEM_SHIFT) /* hardcoded offset */ |
829 | 829 |
#define IO_MEM_UNASSIGNED (2 << IO_MEM_SHIFT) |
830 | 830 |
#define IO_MEM_NOTDIRTY (4 << IO_MEM_SHIFT) /* used internally, never use directly */ |
831 |
/* acts like a ROM when read and like a device when written. As an |
|
832 |
exception, the write memory callback gets the ram offset instead of |
|
833 |
the physical address */ |
|
834 |
#define IO_MEM_ROMD (1) |
|
831 | 835 |
|
832 | 836 |
typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value); |
833 | 837 |
typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr); |
b/exec-all.h | ||
---|---|---|
570 | 570 |
ldub_code(addr); |
571 | 571 |
} |
572 | 572 |
pd = env->tlb_table[is_user][index].addr_code & ~TARGET_PAGE_MASK; |
573 |
if (pd > IO_MEM_ROM) { |
|
573 |
if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
|
|
574 | 574 |
cpu_abort(env, "Trying to execute code outside RAM or ROM at 0x%08lx\n", addr); |
575 | 575 |
} |
576 | 576 |
return addr + env->tlb_table[is_user][index].addend - (unsigned long)phys_ram_base; |
b/exec.c | ||
---|---|---|
1488 | 1488 |
if (is_softmmu) |
1489 | 1489 |
#endif |
1490 | 1490 |
{ |
1491 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM) { |
|
1491 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
|
|
1492 | 1492 |
/* IO memory case */ |
1493 | 1493 |
address = vaddr | pd; |
1494 | 1494 |
addend = paddr; |
... | ... | |
1785 | 1785 |
for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) { |
1786 | 1786 |
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1); |
1787 | 1787 |
p->phys_offset = phys_offset; |
1788 |
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) |
|
1788 |
if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM || |
|
1789 |
(phys_offset & IO_MEM_ROMD)) |
|
1789 | 1790 |
phys_offset += TARGET_PAGE_SIZE; |
1790 | 1791 |
} |
1791 | 1792 |
} |
... | ... | |
2048 | 2049 |
} |
2049 | 2050 |
} |
2050 | 2051 |
} else { |
2051 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM) { |
|
2052 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && |
|
2053 |
!(pd & IO_MEM_ROMD)) { |
|
2052 | 2054 |
/* I/O case */ |
2053 | 2055 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2054 | 2056 |
if (l >= 4 && ((addr & 3) == 0)) { |
... | ... | |
2103 | 2105 |
} |
2104 | 2106 |
|
2105 | 2107 |
if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM && |
2106 |
(pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM) { |
|
2108 |
(pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM && |
|
2109 |
!(pd & IO_MEM_ROMD)) { |
|
2107 | 2110 |
/* do nothing */ |
2108 | 2111 |
} else { |
2109 | 2112 |
unsigned long addr1; |
... | ... | |
2135 | 2138 |
pd = p->phys_offset; |
2136 | 2139 |
} |
2137 | 2140 |
|
2138 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM) { |
|
2141 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && |
|
2142 |
!(pd & IO_MEM_ROMD)) { |
|
2139 | 2143 |
/* I/O case */ |
2140 | 2144 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2141 | 2145 |
val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr); |
... | ... | |
2164 | 2168 |
pd = p->phys_offset; |
2165 | 2169 |
} |
2166 | 2170 |
|
2167 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM) { |
|
2171 |
if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && |
|
2172 |
!(pd & IO_MEM_ROMD)) { |
|
2168 | 2173 |
/* I/O case */ |
2169 | 2174 |
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
2170 | 2175 |
#ifdef TARGET_WORDS_BIGENDIAN |
Also available in: Unified diff