Commit 86e94dea5b740dad65446c857f6959eae43e0ba6

Authored by ths
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
console.c
... ... @@ -1086,5 +1086,7 @@ CharDriverState *text_console_init(DisplayState *ds)
1086 1086 s->t_attrib = s->t_attrib_default;
1087 1087 text_console_resize(s);
1088 1088  
  1089 + qemu_chr_reset(chr);
  1090 +
1089 1091 return chr;
1090 1092 }
... ...
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 ? */
... ...
... ... @@ -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;
... ...
... ... @@ -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);
... ...