/* ** ATA Command/Register access dispatcher */ int dev_ata(ata_t *ata, io_insn_t *io) { if(!io->in) ata->last_out = io->port; if(io->port == ATA_STATUS_REG(ata->base)) { if(io->in) return __dev_ata_status(ata, io); else return dev_io_proxify_filter(io, __dev_ata_cmd_filter, ata); } if(io->port == ATA_ALT_STATUS_REG(ata->base)) { if(io->in) return __dev_ata_alt_status(ata, io); else goto __proxify; } if(io->port == ATA_DEVICE_REG(ata->base)) return __dev_ata_device(ata, io); if(io->port == ATA_DATA_REG(ata->base)) return __dev_ata_data(ata, io); if(io->port == ATA_SECT_CNT_REG(ata->base)) return dev_io_proxify_filter(io, __dev_ata_scnt_filter, ata); if(io->port == ATA_LBA_LOW_REG(ata->base) || io->port == ATA_LBA_MID_REG(ata->base) || io->port == ATA_LBA_HIGH_REG(ata->base)) return dev_io_proxify_filter(io, __dev_ata_lba_filter, ata); if(io->port == ATA_ERR_REG(ata->base)) { if(io->in) debug(DEV_ATA, "ata err\n"); else debug(DEV_ATA, "ata feat\n"); goto __proxify; } debug(DEV_ATA, "ata ???\n"); __proxify: return dev_io_proxify(io); }
int dev_sio(io_insn_t *io) { switch(io->port) { case SIO_INDEX: info->vm.dev.sio_filter = __dev_sio_filter_index; break; case SIO_DATA: /* set by sio filter index */ break; default: info->vm.dev.sio_filter = NULL; } return dev_io_proxify_filter(io, info->vm.dev.sio_filter, NULL); }
int dev_pci(io_insn_t *io) { switch(io->port) { case PCI_CONFIG_ADDR: info->vm.dev.pci_filter = __dev_pci_filter_addr; break; case PCI_CONFIG_DATA: /* set by pci filter addr */ break; default : info->vm.dev.pci_filter = NULL; } return dev_io_proxify_filter(io, info->vm.dev.pci_filter, NULL); }