On Tue, Dec 15, 2009 at 03:14:42PM +0000, Daniel P. Berrange wrote:
The current character device syntax uses either
-serial tty,path=/dev/ttyS2
Or
-chardev tty,id=serial0,path=/dev/ttyS2 -serial chardev:serial0
With the new -device support, we now prefer
-chardev file,id=serial0,path=/tmp/serial.log -device isa-serial,chardev=serial0
This patch changes the existing -chardev syntax to use this new
scheme, and fallbacks to the old plain -serial syntax for old
QEMU.
The monitor device changes to
-chardev socket,id=monitor,path=/tmp/test-monitor,server,nowait -mon chardev=monitor
In addition, this patch adds --nodefaults, which kills off the
default serial, parallel, vga and nic devices. THis avoids the
need for us to explicitly turn each off
---
src/qemu/qemu_conf.c | 74 +++++++++++++-------
src/qemu/qemu_conf.h | 1 +
.../qemuxml2argv-channel-guestfwd.args | 2 +-
.../qemuxml2argv-console-compat-chardev.args | 2 +-
.../qemuxml2argv-parallel-tcp-chardev.args | 2 +-
.../qemuxml2argv-serial-dev-chardev.args | 2 +-
.../qemuxml2argv-serial-file-chardev.args | 2 +-
.../qemuxml2argv-serial-many-chardev.args | 2 +-
.../qemuxml2argv-serial-pty-chardev.args | 2 +-
.../qemuxml2argv-serial-tcp-chardev.args | 2 +-
.../qemuxml2argv-serial-tcp-telnet-chardev.args | 2 +-
.../qemuxml2argv-serial-udp-chardev.args | 2 +-
.../qemuxml2argv-serial-unix-chardev.args | 2 +-
.../qemuxml2argv-serial-vc-chardev.args | 2 +-
tests/qemuxml2argvtest.c | 26 ++++----
15 files changed, 74 insertions(+), 51 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 61e719d..16e8d2c 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -909,6 +909,8 @@ static unsigned int qemudComputeCmdFlags(const char *help,
flags |= QEMUD_CMD_FLAG_MEM_PATH;
if (strstr(help, "-chardev"))
flags |= QEMUD_CMD_FLAG_CHARDEV;
+ if (strstr(help, "-device"))
+ flags |= QEMUD_CMD_FLAG_DEVICE;
hum ... shouldn't we look for a space of some sort after the option
strings, to make sure we match the right string. Not specific to this
but might be safer.
if (version >= 9000)
flags |= QEMUD_CMD_FLAG_VNC_COLON;
@@ -1945,6 +1947,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
if (!def->graphics)
ADD_ARG_LIT("-nographic");
+ if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)
+ ADD_ARG_LIT("-nodefaults");
+
if (monitor_chr) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -1959,26 +1964,32 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG_LIT("-chardev");
ADD_ARG(virBufferContentAndReset(&buf));
- if (monitor_json)
- virBufferAddLit(&buf, "control,");
+ virBufferAddLit(&buf, "chardev=monitor");
- virBufferAddLit(&buf, "chardev:monitor");
- }
+ if (virBufferError(&buf)) {
+ virBufferFreeAndReset(&buf);
+ goto no_memory;
+ }
- else {
+ ADD_ARG_LIT("-mon");
+ if (monitor_json)
+ ADD_ARG_LIT("chardev=monitor,mode=control");
+ else
+ ADD_ARG_LIT("chardev=monitor,mode=readline");
+ } else {
if (monitor_json)
virBufferAddLit(&buf, "control,");
qemudBuildCommandLineChrDevStr(monitor_chr, &buf);
- }
- if (virBufferError(&buf)) {
- virBufferFreeAndReset(&buf);
- goto no_memory;
- }
+ if (virBufferError(&buf)) {
+ virBufferFreeAndReset(&buf);
+ goto no_memory;
+ }
- ADD_ARG_LIT("-monitor");
- ADD_ARG_LIT(virBufferContentAndReset(&buf));
+ ADD_ARG_LIT("-monitor");
+ ADD_ARG(virBufferContentAndReset(&buf));
+ }
}
if (def->localtime)
@@ -2172,8 +2183,11 @@ int qemudBuildCommandLine(virConnectPtr conn,
}
if (!def->nnets) {
- ADD_ARG_LIT("-net");
- ADD_ARG_LIT("none");
+ /* If we have -device, then we set -nodefault alrady */
+ if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
+ ADD_ARG_LIT("-net");
+ ADD_ARG_LIT("none");
+ }
} else {
for (i = 0 ; i < def->nnets ; i++) {
virDomainNetDefPtr net = def->nets[i];
@@ -2232,15 +2246,19 @@ int qemudBuildCommandLine(virConnectPtr conn,
}
if (!def->nserials) {
- ADD_ARG_LIT("-serial");
- ADD_ARG_LIT("none");
+ /* If we have -device, then we set -nodefault alrady */
+ if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
+ ADD_ARG_LIT("-serial");
+ ADD_ARG_LIT("none");
+ }
} else {
for (i = 0 ; i < def->nserials ; i++) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
virDomainChrDefPtr serial = def->serials[i];
- /* Use -chardev if it's available */
- if (qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) {
+ /* Use -chardev with -device if they are available */
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) &&
+ (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
char id[16];
if (snprintf(id, sizeof(id), "serial%i", i) > sizeof(id))
@@ -2255,13 +2273,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG_LIT("-chardev");
ADD_ARG(virBufferContentAndReset(&buf));
- virBufferVSprintf(&buf, "chardev:%s", id);
+ virBufferVSprintf(&buf, "isa-serial,chardev=%s", id);
if (virBufferError(&buf)) {
virBufferFreeAndReset(&buf);
goto no_memory;
}
- ADD_ARG_LIT("-serial");
+ ADD_ARG_LIT("-device");
ADD_ARG(virBufferContentAndReset(&buf));
}
@@ -2279,15 +2297,19 @@ int qemudBuildCommandLine(virConnectPtr conn,
}
if (!def->nparallels) {
- ADD_ARG_LIT("-parallel");
- ADD_ARG_LIT("none");
+ /* If we have -device, then we set -nodefault alrady */
+ if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
+ ADD_ARG_LIT("-parallel");
+ ADD_ARG_LIT("none");
+ }
} else {
for (i = 0 ; i < def->nparallels ; i++) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
virDomainChrDefPtr parallel = def->parallels[i];
- /* Use -chardev if it's available */
- if (qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) {
+ /* Use -chardev with -device if they are available */
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_CHARDEV) &&
+ (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
char id[16];
if (snprintf(id, sizeof(id), "parallel%i", i) >
sizeof(id))
@@ -2302,13 +2324,13 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG_LIT("-chardev");
ADD_ARG(virBufferContentAndReset(&buf));
- virBufferVSprintf(&buf, "chardev:%s", id);
+ virBufferVSprintf(&buf, "isa-parallel,chardev=%s", id);
if (virBufferError(&buf)) {
virBufferFreeAndReset(&buf);
goto no_memory;
}
- ADD_ARG_LIT("-parallel");
+ ADD_ARG_LIT("-device");
ADD_ARG(virBufferContentAndReset(&buf));
}
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index cd59d4c..840b749 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -76,6 +76,7 @@ enum qemud_cmd_flags {
QEMUD_CMD_FLAG_ENABLE_KVM = (1 << 23), /* Is the -enable-kvm flag available
to "enable KVM full virtualization support" */
QEMUD_CMD_FLAG_0_12 = (1 << 24),
QEMUD_CMD_FLAG_MONITOR_JSON = QEMUD_CMD_FLAG_0_12, /* JSON mode for monitor */
+ QEMUD_CMD_FLAG_DEVICE = (1 << 25), /* Is the new -chardev arg available
*/
};
/* Main driver state */
I'm starting to worry about exhausting the enum size ... we are
getting close, and something allowing for the continuous expansion of
QEmu options will be needed soon !
ACK
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/