Commit 86e94dea5b740dad65446c857f6959eae43e0ba6
1 parent
8f28f3fb
Reinitialize monitor upon reconnect, by Anthony Liguori.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2300 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
50 additions
and
7 deletions
console.c
monitor.c
| ... | ... | @@ -55,6 +55,7 @@ typedef struct term_cmd_t { |
| 55 | 55 | } term_cmd_t; |
| 56 | 56 | |
| 57 | 57 | static CharDriverState *monitor_hd; |
| 58 | +static int hide_banner; | |
| 58 | 59 | |
| 59 | 60 | static term_cmd_t term_cmds[]; |
| 60 | 61 | static term_cmd_t info_cmds[]; |
| ... | ... | @@ -2438,15 +2439,24 @@ static void monitor_start_input(void) |
| 2438 | 2439 | readline_start("(qemu) ", 0, monitor_handle_command1, NULL); |
| 2439 | 2440 | } |
| 2440 | 2441 | |
| 2442 | +static void term_event(void *opaque, int event) | |
| 2443 | +{ | |
| 2444 | + if (event != CHR_EVENT_RESET) | |
| 2445 | + return; | |
| 2446 | + | |
| 2447 | + if (!hide_banner) | |
| 2448 | + term_printf("QEMU %s monitor - type 'help' for more information\n", | |
| 2449 | + QEMU_VERSION); | |
| 2450 | + monitor_start_input(); | |
| 2451 | +} | |
| 2452 | + | |
| 2441 | 2453 | void monitor_init(CharDriverState *hd, int show_banner) |
| 2442 | 2454 | { |
| 2443 | 2455 | monitor_hd = hd; |
| 2444 | - if (show_banner) { | |
| 2445 | - term_printf("QEMU %s monitor - type 'help' for more information\n", | |
| 2446 | - QEMU_VERSION); | |
| 2447 | - } | |
| 2456 | + hide_banner = !show_banner; | |
| 2457 | + | |
| 2448 | 2458 | qemu_chr_add_read_handler(hd, term_can_read, term_read, NULL); |
| 2449 | - monitor_start_input(); | |
| 2459 | + qemu_chr_add_event_handler(hd, term_event); | |
| 2450 | 2460 | } |
| 2451 | 2461 | |
| 2452 | 2462 | /* XXX: use threads ? */ | ... | ... |
vl.c
| ... | ... | @@ -1165,6 +1165,23 @@ void quit_timers(void) |
| 1165 | 1165 | /***********************************************************/ |
| 1166 | 1166 | /* character device */ |
| 1167 | 1167 | |
| 1168 | +static void qemu_chr_reset_bh(void *opaque) | |
| 1169 | +{ | |
| 1170 | + CharDriverState *s = opaque; | |
| 1171 | + if (s->chr_event) | |
| 1172 | + s->chr_event(s, CHR_EVENT_RESET); | |
| 1173 | + qemu_bh_delete(s->bh); | |
| 1174 | + s->bh = NULL; | |
| 1175 | +} | |
| 1176 | + | |
| 1177 | +void qemu_chr_reset(CharDriverState *s) | |
| 1178 | +{ | |
| 1179 | + if (s->bh == NULL) { | |
| 1180 | + s->bh = qemu_bh_new(qemu_chr_reset_bh, s); | |
| 1181 | + qemu_bh_schedule(s->bh); | |
| 1182 | + } | |
| 1183 | +} | |
| 1184 | + | |
| 1168 | 1185 | int qemu_chr_write(CharDriverState *s, const uint8_t *buf, int len) |
| 1169 | 1186 | { |
| 1170 | 1187 | return s->chr_write(s, buf, len); |
| ... | ... | @@ -1402,6 +1419,9 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out) |
| 1402 | 1419 | chr->opaque = s; |
| 1403 | 1420 | chr->chr_write = fd_chr_write; |
| 1404 | 1421 | chr->chr_add_read_handler = fd_chr_add_read_handler; |
| 1422 | + | |
| 1423 | + qemu_chr_reset(chr); | |
| 1424 | + | |
| 1405 | 1425 | return chr; |
| 1406 | 1426 | } |
| 1407 | 1427 | |
| ... | ... | @@ -1819,6 +1839,7 @@ static CharDriverState *qemu_chr_open_tty(const char *filename) |
| 1819 | 1839 | if (!chr) |
| 1820 | 1840 | return NULL; |
| 1821 | 1841 | chr->chr_ioctl = tty_serial_ioctl; |
| 1842 | + qemu_chr_reset(chr); | |
| 1822 | 1843 | return chr; |
| 1823 | 1844 | } |
| 1824 | 1845 | |
| ... | ... | @@ -1882,6 +1903,9 @@ static CharDriverState *qemu_chr_open_pp(const char *filename) |
| 1882 | 1903 | chr->chr_write = null_chr_write; |
| 1883 | 1904 | chr->chr_add_read_handler = null_chr_add_read_handler; |
| 1884 | 1905 | chr->chr_ioctl = pp_ioctl; |
| 1906 | + | |
| 1907 | + qemu_chr_reset(chr); | |
| 1908 | + | |
| 1885 | 1909 | return chr; |
| 1886 | 1910 | } |
| 1887 | 1911 | |
| ... | ... | @@ -2127,6 +2151,7 @@ static CharDriverState *qemu_chr_open_win(const char *filename) |
| 2127 | 2151 | free(chr); |
| 2128 | 2152 | return NULL; |
| 2129 | 2153 | } |
| 2154 | + qemu_chr_reset(chr); | |
| 2130 | 2155 | return chr; |
| 2131 | 2156 | } |
| 2132 | 2157 | |
| ... | ... | @@ -2230,6 +2255,7 @@ static CharDriverState *qemu_chr_open_win_pipe(const char *filename) |
| 2230 | 2255 | free(chr); |
| 2231 | 2256 | return NULL; |
| 2232 | 2257 | } |
| 2258 | + qemu_chr_reset(chr); | |
| 2233 | 2259 | return chr; |
| 2234 | 2260 | } |
| 2235 | 2261 | |
| ... | ... | @@ -2250,6 +2276,7 @@ static CharDriverState *qemu_chr_open_win_file(HANDLE fd_out) |
| 2250 | 2276 | chr->opaque = s; |
| 2251 | 2277 | chr->chr_write = win_chr_write; |
| 2252 | 2278 | chr->chr_add_read_handler = win_chr_add_read_handler; |
| 2279 | + qemu_chr_reset(chr); | |
| 2253 | 2280 | return chr; |
| 2254 | 2281 | } |
| 2255 | 2282 | |
| ... | ... | @@ -2537,6 +2564,7 @@ static void tcp_chr_connect(void *opaque) |
| 2537 | 2564 | s->connected = 1; |
| 2538 | 2565 | qemu_set_fd_handler2(s->fd, tcp_chr_read_poll, |
| 2539 | 2566 | tcp_chr_read, NULL, chr); |
| 2567 | + qemu_chr_reset(chr); | |
| 2540 | 2568 | } |
| 2541 | 2569 | |
| 2542 | 2570 | #define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c; | ... | ... |
vl.h
| ... | ... | @@ -260,11 +260,13 @@ int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); |
| 260 | 260 | void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); |
| 261 | 261 | #endif |
| 262 | 262 | |
| 263 | +typedef struct QEMUBH QEMUBH; | |
| 264 | + | |
| 263 | 265 | /* character device */ |
| 264 | 266 | |
| 265 | 267 | #define CHR_EVENT_BREAK 0 /* serial break char */ |
| 266 | 268 | #define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */ |
| 267 | - | |
| 269 | +#define CHR_EVENT_RESET 2 /* new connection established */ | |
| 268 | 270 | |
| 269 | 271 | |
| 270 | 272 | #define CHR_IOCTL_SERIAL_SET_PARAMS 1 |
| ... | ... | @@ -295,6 +297,7 @@ typedef struct CharDriverState { |
| 295 | 297 | void (*chr_send_event)(struct CharDriverState *chr, int event); |
| 296 | 298 | void (*chr_close)(struct CharDriverState *chr); |
| 297 | 299 | void *opaque; |
| 300 | + QEMUBH *bh; | |
| 298 | 301 | } CharDriverState; |
| 299 | 302 | |
| 300 | 303 | void qemu_chr_printf(CharDriverState *s, const char *fmt, ...); |
| ... | ... | @@ -305,6 +308,7 @@ void qemu_chr_add_read_handler(CharDriverState *s, |
| 305 | 308 | IOReadHandler *fd_read, void *opaque); |
| 306 | 309 | void qemu_chr_add_event_handler(CharDriverState *s, IOEventHandler *chr_event); |
| 307 | 310 | int qemu_chr_ioctl(CharDriverState *s, int cmd, void *arg); |
| 311 | +void qemu_chr_reset(CharDriverState *s); | |
| 308 | 312 | |
| 309 | 313 | /* consoles */ |
| 310 | 314 | |
| ... | ... | @@ -513,7 +517,6 @@ void do_delvm(const char *name); |
| 513 | 517 | void do_info_snapshots(void); |
| 514 | 518 | |
| 515 | 519 | /* bottom halves */ |
| 516 | -typedef struct QEMUBH QEMUBH; | |
| 517 | 520 | typedef void QEMUBHFunc(void *opaque); |
| 518 | 521 | |
| 519 | 522 | QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque); | ... | ... |