void esp_init(hwaddr espaddr, int it_shift, ESPDMAMemoryReadWriteFunc dma_memory_read, ESPDMAMemoryReadWriteFunc dma_memory_write, void *dma_opaque, qemu_irq irq, qemu_irq *reset, qemu_irq *dma_enable) { DeviceState *dev; SysBusDevice *s; SysBusESPState *sysbus; ESPState *esp; dev = qdev_create(NULL, TYPE_ESP); sysbus = ESP(dev); esp = &sysbus->esp; esp->dma_memory_read = dma_memory_read; esp->dma_memory_write = dma_memory_write; esp->dma_opaque = dma_opaque; sysbus->it_shift = it_shift; /* XXX for now until rc4030 has been changed to use DMA enable signal */ esp->dma_enabled = 1; qdev_init_nofail(dev); s = SYS_BUS_DEVICE(dev); sysbus_connect_irq(s, 0, irq); sysbus_mmio_map(s, 0, espaddr); *reset = qdev_get_gpio_in(dev, 0); *dma_enable = qdev_get_gpio_in(dev, 1); }
void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write) { dev->lsistate = calloc(sizeof(ESPState), 1); ESPState *s = ESP(dev); s->dma_memory_read = read; s->dma_memory_write = write; }
void esp_scsi_reset(DeviceState *dev, void *privdata) { ESPState *s = ESP(dev); esp_soft_reset(s); s->bus.privdata = privdata; s->irq = privdata; s->dma_opaque = privdata; }
static void sysbus_esp_gpio_demux(void *opaque, int irq, int level) { SysBusESPState *sysbus = ESP(opaque); ESPState *s = &sysbus->esp; switch (irq) { case 0: parent_esp_reset(s, irq, level); break; case 1: esp_dma_enable(opaque, irq, level); break; } }
static void sysbus_esp_realize(DeviceState *dev, Error **errp) { SysBusDevice *sbd = SYS_BUS_DEVICE(dev); SysBusESPState *sysbus = ESP(dev); ESPState *s = &sysbus->esp; Error *err = NULL; sysbus_init_irq(sbd, &s->irq); assert(sysbus->it_shift != -1); s->chip_id = TCHI_FAS100A; memory_region_init_io(&sysbus->iomem, OBJECT(sysbus), &sysbus_esp_mem_ops, sysbus, "esp", ESP_REGS << sysbus->it_shift); sysbus_init_mmio(sbd, &sysbus->iomem); qdev_init_gpio_in(dev, sysbus_esp_gpio_demux, 2); scsi_bus_new(&s->bus, sizeof(s->bus), dev, &esp_scsi_info, NULL); scsi_bus_legacy_handle_cmdline(&s->bus, &err); if (err != NULL) { error_propagate(errp, err); return; } }
// TODO: taskswitch handling static void save_state_to_tss32(CPUState *cpu, struct x86_tss_segment32 *tss) { X86CPU *x86_cpu = X86_CPU(cpu); CPUX86State *env = &x86_cpu->env; /* CR3 and ldt selector are not saved intentionally */ tss->eip = EIP(env); tss->eflags = EFLAGS(env); tss->eax = EAX(env); tss->ecx = ECX(env); tss->edx = EDX(env); tss->ebx = EBX(env); tss->esp = ESP(env); tss->ebp = EBP(env); tss->esi = ESI(env); tss->edi = EDI(env); tss->es = vmx_read_segment_selector(cpu, R_ES).sel; tss->cs = vmx_read_segment_selector(cpu, R_CS).sel; tss->ss = vmx_read_segment_selector(cpu, R_SS).sel; tss->ds = vmx_read_segment_selector(cpu, R_DS).sel; tss->fs = vmx_read_segment_selector(cpu, R_FS).sel; tss->gs = vmx_read_segment_selector(cpu, R_GS).sel; }
static void sysbus_esp_hard_reset(DeviceState *dev) { SysBusESPState *sysbus = ESP(dev); esp_hard_reset(&sysbus->esp); }
bool esp_dreq(DeviceState *dev) { ESPState *s = ESP(dev); return s->dma_cb != NULL; }