Commit 9781e0401ad7d2d30e48fd532372d4ef80be58b6

Authored by aliguori
1 parent 5c047c0d

Rework vm_state_change notifiers (Jan Kiszka)


Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6402 c046a42c-6fe2-441c-8c8c-71466251a162
audio/audio.c
... ... @@ -1622,7 +1622,8 @@ static int audio_driver_init (AudioState *s, struct audio_driver *drv)
1622 1622 }
1623 1623 }
1624 1624  
1625   -static void audio_vm_change_state_handler (void *opaque, int running)
  1625 +static void audio_vm_change_state_handler (void *opaque, int running,
  1626 + int reason)
1626 1627 {
1627 1628 AudioState *s = opaque;
1628 1629 HWVoiceOut *hwo = NULL;
... ...
gdbstub.c
... ... @@ -1867,7 +1867,7 @@ void gdb_set_stop_cpu(CPUState *env)
1867 1867 }
1868 1868  
1869 1869 #ifndef CONFIG_USER_ONLY
1870   -static void gdb_vm_stopped(void *opaque, int reason)
  1870 +static void gdb_vm_state_change(void *opaque, int running, int reason)
1871 1871 {
1872 1872 GDBState *s = gdbserver_state;
1873 1873 CPUState *env = s->c_cpu;
... ... @@ -1875,7 +1875,8 @@ static void gdb_vm_stopped(void *opaque, int reason)
1875 1875 const char *type;
1876 1876 int ret;
1877 1877  
1878   - if (s->state == RS_SYSCALL)
  1878 + if (running || (reason != EXCP_DEBUG && reason != EXCP_INTERRUPT) ||
  1879 + s->state == RS_SYSCALL)
1879 1880 return;
1880 1881  
1881 1882 /* disable single step if it was enable */
... ... @@ -1904,10 +1905,8 @@ static void gdb_vm_stopped(void *opaque, int reason)
1904 1905 }
1905 1906 tb_flush(env);
1906 1907 ret = GDB_SIGNAL_TRAP;
1907   - } else if (reason == EXCP_INTERRUPT) {
1908   - ret = GDB_SIGNAL_INT;
1909 1908 } else {
1910   - ret = 0;
  1909 + ret = GDB_SIGNAL_INT;
1911 1910 }
1912 1911 snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, env->cpu_index+1);
1913 1912 put_packet(s, buf);
... ... @@ -2300,7 +2299,7 @@ int gdbserver_start(const char *port)
2300 2299 gdbserver_state = s;
2301 2300 qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
2302 2301 gdb_chr_event, NULL);
2303   - qemu_add_vm_stop_handler(gdb_vm_stopped, NULL);
  2302 + qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);
2304 2303 return 0;
2305 2304 }
2306 2305 #endif
... ...
sysemu.h
... ... @@ -12,16 +12,12 @@ extern uint8_t qemu_uuid[];
12 12 #define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
13 13  
14 14 typedef struct vm_change_state_entry VMChangeStateEntry;
15   -typedef void VMChangeStateHandler(void *opaque, int running);
16   -typedef void VMStopHandler(void *opaque, int reason);
  15 +typedef void VMChangeStateHandler(void *opaque, int running, int reason);
17 16  
18 17 VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
19 18 void *opaque);
20 19 void qemu_del_vm_change_state_handler(VMChangeStateEntry *e);
21 20  
22   -int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque);
23   -void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
24   -
25 21 void vm_start(void);
26 22 void vm_stop(int reason);
27 23  
... ...
... ... @@ -3451,37 +3451,21 @@ void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
3451 3451 qemu_free (e);
3452 3452 }
3453 3453  
3454   -static void vm_state_notify(int running)
  3454 +static void vm_state_notify(int running, int reason)
3455 3455 {
3456 3456 VMChangeStateEntry *e;
3457 3457  
3458 3458 for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
3459   - e->cb(e->opaque, running);
  3459 + e->cb(e->opaque, running, reason);
3460 3460 }
3461 3461 }
3462 3462  
3463   -/* XXX: support several handlers */
3464   -static VMStopHandler *vm_stop_cb;
3465   -static void *vm_stop_opaque;
3466   -
3467   -int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
3468   -{
3469   - vm_stop_cb = cb;
3470   - vm_stop_opaque = opaque;
3471   - return 0;
3472   -}
3473   -
3474   -void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque)
3475   -{
3476   - vm_stop_cb = NULL;
3477   -}
3478   -
3479 3463 void vm_start(void)
3480 3464 {
3481 3465 if (!vm_running) {
3482 3466 cpu_enable_ticks();
3483 3467 vm_running = 1;
3484   - vm_state_notify(1);
  3468 + vm_state_notify(1, 0);
3485 3469 qemu_rearm_alarm_timer(alarm_timer);
3486 3470 }
3487 3471 }
... ... @@ -3491,12 +3475,7 @@ void vm_stop(int reason)
3491 3475 if (vm_running) {
3492 3476 cpu_disable_ticks();
3493 3477 vm_running = 0;
3494   - if (reason != 0) {
3495   - if (vm_stop_cb) {
3496   - vm_stop_cb(vm_stop_opaque, reason);
3497   - }
3498   - }
3499   - vm_state_notify(0);
  3478 + vm_state_notify(0, reason);
3500 3479 }
3501 3480 }
3502 3481  
... ...