qemu: Fix specifying char devs for ARM

QEMU ARM boards don't give us any way to explicitly wire in
a -chardev, so use the old style -serial options.

Unfortunately this isn't as simple as just turning off the CHARDEV flag
for qemu-system-arm, as upcoming virtio support _will_ use device/chardev.
This commit is contained in:
Cole Robinson 2013-07-30 17:49:11 -04:00
parent 7c9617641d
commit 3a2beaee1d
4 changed files with 45 additions and 17 deletions

View File

@ -2838,3 +2838,21 @@ virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps)
{ {
return qemuCaps->usedQMP; return qemuCaps->usedQMP;
} }
bool
virQEMUCapsSupportsChardev(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virDomainChrDefPtr chr ATTRIBUTE_UNUSED)
{
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
return false;
/* This may not be true for all ARM machine types, but at least
* the only supported serial devices of vexpress and versatile
* don't have the -chardev property wired up. */
if (def->os.arch != VIR_ARCH_ARMV7L)
return false;
return true;
}

View File

@ -277,4 +277,8 @@ int virQEMUCapsParseDeviceStr(virQEMUCapsPtr qemuCaps, const char *str);
VIR_ENUM_DECL(virQEMUCaps); VIR_ENUM_DECL(virQEMUCaps);
bool virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps); bool virQEMUCapsUsedQMP(virQEMUCapsPtr qemuCaps);
bool virQEMUCapsSupportsChardev(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virDomainChrDefPtr chr);
#endif /* __QEMU_CAPABILITIES_H__*/ #endif /* __QEMU_CAPABILITIES_H__*/

View File

@ -8516,8 +8516,7 @@ qemuBuildCommandLine(virConnectPtr conn,
char *devstr; char *devstr;
/* Use -chardev with -device if they are available */ /* Use -chardev with -device if they are available */
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) && if (virQEMUCapsSupportsChardev(def, qemuCaps, serial)) {
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
virCommandAddArg(cmd, "-chardev"); virCommandAddArg(cmd, "-chardev");
if (!(devstr = qemuBuildChrChardevStr(&serial->source, if (!(devstr = qemuBuildChrChardevStr(&serial->source,
serial->info.alias, serial->info.alias,

View File

@ -1604,22 +1604,25 @@ qemuProcessExtractTTYPath(const char *haystack,
} }
static int static int
qemuProcessLookupPTYs(virDomainChrDefPtr *devices, qemuProcessLookupPTYs(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virDomainChrDefPtr *devices,
int count, int count,
virHashTablePtr paths, virHashTablePtr paths)
bool chardevfmt)
{ {
size_t i; size_t i;
const char *prefix = chardevfmt ? "char" : "";
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
virDomainChrDefPtr chr = devices[i]; virDomainChrDefPtr chr = devices[i];
bool chardevfmt = virQEMUCapsSupportsChardev(def, qemuCaps, chr);
if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) { if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
char id[32]; char id[32];
const char *path; const char *path;
if (snprintf(id, sizeof(id), "%s%s", if (snprintf(id, sizeof(id), "%s%s",
prefix, chr->info.alias) >= sizeof(id)) chardevfmt ? "char" : "",
chr->info.alias) >= sizeof(id))
return -1; return -1;
path = (const char *) virHashLookup(paths, id); path = (const char *) virHashLookup(paths, id);
@ -1653,19 +1656,21 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
virHashTablePtr paths) virHashTablePtr paths)
{ {
bool chardevfmt = virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV);
size_t i = 0; size_t i = 0;
if (qemuProcessLookupPTYs(vm->def->serials, vm->def->nserials, if (qemuProcessLookupPTYs(vm->def, qemuCaps,
paths, chardevfmt) < 0) vm->def->serials, vm->def->nserials,
paths) < 0)
return -1; return -1;
if (qemuProcessLookupPTYs(vm->def->parallels, vm->def->nparallels, if (qemuProcessLookupPTYs(vm->def, qemuCaps,
paths, chardevfmt) < 0) vm->def->parallels, vm->def->nparallels,
paths) < 0)
return -1; return -1;
if (qemuProcessLookupPTYs(vm->def->channels, vm->def->nchannels, if (qemuProcessLookupPTYs(vm->def, qemuCaps,
paths, chardevfmt) < 0) vm->def->channels, vm->def->nchannels,
paths) < 0)
return -1; return -1;
/* For historical reasons, console[0] can be just an alias /* For historical reasons, console[0] can be just an alias
* for serial[0]. That's why we need to update it as well. */ * for serial[0]. That's why we need to update it as well. */
@ -1683,8 +1688,9 @@ qemuProcessFindCharDevicePTYsMonitor(virDomainObjPtr vm,
} }
} }
if (qemuProcessLookupPTYs(vm->def->consoles + i, vm->def->nconsoles - i, if (qemuProcessLookupPTYs(vm->def, qemuCaps,
paths, chardevfmt) < 0) vm->def->consoles + i, vm->def->nconsoles - i,
paths) < 0)
return -1; return -1;
return 0; return 0;
@ -1774,7 +1780,8 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
virHashTablePtr paths = NULL; virHashTablePtr paths = NULL;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
if (!virQEMUCapsUsedQMP(qemuCaps) && pos != -1) { if (!virQEMUCapsUsedQMP(qemuCaps)
&& pos != -1) {
if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0) if ((logfd = qemuDomainOpenLog(driver, vm, pos)) < 0)
return -1; return -1;