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