static uint64_t pcnet_ioport_read(void *opaque, hwaddr addr, unsigned size) { PCNetState *d = opaque; if (addr < 0x10) { if (!BCR_DWIO(d) && size == 1) { return pcnet_aprom_readb(d, addr); } else if (!BCR_DWIO(d) && (addr & 1) == 0 && size == 2) { return pcnet_aprom_readb(d, addr) | (pcnet_aprom_readb(d, addr + 1) << 8); } else if (BCR_DWIO(d) && (addr & 3) == 0 && size == 4) { return pcnet_aprom_readb(d, addr) | (pcnet_aprom_readb(d, addr + 1) << 8) | (pcnet_aprom_readb(d, addr + 2) << 16) | (pcnet_aprom_readb(d, addr + 3) << 24); } } else { if (size == 2) { return pcnet_ioport_readw(d, addr); } else if (size == 4) { return pcnet_ioport_readl(d, addr); } } return ((uint64_t)1 << (size * 8)) - 1; }
static uint64_t pcnet_ioport_read(void *opaque, target_phys_addr_t addr, unsigned size) { PCNetState *d = opaque; if (addr < 16 && size == 1) { return pcnet_aprom_readb(d, addr); } else if (addr >= 0x10 && addr < 0x20 && size == 2) { return pcnet_ioport_readw(d, addr); } else if (addr >= 0x10 && addr < 0x20 && size == 4) { return pcnet_ioport_readl(d, addr); } return ((uint64_t)1 << (size * 8)) - 1; }
static uint32_t pcnet_mmio_readl(void *opaque, target_phys_addr_t addr) { PCNetState *d = opaque; uint32_t val; if (addr & 0x10) val = pcnet_ioport_readl(d, addr & 0x0f); else { addr &= 0x0f; val = pcnet_aprom_readb(d, addr+3); val <<= 8; val |= pcnet_aprom_readb(d, addr+2); val <<= 8; val |= pcnet_aprom_readb(d, addr+1); val <<= 8; val |= pcnet_aprom_readb(d, addr); } #ifdef PCNET_DEBUG_IO printf("pcnet_mmio_readl addr=0x" TARGET_FMT_plx " val=0x%08x\n", addr, val); #endif return val; }