Compare commits
	
		
			21 Commits
		
	
	
		
			pull-usb-2
			...
			pull-input
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6575ccddf4 | ||
| 
						 | 
					01df51432e | ||
| 
						 | 
					f22d0af076 | ||
| 
						 | 
					b98d26e333 | ||
| 
						 | 
					f2c1d54c18 | ||
| 
						 | 
					071608b519 | ||
| 
						 | 
					1da90c34c9 | ||
| 
						 | 
					3ff430aa91 | ||
| 
						 | 
					35227e6a09 | ||
| 
						 | 
					e220656ce1 | ||
| 
						 | 
					438528a3e7 | ||
| 
						 | 
					9f5c6d06ad | ||
| 
						 | 
					a005b3ef50 | ||
| 
						 | 
					902c053d83 | ||
| 
						 | 
					09b5e30da5 | ||
| 
						 | 
					2d7d06d847 | ||
| 
						 | 
					cba0e7796b | ||
| 
						 | 
					ce266b75fe | ||
| 
						 | 
					d4a63ac8b1 | ||
| 
						 | 
					3d0db3e74d | ||
| 
						 | 
					e6915b5f3a | 
@@ -1091,6 +1091,7 @@ SPICE
 | 
				
			|||||||
M: Gerd Hoffmann <kraxel@redhat.com>
 | 
					M: Gerd Hoffmann <kraxel@redhat.com>
 | 
				
			||||||
S: Supported
 | 
					S: Supported
 | 
				
			||||||
F: include/ui/qemu-spice.h
 | 
					F: include/ui/qemu-spice.h
 | 
				
			||||||
 | 
					F: include/ui/spice-display.h
 | 
				
			||||||
F: ui/spice-*.c
 | 
					F: ui/spice-*.c
 | 
				
			||||||
F: audio/spiceaudio.c
 | 
					F: audio/spiceaudio.c
 | 
				
			||||||
F: hw/display/qxl*
 | 
					F: hw/display/qxl*
 | 
				
			||||||
@@ -1099,6 +1100,7 @@ Graphics
 | 
				
			|||||||
M: Gerd Hoffmann <kraxel@redhat.com>
 | 
					M: Gerd Hoffmann <kraxel@redhat.com>
 | 
				
			||||||
S: Odd Fixes
 | 
					S: Odd Fixes
 | 
				
			||||||
F: ui/
 | 
					F: ui/
 | 
				
			||||||
 | 
					F: include/ui/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cocoa graphics
 | 
					Cocoa graphics
 | 
				
			||||||
M: Andreas Färber <andreas.faerber@web.de>
 | 
					M: Andreas Färber <andreas.faerber@web.de>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -312,6 +312,21 @@ static bool machine_get_suppress_vmdesc(Object *obj, Error **errp)
 | 
				
			|||||||
    return ms->suppress_vmdesc;
 | 
					    return ms->suppress_vmdesc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void machine_set_enforce_config_section(Object *obj, bool value,
 | 
				
			||||||
 | 
					                                             Error **errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MachineState *ms = MACHINE(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ms->enforce_config_section = value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool machine_get_enforce_config_section(Object *obj, Error **errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MachineState *ms = MACHINE(obj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ms->enforce_config_section;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
 | 
					static int error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    error_report("Option '-device %s' cannot be handled by this machine",
 | 
					    error_report("Option '-device %s' cannot be handled by this machine",
 | 
				
			||||||
@@ -467,6 +482,12 @@ static void machine_initfn(Object *obj)
 | 
				
			|||||||
    object_property_set_description(obj, "suppress-vmdesc",
 | 
					    object_property_set_description(obj, "suppress-vmdesc",
 | 
				
			||||||
                                    "Set on to disable self-describing migration",
 | 
					                                    "Set on to disable self-describing migration",
 | 
				
			||||||
                                    NULL);
 | 
					                                    NULL);
 | 
				
			||||||
 | 
					    object_property_add_bool(obj, "enforce-config-section",
 | 
				
			||||||
 | 
					                             machine_get_enforce_config_section,
 | 
				
			||||||
 | 
					                             machine_set_enforce_config_section, NULL);
 | 
				
			||||||
 | 
					    object_property_set_description(obj, "enforce-config-section",
 | 
				
			||||||
 | 
					                                    "Set on to enforce configuration section migration",
 | 
				
			||||||
 | 
					                                    NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Register notifier when init is done for sysbus sanity checks */
 | 
					    /* Register notifier when init is done for sysbus sanity checks */
 | 
				
			||||||
    ms->sysbus_notifier.notify = machine_init_notify;
 | 
					    ms->sysbus_notifier.notify = machine_init_notify;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,9 +140,9 @@ static void hid_pointer_event(DeviceState *dev, QemuConsole *src,
 | 
				
			|||||||
    case INPUT_EVENT_KIND_BTN:
 | 
					    case INPUT_EVENT_KIND_BTN:
 | 
				
			||||||
        if (evt->u.btn->down) {
 | 
					        if (evt->u.btn->down) {
 | 
				
			||||||
            e->buttons_state |= bmap[evt->u.btn->button];
 | 
					            e->buttons_state |= bmap[evt->u.btn->button];
 | 
				
			||||||
            if (evt->u.btn->button == INPUT_BUTTON_WHEELUP) {
 | 
					            if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) {
 | 
				
			||||||
                e->dz--;
 | 
					                e->dz--;
 | 
				
			||||||
            } else if (evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) {
 | 
					            } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) {
 | 
				
			||||||
                e->dz++;
 | 
					                e->dz++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -406,9 +406,9 @@ static void ps2_mouse_event(DeviceState *dev, QemuConsole *src,
 | 
				
			|||||||
    case INPUT_EVENT_KIND_BTN:
 | 
					    case INPUT_EVENT_KIND_BTN:
 | 
				
			||||||
        if (evt->u.btn->down) {
 | 
					        if (evt->u.btn->down) {
 | 
				
			||||||
            s->mouse_buttons |= bmap[evt->u.btn->button];
 | 
					            s->mouse_buttons |= bmap[evt->u.btn->button];
 | 
				
			||||||
            if (evt->u.btn->button == INPUT_BUTTON_WHEELUP) {
 | 
					            if (evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) {
 | 
				
			||||||
                s->mouse_dz--;
 | 
					                s->mouse_dz--;
 | 
				
			||||||
            } else if (evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) {
 | 
					            } else if (evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) {
 | 
				
			||||||
                s->mouse_dz++;
 | 
					                s->mouse_dz++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,8 +143,8 @@ static const unsigned int keymap_button[INPUT_BUTTON__MAX] = {
 | 
				
			|||||||
    [INPUT_BUTTON_LEFT]              = BTN_LEFT,
 | 
					    [INPUT_BUTTON_LEFT]              = BTN_LEFT,
 | 
				
			||||||
    [INPUT_BUTTON_RIGHT]             = BTN_RIGHT,
 | 
					    [INPUT_BUTTON_RIGHT]             = BTN_RIGHT,
 | 
				
			||||||
    [INPUT_BUTTON_MIDDLE]            = BTN_MIDDLE,
 | 
					    [INPUT_BUTTON_MIDDLE]            = BTN_MIDDLE,
 | 
				
			||||||
    [INPUT_BUTTON_WHEELUP]           = BTN_GEAR_UP,
 | 
					    [INPUT_BUTTON_WHEEL_UP]          = BTN_GEAR_UP,
 | 
				
			||||||
    [INPUT_BUTTON_WHEELDOWN]         = BTN_GEAR_DOWN,
 | 
					    [INPUT_BUTTON_WHEEL_DOWN]        = BTN_GEAR_DOWN,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const unsigned int axismap_rel[INPUT_AXIS__MAX] = {
 | 
					static const unsigned int axismap_rel[INPUT_AXIS__MAX] = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -712,7 +712,7 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum)
 | 
				
			|||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
 | 
					int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ICSState *ics = &icp->ics[src];
 | 
					    ICSState *ics = &icp->ics[src];
 | 
				
			||||||
    int irq;
 | 
					    int irq;
 | 
				
			||||||
@@ -720,14 +720,14 @@ int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
 | 
				
			|||||||
    if (irq_hint) {
 | 
					    if (irq_hint) {
 | 
				
			||||||
        assert(src == xics_find_source(icp, irq_hint));
 | 
					        assert(src == xics_find_source(icp, irq_hint));
 | 
				
			||||||
        if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) {
 | 
					        if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) {
 | 
				
			||||||
            trace_xics_alloc_failed_hint(src, irq_hint);
 | 
					            error_setg(errp, "can't allocate IRQ %d: already in use", irq_hint);
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        irq = irq_hint;
 | 
					        irq = irq_hint;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        irq = ics_find_free_block(ics, 1, 1);
 | 
					        irq = ics_find_free_block(ics, 1, 1);
 | 
				
			||||||
        if (irq < 0) {
 | 
					        if (irq < 0) {
 | 
				
			||||||
            trace_xics_alloc_failed_no_left(src);
 | 
					            error_setg(errp, "can't allocate IRQ: no IRQ left");
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        irq += ics->offset;
 | 
					        irq += ics->offset;
 | 
				
			||||||
@@ -743,7 +743,8 @@ int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi)
 | 
				
			|||||||
 * Allocate block of consecutive IRQs, and return the number of the first IRQ in the block.
 | 
					 * Allocate block of consecutive IRQs, and return the number of the first IRQ in the block.
 | 
				
			||||||
 * If align==true, aligns the first IRQ number to num.
 | 
					 * If align==true, aligns the first IRQ number to num.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
 | 
					int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align,
 | 
				
			||||||
 | 
					                     Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i, first = -1;
 | 
					    int i, first = -1;
 | 
				
			||||||
    ICSState *ics = &icp->ics[src];
 | 
					    ICSState *ics = &icp->ics[src];
 | 
				
			||||||
@@ -763,6 +764,10 @@ int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align)
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        first = ics_find_free_block(ics, num, 1);
 | 
					        first = ics_find_free_block(ics, num, 1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (first < 0) {
 | 
				
			||||||
 | 
					        error_setg(errp, "can't find a free %d-IRQ block", num);
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (first >= 0) {
 | 
					    if (first >= 0) {
 | 
				
			||||||
        for (i = first; i < first + num; ++i) {
 | 
					        for (i = first; i < first + num; ++i) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -557,11 +557,13 @@ void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    DBDMA_DPRINTF("DBDMA_register_channel 0x%x\n", nchan);
 | 
					    DBDMA_DPRINTF("DBDMA_register_channel 0x%x\n", nchan);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(rw);
 | 
				
			||||||
 | 
					    assert(flush);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ch->irq = irq;
 | 
					    ch->irq = irq;
 | 
				
			||||||
    ch->rw = rw;
 | 
					    ch->rw = rw;
 | 
				
			||||||
    ch->flush = flush;
 | 
					    ch->flush = flush;
 | 
				
			||||||
    ch->io.opaque = opaque;
 | 
					    ch->io.opaque = opaque;
 | 
				
			||||||
    ch->io.channel = ch;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@@ -775,6 +777,20 @@ static void dbdma_reset(void *opaque)
 | 
				
			|||||||
        memset(s->channels[i].regs, 0, DBDMA_SIZE);
 | 
					        memset(s->channels[i].regs, 0, DBDMA_SIZE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void dbdma_unassigned_rw(DBDMA_io *io)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DBDMA_channel *ch = io->channel;
 | 
				
			||||||
 | 
					    qemu_log_mask(LOG_GUEST_ERROR, "%s: use of unassigned channel %d\n",
 | 
				
			||||||
 | 
					                  __func__, ch->channel);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void dbdma_unassigned_flush(DBDMA_io *io)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DBDMA_channel *ch = io->channel;
 | 
				
			||||||
 | 
					    qemu_log_mask(LOG_GUEST_ERROR, "%s: use of unassigned channel %d\n",
 | 
				
			||||||
 | 
					                  __func__, ch->channel);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void* DBDMA_init (MemoryRegion **dbdma_mem)
 | 
					void* DBDMA_init (MemoryRegion **dbdma_mem)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DBDMAState *s;
 | 
					    DBDMAState *s;
 | 
				
			||||||
@@ -784,8 +800,13 @@ void* DBDMA_init (MemoryRegion **dbdma_mem)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < DBDMA_CHANNELS; i++) {
 | 
					    for (i = 0; i < DBDMA_CHANNELS; i++) {
 | 
				
			||||||
        DBDMA_io *io = &s->channels[i].io;
 | 
					        DBDMA_io *io = &s->channels[i].io;
 | 
				
			||||||
 | 
					        DBDMA_channel *ch = &s->channels[i];
 | 
				
			||||||
        qemu_iovec_init(&io->iov, 1);
 | 
					        qemu_iovec_init(&io->iov, 1);
 | 
				
			||||||
        s->channels[i].channel = i;
 | 
					
 | 
				
			||||||
 | 
					        ch->rw = dbdma_unassigned_rw;
 | 
				
			||||||
 | 
					        ch->flush = dbdma_unassigned_flush;
 | 
				
			||||||
 | 
					        ch->channel = i;
 | 
				
			||||||
 | 
					        ch->io.channel = ch;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memory_region_init_io(&s->mem, NULL, &dbdma_ops, s, "dbdma", 0x1000);
 | 
					    memory_region_init_io(&s->mem, NULL, &dbdma_ops, s, "dbdma", 0x1000);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -778,17 +778,19 @@ FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase,
 | 
				
			|||||||
    DeviceState *dev;
 | 
					    DeviceState *dev;
 | 
				
			||||||
    FWCfgState *s;
 | 
					    FWCfgState *s;
 | 
				
			||||||
    uint32_t version = FW_CFG_VERSION;
 | 
					    uint32_t version = FW_CFG_VERSION;
 | 
				
			||||||
    bool dma_enabled = dma_iobase && dma_as;
 | 
					    bool dma_requested = dma_iobase && dma_as;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_create(NULL, TYPE_FW_CFG_IO);
 | 
					    dev = qdev_create(NULL, TYPE_FW_CFG_IO);
 | 
				
			||||||
    qdev_prop_set_uint32(dev, "iobase", iobase);
 | 
					    qdev_prop_set_uint32(dev, "iobase", iobase);
 | 
				
			||||||
    qdev_prop_set_uint32(dev, "dma_iobase", dma_iobase);
 | 
					    qdev_prop_set_uint32(dev, "dma_iobase", dma_iobase);
 | 
				
			||||||
    qdev_prop_set_bit(dev, "dma_enabled", dma_enabled);
 | 
					    if (!dma_requested) {
 | 
				
			||||||
 | 
					        qdev_prop_set_bit(dev, "dma_enabled", false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fw_cfg_init1(dev);
 | 
					    fw_cfg_init1(dev);
 | 
				
			||||||
    s = FW_CFG(dev);
 | 
					    s = FW_CFG(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (dma_enabled) {
 | 
					    if (s->dma_enabled) {
 | 
				
			||||||
        /* 64 bits for the address field */
 | 
					        /* 64 bits for the address field */
 | 
				
			||||||
        s->dma_as = dma_as;
 | 
					        s->dma_as = dma_as;
 | 
				
			||||||
        s->dma_addr = 0;
 | 
					        s->dma_addr = 0;
 | 
				
			||||||
@@ -814,11 +816,13 @@ FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr,
 | 
				
			|||||||
    SysBusDevice *sbd;
 | 
					    SysBusDevice *sbd;
 | 
				
			||||||
    FWCfgState *s;
 | 
					    FWCfgState *s;
 | 
				
			||||||
    uint32_t version = FW_CFG_VERSION;
 | 
					    uint32_t version = FW_CFG_VERSION;
 | 
				
			||||||
    bool dma_enabled = dma_addr && dma_as;
 | 
					    bool dma_requested = dma_addr && dma_as;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_create(NULL, TYPE_FW_CFG_MEM);
 | 
					    dev = qdev_create(NULL, TYPE_FW_CFG_MEM);
 | 
				
			||||||
    qdev_prop_set_uint32(dev, "data_width", data_width);
 | 
					    qdev_prop_set_uint32(dev, "data_width", data_width);
 | 
				
			||||||
    qdev_prop_set_bit(dev, "dma_enabled", dma_enabled);
 | 
					    if (!dma_requested) {
 | 
				
			||||||
 | 
					        qdev_prop_set_bit(dev, "dma_enabled", false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fw_cfg_init1(dev);
 | 
					    fw_cfg_init1(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -828,7 +832,7 @@ FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    s = FW_CFG(dev);
 | 
					    s = FW_CFG(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (dma_enabled) {
 | 
					    if (s->dma_enabled) {
 | 
				
			||||||
        s->dma_as = dma_as;
 | 
					        s->dma_as = dma_as;
 | 
				
			||||||
        s->dma_addr = 0;
 | 
					        s->dma_addr = 0;
 | 
				
			||||||
        sysbus_mmio_map(sbd, 2, dma_addr);
 | 
					        sysbus_mmio_map(sbd, 2, dma_addr);
 | 
				
			||||||
@@ -873,7 +877,7 @@ static Property fw_cfg_io_properties[] = {
 | 
				
			|||||||
    DEFINE_PROP_UINT32("iobase", FWCfgIoState, iobase, -1),
 | 
					    DEFINE_PROP_UINT32("iobase", FWCfgIoState, iobase, -1),
 | 
				
			||||||
    DEFINE_PROP_UINT32("dma_iobase", FWCfgIoState, dma_iobase, -1),
 | 
					    DEFINE_PROP_UINT32("dma_iobase", FWCfgIoState, dma_iobase, -1),
 | 
				
			||||||
    DEFINE_PROP_BOOL("dma_enabled", FWCfgIoState, parent_obj.dma_enabled,
 | 
					    DEFINE_PROP_BOOL("dma_enabled", FWCfgIoState, parent_obj.dma_enabled,
 | 
				
			||||||
                     false),
 | 
					                     true),
 | 
				
			||||||
    DEFINE_PROP_END_OF_LIST(),
 | 
					    DEFINE_PROP_END_OF_LIST(),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -913,7 +917,7 @@ static const TypeInfo fw_cfg_io_info = {
 | 
				
			|||||||
static Property fw_cfg_mem_properties[] = {
 | 
					static Property fw_cfg_mem_properties[] = {
 | 
				
			||||||
    DEFINE_PROP_UINT32("data_width", FWCfgMemState, data_width, -1),
 | 
					    DEFINE_PROP_UINT32("data_width", FWCfgMemState, data_width, -1),
 | 
				
			||||||
    DEFINE_PROP_BOOL("dma_enabled", FWCfgMemState, parent_obj.dma_enabled,
 | 
					    DEFINE_PROP_BOOL("dma_enabled", FWCfgMemState, parent_obj.dma_enabled,
 | 
				
			||||||
                     false),
 | 
					                     true),
 | 
				
			||||||
    DEFINE_PROP_END_OF_LIST(),
 | 
					    DEFINE_PROP_END_OF_LIST(),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2427,6 +2427,7 @@ static void spapr_machine_2_3_instance_options(MachineState *machine)
 | 
				
			|||||||
    spapr_machine_2_4_instance_options(machine);
 | 
					    spapr_machine_2_4_instance_options(machine);
 | 
				
			||||||
    savevm_skip_section_footers();
 | 
					    savevm_skip_section_footers();
 | 
				
			||||||
    global_state_set_optional();
 | 
					    global_state_set_optional();
 | 
				
			||||||
 | 
					    savevm_skip_configuration();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void spapr_machine_2_3_class_options(MachineClass *mc)
 | 
					static void spapr_machine_2_3_class_options(MachineClass *mc)
 | 
				
			||||||
@@ -2452,6 +2453,7 @@ DEFINE_SPAPR_MACHINE(2_3, "2.3", false);
 | 
				
			|||||||
static void spapr_machine_2_2_instance_options(MachineState *machine)
 | 
					static void spapr_machine_2_2_instance_options(MachineState *machine)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    spapr_machine_2_3_instance_options(machine);
 | 
					    spapr_machine_2_3_instance_options(machine);
 | 
				
			||||||
 | 
					    machine->suppress_vmdesc = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void spapr_machine_2_2_class_options(MachineClass *mc)
 | 
					static void spapr_machine_2_2_class_options(MachineClass *mc)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -588,7 +588,8 @@ out_no_events:
 | 
				
			|||||||
void spapr_events_init(sPAPRMachineState *spapr)
 | 
					void spapr_events_init(sPAPRMachineState *spapr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QTAILQ_INIT(&spapr->pending_events);
 | 
					    QTAILQ_INIT(&spapr->pending_events);
 | 
				
			||||||
    spapr->check_exception_irq = xics_alloc(spapr->icp, 0, 0, false);
 | 
					    spapr->check_exception_irq = xics_alloc(spapr->icp, 0, 0, false,
 | 
				
			||||||
 | 
					                                            &error_fatal);
 | 
				
			||||||
    spapr->epow_notifier.notify = spapr_powerdown_req;
 | 
					    spapr->epow_notifier.notify = spapr_powerdown_req;
 | 
				
			||||||
    qemu_register_powerdown_notifier(&spapr->epow_notifier);
 | 
					    qemu_register_powerdown_notifier(&spapr->epow_notifier);
 | 
				
			||||||
    spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception",
 | 
					    spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -275,11 +275,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			|||||||
    unsigned int req_num = rtas_ld(args, 4); /* 0 == remove all */
 | 
					    unsigned int req_num = rtas_ld(args, 4); /* 0 == remove all */
 | 
				
			||||||
    unsigned int seq_num = rtas_ld(args, 5);
 | 
					    unsigned int seq_num = rtas_ld(args, 5);
 | 
				
			||||||
    unsigned int ret_intr_type;
 | 
					    unsigned int ret_intr_type;
 | 
				
			||||||
    unsigned int irq, max_irqs = 0, num = 0;
 | 
					    unsigned int irq, max_irqs = 0;
 | 
				
			||||||
    sPAPRPHBState *phb = NULL;
 | 
					    sPAPRPHBState *phb = NULL;
 | 
				
			||||||
    PCIDevice *pdev = NULL;
 | 
					    PCIDevice *pdev = NULL;
 | 
				
			||||||
    spapr_pci_msi *msi;
 | 
					    spapr_pci_msi *msi;
 | 
				
			||||||
    int *config_addr_key;
 | 
					    int *config_addr_key;
 | 
				
			||||||
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (func) {
 | 
					    switch (func) {
 | 
				
			||||||
    case RTAS_CHANGE_MSI_FN:
 | 
					    case RTAS_CHANGE_MSI_FN:
 | 
				
			||||||
@@ -305,9 +306,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Releasing MSIs */
 | 
					    /* Releasing MSIs */
 | 
				
			||||||
    if (!req_num) {
 | 
					    if (!req_num) {
 | 
				
			||||||
        msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
 | 
					 | 
				
			||||||
        if (!msi) {
 | 
					        if (!msi) {
 | 
				
			||||||
            trace_spapr_pci_msi("Releasing wrong config", config_addr);
 | 
					            trace_spapr_pci_msi("Releasing wrong config", config_addr);
 | 
				
			||||||
            rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
 | 
					            rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
 | 
				
			||||||
@@ -316,10 +318,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        xics_free(spapr->icp, msi->first_irq, msi->num);
 | 
					        xics_free(spapr->icp, msi->first_irq, msi->num);
 | 
				
			||||||
        if (msi_present(pdev)) {
 | 
					        if (msi_present(pdev)) {
 | 
				
			||||||
            spapr_msi_setmsg(pdev, 0, false, 0, num);
 | 
					            spapr_msi_setmsg(pdev, 0, false, 0, 0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (msix_present(pdev)) {
 | 
					        if (msix_present(pdev)) {
 | 
				
			||||||
            spapr_msi_setmsg(pdev, 0, true, 0, num);
 | 
					            spapr_msi_setmsg(pdev, 0, true, 0, 0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        g_hash_table_remove(phb->msi, &config_addr);
 | 
					        g_hash_table_remove(phb->msi, &config_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -353,13 +355,20 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* Allocate MSIs */
 | 
					    /* Allocate MSIs */
 | 
				
			||||||
    irq = xics_alloc_block(spapr->icp, 0, req_num, false,
 | 
					    irq = xics_alloc_block(spapr->icp, 0, req_num, false,
 | 
				
			||||||
                           ret_intr_type == RTAS_TYPE_MSI);
 | 
					                           ret_intr_type == RTAS_TYPE_MSI, &err);
 | 
				
			||||||
    if (!irq) {
 | 
					    if (err) {
 | 
				
			||||||
        error_report("Cannot allocate MSIs for device %x", config_addr);
 | 
					        error_reportf_err(err, "Can't allocate MSIs for device %x: ",
 | 
				
			||||||
 | 
					                          config_addr);
 | 
				
			||||||
        rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
 | 
					        rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Release previous MSIs */
 | 
				
			||||||
 | 
					    if (msi) {
 | 
				
			||||||
 | 
					        xics_free(spapr->icp, msi->first_irq, msi->num);
 | 
				
			||||||
 | 
					        g_hash_table_remove(phb->msi, &config_addr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Setup MSI/MSIX vectors in the device (via cfgspace or MSIX BAR) */
 | 
					    /* Setup MSI/MSIX vectors in the device (via cfgspace or MSIX BAR) */
 | 
				
			||||||
    spapr_msi_setmsg(pdev, SPAPR_PCI_MSI_WINDOW, ret_intr_type == RTAS_TYPE_MSIX,
 | 
					    spapr_msi_setmsg(pdev, SPAPR_PCI_MSI_WINDOW, ret_intr_type == RTAS_TYPE_MSIX,
 | 
				
			||||||
                     irq, req_num);
 | 
					                     irq, req_num);
 | 
				
			||||||
@@ -1360,10 +1369,12 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
    /* Initialize the LSI table */
 | 
					    /* Initialize the LSI table */
 | 
				
			||||||
    for (i = 0; i < PCI_NUM_PINS; i++) {
 | 
					    for (i = 0; i < PCI_NUM_PINS; i++) {
 | 
				
			||||||
        uint32_t irq;
 | 
					        uint32_t irq;
 | 
				
			||||||
 | 
					        Error *local_err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        irq = xics_alloc_block(spapr->icp, 0, 1, true, false);
 | 
					        irq = xics_alloc_block(spapr->icp, 0, 1, true, false, &local_err);
 | 
				
			||||||
        if (!irq) {
 | 
					        if (local_err) {
 | 
				
			||||||
            error_setg(errp, "spapr_allocate_lsi failed");
 | 
					            error_propagate(errp, local_err);
 | 
				
			||||||
 | 
					            error_prepend(errp, "can't allocate LSIs: ");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -170,6 +170,7 @@ static void spapr_rng_class_init(ObjectClass *oc, void *data)
 | 
				
			|||||||
    dc->realize = spapr_rng_realize;
 | 
					    dc->realize = spapr_rng_realize;
 | 
				
			||||||
    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 | 
					    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
 | 
				
			||||||
    dc->props = spapr_rng_properties;
 | 
					    dc->props = spapr_rng_properties;
 | 
				
			||||||
 | 
					    dc->hotpluggable = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const TypeInfo spapr_rng_info = {
 | 
					static const TypeInfo spapr_rng_info = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -431,6 +431,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
 | 
				
			|||||||
    VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
 | 
					    VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
 | 
				
			||||||
    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 | 
					    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 | 
				
			||||||
    char *id;
 | 
					    char *id;
 | 
				
			||||||
 | 
					    Error *local_err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (dev->reg != -1) {
 | 
					    if (dev->reg != -1) {
 | 
				
			||||||
        /*
 | 
					        /*
 | 
				
			||||||
@@ -463,9 +464,9 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
 | 
				
			|||||||
        dev->qdev.id = id;
 | 
					        dev->qdev.id = id;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev->irq = xics_alloc(spapr->icp, 0, dev->irq, false);
 | 
					    dev->irq = xics_alloc(spapr->icp, 0, dev->irq, false, &local_err);
 | 
				
			||||||
    if (!dev->irq) {
 | 
					    if (local_err) {
 | 
				
			||||||
        error_setg(errp, "can't allocate IRQ");
 | 
					        error_propagate(errp, local_err);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,6 +127,7 @@ struct MachineState {
 | 
				
			|||||||
    char *firmware;
 | 
					    char *firmware;
 | 
				
			||||||
    bool iommu;
 | 
					    bool iommu;
 | 
				
			||||||
    bool suppress_vmdesc;
 | 
					    bool suppress_vmdesc;
 | 
				
			||||||
 | 
					    bool enforce_config_section;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ram_addr_t ram_size;
 | 
					    ram_addr_t ram_size;
 | 
				
			||||||
    ram_addr_t maxram_size;
 | 
					    ram_addr_t maxram_size;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,6 +42,14 @@
 | 
				
			|||||||
        .driver   = "virtio-pci",\
 | 
					        .driver   = "virtio-pci",\
 | 
				
			||||||
        .property = "migrate-extra",\
 | 
					        .property = "migrate-extra",\
 | 
				
			||||||
        .value    = "off",\
 | 
					        .value    = "off",\
 | 
				
			||||||
 | 
					    },{\
 | 
				
			||||||
 | 
					        .driver   = "fw_cfg_mem",\
 | 
				
			||||||
 | 
					        .property = "dma_enabled",\
 | 
				
			||||||
 | 
					        .value    = "off",\
 | 
				
			||||||
 | 
					    },{\
 | 
				
			||||||
 | 
					        .driver   = "fw_cfg_io",\
 | 
				
			||||||
 | 
					        .property = "dma_enabled",\
 | 
				
			||||||
 | 
					        .value    = "off",\
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HW_COMPAT_2_3 \
 | 
					#define HW_COMPAT_2_3 \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -161,8 +161,9 @@ struct ICSIRQState {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
qemu_irq xics_get_qirq(XICSState *icp, int irq);
 | 
					qemu_irq xics_get_qirq(XICSState *icp, int irq);
 | 
				
			||||||
void xics_set_irq_type(XICSState *icp, int irq, bool lsi);
 | 
					void xics_set_irq_type(XICSState *icp, int irq, bool lsi);
 | 
				
			||||||
int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi);
 | 
					int xics_alloc(XICSState *icp, int src, int irq_hint, bool lsi, Error **errp);
 | 
				
			||||||
int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align);
 | 
					int xics_alloc_block(XICSState *icp, int src, int num, bool lsi, bool align,
 | 
				
			||||||
 | 
					                     Error **errp);
 | 
				
			||||||
void xics_free(XICSState *icp, int irq, int num);
 | 
					void xics_free(XICSState *icp, int irq, int num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
 | 
					void xics_cpu_setup(XICSState *icp, PowerPCCPU *cpu);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -378,6 +378,8 @@ void graphic_hw_gl_block(QemuConsole *con, bool block);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
QemuConsole *qemu_console_lookup_by_index(unsigned int index);
 | 
					QemuConsole *qemu_console_lookup_by_index(unsigned int index);
 | 
				
			||||||
QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
 | 
					QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
 | 
				
			||||||
 | 
					QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
 | 
				
			||||||
 | 
					                                                uint32_t head, Error **errp);
 | 
				
			||||||
bool qemu_console_is_visible(QemuConsole *con);
 | 
					bool qemu_console_is_visible(QemuConsole *con);
 | 
				
			||||||
bool qemu_console_is_graphic(QemuConsole *con);
 | 
					bool qemu_console_is_graphic(QemuConsole *con);
 | 
				
			||||||
bool qemu_console_is_fixedsize(QemuConsole *con);
 | 
					bool qemu_console_is_fixedsize(QemuConsole *con);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
#include "sysemu/sysemu.h"
 | 
					#include "sysemu/sysemu.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_OPENGL_DMABUF)
 | 
					#if defined(CONFIG_OPENGL_DMABUF)
 | 
				
			||||||
# if SPICE_SERVER_VERSION >= 0x000d00 /* release 0.13.0 */
 | 
					# if SPICE_SERVER_VERSION >= 0x000d01 /* release 0.13.1 */
 | 
				
			||||||
#  define HAVE_SPICE_GL 1
 | 
					#  define HAVE_SPICE_GL 1
 | 
				
			||||||
#  include "ui/egl-helpers.h"
 | 
					#  include "ui/egl-helpers.h"
 | 
				
			||||||
#  include "ui/egl-context.h"
 | 
					#  include "ui/egl-context.h"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -878,13 +878,19 @@ bool qemu_savevm_state_blocked(Error **errp)
 | 
				
			|||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool enforce_config_section(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MachineState *machine = MACHINE(qdev_get_machine());
 | 
				
			||||||
 | 
					    return machine->enforce_config_section;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qemu_savevm_state_header(QEMUFile *f)
 | 
					void qemu_savevm_state_header(QEMUFile *f)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    trace_savevm_state_header();
 | 
					    trace_savevm_state_header();
 | 
				
			||||||
    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
 | 
					    qemu_put_be32(f, QEMU_VM_FILE_MAGIC);
 | 
				
			||||||
    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
 | 
					    qemu_put_be32(f, QEMU_VM_FILE_VERSION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!savevm_state.skip_configuration) {
 | 
					    if (!savevm_state.skip_configuration || enforce_config_section()) {
 | 
				
			||||||
        qemu_put_byte(f, QEMU_VM_CONFIGURATION);
 | 
					        qemu_put_byte(f, QEMU_VM_CONFIGURATION);
 | 
				
			||||||
        vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
 | 
					        vmstate_save_state(f, &vmstate_configuration, &savevm_state, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1883,7 +1889,7 @@ int qemu_loadvm_state(QEMUFile *f)
 | 
				
			|||||||
        return -ENOTSUP;
 | 
					        return -ENOTSUP;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!savevm_state.skip_configuration) {
 | 
					    if (!savevm_state.skip_configuration || enforce_config_section()) {
 | 
				
			||||||
        if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
 | 
					        if (qemu_get_byte(f) != QEMU_VM_CONFIGURATION) {
 | 
				
			||||||
            error_report("Configuration section missing");
 | 
					            error_report("Configuration section missing");
 | 
				
			||||||
            return -EINVAL;
 | 
					            return -EINVAL;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1375,7 +1375,7 @@ static void hmp_mouse_move(Monitor *mon, const QDict *qdict)
 | 
				
			|||||||
    if (dz_str) {
 | 
					    if (dz_str) {
 | 
				
			||||||
        dz = strtol(dz_str, NULL, 0);
 | 
					        dz = strtol(dz_str, NULL, 0);
 | 
				
			||||||
        if (dz != 0) {
 | 
					        if (dz != 0) {
 | 
				
			||||||
            button = (dz > 0) ? INPUT_BUTTON_WHEELUP : INPUT_BUTTON_WHEELDOWN;
 | 
					            button = (dz > 0) ? INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
 | 
				
			||||||
            qemu_input_queue_btn(NULL, button, true);
 | 
					            qemu_input_queue_btn(NULL, button, true);
 | 
				
			||||||
            qemu_input_event_sync();
 | 
					            qemu_input_event_sync();
 | 
				
			||||||
            qemu_input_queue_btn(NULL, button, false);
 | 
					            qemu_input_queue_btn(NULL, button, false);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3743,12 +3743,9 @@
 | 
				
			|||||||
# Button of a pointer input device (mouse, tablet).
 | 
					# Button of a pointer input device (mouse, tablet).
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Since: 2.0
 | 
					# Since: 2.0
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note that the spelling of these values may change when the
 | 
					 | 
				
			||||||
# x-input-send-event is promoted out of experimental status.
 | 
					 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'enum'  : 'InputButton',
 | 
					{ 'enum'  : 'InputButton',
 | 
				
			||||||
  'data'  : [ 'Left', 'Middle', 'Right', 'WheelUp', 'WheelDown' ] }
 | 
					  'data'  : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down' ] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# @InputAxis
 | 
					# @InputAxis
 | 
				
			||||||
@@ -3756,12 +3753,9 @@
 | 
				
			|||||||
# Position axis of a pointer input device (mouse, tablet).
 | 
					# Position axis of a pointer input device (mouse, tablet).
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Since: 2.0
 | 
					# Since: 2.0
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note that the spelling of these values may change when the
 | 
					 | 
				
			||||||
# x-input-send-event is promoted out of experimental status.
 | 
					 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'enum'  : 'InputAxis',
 | 
					{ 'enum'  : 'InputAxis',
 | 
				
			||||||
  'data'  : [ 'X', 'Y' ] }
 | 
					  'data'  : [ 'x', 'y' ] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# @InputKeyEvent
 | 
					# @InputKeyEvent
 | 
				
			||||||
@@ -3825,38 +3819,34 @@
 | 
				
			|||||||
              'abs'     : 'InputMoveEvent' } }
 | 
					              'abs'     : 'InputMoveEvent' } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# @x-input-send-event
 | 
					# @input-send-event
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Send input event(s) to guest.
 | 
					# Send input event(s) to guest.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# @console: #optional console to send event(s) to.
 | 
					# @device: #optional display device to send event(s) to.
 | 
				
			||||||
#           This parameter can be used to send the input event to
 | 
					# @head: #optional head to send event(s) to, in case the
 | 
				
			||||||
#           specific input devices in case (a) multiple input devices
 | 
					#        display device supports multiple scanouts.
 | 
				
			||||||
#           of the same kind are added to the virtual machine and (b)
 | 
					 | 
				
			||||||
#           you have configured input routing (see docs/multiseat.txt)
 | 
					 | 
				
			||||||
#           for those input devices.  If input routing is not
 | 
					 | 
				
			||||||
#           configured this parameter has no effect.
 | 
					 | 
				
			||||||
#           If @console is missing, only devices that aren't associated
 | 
					 | 
				
			||||||
#           with a console are admissible.
 | 
					 | 
				
			||||||
#           If @console is specified, it must exist, and both devices
 | 
					 | 
				
			||||||
#           associated with that console and devices not associated with a
 | 
					 | 
				
			||||||
#           console are admissible, but the former take precedence.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# @events: List of InputEvent union.
 | 
					# @events: List of InputEvent union.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Returns: Nothing on success.
 | 
					# Returns: Nothing on success.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Since: 2.2
 | 
					# The @display and @head parameters can be used to send the input
 | 
				
			||||||
#
 | 
					# event to specific input devices in case (a) multiple input devices
 | 
				
			||||||
# Note: this command is experimental, and not a stable API.  Things that
 | 
					# of the same kind are added to the virtual machine and (b) you have
 | 
				
			||||||
# might change before it becomes stable include the spelling of enum
 | 
					# configured input routing (see docs/multiseat.txt) for those input
 | 
				
			||||||
# values for InputButton and InputAxis, and the notion of how to designate
 | 
					# devices.  The parameters work exactly like the device and head
 | 
				
			||||||
# which console will receive the event.
 | 
					# properties of input devices.  If @device is missing, only devices
 | 
				
			||||||
 | 
					# that have no input routing config are admissible.  If @device is
 | 
				
			||||||
 | 
					# specified, both input devices with and without input routing config
 | 
				
			||||||
 | 
					# are admissible, but devices with input routing config take
 | 
				
			||||||
 | 
					# precedence.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					# Since: 2.6
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'command': 'x-input-send-event',
 | 
					{ 'command': 'input-send-event',
 | 
				
			||||||
  'data': { '*console':'int', 'events': [ 'InputEvent' ] } }
 | 
					  'data': { '*device': 'str',
 | 
				
			||||||
 | 
					            '*head'  : 'int',
 | 
				
			||||||
 | 
					            'events' : [ 'InputEvent' ] } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
# @NumaOptions
 | 
					# @NumaOptions
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
 | 
				
			|||||||
    "                aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n"
 | 
					    "                aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n"
 | 
				
			||||||
    "                dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n"
 | 
					    "                dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n"
 | 
				
			||||||
    "                suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
 | 
					    "                suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
 | 
				
			||||||
    "                nvdimm=on|off controls NVDIMM support (default=off)\n",
 | 
					    "                nvdimm=on|off controls NVDIMM support (default=off)\n"
 | 
				
			||||||
 | 
					    "                enforce-config-section=on|off enforce configuration section migration (default=off)\n",
 | 
				
			||||||
    QEMU_ARCH_ALL)
 | 
					    QEMU_ARCH_ALL)
 | 
				
			||||||
STEXI
 | 
					STEXI
 | 
				
			||||||
@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
 | 
					@item -machine [type=]@var{name}[,prop=@var{value}[,...]]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4658,21 +4658,22 @@ Example:
 | 
				
			|||||||
EQMP
 | 
					EQMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        .name       = "x-input-send-event",
 | 
					        .name       = "input-send-event",
 | 
				
			||||||
        .args_type  = "console:i?,events:q",
 | 
					        .args_type  = "console:i?,events:q",
 | 
				
			||||||
        .mhandler.cmd_new = qmp_marshal_x_input_send_event,
 | 
					        .mhandler.cmd_new = qmp_marshal_input_send_event,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SQMP
 | 
					SQMP
 | 
				
			||||||
@x-input-send-event
 | 
					@input-send-event
 | 
				
			||||||
-----------------
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Send input event to guest.
 | 
					Send input event to guest.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Arguments:
 | 
					Arguments:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- "console": console index. (json-int, optional)
 | 
					- "device": display device (json-string, optional)
 | 
				
			||||||
- "events": list of input events.
 | 
					- "head": display head (json-int, optional)
 | 
				
			||||||
 | 
					- "events": list of input events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The consoles are visible in the qom tree, under
 | 
					The consoles are visible in the qom tree, under
 | 
				
			||||||
/backend/console[$index]. They have a device link and head property, so
 | 
					/backend/console[$index]. They have a device link and head property, so
 | 
				
			||||||
@@ -4684,24 +4685,24 @@ Example (1):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Press left mouse button.
 | 
					Press left mouse button.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-> { "execute": "x-input-send-event",
 | 
					-> { "execute": "input-send-event",
 | 
				
			||||||
    "arguments": { "console": 0,
 | 
					    "arguments": { "device": "video0",
 | 
				
			||||||
                   "events": [ { "type": "btn",
 | 
					                   "events": [ { "type": "btn",
 | 
				
			||||||
                    "data" : { "down": true, "button": "Left" } } ] } }
 | 
					                   "data" : { "down": true, "button": "left" } } ] } }
 | 
				
			||||||
<- { "return": {} }
 | 
					<- { "return": {} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-> { "execute": "x-input-send-event",
 | 
					-> { "execute": "input-send-event",
 | 
				
			||||||
    "arguments": { "console": 0,
 | 
					    "arguments": { "device": "video0",
 | 
				
			||||||
                   "events": [ { "type": "btn",
 | 
					                   "events": [ { "type": "btn",
 | 
				
			||||||
                    "data" : { "down": false, "button": "Left" } } ] } }
 | 
					                   "data" : { "down": false, "button": "left" } } ] } }
 | 
				
			||||||
<- { "return": {} }
 | 
					<- { "return": {} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example (2):
 | 
					Example (2):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Press ctrl-alt-del.
 | 
					Press ctrl-alt-del.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-> { "execute": "x-input-send-event",
 | 
					-> { "execute": "input-send-event",
 | 
				
			||||||
     "arguments": { "console": 0, "events": [
 | 
					     "arguments": { "events": [
 | 
				
			||||||
        { "type": "key", "data" : { "down": true,
 | 
					        { "type": "key", "data" : { "down": true,
 | 
				
			||||||
          "key": {"type": "qcode", "data": "ctrl" } } },
 | 
					          "key": {"type": "qcode", "data": "ctrl" } } },
 | 
				
			||||||
        { "type": "key", "data" : { "down": true,
 | 
					        { "type": "key", "data" : { "down": true,
 | 
				
			||||||
@@ -4714,10 +4715,10 @@ Example (3):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Move mouse pointer to absolute coordinates (20000, 400).
 | 
					Move mouse pointer to absolute coordinates (20000, 400).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-> { "execute": "x-input-send-event" ,
 | 
					-> { "execute": "input-send-event" ,
 | 
				
			||||||
  "arguments": { "console": 0, "events": [
 | 
					  "arguments": { "events": [
 | 
				
			||||||
               { "type": "abs", "data" : { "axis": "X", "value" : 20000 } },
 | 
					               { "type": "abs", "data" : { "axis": "x", "value" : 20000 } },
 | 
				
			||||||
               { "type": "abs", "data" : { "axis": "Y", "value" : 400 } } ] } }
 | 
					               { "type": "abs", "data" : { "axis": "y", "value" : 400 } } ] } }
 | 
				
			||||||
<- { "return": {} }
 | 
					<- { "return": {} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EQMP
 | 
					EQMP
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,8 +66,6 @@ case_whitelist = [
 | 
				
			|||||||
    'CpuInfoBase',          # CPU, visible through query-cpu
 | 
					    'CpuInfoBase',          # CPU, visible through query-cpu
 | 
				
			||||||
    'CpuInfoMIPS',          # PC, visible through query-cpu
 | 
					    'CpuInfoMIPS',          # PC, visible through query-cpu
 | 
				
			||||||
    'CpuInfoTricore',       # PC, visible through query-cpu
 | 
					    'CpuInfoTricore',       # PC, visible through query-cpu
 | 
				
			||||||
    'InputAxis',            # TODO: drop when x-input-send-event is fixed
 | 
					 | 
				
			||||||
    'InputButton',          # TODO: drop when x-input-send-event is fixed
 | 
					 | 
				
			||||||
    'QapiErrorClass',       # all members, visible through errors
 | 
					    'QapiErrorClass',       # all members, visible through errors
 | 
				
			||||||
    'UuidInfo',             # UUID, visible through query-uuid
 | 
					    'UuidInfo',             # UUID, visible through query-uuid
 | 
				
			||||||
    'X86CPURegister32',     # all members, visible indirectly through qom-get
 | 
					    'X86CPURegister32',     # all members, visible indirectly through qom-get
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1409,8 +1409,6 @@ xics_ics_write_xive(int nr, int srcno, int server, uint8_t priority) "ics_write_
 | 
				
			|||||||
xics_ics_reject(int nr, int srcno) "reject irq %#x [src %d]"
 | 
					xics_ics_reject(int nr, int srcno) "reject irq %#x [src %d]"
 | 
				
			||||||
xics_ics_eoi(int nr) "ics_eoi: irq %#x"
 | 
					xics_ics_eoi(int nr) "ics_eoi: irq %#x"
 | 
				
			||||||
xics_alloc(int src, int irq) "source#%d, irq %d"
 | 
					xics_alloc(int src, int irq) "source#%d, irq %d"
 | 
				
			||||||
xics_alloc_failed_hint(int src, int irq) "source#%d, irq %d is already in use"
 | 
					 | 
				
			||||||
xics_alloc_failed_no_left(int src) "source#%d, no irq left"
 | 
					 | 
				
			||||||
xics_alloc_block(int src, int first, int num, bool lsi, int align) "source#%d, first irq %d, %d irqs, lsi=%d, alignnum %d"
 | 
					xics_alloc_block(int src, int first, int num, bool lsi, int align) "source#%d, first irq %d, %d irqs, lsi=%d, alignnum %d"
 | 
				
			||||||
xics_ics_free(int src, int irq, int num) "Source#%d, first irq %d, %d irqs"
 | 
					xics_ics_free(int src, int irq, int num) "Source#%d, first irq %d, %d irqs"
 | 
				
			||||||
xics_ics_free_warn(int src, int irq) "Source#%d, irq %d is already free"
 | 
					xics_ics_free_warn(int src, int irq) "Source#%d, irq %d is already free"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -739,8 +739,8 @@ QemuCocoaView *cocoaView;
 | 
				
			|||||||
                [INPUT_BUTTON_LEFT]       = MOUSE_EVENT_LBUTTON,
 | 
					                [INPUT_BUTTON_LEFT]       = MOUSE_EVENT_LBUTTON,
 | 
				
			||||||
                [INPUT_BUTTON_MIDDLE]     = MOUSE_EVENT_MBUTTON,
 | 
					                [INPUT_BUTTON_MIDDLE]     = MOUSE_EVENT_MBUTTON,
 | 
				
			||||||
                [INPUT_BUTTON_RIGHT]      = MOUSE_EVENT_RBUTTON,
 | 
					                [INPUT_BUTTON_RIGHT]      = MOUSE_EVENT_RBUTTON,
 | 
				
			||||||
                [INPUT_BUTTON_WHEELUP]    = MOUSE_EVENT_WHEELUP,
 | 
					                [INPUT_BUTTON_WHEEL_UP]   = MOUSE_EVENT_WHEELUP,
 | 
				
			||||||
                [INPUT_BUTTON_WHEELDOWN]  = MOUSE_EVENT_WHEELDN,
 | 
					                [INPUT_BUTTON_WHEEL_DOWN] = MOUSE_EVENT_WHEELDN,
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            qemu_input_update_buttons(dcl->con, bmap, last_buttons, buttons);
 | 
					            qemu_input_update_buttons(dcl->con, bmap, last_buttons, buttons);
 | 
				
			||||||
            last_buttons = buttons;
 | 
					            last_buttons = buttons;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								ui/console.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								ui/console.c
									
									
									
									
									
								
							@@ -1790,6 +1790,29 @@ QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head)
 | 
				
			|||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
 | 
				
			||||||
 | 
					                                                uint32_t head, Error **errp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DeviceState *dev;
 | 
				
			||||||
 | 
					    QemuConsole *con;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dev = qdev_find_recursive(sysbus_get_default(), device_id);
 | 
				
			||||||
 | 
					    if (dev == NULL) {
 | 
				
			||||||
 | 
					        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
 | 
				
			||||||
 | 
					                  "Device '%s' not found", device_id);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    con = qemu_console_lookup_by_device(dev, head);
 | 
				
			||||||
 | 
					    if (con == NULL) {
 | 
				
			||||||
 | 
					        error_setg(errp, "Device %s (head %d) is not bound to a QemuConsole",
 | 
				
			||||||
 | 
					                   device_id, head);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return con;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool qemu_console_is_visible(QemuConsole *con)
 | 
					bool qemu_console_is_visible(QemuConsole *con)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return (con == active_console) || (con->dcls > 0);
 | 
					    return (con == active_console) || (con->dcls > 0);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								ui/gtk.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								ui/gtk.c
									
									
									
									
									
								
							@@ -966,9 +966,9 @@ static gboolean gd_scroll_event(GtkWidget *widget, GdkEventScroll *scroll,
 | 
				
			|||||||
    InputButton btn;
 | 
					    InputButton btn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (scroll->direction == GDK_SCROLL_UP) {
 | 
					    if (scroll->direction == GDK_SCROLL_UP) {
 | 
				
			||||||
        btn = INPUT_BUTTON_WHEELUP;
 | 
					        btn = INPUT_BUTTON_WHEEL_UP;
 | 
				
			||||||
    } else if (scroll->direction == GDK_SCROLL_DOWN) {
 | 
					    } else if (scroll->direction == GDK_SCROLL_DOWN) {
 | 
				
			||||||
        btn = INPUT_BUTTON_WHEELDOWN;
 | 
					        btn = INPUT_BUTTON_WHEEL_DOWN;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        return TRUE;
 | 
					        return TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -158,7 +158,7 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            s->buttons &= ~bmap[evt->u.btn->button];
 | 
					            s->buttons &= ~bmap[evt->u.btn->button];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (evt->u.btn->down && evt->u.btn->button == INPUT_BUTTON_WHEELUP) {
 | 
					        if (evt->u.btn->down && evt->u.btn->button == INPUT_BUTTON_WHEEL_UP) {
 | 
				
			||||||
            s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
 | 
					            s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
 | 
				
			||||||
                                    s->axis[INPUT_AXIS_X],
 | 
					                                    s->axis[INPUT_AXIS_X],
 | 
				
			||||||
                                    s->axis[INPUT_AXIS_Y],
 | 
					                                    s->axis[INPUT_AXIS_Y],
 | 
				
			||||||
@@ -166,7 +166,7 @@ static void legacy_mouse_event(DeviceState *dev, QemuConsole *src,
 | 
				
			|||||||
                                    s->buttons);
 | 
					                                    s->buttons);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (evt->u.btn->down &&
 | 
					        if (evt->u.btn->down &&
 | 
				
			||||||
            evt->u.btn->button == INPUT_BUTTON_WHEELDOWN) {
 | 
					            evt->u.btn->button == INPUT_BUTTON_WHEEL_DOWN) {
 | 
				
			||||||
            s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
 | 
					            s->qemu_put_mouse_event(s->qemu_put_mouse_event_opaque,
 | 
				
			||||||
                                    s->axis[INPUT_AXIS_X],
 | 
					                                    s->axis[INPUT_AXIS_X],
 | 
				
			||||||
                                    s->axis[INPUT_AXIS_Y],
 | 
					                                    s->axis[INPUT_AXIS_Y],
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								ui/input.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								ui/input.c
									
									
									
									
									
								
							@@ -82,19 +82,12 @@ void qemu_input_handler_bind(QemuInputHandlerState *s,
 | 
				
			|||||||
                             const char *device_id, int head,
 | 
					                             const char *device_id, int head,
 | 
				
			||||||
                             Error **errp)
 | 
					                             Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DeviceState *dev;
 | 
					 | 
				
			||||||
    QemuConsole *con;
 | 
					    QemuConsole *con;
 | 
				
			||||||
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_find_recursive(sysbus_get_default(), device_id);
 | 
					    con = qemu_console_lookup_by_device_name(device_id, head, &err);
 | 
				
			||||||
    if (dev == NULL) {
 | 
					    if (err) {
 | 
				
			||||||
        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
 | 
					        error_propagate(errp, err);
 | 
				
			||||||
                  "Device '%s' not found", device_id);
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    con = qemu_console_lookup_by_device(dev, head);
 | 
					 | 
				
			||||||
    if (con == NULL) {
 | 
					 | 
				
			||||||
        error_setg(errp, "Device %s is not bound to a QemuConsole", device_id);
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -126,17 +119,22 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
 | 
				
			|||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void qmp_x_input_send_event(bool has_console, int64_t console,
 | 
					void qmp_input_send_event(bool has_device, const char *device,
 | 
				
			||||||
 | 
					                          bool has_head, int64_t head,
 | 
				
			||||||
                          InputEventList *events, Error **errp)
 | 
					                          InputEventList *events, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    InputEventList *e;
 | 
					    InputEventList *e;
 | 
				
			||||||
    QemuConsole *con;
 | 
					    QemuConsole *con;
 | 
				
			||||||
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    con = NULL;
 | 
					    con = NULL;
 | 
				
			||||||
    if (has_console) {
 | 
					    if (has_device) {
 | 
				
			||||||
        con = qemu_console_lookup_by_index(console);
 | 
					        if (!has_head) {
 | 
				
			||||||
        if (!con) {
 | 
					            head = 0;
 | 
				
			||||||
            error_setg(errp, "console %" PRId64 " not found", console);
 | 
					        }
 | 
				
			||||||
 | 
					        con = qemu_console_lookup_by_device_name(device, head, &err);
 | 
				
			||||||
 | 
					        if (err) {
 | 
				
			||||||
 | 
					            error_propagate(errp, err);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								ui/sdl.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								ui/sdl.c
									
									
									
									
									
								
							@@ -475,8 +475,8 @@ static void sdl_send_mouse_event(int dx, int dy, int x, int y, int state)
 | 
				
			|||||||
        [INPUT_BUTTON_LEFT]       = SDL_BUTTON(SDL_BUTTON_LEFT),
 | 
					        [INPUT_BUTTON_LEFT]       = SDL_BUTTON(SDL_BUTTON_LEFT),
 | 
				
			||||||
        [INPUT_BUTTON_MIDDLE]     = SDL_BUTTON(SDL_BUTTON_MIDDLE),
 | 
					        [INPUT_BUTTON_MIDDLE]     = SDL_BUTTON(SDL_BUTTON_MIDDLE),
 | 
				
			||||||
        [INPUT_BUTTON_RIGHT]      = SDL_BUTTON(SDL_BUTTON_RIGHT),
 | 
					        [INPUT_BUTTON_RIGHT]      = SDL_BUTTON(SDL_BUTTON_RIGHT),
 | 
				
			||||||
        [INPUT_BUTTON_WHEELUP]    = SDL_BUTTON(SDL_BUTTON_WHEELUP),
 | 
					        [INPUT_BUTTON_WHEEL_UP]   = SDL_BUTTON(SDL_BUTTON_WHEELUP),
 | 
				
			||||||
        [INPUT_BUTTON_WHEELDOWN]  = SDL_BUTTON(SDL_BUTTON_WHEELDOWN),
 | 
					        [INPUT_BUTTON_WHEEL_DOWN] = SDL_BUTTON(SDL_BUTTON_WHEELDOWN),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    static uint32_t prev_state;
 | 
					    static uint32_t prev_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -509,9 +509,9 @@ static void handle_mousewheel(SDL_Event *ev)
 | 
				
			|||||||
    InputButton btn;
 | 
					    InputButton btn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (wev->y > 0) {
 | 
					    if (wev->y > 0) {
 | 
				
			||||||
        btn = INPUT_BUTTON_WHEELUP;
 | 
					        btn = INPUT_BUTTON_WHEEL_UP;
 | 
				
			||||||
    } else if (wev->y < 0) {
 | 
					    } else if (wev->y < 0) {
 | 
				
			||||||
        btn = INPUT_BUTTON_WHEELDOWN;
 | 
					        btn = INPUT_BUTTON_WHEEL_DOWN;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,8 +108,8 @@ static void spice_update_buttons(QemuSpicePointer *pointer,
 | 
				
			|||||||
        [INPUT_BUTTON_LEFT]        = 0x01,
 | 
					        [INPUT_BUTTON_LEFT]        = 0x01,
 | 
				
			||||||
        [INPUT_BUTTON_MIDDLE]      = 0x04,
 | 
					        [INPUT_BUTTON_MIDDLE]      = 0x04,
 | 
				
			||||||
        [INPUT_BUTTON_RIGHT]       = 0x02,
 | 
					        [INPUT_BUTTON_RIGHT]       = 0x02,
 | 
				
			||||||
        [INPUT_BUTTON_WHEELUP]     = 0x10,
 | 
					        [INPUT_BUTTON_WHEEL_UP]    = 0x10,
 | 
				
			||||||
        [INPUT_BUTTON_WHEELDOWN]   = 0x20,
 | 
					        [INPUT_BUTTON_WHEEL_DOWN]  = 0x20,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (wheel < 0) {
 | 
					    if (wheel < 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								ui/vnc.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								ui/vnc.c
									
									
									
									
									
								
							@@ -1593,8 +1593,8 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
 | 
				
			|||||||
        [INPUT_BUTTON_LEFT]       = 0x01,
 | 
					        [INPUT_BUTTON_LEFT]       = 0x01,
 | 
				
			||||||
        [INPUT_BUTTON_MIDDLE]     = 0x02,
 | 
					        [INPUT_BUTTON_MIDDLE]     = 0x02,
 | 
				
			||||||
        [INPUT_BUTTON_RIGHT]      = 0x04,
 | 
					        [INPUT_BUTTON_RIGHT]      = 0x04,
 | 
				
			||||||
        [INPUT_BUTTON_WHEELUP]    = 0x08,
 | 
					        [INPUT_BUTTON_WHEEL_UP]   = 0x08,
 | 
				
			||||||
        [INPUT_BUTTON_WHEELDOWN]  = 0x10,
 | 
					        [INPUT_BUTTON_WHEEL_DOWN] = 0x10,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    QemuConsole *con = vs->vd->dcl.con;
 | 
					    QemuConsole *con = vs->vd->dcl.con;
 | 
				
			||||||
    int width = pixman_image_get_width(vs->vd->server);
 | 
					    int width = pixman_image_get_width(vs->vd->server);
 | 
				
			||||||
@@ -3732,19 +3732,12 @@ void vnc_display_open(const char *id, Error **errp)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    device_id = qemu_opt_get(opts, "display");
 | 
					    device_id = qemu_opt_get(opts, "display");
 | 
				
			||||||
    if (device_id) {
 | 
					    if (device_id) {
 | 
				
			||||||
        DeviceState *dev;
 | 
					 | 
				
			||||||
        int head = qemu_opt_get_number(opts, "head", 0);
 | 
					        int head = qemu_opt_get_number(opts, "head", 0);
 | 
				
			||||||
 | 
					        Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        dev = qdev_find_recursive(sysbus_get_default(), device_id);
 | 
					        con = qemu_console_lookup_by_device_name(device_id, head, &err);
 | 
				
			||||||
        if (dev == NULL) {
 | 
					        if (err) {
 | 
				
			||||||
            error_setg(errp, "Device '%s' not found", device_id);
 | 
					            error_propagate(errp, err);
 | 
				
			||||||
            goto fail;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        con = qemu_console_lookup_by_device(dev, head);
 | 
					 | 
				
			||||||
        if (con == NULL) {
 | 
					 | 
				
			||||||
            error_setg(errp, "Device %s is not bound to a QemuConsole",
 | 
					 | 
				
			||||||
                       device_id);
 | 
					 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user