Revision 56384e8b exec.c
b/exec.c | ||
---|---|---|
3570 | 3570 |
&subpage_writel, |
3571 | 3571 |
}; |
3572 | 3572 |
|
3573 |
static uint32_t subpage_ram_readb(void *opaque, target_phys_addr_t addr) |
|
3574 |
{ |
|
3575 |
ram_addr_t raddr = addr; |
|
3576 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3577 |
return ldub_p(ptr); |
|
3578 |
} |
|
3579 |
|
|
3580 |
static void subpage_ram_writeb(void *opaque, target_phys_addr_t addr, |
|
3581 |
uint32_t value) |
|
3582 |
{ |
|
3583 |
ram_addr_t raddr = addr; |
|
3584 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3585 |
stb_p(ptr, value); |
|
3586 |
} |
|
3587 |
|
|
3588 |
static uint32_t subpage_ram_readw(void *opaque, target_phys_addr_t addr) |
|
3589 |
{ |
|
3590 |
ram_addr_t raddr = addr; |
|
3591 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3592 |
return lduw_p(ptr); |
|
3593 |
} |
|
3594 |
|
|
3595 |
static void subpage_ram_writew(void *opaque, target_phys_addr_t addr, |
|
3596 |
uint32_t value) |
|
3597 |
{ |
|
3598 |
ram_addr_t raddr = addr; |
|
3599 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3600 |
stw_p(ptr, value); |
|
3601 |
} |
|
3602 |
|
|
3603 |
static uint32_t subpage_ram_readl(void *opaque, target_phys_addr_t addr) |
|
3604 |
{ |
|
3605 |
ram_addr_t raddr = addr; |
|
3606 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3607 |
return ldl_p(ptr); |
|
3608 |
} |
|
3609 |
|
|
3610 |
static void subpage_ram_writel(void *opaque, target_phys_addr_t addr, |
|
3611 |
uint32_t value) |
|
3612 |
{ |
|
3613 |
ram_addr_t raddr = addr; |
|
3614 |
void *ptr = qemu_get_ram_ptr(raddr); |
|
3615 |
stl_p(ptr, value); |
|
3616 |
} |
|
3617 |
|
|
3618 |
static CPUReadMemoryFunc * const subpage_ram_read[] = { |
|
3619 |
&subpage_ram_readb, |
|
3620 |
&subpage_ram_readw, |
|
3621 |
&subpage_ram_readl, |
|
3622 |
}; |
|
3623 |
|
|
3624 |
static CPUWriteMemoryFunc * const subpage_ram_write[] = { |
|
3625 |
&subpage_ram_writeb, |
|
3626 |
&subpage_ram_writew, |
|
3627 |
&subpage_ram_writel, |
|
3628 |
}; |
|
3629 |
|
|
3573 | 3630 |
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
3574 | 3631 |
ram_addr_t memory, ram_addr_t region_offset) |
3575 | 3632 |
{ |
... | ... | |
3583 | 3640 |
printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__, |
3584 | 3641 |
mmio, start, end, idx, eidx, memory); |
3585 | 3642 |
#endif |
3586 |
if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM) |
|
3587 |
memory = IO_MEM_UNASSIGNED; |
|
3643 |
if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM) { |
|
3644 |
memory = IO_MEM_SUBPAGE_RAM; |
|
3645 |
} |
|
3588 | 3646 |
memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); |
3589 | 3647 |
for (; idx <= eidx; idx++) { |
3590 | 3648 |
mmio->sub_io_index[idx] = memory; |
... | ... | |
3817 | 3875 |
cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read, |
3818 | 3876 |
notdirty_mem_write, NULL, |
3819 | 3877 |
DEVICE_NATIVE_ENDIAN); |
3878 |
cpu_register_io_memory_fixed(IO_MEM_SUBPAGE_RAM, subpage_ram_read, |
|
3879 |
subpage_ram_write, NULL, |
|
3880 |
DEVICE_NATIVE_ENDIAN); |
|
3820 | 3881 |
for (i=0; i<5; i++) |
3821 | 3882 |
io_mem_used[i] = 1; |
3822 | 3883 |
|
Also available in: Unified diff