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], | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								ui/input.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								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, | ||||||
|                             InputEventList *events, Error **errp) |                           bool has_head, int64_t head, | ||||||
|  |                           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