From: Li Zhang <zhlcindy(a)linux.vnet.ibm.com>
PS2 device only works for X86 platform, other platforms may need
USB mouse. Athough it doesn't influence the QEMU command line, but
It's not right to add one PS2 mouse for non-X86 platform.
This patch is to remove PS2 device definition from other platforms.
Add one default USB mouse for PPC64. It can be also added for other
platforms if necessary.
Signed-off-by: Li Zhang <zhlcindy(a)linux.vnet.ibm.com>
---
src/conf/domain_conf.c | 59 ++++++++--------------
src/qemu/qemu_domain.c | 20 +++++++-
src/util/virarch.h | 2 +
.../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml | 2 +-
4 files changed, 42 insertions(+), 41 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 82339ea..e53a786 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7567,7 +7567,7 @@ error:
/* Parse the XML definition for an input device */
static virDomainInputDefPtr
-virDomainInputDefParseXML(const char *ostype,
+virDomainInputDefParseXML(const virDomainDef *dom,
xmlNodePtr node,
unsigned int flags)
{
@@ -7600,7 +7600,7 @@ virDomainInputDefParseXML(const char *ostype,
goto error;
}
- if (STREQ(ostype, "hvm")) {
+ if (STREQ(dom->os.type, "hvm")) {
if (def->bus == VIR_DOMAIN_INPUT_BUS_PS2 && /* Only allow mouse
for ps2 */
def->type != VIR_DOMAIN_INPUT_TYPE_MOUSE) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -7628,8 +7628,9 @@ virDomainInputDefParseXML(const char *ostype,
}
}
} else {
- if (STREQ(ostype, "hvm")) {
- if (def->type == VIR_DOMAIN_INPUT_TYPE_MOUSE)
+ if (STREQ(dom->os.type, "hvm")) {
+ if (def->type == VIR_DOMAIN_INPUT_TYPE_MOUSE &&
+ ARCH_IS_X86(dom->os.arch))
def->bus = VIR_DOMAIN_INPUT_BUS_PS2;
else
def->bus = VIR_DOMAIN_INPUT_BUS_USB;
@@ -9631,7 +9632,7 @@ virDomainDeviceDefParse(const char *xmlStr,
goto error;
break;
case VIR_DOMAIN_DEVICE_INPUT:
- if (!(dev->data.input = virDomainInputDefParseXML(def->os.type,
+ if (!(dev->data.input = virDomainInputDefParseXML(def,
node, flags)))
goto error;
break;
@@ -12211,7 +12212,7 @@ virDomainDefParseXML(xmlDocPtr xml,
goto error;
for (i = 0; i < n; i++) {
- virDomainInputDefPtr input = virDomainInputDefParseXML(def->os.type,
+ virDomainInputDefPtr input = virDomainInputDefParseXML(def,
nodes[i],
flags);
if (!input)
@@ -12230,9 +12231,11 @@ virDomainDefParseXML(xmlDocPtr xml,
* with graphics, so don't store it.
* XXX will this be true for other virt types ? */
if ((STREQ(def->os.type, "hvm") &&
+ ARCH_IS_X86(def->os.arch) &&
input->bus == VIR_DOMAIN_INPUT_BUS_PS2 &&
input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE) ||
(STRNEQ(def->os.type, "hvm") &&
+ ARCH_IS_X86(def->os.arch) &&
input->bus == VIR_DOMAIN_INPUT_BUS_XEN &&
input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE)) {
virDomainInputDefFree(input);
@@ -12260,30 +12263,6 @@ virDomainDefParseXML(xmlDocPtr xml,
}
VIR_FREE(nodes);
- /* If graphics are enabled, there's an implicit PS2 mouse */
- if (def->ngraphics > 0) {
- virDomainInputDefPtr input;
-
- if (VIR_ALLOC(input) < 0) {
- goto error;
- }
- if (STREQ(def->os.type, "hvm")) {
- input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
- input->bus = VIR_DOMAIN_INPUT_BUS_PS2;
- } else {
- input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
- input->bus = VIR_DOMAIN_INPUT_BUS_XEN;
- }
-
- if (VIR_REALLOC_N(def->inputs, def->ninputs + 1) < 0) {
- virDomainInputDefFree(input);
- goto error;
- }
- def->inputs[def->ninputs] = input;
- def->ninputs++;
- }
-
-
/* analysis of the sound devices */
if ((n = virXPathNodeSet("./devices/sound", ctxt, &nodes)) < 0) {
goto error;
@@ -17201,15 +17180,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
if (def->ngraphics > 0) {
/* If graphics is enabled, add the implicit mouse */
- virDomainInputDef autoInput = {
- VIR_DOMAIN_INPUT_TYPE_MOUSE,
- STREQ(def->os.type, "hvm") ?
- VIR_DOMAIN_INPUT_BUS_PS2 : VIR_DOMAIN_INPUT_BUS_XEN,
- { .alias = NULL },
- };
-
- if (virDomainInputDefFormat(buf, &autoInput, flags) < 0)
- goto error;
+ if (ARCH_IS_X86(def->os.arch)) {
+ virDomainInputDef autoInput = {
+ VIR_DOMAIN_INPUT_TYPE_MOUSE,
+ STREQ(def->os.type, "hvm") ?
+ VIR_DOMAIN_INPUT_BUS_PS2 : VIR_DOMAIN_INPUT_BUS_XEN,
+ { .alias = NULL },
+ };
+ if (virDomainInputDefFormat(buf, &autoInput, flags) < 0)
+ goto error;
+ }
+
for (n = 0; n < def->ngraphics; n++)
if (virDomainGraphicsDefFormat(buf, def->graphics[n], flags) < 0)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 346fec3..75e615a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -691,6 +691,8 @@ qemuDomainDefPostParse(virDomainDefPtr def,
bool addPCIRoot = false;
bool addPCIeRoot = false;
bool addDefaultMemballoon = true;
+ bool addDefaultMouse = false;
+ int mouse_bus = VIR_DOMAIN_INPUT_BUS_XEN;
/* check for emulator and create a default one if needed */
if (!def->emulator &&
@@ -721,6 +723,9 @@ qemuDomainDefPostParse(virDomainDefPtr def,
!STRPREFIX(def->os.machine, "rhel"))
break;
addPCIRoot = true;
+ addDefaultMouse = true;
+ if (STREQ(def->os.type, "hvm"))
+ mouse_bus = VIR_DOMAIN_INPUT_BUS_PS2;
break;
case VIR_ARCH_ARMV7L:
@@ -728,9 +733,15 @@ qemuDomainDefPostParse(virDomainDefPtr def,
addDefaultMemballoon = false;
break;
+ case VIR_ARCH_PPC64:
+ addPCIRoot = true;
+ addDefaultMouse = true;
+ if (STREQ(def->os.type, "hvm"))
+ mouse_bus = VIR_DOMAIN_INPUT_BUS_USB;
+ break;
+
case VIR_ARCH_ALPHA:
case VIR_ARCH_PPC:
- case VIR_ARCH_PPC64:
case VIR_ARCH_PPCEMB:
case VIR_ARCH_SH4:
case VIR_ARCH_SH4EB:
@@ -783,6 +794,13 @@ qemuDomainDefPostParse(virDomainDefPtr def,
def->memballoon = memballoon;
}
+ if (def->ngraphics > 0 && addDefaultMouse) {
+ if (virDomainDefMaybeAddInput(def,
+ VIR_DOMAIN_INPUT_TYPE_MOUSE,
+ mouse_bus) < 0)
+ return -1;
+ }
+
return 0;
}
diff --git a/src/util/virarch.h b/src/util/virarch.h
index b180400..9b66e43 100644
--- a/src/util/virarch.h
+++ b/src/util/virarch.h
@@ -70,6 +70,8 @@ typedef enum {
VIR_ARCH_LAST,
} virArch;
+#define ARCH_IS_X86(arch) ((arch) == VIR_ARCH_X86_64 ||\
+ (arch) == VIR_ARCH_I686)
typedef enum {
VIR_ARCH_LITTLE_ENDIAN,
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
index dbbd6aa..117213d 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
@@ -30,7 +30,7 @@
<controller type='usb' index='0'/>
<controller type='scsi' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
- <input type='mouse' bus='ps2'/>
+ <input type='mouse' bus='usb'/>
<graphics type='sdl'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
--
1.8.2.1