Commit 9781e0401ad7d2d30e48fd532372d4ef80be58b6
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
Showing
4 changed files
with
12 additions
and
37 deletions
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 | ... | ... |
vl.c
| ... | ... | @@ -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 | ... | ... |