trap signals for "-serial mon:stdio"

With mon:stdio you can exit the VM by switching to the monitor and
sending the "quit" command.  It is then useful to pass Ctrl-C to the
VM instead of exiting.

This in turn lets us stop tying the default signal handling behavior
to -nographic, removing gratuitous differences between "-display none"
and "-nographic".

This patch changes behavior for "-display none -serial mon:stdio", as
expected, but not for "-display none -serial stdio".

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 1372868986-25988-1-git-send-email-mjt@msgid.tls.msk.ru
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Paolo Bonzini 2013-07-03 20:29:45 +04:00 committed by Anthony Liguori
parent 964c6fa16f
commit 02c4bdf1d2
2 changed files with 14 additions and 7 deletions

View File

@ -926,7 +926,6 @@ static void qemu_chr_set_echo_stdio(CharDriverState *chr, bool echo)
tty.c_cc[VMIN] = 1; tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 0; tty.c_cc[VTIME] = 0;
} }
/* if graphical mode, we allow Ctrl-C handling */
if (!stdio_allow_signal) if (!stdio_allow_signal)
tty.c_lflag &= ~ISIG; tty.c_lflag &= ~ISIG;
@ -955,7 +954,6 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
chr = qemu_chr_open_fd(0, 1); chr = qemu_chr_open_fd(0, 1);
chr->chr_close = qemu_chr_close_stdio; chr->chr_close = qemu_chr_close_stdio;
chr->chr_set_echo = qemu_chr_set_echo_stdio; chr->chr_set_echo = qemu_chr_set_echo_stdio;
stdio_allow_signal = display_type != DT_NOGRAPHIC;
if (opts->has_signal) { if (opts->has_signal) {
stdio_allow_signal = opts->signal; stdio_allow_signal = opts->signal;
} }
@ -2932,6 +2930,14 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
if (strstart(filename, "mon:", &p)) { if (strstart(filename, "mon:", &p)) {
filename = p; filename = p;
qemu_opt_set(opts, "mux", "on"); qemu_opt_set(opts, "mux", "on");
if (strcmp(filename, "stdio") == 0) {
/* Monitor is muxed to stdio: do not exit on Ctrl+C by default
* but pass it to the guest. Handle this only for compat syntax,
* for -chardev syntax we have special option for this.
* This is what -nographic did, redirecting+muxing serial+monitor
* to stdio causing Ctrl+C to be passed to guest. */
qemu_opt_set(opts, "signal", "off");
}
} }
if (strcmp(filename, "null") == 0 || if (strcmp(filename, "null") == 0 ||
@ -3060,8 +3066,7 @@ static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
{ {
backend->stdio = g_new0(ChardevStdio, 1); backend->stdio = g_new0(ChardevStdio, 1);
backend->stdio->has_signal = true; backend->stdio->has_signal = true;
backend->stdio->signal = backend->stdio->signal = qemu_opt_get_bool(opts, "signal", true);
qemu_opt_get_bool(opts, "signal", display_type != DT_NOGRAPHIC);
} }
static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend, static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,

View File

@ -842,7 +842,8 @@ STEXI
Normally, QEMU uses SDL to display the VGA output. With this option, Normally, QEMU uses SDL to display the VGA output. With this option,
you can totally disable graphical output so that QEMU is a simple you can totally disable graphical output so that QEMU is a simple
command line application. The emulated serial port is redirected on command line application. The emulated serial port is redirected on
the console. Therefore, you can still use QEMU to debug a Linux kernel the console and muxed with the monitor (unless redirected elsewhere
explicitly). Therefore, you can still use QEMU to debug a Linux kernel
with a serial console. with a serial console.
ETEXI ETEXI
@ -2485,14 +2486,15 @@ same as if you had specified @code{-serial tcp} except the unix domain socket
@item mon:@var{dev_string} @item mon:@var{dev_string}
This is a special option to allow the monitor to be multiplexed onto This is a special option to allow the monitor to be multiplexed onto
another serial port. The monitor is accessed with key sequence of another serial port. The monitor is accessed with key sequence of
@key{Control-a} and then pressing @key{c}. See monitor access @key{Control-a} and then pressing @key{c}.
@ref{pcsys_keys} in the -nographic section for more keys.
@var{dev_string} should be any one of the serial devices specified @var{dev_string} should be any one of the serial devices specified
above. An example to multiplex the monitor onto a telnet server above. An example to multiplex the monitor onto a telnet server
listening on port 4444 would be: listening on port 4444 would be:
@table @code @table @code
@item -serial mon:telnet::4444,server,nowait @item -serial mon:telnet::4444,server,nowait
@end table @end table
When monitor is multiplexed to stdio this way, Ctrl+C will not terminate
QEMU anymore but will be passed to the guest instead.
@item braille @item braille
Braille device. This will use BrlAPI to display the braille output on a real Braille device. This will use BrlAPI to display the braille output on a real