We can stop messing with CPUState directly, as we have special irq in arm_pic
Signed-off-by: Dmitry Eremin-Solenikov <dbarysh...@gmail.com> --- hw/pxa.h | 2 +- hw/pxa2xx.c | 6 ++++-- hw/pxa2xx_gpio.c | 14 +++++--------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/hw/pxa.h b/hw/pxa.h index 7c6fd44..c2dede2 100644 --- a/hw/pxa.h +++ b/hw/pxa.h @@ -72,7 +72,7 @@ void pxa27x_timer_init(target_phys_addr_t base, DeviceState *pic); /* pxa2xx_gpio.c */ DeviceState *pxa2xx_gpio_init(target_phys_addr_t base, - CPUState *env, DeviceState *pic, int lines); + qemu_irq wake_irq, DeviceState *pic, int lines); void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler); /* pxa2xx_dma.c */ diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c index 58e6e7b..bc9542e 100644 --- a/hw/pxa2xx.c +++ b/hw/pxa2xx.c @@ -2106,7 +2106,8 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision) pxa27x_timer_init(0x40a00000, s->pic); - s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121); + s->gpio = pxa2xx_gpio_init(0x40e00000, arm_pic[ARM_PIC_CPU_WAKE], + s->pic, 121); dinfo = drive_get(IF_SD, 0, 0); if (!dinfo) { @@ -2240,7 +2241,8 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) pxa25x_timer_init(0x40a00000, s->pic); - s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85); + s->gpio = pxa2xx_gpio_init(0x40e00000, arm_pic[ARM_PIC_CPU_WAKE], + s->pic, 85); dinfo = drive_get(IF_SD, 0, 0); if (!dinfo) { diff --git a/hw/pxa2xx_gpio.c b/hw/pxa2xx_gpio.c index 16a8865..61d556b 100644 --- a/hw/pxa2xx_gpio.c +++ b/hw/pxa2xx_gpio.c @@ -17,9 +17,8 @@ typedef struct PXA2xxGPIOInfo PXA2xxGPIOInfo; struct PXA2xxGPIOInfo { SysBusDevice busdev; qemu_irq irq0, irq1, irqX; + qemu_irq wake_irq; int lines; - int ncpu; - CPUState *cpu_env; /* XXX: GNU C vectors are more suitable */ uint32_t ilevel[PXA2XX_GPIO_BANKS]; @@ -117,8 +116,7 @@ static void pxa2xx_gpio_set(void *opaque, int line, int level) pxa2xx_gpio_irq_update(s); /* Wake-up GPIOs */ - if (s->cpu_env->halted && (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank])) - cpu_interrupt(s->cpu_env, CPU_INTERRUPT_EXITTB); + qemu_set_irq(s->wake_irq, (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank])); } static void pxa2xx_gpio_handler_update(PXA2xxGPIOInfo *s) { @@ -253,13 +251,12 @@ static CPUWriteMemoryFunc * const pxa2xx_gpio_writefn[] = { }; DeviceState *pxa2xx_gpio_init(target_phys_addr_t base, - CPUState *env, DeviceState *pic, int lines) + qemu_irq wake_irq, DeviceState *pic, int lines) { DeviceState *dev; dev = qdev_create(NULL, "pxa2xx-gpio"); qdev_prop_set_int32(dev, "lines", lines); - qdev_prop_set_int32(dev, "ncpu", env->cpu_index); qdev_init_nofail(dev); sysbus_mmio_map(sysbus_from_qdev(dev), 0, base); @@ -269,6 +266,7 @@ DeviceState *pxa2xx_gpio_init(target_phys_addr_t base, qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1)); sysbus_connect_irq(sysbus_from_qdev(dev), 2, qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X)); + sysbus_connect_irq(sysbus_from_qdev(dev), 3, wake_irq); return dev; } @@ -280,8 +278,6 @@ static int pxa2xx_gpio_initfn(SysBusDevice *dev) s = FROM_SYSBUS(PXA2xxGPIOInfo, dev); - s->cpu_env = qemu_get_cpu(s->ncpu); - qdev_init_gpio_in(&dev->qdev, pxa2xx_gpio_set, s->lines); qdev_init_gpio_out(&dev->qdev, s->handler, s->lines); @@ -292,6 +288,7 @@ static int pxa2xx_gpio_initfn(SysBusDevice *dev) sysbus_init_irq(dev, &s->irq0); sysbus_init_irq(dev, &s->irq1); sysbus_init_irq(dev, &s->irqX); + sysbus_init_irq(dev, &s->wake_irq); return 0; } @@ -331,7 +328,6 @@ static SysBusDeviceInfo pxa2xx_gpio_info = { .qdev.size = sizeof(PXA2xxGPIOInfo), .qdev.props = (Property []) { DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0), - DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0), DEFINE_PROP_END_OF_LIST(), } }; -- 1.7.2.3