]> git.proxmox.com Git - mirror_qemu.git/blame - cpus.c
gtk: add tab to trace events
[mirror_qemu.git] / cpus.c
CommitLineData
296af7c9
BS
1/*
2 * QEMU System Emulator
3 *
4 * Copyright (c) 2003-2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25/* Needed early for CONFIG_BSD etc. */
26#include "config-host.h"
27
83c9089e 28#include "monitor/monitor.h"
9c17d615 29#include "sysemu/sysemu.h"
022c62cb 30#include "exec/gdbstub.h"
9c17d615
PB
31#include "sysemu/dma.h"
32#include "sysemu/kvm.h"
de0b36b6 33#include "qmp-commands.h"
296af7c9 34
1de7afc9 35#include "qemu/thread.h"
9c17d615
PB
36#include "sysemu/cpus.h"
37#include "sysemu/qtest.h"
1de7afc9
PB
38#include "qemu/main-loop.h"
39#include "qemu/bitmap.h"
cb365646 40#include "qemu/seqlock.h"
0ff0fc19
JK
41
42#ifndef _WIN32
1de7afc9 43#include "qemu/compatfd.h"
0ff0fc19 44#endif
296af7c9 45
6d9cb73c
JK
46#ifdef CONFIG_LINUX
47
48#include <sys/prctl.h>
49
c0532a76
MT
50#ifndef PR_MCE_KILL
51#define PR_MCE_KILL 33
52#endif
53
6d9cb73c
JK
54#ifndef PR_MCE_KILL_SET
55#define PR_MCE_KILL_SET 1
56#endif
57
58#ifndef PR_MCE_KILL_EARLY
59#define PR_MCE_KILL_EARLY 1
60#endif
61
62#endif /* CONFIG_LINUX */
63
182735ef 64static CPUState *next_cpu;
296af7c9 65
321bc0b2
TC
66bool cpu_is_stopped(CPUState *cpu)
67{
68 return cpu->stopped || !runstate_is_running();
69}
70
a98ae1d8 71static bool cpu_thread_is_idle(CPUState *cpu)
ac873f1e 72{
c64ca814 73 if (cpu->stop || cpu->queued_work_first) {
ac873f1e
PM
74 return false;
75 }
321bc0b2 76 if (cpu_is_stopped(cpu)) {
ac873f1e
PM
77 return true;
78 }
8c2e1b00 79 if (!cpu->halted || cpu_has_work(cpu) ||
215e79c0 80 kvm_halt_in_kernel()) {
ac873f1e
PM
81 return false;
82 }
83 return true;
84}
85
86static bool all_cpu_threads_idle(void)
87{
182735ef 88 CPUState *cpu;
ac873f1e 89
bdc44640 90 CPU_FOREACH(cpu) {
182735ef 91 if (!cpu_thread_is_idle(cpu)) {
ac873f1e
PM
92 return false;
93 }
94 }
95 return true;
96}
97
946fb27c
PB
98/***********************************************************/
99/* guest cycle counter */
100
a3270e19
PB
101/* Protected by TimersState seqlock */
102
103/* Compensate for varying guest execution speed. */
104static int64_t qemu_icount_bias;
105static int64_t vm_clock_warp_start;
946fb27c
PB
106/* Conversion factor from emulated instructions to virtual clock ticks. */
107static int icount_time_shift;
108/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
109#define MAX_ICOUNT_SHIFT 10
a3270e19
PB
110
111/* Only written by TCG thread */
112static int64_t qemu_icount;
113
946fb27c
PB
114static QEMUTimer *icount_rt_timer;
115static QEMUTimer *icount_vm_timer;
116static QEMUTimer *icount_warp_timer;
946fb27c
PB
117
118typedef struct TimersState {
cb365646 119 /* Protected by BQL. */
946fb27c
PB
120 int64_t cpu_ticks_prev;
121 int64_t cpu_ticks_offset;
cb365646
LPF
122
123 /* cpu_clock_offset can be read out of BQL, so protect it with
124 * this lock.
125 */
126 QemuSeqLock vm_clock_seqlock;
946fb27c
PB
127 int64_t cpu_clock_offset;
128 int32_t cpu_ticks_enabled;
129 int64_t dummy;
130} TimersState;
131
d9cd4007 132static TimersState timers_state;
946fb27c
PB
133
134/* Return the virtual CPU time, based on the instruction counter. */
17a15f1b 135static int64_t cpu_get_icount_locked(void)
946fb27c
PB
136{
137 int64_t icount;
4917cf44 138 CPUState *cpu = current_cpu;
946fb27c
PB
139
140 icount = qemu_icount;
4917cf44 141 if (cpu) {
99df7dce 142 if (!cpu_can_do_io(cpu)) {
946fb27c
PB
143 fprintf(stderr, "Bad clock read\n");
144 }
28ecfd7a 145 icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
946fb27c
PB
146 }
147 return qemu_icount_bias + (icount << icount_time_shift);
148}
149
17a15f1b
PB
150int64_t cpu_get_icount(void)
151{
152 int64_t icount;
153 unsigned start;
154
155 do {
156 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
157 icount = cpu_get_icount_locked();
158 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
159
160 return icount;
161}
162
946fb27c 163/* return the host CPU cycle counter and handle stop/restart */
cb365646 164/* Caller must hold the BQL */
946fb27c
PB
165int64_t cpu_get_ticks(void)
166{
5f3e3101
PB
167 int64_t ticks;
168
946fb27c
PB
169 if (use_icount) {
170 return cpu_get_icount();
171 }
5f3e3101
PB
172
173 ticks = timers_state.cpu_ticks_offset;
174 if (timers_state.cpu_ticks_enabled) {
175 ticks += cpu_get_real_ticks();
176 }
177
178 if (timers_state.cpu_ticks_prev > ticks) {
179 /* Note: non increasing ticks may happen if the host uses
180 software suspend */
181 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
182 ticks = timers_state.cpu_ticks_prev;
946fb27c 183 }
5f3e3101
PB
184
185 timers_state.cpu_ticks_prev = ticks;
186 return ticks;
946fb27c
PB
187}
188
cb365646 189static int64_t cpu_get_clock_locked(void)
946fb27c 190{
5f3e3101 191 int64_t ticks;
cb365646 192
5f3e3101
PB
193 ticks = timers_state.cpu_clock_offset;
194 if (timers_state.cpu_ticks_enabled) {
195 ticks += get_clock();
946fb27c 196 }
cb365646 197
5f3e3101 198 return ticks;
cb365646
LPF
199}
200
201/* return the host CPU monotonic timer and handle stop/restart */
202int64_t cpu_get_clock(void)
203{
204 int64_t ti;
205 unsigned start;
206
207 do {
208 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
209 ti = cpu_get_clock_locked();
210 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
211
212 return ti;
946fb27c
PB
213}
214
cb365646
LPF
215/* enable cpu_get_ticks()
216 * Caller must hold BQL which server as mutex for vm_clock_seqlock.
217 */
946fb27c
PB
218void cpu_enable_ticks(void)
219{
cb365646
LPF
220 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
221 seqlock_write_lock(&timers_state.vm_clock_seqlock);
946fb27c
PB
222 if (!timers_state.cpu_ticks_enabled) {
223 timers_state.cpu_ticks_offset -= cpu_get_real_ticks();
224 timers_state.cpu_clock_offset -= get_clock();
225 timers_state.cpu_ticks_enabled = 1;
226 }
cb365646 227 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
946fb27c
PB
228}
229
230/* disable cpu_get_ticks() : the clock is stopped. You must not call
cb365646
LPF
231 * cpu_get_ticks() after that.
232 * Caller must hold BQL which server as mutex for vm_clock_seqlock.
233 */
946fb27c
PB
234void cpu_disable_ticks(void)
235{
cb365646
LPF
236 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
237 seqlock_write_lock(&timers_state.vm_clock_seqlock);
946fb27c 238 if (timers_state.cpu_ticks_enabled) {
5f3e3101 239 timers_state.cpu_ticks_offset += cpu_get_real_ticks();
cb365646 240 timers_state.cpu_clock_offset = cpu_get_clock_locked();
946fb27c
PB
241 timers_state.cpu_ticks_enabled = 0;
242 }
cb365646 243 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
946fb27c
PB
244}
245
246/* Correlation between real and virtual time is always going to be
247 fairly approximate, so ignore small variation.
248 When the guest is idle real and virtual time will be aligned in
249 the IO wait loop. */
250#define ICOUNT_WOBBLE (get_ticks_per_sec() / 10)
251
252static void icount_adjust(void)
253{
254 int64_t cur_time;
255 int64_t cur_icount;
256 int64_t delta;
a3270e19
PB
257
258 /* Protected by TimersState mutex. */
946fb27c 259 static int64_t last_delta;
468cc7cf 260
946fb27c
PB
261 /* If the VM is not running, then do nothing. */
262 if (!runstate_is_running()) {
263 return;
264 }
468cc7cf 265
17a15f1b
PB
266 seqlock_write_lock(&timers_state.vm_clock_seqlock);
267 cur_time = cpu_get_clock_locked();
268 cur_icount = cpu_get_icount_locked();
468cc7cf 269
946fb27c
PB
270 delta = cur_icount - cur_time;
271 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
272 if (delta > 0
273 && last_delta + ICOUNT_WOBBLE < delta * 2
274 && icount_time_shift > 0) {
275 /* The guest is getting too far ahead. Slow time down. */
276 icount_time_shift--;
277 }
278 if (delta < 0
279 && last_delta - ICOUNT_WOBBLE > delta * 2
280 && icount_time_shift < MAX_ICOUNT_SHIFT) {
281 /* The guest is getting too far behind. Speed time up. */
282 icount_time_shift++;
283 }
284 last_delta = delta;
285 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
17a15f1b 286 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
946fb27c
PB
287}
288
289static void icount_adjust_rt(void *opaque)
290{
40daca54
AB
291 timer_mod(icount_rt_timer,
292 qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
946fb27c
PB
293 icount_adjust();
294}
295
296static void icount_adjust_vm(void *opaque)
297{
40daca54
AB
298 timer_mod(icount_vm_timer,
299 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
300 get_ticks_per_sec() / 10);
946fb27c
PB
301 icount_adjust();
302}
303
304static int64_t qemu_icount_round(int64_t count)
305{
306 return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
307}
308
309static void icount_warp_rt(void *opaque)
310{
17a15f1b
PB
311 /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
312 * changes from -1 to another value, so the race here is okay.
313 */
314 if (atomic_read(&vm_clock_warp_start) == -1) {
946fb27c
PB
315 return;
316 }
317
17a15f1b 318 seqlock_write_lock(&timers_state.vm_clock_seqlock);
946fb27c 319 if (runstate_is_running()) {
40daca54 320 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
8ed961d9
PB
321 int64_t warp_delta;
322
323 warp_delta = clock - vm_clock_warp_start;
324 if (use_icount == 2) {
946fb27c 325 /*
40daca54 326 * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
946fb27c
PB
327 * far ahead of real time.
328 */
17a15f1b
PB
329 int64_t cur_time = cpu_get_clock_locked();
330 int64_t cur_icount = cpu_get_icount_locked();
946fb27c 331 int64_t delta = cur_time - cur_icount;
8ed961d9 332 warp_delta = MIN(warp_delta, delta);
946fb27c 333 }
8ed961d9 334 qemu_icount_bias += warp_delta;
946fb27c
PB
335 }
336 vm_clock_warp_start = -1;
17a15f1b 337 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
8ed961d9
PB
338
339 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
340 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
341 }
946fb27c
PB
342}
343
8156be56
PB
344void qtest_clock_warp(int64_t dest)
345{
40daca54 346 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
8156be56
PB
347 assert(qtest_enabled());
348 while (clock < dest) {
40daca54 349 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
8156be56 350 int64_t warp = MIN(dest - clock, deadline);
17a15f1b 351 seqlock_write_lock(&timers_state.vm_clock_seqlock);
8156be56 352 qemu_icount_bias += warp;
17a15f1b
PB
353 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
354
40daca54
AB
355 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
356 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
8156be56 357 }
40daca54 358 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
8156be56
PB
359}
360
40daca54 361void qemu_clock_warp(QEMUClockType type)
946fb27c 362{
ce78d18c 363 int64_t clock;
946fb27c
PB
364 int64_t deadline;
365
366 /*
367 * There are too many global variables to make the "warp" behavior
368 * applicable to other clocks. But a clock argument removes the
369 * need for if statements all over the place.
370 */
40daca54 371 if (type != QEMU_CLOCK_VIRTUAL || !use_icount) {
946fb27c
PB
372 return;
373 }
374
375 /*
40daca54
AB
376 * If the CPUs have been sleeping, advance QEMU_CLOCK_VIRTUAL timer now.
377 * This ensures that the deadline for the timer is computed correctly below.
946fb27c
PB
378 * This also makes sure that the insn counter is synchronized before the
379 * CPU starts running, in case the CPU is woken by an event other than
40daca54 380 * the earliest QEMU_CLOCK_VIRTUAL timer.
946fb27c
PB
381 */
382 icount_warp_rt(NULL);
ce78d18c
PB
383 timer_del(icount_warp_timer);
384 if (!all_cpu_threads_idle()) {
946fb27c
PB
385 return;
386 }
387
8156be56
PB
388 if (qtest_enabled()) {
389 /* When testing, qtest commands advance icount. */
390 return;
391 }
392
ac70aafc 393 /* We want to use the earliest deadline from ALL vm_clocks */
ce78d18c 394 clock = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
40daca54 395 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ce78d18c
PB
396 if (deadline < 0) {
397 return;
ac70aafc
AB
398 }
399
946fb27c
PB
400 if (deadline > 0) {
401 /*
40daca54 402 * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to
946fb27c
PB
403 * sleep. Otherwise, the CPU might be waiting for a future timer
404 * interrupt to wake it up, but the interrupt never comes because
405 * the vCPU isn't running any insns and thus doesn't advance the
40daca54 406 * QEMU_CLOCK_VIRTUAL.
946fb27c
PB
407 *
408 * An extreme solution for this problem would be to never let VCPUs
40daca54
AB
409 * sleep in icount mode if there is a pending QEMU_CLOCK_VIRTUAL
410 * timer; rather time could just advance to the next QEMU_CLOCK_VIRTUAL
411 * event. Instead, we do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL
412 * after some e"real" time, (related to the time left until the next
413 * event) has passed. The QEMU_CLOCK_REALTIME timer will do this.
414 * This avoids that the warps are visible externally; for example,
415 * you will not be sending network packets continuously instead of
416 * every 100ms.
946fb27c 417 */
17a15f1b 418 seqlock_write_lock(&timers_state.vm_clock_seqlock);
ce78d18c
PB
419 if (vm_clock_warp_start == -1 || vm_clock_warp_start > clock) {
420 vm_clock_warp_start = clock;
421 }
17a15f1b 422 seqlock_write_unlock(&timers_state.vm_clock_seqlock);
ce78d18c 423 timer_mod_anticipate(icount_warp_timer, clock + deadline);
ac70aafc 424 } else if (deadline == 0) {
40daca54 425 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
946fb27c
PB
426 }
427}
428
429static const VMStateDescription vmstate_timers = {
430 .name = "timer",
431 .version_id = 2,
432 .minimum_version_id = 1,
35d08458 433 .fields = (VMStateField[]) {
946fb27c
PB
434 VMSTATE_INT64(cpu_ticks_offset, TimersState),
435 VMSTATE_INT64(dummy, TimersState),
436 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
437 VMSTATE_END_OF_LIST()
438 }
439};
440
441void configure_icount(const char *option)
442{
cb365646 443 seqlock_init(&timers_state.vm_clock_seqlock, NULL);
946fb27c
PB
444 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
445 if (!option) {
446 return;
447 }
448
40daca54
AB
449 icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME,
450 icount_warp_rt, NULL);
946fb27c
PB
451 if (strcmp(option, "auto") != 0) {
452 icount_time_shift = strtol(option, NULL, 0);
453 use_icount = 1;
454 return;
455 }
456
457 use_icount = 2;
458
459 /* 125MIPS seems a reasonable initial guess at the guest speed.
460 It will be corrected fairly quickly anyway. */
461 icount_time_shift = 3;
462
463 /* Have both realtime and virtual time triggers for speed adjustment.
464 The realtime trigger catches emulated time passing too slowly,
465 the virtual time trigger catches emulated time passing too fast.
466 Realtime triggers occur even when idle, so use them less frequently
467 than VM triggers. */
40daca54
AB
468 icount_rt_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
469 icount_adjust_rt, NULL);
470 timer_mod(icount_rt_timer,
471 qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
472 icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
473 icount_adjust_vm, NULL);
474 timer_mod(icount_vm_timer,
475 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
476 get_ticks_per_sec() / 10);
946fb27c
PB
477}
478
296af7c9
BS
479/***********************************************************/
480void hw_error(const char *fmt, ...)
481{
482 va_list ap;
55e5c285 483 CPUState *cpu;
296af7c9
BS
484
485 va_start(ap, fmt);
486 fprintf(stderr, "qemu: hardware error: ");
487 vfprintf(stderr, fmt, ap);
488 fprintf(stderr, "\n");
bdc44640 489 CPU_FOREACH(cpu) {
55e5c285 490 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
878096ee 491 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU);
296af7c9
BS
492 }
493 va_end(ap);
494 abort();
495}
496
497void cpu_synchronize_all_states(void)
498{
182735ef 499 CPUState *cpu;
296af7c9 500
bdc44640 501 CPU_FOREACH(cpu) {
182735ef 502 cpu_synchronize_state(cpu);
296af7c9
BS
503 }
504}
505
506void cpu_synchronize_all_post_reset(void)
507{
182735ef 508 CPUState *cpu;
296af7c9 509
bdc44640 510 CPU_FOREACH(cpu) {
182735ef 511 cpu_synchronize_post_reset(cpu);
296af7c9
BS
512 }
513}
514
515void cpu_synchronize_all_post_init(void)
516{
182735ef 517 CPUState *cpu;
296af7c9 518
bdc44640 519 CPU_FOREACH(cpu) {
182735ef 520 cpu_synchronize_post_init(cpu);
296af7c9
BS
521 }
522}
523
56983463 524static int do_vm_stop(RunState state)
296af7c9 525{
56983463
KW
526 int ret = 0;
527
1354869c 528 if (runstate_is_running()) {
296af7c9 529 cpu_disable_ticks();
296af7c9 530 pause_all_vcpus();
f5bbfba1 531 runstate_set(state);
1dfb4dd9 532 vm_state_notify(0, state);
296af7c9
BS
533 monitor_protocol_event(QEVENT_STOP, NULL);
534 }
56983463 535
594a45ce
KW
536 bdrv_drain_all();
537 ret = bdrv_flush_all();
538
56983463 539 return ret;
296af7c9
BS
540}
541
a1fcaa73 542static bool cpu_can_run(CPUState *cpu)
296af7c9 543{
4fdeee7c 544 if (cpu->stop) {
a1fcaa73 545 return false;
0ab07c62 546 }
321bc0b2 547 if (cpu_is_stopped(cpu)) {
a1fcaa73 548 return false;
0ab07c62 549 }
a1fcaa73 550 return true;
296af7c9
BS
551}
552
91325046 553static void cpu_handle_guest_debug(CPUState *cpu)
83f338f7 554{
64f6b346 555 gdb_set_stop_cpu(cpu);
8cf71710 556 qemu_system_debug_request();
f324e766 557 cpu->stopped = true;
3c638d06
JK
558}
559
714bd040
PB
560static void cpu_signal(int sig)
561{
4917cf44
AF
562 if (current_cpu) {
563 cpu_exit(current_cpu);
714bd040
PB
564 }
565 exit_request = 1;
566}
714bd040 567
6d9cb73c
JK
568#ifdef CONFIG_LINUX
569static void sigbus_reraise(void)
570{
571 sigset_t set;
572 struct sigaction action;
573
574 memset(&action, 0, sizeof(action));
575 action.sa_handler = SIG_DFL;
576 if (!sigaction(SIGBUS, &action, NULL)) {
577 raise(SIGBUS);
578 sigemptyset(&set);
579 sigaddset(&set, SIGBUS);
580 sigprocmask(SIG_UNBLOCK, &set, NULL);
581 }
582 perror("Failed to re-raise SIGBUS!\n");
583 abort();
584}
585
586static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
587 void *ctx)
588{
589 if (kvm_on_sigbus(siginfo->ssi_code,
590 (void *)(intptr_t)siginfo->ssi_addr)) {
591 sigbus_reraise();
592 }
593}
594
595static void qemu_init_sigbus(void)
596{
597 struct sigaction action;
598
599 memset(&action, 0, sizeof(action));
600 action.sa_flags = SA_SIGINFO;
601 action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
602 sigaction(SIGBUS, &action, NULL);
603
604 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
605}
606
290adf38 607static void qemu_kvm_eat_signals(CPUState *cpu)
1ab3c6c0
JK
608{
609 struct timespec ts = { 0, 0 };
610 siginfo_t siginfo;
611 sigset_t waitset;
612 sigset_t chkset;
613 int r;
614
615 sigemptyset(&waitset);
616 sigaddset(&waitset, SIG_IPI);
617 sigaddset(&waitset, SIGBUS);
618
619 do {
620 r = sigtimedwait(&waitset, &siginfo, &ts);
621 if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
622 perror("sigtimedwait");
623 exit(1);
624 }
625
626 switch (r) {
627 case SIGBUS:
290adf38 628 if (kvm_on_sigbus_vcpu(cpu, siginfo.si_code, siginfo.si_addr)) {
1ab3c6c0
JK
629 sigbus_reraise();
630 }
631 break;
632 default:
633 break;
634 }
635
636 r = sigpending(&chkset);
637 if (r == -1) {
638 perror("sigpending");
639 exit(1);
640 }
641 } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
1ab3c6c0
JK
642}
643
6d9cb73c
JK
644#else /* !CONFIG_LINUX */
645
646static void qemu_init_sigbus(void)
647{
648}
1ab3c6c0 649
290adf38 650static void qemu_kvm_eat_signals(CPUState *cpu)
1ab3c6c0
JK
651{
652}
6d9cb73c
JK
653#endif /* !CONFIG_LINUX */
654
296af7c9 655#ifndef _WIN32
55f8d6ac
JK
656static void dummy_signal(int sig)
657{
658}
55f8d6ac 659
13618e05 660static void qemu_kvm_init_cpu_signals(CPUState *cpu)
714bd040
PB
661{
662 int r;
663 sigset_t set;
664 struct sigaction sigact;
665
666 memset(&sigact, 0, sizeof(sigact));
667 sigact.sa_handler = dummy_signal;
668 sigaction(SIG_IPI, &sigact, NULL);
669
714bd040
PB
670 pthread_sigmask(SIG_BLOCK, NULL, &set);
671 sigdelset(&set, SIG_IPI);
714bd040 672 sigdelset(&set, SIGBUS);
491d6e80 673 r = kvm_set_signal_mask(cpu, &set);
714bd040
PB
674 if (r) {
675 fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
676 exit(1);
677 }
678}
679
680static void qemu_tcg_init_cpu_signals(void)
681{
714bd040
PB
682 sigset_t set;
683 struct sigaction sigact;
684
685 memset(&sigact, 0, sizeof(sigact));
686 sigact.sa_handler = cpu_signal;
687 sigaction(SIG_IPI, &sigact, NULL);
688
689 sigemptyset(&set);
690 sigaddset(&set, SIG_IPI);
691 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
714bd040
PB
692}
693
55f8d6ac 694#else /* _WIN32 */
13618e05 695static void qemu_kvm_init_cpu_signals(CPUState *cpu)
ff48eb5f 696{
714bd040
PB
697 abort();
698}
ff48eb5f 699
714bd040
PB
700static void qemu_tcg_init_cpu_signals(void)
701{
ff48eb5f 702}
714bd040 703#endif /* _WIN32 */
ff48eb5f 704
b2532d88 705static QemuMutex qemu_global_mutex;
46daff13
PB
706static QemuCond qemu_io_proceeded_cond;
707static bool iothread_requesting_mutex;
296af7c9
BS
708
709static QemuThread io_thread;
710
711static QemuThread *tcg_cpu_thread;
712static QemuCond *tcg_halt_cond;
713
296af7c9
BS
714/* cpu creation */
715static QemuCond qemu_cpu_cond;
716/* system init */
296af7c9 717static QemuCond qemu_pause_cond;
e82bcec2 718static QemuCond qemu_work_cond;
296af7c9 719
d3b12f5d 720void qemu_init_cpu_loop(void)
296af7c9 721{
6d9cb73c 722 qemu_init_sigbus();
ed94592b 723 qemu_cond_init(&qemu_cpu_cond);
ed94592b
AL
724 qemu_cond_init(&qemu_pause_cond);
725 qemu_cond_init(&qemu_work_cond);
46daff13 726 qemu_cond_init(&qemu_io_proceeded_cond);
296af7c9 727 qemu_mutex_init(&qemu_global_mutex);
296af7c9 728
b7680cb6 729 qemu_thread_get_self(&io_thread);
296af7c9
BS
730}
731
f100f0b3 732void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
e82bcec2
MT
733{
734 struct qemu_work_item wi;
735
60e82579 736 if (qemu_cpu_is_self(cpu)) {
e82bcec2
MT
737 func(data);
738 return;
739 }
740
741 wi.func = func;
742 wi.data = data;
3c02270d 743 wi.free = false;
c64ca814
AF
744 if (cpu->queued_work_first == NULL) {
745 cpu->queued_work_first = &wi;
0ab07c62 746 } else {
c64ca814 747 cpu->queued_work_last->next = &wi;
0ab07c62 748 }
c64ca814 749 cpu->queued_work_last = &wi;
e82bcec2
MT
750 wi.next = NULL;
751 wi.done = false;
752
c08d7424 753 qemu_cpu_kick(cpu);
e82bcec2 754 while (!wi.done) {
4917cf44 755 CPUState *self_cpu = current_cpu;
e82bcec2
MT
756
757 qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
4917cf44 758 current_cpu = self_cpu;
e82bcec2
MT
759 }
760}
761
3c02270d
CV
762void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
763{
764 struct qemu_work_item *wi;
765
766 if (qemu_cpu_is_self(cpu)) {
767 func(data);
768 return;
769 }
770
771 wi = g_malloc0(sizeof(struct qemu_work_item));
772 wi->func = func;
773 wi->data = data;
774 wi->free = true;
775 if (cpu->queued_work_first == NULL) {
776 cpu->queued_work_first = wi;
777 } else {
778 cpu->queued_work_last->next = wi;
779 }
780 cpu->queued_work_last = wi;
781 wi->next = NULL;
782 wi->done = false;
783
784 qemu_cpu_kick(cpu);
785}
786
6d45b109 787static void flush_queued_work(CPUState *cpu)
e82bcec2
MT
788{
789 struct qemu_work_item *wi;
790
c64ca814 791 if (cpu->queued_work_first == NULL) {
e82bcec2 792 return;
0ab07c62 793 }
e82bcec2 794
c64ca814
AF
795 while ((wi = cpu->queued_work_first)) {
796 cpu->queued_work_first = wi->next;
e82bcec2
MT
797 wi->func(wi->data);
798 wi->done = true;
3c02270d
CV
799 if (wi->free) {
800 g_free(wi);
801 }
e82bcec2 802 }
c64ca814 803 cpu->queued_work_last = NULL;
e82bcec2
MT
804 qemu_cond_broadcast(&qemu_work_cond);
805}
806
509a0d78 807static void qemu_wait_io_event_common(CPUState *cpu)
296af7c9 808{
4fdeee7c
AF
809 if (cpu->stop) {
810 cpu->stop = false;
f324e766 811 cpu->stopped = true;
296af7c9
BS
812 qemu_cond_signal(&qemu_pause_cond);
813 }
6d45b109 814 flush_queued_work(cpu);
216fc9a4 815 cpu->thread_kicked = false;
296af7c9
BS
816}
817
6cabe1f3 818static void qemu_tcg_wait_io_event(void)
296af7c9 819{
182735ef 820 CPUState *cpu;
6cabe1f3 821
16400322 822 while (all_cpu_threads_idle()) {
ab33fcda
PB
823 /* Start accounting real time to the virtual clock if the CPUs
824 are idle. */
40daca54 825 qemu_clock_warp(QEMU_CLOCK_VIRTUAL);
9705fbb5 826 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
16400322 827 }
296af7c9 828
46daff13
PB
829 while (iothread_requesting_mutex) {
830 qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
831 }
6cabe1f3 832
bdc44640 833 CPU_FOREACH(cpu) {
182735ef 834 qemu_wait_io_event_common(cpu);
6cabe1f3 835 }
296af7c9
BS
836}
837
fd529e8f 838static void qemu_kvm_wait_io_event(CPUState *cpu)
296af7c9 839{
a98ae1d8 840 while (cpu_thread_is_idle(cpu)) {
f5c121b8 841 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
16400322 842 }
296af7c9 843
290adf38 844 qemu_kvm_eat_signals(cpu);
509a0d78 845 qemu_wait_io_event_common(cpu);
296af7c9
BS
846}
847
7e97cd88 848static void *qemu_kvm_cpu_thread_fn(void *arg)
296af7c9 849{
48a106bd 850 CPUState *cpu = arg;
84b4915d 851 int r;
296af7c9 852
6164e6d6 853 qemu_mutex_lock(&qemu_global_mutex);
814e612e 854 qemu_thread_get_self(cpu->thread);
9f09e18a 855 cpu->thread_id = qemu_get_thread_id();
4917cf44 856 current_cpu = cpu;
296af7c9 857
504134d2 858 r = kvm_init_vcpu(cpu);
84b4915d
JK
859 if (r < 0) {
860 fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
861 exit(1);
862 }
296af7c9 863
13618e05 864 qemu_kvm_init_cpu_signals(cpu);
296af7c9
BS
865
866 /* signal CPU creation */
61a46217 867 cpu->created = true;
296af7c9
BS
868 qemu_cond_signal(&qemu_cpu_cond);
869
296af7c9 870 while (1) {
a1fcaa73 871 if (cpu_can_run(cpu)) {
1458c363 872 r = kvm_cpu_exec(cpu);
83f338f7 873 if (r == EXCP_DEBUG) {
91325046 874 cpu_handle_guest_debug(cpu);
83f338f7 875 }
0ab07c62 876 }
fd529e8f 877 qemu_kvm_wait_io_event(cpu);
296af7c9
BS
878 }
879
880 return NULL;
881}
882
c7f0f3b1
AL
883static void *qemu_dummy_cpu_thread_fn(void *arg)
884{
885#ifdef _WIN32
886 fprintf(stderr, "qtest is not supported under Windows\n");
887 exit(1);
888#else
10a9021d 889 CPUState *cpu = arg;
c7f0f3b1
AL
890 sigset_t waitset;
891 int r;
892
893 qemu_mutex_lock_iothread();
814e612e 894 qemu_thread_get_self(cpu->thread);
9f09e18a 895 cpu->thread_id = qemu_get_thread_id();
c7f0f3b1
AL
896
897 sigemptyset(&waitset);
898 sigaddset(&waitset, SIG_IPI);
899
900 /* signal CPU creation */
61a46217 901 cpu->created = true;
c7f0f3b1
AL
902 qemu_cond_signal(&qemu_cpu_cond);
903
4917cf44 904 current_cpu = cpu;
c7f0f3b1 905 while (1) {
4917cf44 906 current_cpu = NULL;
c7f0f3b1
AL
907 qemu_mutex_unlock_iothread();
908 do {
909 int sig;
910 r = sigwait(&waitset, &sig);
911 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
912 if (r == -1) {
913 perror("sigwait");
914 exit(1);
915 }
916 qemu_mutex_lock_iothread();
4917cf44 917 current_cpu = cpu;
509a0d78 918 qemu_wait_io_event_common(cpu);
c7f0f3b1
AL
919 }
920
921 return NULL;
922#endif
923}
924
bdb7ca67
JK
925static void tcg_exec_all(void);
926
7e97cd88 927static void *qemu_tcg_cpu_thread_fn(void *arg)
296af7c9 928{
c3586ba7 929 CPUState *cpu = arg;
296af7c9 930
55f8d6ac 931 qemu_tcg_init_cpu_signals();
814e612e 932 qemu_thread_get_self(cpu->thread);
296af7c9 933
296af7c9 934 qemu_mutex_lock(&qemu_global_mutex);
38fcbd3f
AF
935 CPU_FOREACH(cpu) {
936 cpu->thread_id = qemu_get_thread_id();
937 cpu->created = true;
938 }
296af7c9
BS
939 qemu_cond_signal(&qemu_cpu_cond);
940
fa7d1867 941 /* wait for initial kick-off after machine start */
bdc44640 942 while (QTAILQ_FIRST(&cpus)->stopped) {
fa7d1867 943 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
8e564b4e
JK
944
945 /* process any pending work */
bdc44640 946 CPU_FOREACH(cpu) {
182735ef 947 qemu_wait_io_event_common(cpu);
8e564b4e 948 }
0ab07c62 949 }
296af7c9
BS
950
951 while (1) {
bdb7ca67 952 tcg_exec_all();
ac70aafc
AB
953
954 if (use_icount) {
40daca54 955 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ac70aafc
AB
956
957 if (deadline == 0) {
40daca54 958 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
ac70aafc 959 }
3b2319a3 960 }
6cabe1f3 961 qemu_tcg_wait_io_event();
296af7c9
BS
962 }
963
964 return NULL;
965}
966
2ff09a40 967static void qemu_cpu_kick_thread(CPUState *cpu)
cc015e9a
PB
968{
969#ifndef _WIN32
970 int err;
971
814e612e 972 err = pthread_kill(cpu->thread->thread, SIG_IPI);
cc015e9a
PB
973 if (err) {
974 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
975 exit(1);
976 }
977#else /* _WIN32 */
60e82579 978 if (!qemu_cpu_is_self(cpu)) {
ed9164a3
OH
979 CONTEXT tcgContext;
980
981 if (SuspendThread(cpu->hThread) == (DWORD)-1) {
7f1721df 982 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
ed9164a3
OH
983 GetLastError());
984 exit(1);
985 }
986
987 /* On multi-core systems, we are not sure that the thread is actually
988 * suspended until we can get the context.
989 */
990 tcgContext.ContextFlags = CONTEXT_CONTROL;
991 while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
992 continue;
993 }
994
cc015e9a 995 cpu_signal(0);
ed9164a3
OH
996
997 if (ResumeThread(cpu->hThread) == (DWORD)-1) {
7f1721df 998 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
ed9164a3
OH
999 GetLastError());
1000 exit(1);
1001 }
cc015e9a
PB
1002 }
1003#endif
1004}
1005
c08d7424 1006void qemu_cpu_kick(CPUState *cpu)
296af7c9 1007{
f5c121b8 1008 qemu_cond_broadcast(cpu->halt_cond);
216fc9a4 1009 if (!tcg_enabled() && !cpu->thread_kicked) {
2ff09a40 1010 qemu_cpu_kick_thread(cpu);
216fc9a4 1011 cpu->thread_kicked = true;
aa2c364b 1012 }
296af7c9
BS
1013}
1014
46d62fac 1015void qemu_cpu_kick_self(void)
296af7c9 1016{
b55c22c6 1017#ifndef _WIN32
4917cf44 1018 assert(current_cpu);
296af7c9 1019
4917cf44
AF
1020 if (!current_cpu->thread_kicked) {
1021 qemu_cpu_kick_thread(current_cpu);
1022 current_cpu->thread_kicked = true;
296af7c9 1023 }
b55c22c6
PB
1024#else
1025 abort();
1026#endif
296af7c9
BS
1027}
1028
60e82579 1029bool qemu_cpu_is_self(CPUState *cpu)
296af7c9 1030{
814e612e 1031 return qemu_thread_is_self(cpu->thread);
296af7c9
BS
1032}
1033
aa723c23
JQ
1034static bool qemu_in_vcpu_thread(void)
1035{
4917cf44 1036 return current_cpu && qemu_cpu_is_self(current_cpu);
aa723c23
JQ
1037}
1038
296af7c9
BS
1039void qemu_mutex_lock_iothread(void)
1040{
c7f0f3b1 1041 if (!tcg_enabled()) {
296af7c9 1042 qemu_mutex_lock(&qemu_global_mutex);
1a28cac3 1043 } else {
46daff13 1044 iothread_requesting_mutex = true;
1a28cac3 1045 if (qemu_mutex_trylock(&qemu_global_mutex)) {
182735ef 1046 qemu_cpu_kick_thread(first_cpu);
1a28cac3
MT
1047 qemu_mutex_lock(&qemu_global_mutex);
1048 }
46daff13
PB
1049 iothread_requesting_mutex = false;
1050 qemu_cond_broadcast(&qemu_io_proceeded_cond);
1a28cac3 1051 }
296af7c9
BS
1052}
1053
1054void qemu_mutex_unlock_iothread(void)
1055{
1056 qemu_mutex_unlock(&qemu_global_mutex);
1057}
1058
1059static int all_vcpus_paused(void)
1060{
bdc44640 1061 CPUState *cpu;
296af7c9 1062
bdc44640 1063 CPU_FOREACH(cpu) {
182735ef 1064 if (!cpu->stopped) {
296af7c9 1065 return 0;
0ab07c62 1066 }
296af7c9
BS
1067 }
1068
1069 return 1;
1070}
1071
1072void pause_all_vcpus(void)
1073{
bdc44640 1074 CPUState *cpu;
296af7c9 1075
40daca54 1076 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
bdc44640 1077 CPU_FOREACH(cpu) {
182735ef
AF
1078 cpu->stop = true;
1079 qemu_cpu_kick(cpu);
296af7c9
BS
1080 }
1081
aa723c23 1082 if (qemu_in_vcpu_thread()) {
d798e974
JK
1083 cpu_stop_current();
1084 if (!kvm_enabled()) {
bdc44640 1085 CPU_FOREACH(cpu) {
182735ef
AF
1086 cpu->stop = false;
1087 cpu->stopped = true;
d798e974
JK
1088 }
1089 return;
1090 }
1091 }
1092
296af7c9 1093 while (!all_vcpus_paused()) {
be7d6c57 1094 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
bdc44640 1095 CPU_FOREACH(cpu) {
182735ef 1096 qemu_cpu_kick(cpu);
296af7c9
BS
1097 }
1098 }
1099}
1100
2993683b
IM
1101void cpu_resume(CPUState *cpu)
1102{
1103 cpu->stop = false;
1104 cpu->stopped = false;
1105 qemu_cpu_kick(cpu);
1106}
1107
296af7c9
BS
1108void resume_all_vcpus(void)
1109{
bdc44640 1110 CPUState *cpu;
296af7c9 1111
40daca54 1112 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
bdc44640 1113 CPU_FOREACH(cpu) {
182735ef 1114 cpu_resume(cpu);
296af7c9
BS
1115 }
1116}
1117
4900116e
DDAG
1118/* For temporary buffers for forming a name */
1119#define VCPU_THREAD_NAME_SIZE 16
1120
e5ab30a2 1121static void qemu_tcg_init_vcpu(CPUState *cpu)
296af7c9 1122{
4900116e
DDAG
1123 char thread_name[VCPU_THREAD_NAME_SIZE];
1124
09daed84
EI
1125 tcg_cpu_address_space_init(cpu, cpu->as);
1126
296af7c9
BS
1127 /* share a single thread for all cpus with TCG */
1128 if (!tcg_cpu_thread) {
814e612e 1129 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1130 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1131 qemu_cond_init(cpu->halt_cond);
1132 tcg_halt_cond = cpu->halt_cond;
4900116e
DDAG
1133 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
1134 cpu->cpu_index);
1135 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1136 cpu, QEMU_THREAD_JOINABLE);
1ecf47bf 1137#ifdef _WIN32
814e612e 1138 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1ecf47bf 1139#endif
61a46217 1140 while (!cpu->created) {
18a85728 1141 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1142 }
814e612e 1143 tcg_cpu_thread = cpu->thread;
296af7c9 1144 } else {
814e612e 1145 cpu->thread = tcg_cpu_thread;
f5c121b8 1146 cpu->halt_cond = tcg_halt_cond;
296af7c9
BS
1147 }
1148}
1149
48a106bd 1150static void qemu_kvm_start_vcpu(CPUState *cpu)
296af7c9 1151{
4900116e
DDAG
1152 char thread_name[VCPU_THREAD_NAME_SIZE];
1153
814e612e 1154 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1155 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1156 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1157 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
1158 cpu->cpu_index);
1159 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
1160 cpu, QEMU_THREAD_JOINABLE);
61a46217 1161 while (!cpu->created) {
18a85728 1162 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1163 }
296af7c9
BS
1164}
1165
10a9021d 1166static void qemu_dummy_start_vcpu(CPUState *cpu)
c7f0f3b1 1167{
4900116e
DDAG
1168 char thread_name[VCPU_THREAD_NAME_SIZE];
1169
814e612e 1170 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1171 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1172 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1173 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
1174 cpu->cpu_index);
1175 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
c7f0f3b1 1176 QEMU_THREAD_JOINABLE);
61a46217 1177 while (!cpu->created) {
c7f0f3b1
AL
1178 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1179 }
1180}
1181
c643bed9 1182void qemu_init_vcpu(CPUState *cpu)
296af7c9 1183{
ce3960eb
AF
1184 cpu->nr_cores = smp_cores;
1185 cpu->nr_threads = smp_threads;
f324e766 1186 cpu->stopped = true;
0ab07c62 1187 if (kvm_enabled()) {
48a106bd 1188 qemu_kvm_start_vcpu(cpu);
c7f0f3b1 1189 } else if (tcg_enabled()) {
e5ab30a2 1190 qemu_tcg_init_vcpu(cpu);
c7f0f3b1 1191 } else {
10a9021d 1192 qemu_dummy_start_vcpu(cpu);
0ab07c62 1193 }
296af7c9
BS
1194}
1195
b4a3d965 1196void cpu_stop_current(void)
296af7c9 1197{
4917cf44
AF
1198 if (current_cpu) {
1199 current_cpu->stop = false;
1200 current_cpu->stopped = true;
1201 cpu_exit(current_cpu);
67bb172f 1202 qemu_cond_signal(&qemu_pause_cond);
b4a3d965 1203 }
296af7c9
BS
1204}
1205
56983463 1206int vm_stop(RunState state)
296af7c9 1207{
aa723c23 1208 if (qemu_in_vcpu_thread()) {
1dfb4dd9 1209 qemu_system_vmstop_request(state);
296af7c9
BS
1210 /*
1211 * FIXME: should not return to device code in case
1212 * vm_stop() has been requested.
1213 */
b4a3d965 1214 cpu_stop_current();
56983463 1215 return 0;
296af7c9 1216 }
56983463
KW
1217
1218 return do_vm_stop(state);
296af7c9
BS
1219}
1220
8a9236f1
LC
1221/* does a state transition even if the VM is already stopped,
1222 current state is forgotten forever */
56983463 1223int vm_stop_force_state(RunState state)
8a9236f1
LC
1224{
1225 if (runstate_is_running()) {
56983463 1226 return vm_stop(state);
8a9236f1
LC
1227 } else {
1228 runstate_set(state);
594a45ce
KW
1229 /* Make sure to return an error if the flush in a previous vm_stop()
1230 * failed. */
1231 return bdrv_flush_all();
8a9236f1
LC
1232 }
1233}
1234
9349b4f9 1235static int tcg_cpu_exec(CPUArchState *env)
296af7c9 1236{
efee7340 1237 CPUState *cpu = ENV_GET_CPU(env);
296af7c9
BS
1238 int ret;
1239#ifdef CONFIG_PROFILER
1240 int64_t ti;
1241#endif
1242
1243#ifdef CONFIG_PROFILER
1244 ti = profile_getclock();
1245#endif
1246 if (use_icount) {
1247 int64_t count;
ac70aafc 1248 int64_t deadline;
296af7c9 1249 int decr;
28ecfd7a
AF
1250 qemu_icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
1251 cpu->icount_decr.u16.low = 0;
efee7340 1252 cpu->icount_extra = 0;
40daca54 1253 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ac70aafc
AB
1254
1255 /* Maintain prior (possibly buggy) behaviour where if no deadline
40daca54 1256 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
ac70aafc
AB
1257 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1258 * nanoseconds.
1259 */
1260 if ((deadline < 0) || (deadline > INT32_MAX)) {
1261 deadline = INT32_MAX;
1262 }
1263
1264 count = qemu_icount_round(deadline);
296af7c9
BS
1265 qemu_icount += count;
1266 decr = (count > 0xffff) ? 0xffff : count;
1267 count -= decr;
28ecfd7a 1268 cpu->icount_decr.u16.low = decr;
efee7340 1269 cpu->icount_extra = count;
296af7c9
BS
1270 }
1271 ret = cpu_exec(env);
1272#ifdef CONFIG_PROFILER
1273 qemu_time += profile_getclock() - ti;
1274#endif
1275 if (use_icount) {
1276 /* Fold pending instructions back into the
1277 instruction counter, and clear the interrupt flag. */
28ecfd7a
AF
1278 qemu_icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
1279 cpu->icount_decr.u32 = 0;
efee7340 1280 cpu->icount_extra = 0;
296af7c9
BS
1281 }
1282 return ret;
1283}
1284
bdb7ca67 1285static void tcg_exec_all(void)
296af7c9 1286{
9a36085b
JK
1287 int r;
1288
40daca54
AB
1289 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1290 qemu_clock_warp(QEMU_CLOCK_VIRTUAL);
ab33fcda 1291
0ab07c62 1292 if (next_cpu == NULL) {
296af7c9 1293 next_cpu = first_cpu;
0ab07c62 1294 }
bdc44640 1295 for (; next_cpu != NULL && !exit_request; next_cpu = CPU_NEXT(next_cpu)) {
182735ef
AF
1296 CPUState *cpu = next_cpu;
1297 CPUArchState *env = cpu->env_ptr;
296af7c9 1298
40daca54 1299 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
ed2803da 1300 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
296af7c9 1301
a1fcaa73 1302 if (cpu_can_run(cpu)) {
bdb7ca67 1303 r = tcg_cpu_exec(env);
9a36085b 1304 if (r == EXCP_DEBUG) {
91325046 1305 cpu_handle_guest_debug(cpu);
3c638d06
JK
1306 break;
1307 }
f324e766 1308 } else if (cpu->stop || cpu->stopped) {
296af7c9
BS
1309 break;
1310 }
1311 }
c629a4bc 1312 exit_request = 0;
296af7c9
BS
1313}
1314
1315void set_numa_modes(void)
1316{
1b1ed8dc 1317 CPUState *cpu;
296af7c9
BS
1318 int i;
1319
bdc44640 1320 CPU_FOREACH(cpu) {
296af7c9 1321 for (i = 0; i < nb_numa_nodes; i++) {
55e5c285 1322 if (test_bit(cpu->cpu_index, node_cpumask[i])) {
1b1ed8dc 1323 cpu->numa_node = i;
296af7c9
BS
1324 }
1325 }
1326 }
1327}
1328
9a78eead 1329void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
262353cb
BS
1330{
1331 /* XXX: implement xxx_cpu_list for targets that still miss it */
e916cbf8
PM
1332#if defined(cpu_list)
1333 cpu_list(f, cpu_fprintf);
262353cb
BS
1334#endif
1335}
de0b36b6
LC
1336
1337CpuInfoList *qmp_query_cpus(Error **errp)
1338{
1339 CpuInfoList *head = NULL, *cur_item = NULL;
182735ef 1340 CPUState *cpu;
de0b36b6 1341
bdc44640 1342 CPU_FOREACH(cpu) {
de0b36b6 1343 CpuInfoList *info;
182735ef
AF
1344#if defined(TARGET_I386)
1345 X86CPU *x86_cpu = X86_CPU(cpu);
1346 CPUX86State *env = &x86_cpu->env;
1347#elif defined(TARGET_PPC)
1348 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
1349 CPUPPCState *env = &ppc_cpu->env;
1350#elif defined(TARGET_SPARC)
1351 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
1352 CPUSPARCState *env = &sparc_cpu->env;
1353#elif defined(TARGET_MIPS)
1354 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
1355 CPUMIPSState *env = &mips_cpu->env;
1356#endif
de0b36b6 1357
cb446eca 1358 cpu_synchronize_state(cpu);
de0b36b6
LC
1359
1360 info = g_malloc0(sizeof(*info));
1361 info->value = g_malloc0(sizeof(*info->value));
55e5c285 1362 info->value->CPU = cpu->cpu_index;
182735ef 1363 info->value->current = (cpu == first_cpu);
259186a7 1364 info->value->halted = cpu->halted;
9f09e18a 1365 info->value->thread_id = cpu->thread_id;
de0b36b6
LC
1366#if defined(TARGET_I386)
1367 info->value->has_pc = true;
1368 info->value->pc = env->eip + env->segs[R_CS].base;
1369#elif defined(TARGET_PPC)
1370 info->value->has_nip = true;
1371 info->value->nip = env->nip;
1372#elif defined(TARGET_SPARC)
1373 info->value->has_pc = true;
1374 info->value->pc = env->pc;
1375 info->value->has_npc = true;
1376 info->value->npc = env->npc;
1377#elif defined(TARGET_MIPS)
1378 info->value->has_PC = true;
1379 info->value->PC = env->active_tc.PC;
1380#endif
1381
1382 /* XXX: waiting for the qapi to support GSList */
1383 if (!cur_item) {
1384 head = cur_item = info;
1385 } else {
1386 cur_item->next = info;
1387 cur_item = info;
1388 }
1389 }
1390
1391 return head;
1392}
0cfd6a9a
LC
1393
1394void qmp_memsave(int64_t addr, int64_t size, const char *filename,
1395 bool has_cpu, int64_t cpu_index, Error **errp)
1396{
1397 FILE *f;
1398 uint32_t l;
55e5c285 1399 CPUState *cpu;
0cfd6a9a
LC
1400 uint8_t buf[1024];
1401
1402 if (!has_cpu) {
1403 cpu_index = 0;
1404 }
1405
151d1322
AF
1406 cpu = qemu_get_cpu(cpu_index);
1407 if (cpu == NULL) {
0cfd6a9a
LC
1408 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
1409 "a CPU number");
1410 return;
1411 }
1412
1413 f = fopen(filename, "wb");
1414 if (!f) {
618da851 1415 error_setg_file_open(errp, errno, filename);
0cfd6a9a
LC
1416 return;
1417 }
1418
1419 while (size != 0) {
1420 l = sizeof(buf);
1421 if (l > size)
1422 l = size;
2f4d0f59
AK
1423 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
1424 error_setg(errp, "Invalid addr 0x%016" PRIx64 "specified", addr);
1425 goto exit;
1426 }
0cfd6a9a
LC
1427 if (fwrite(buf, 1, l, f) != l) {
1428 error_set(errp, QERR_IO_ERROR);
1429 goto exit;
1430 }
1431 addr += l;
1432 size -= l;
1433 }
1434
1435exit:
1436 fclose(f);
1437}
6d3962bf
LC
1438
1439void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
1440 Error **errp)
1441{
1442 FILE *f;
1443 uint32_t l;
1444 uint8_t buf[1024];
1445
1446 f = fopen(filename, "wb");
1447 if (!f) {
618da851 1448 error_setg_file_open(errp, errno, filename);
6d3962bf
LC
1449 return;
1450 }
1451
1452 while (size != 0) {
1453 l = sizeof(buf);
1454 if (l > size)
1455 l = size;
eb6282f2 1456 cpu_physical_memory_read(addr, buf, l);
6d3962bf
LC
1457 if (fwrite(buf, 1, l, f) != l) {
1458 error_set(errp, QERR_IO_ERROR);
1459 goto exit;
1460 }
1461 addr += l;
1462 size -= l;
1463 }
1464
1465exit:
1466 fclose(f);
1467}
ab49ab5c
LC
1468
1469void qmp_inject_nmi(Error **errp)
1470{
1471#if defined(TARGET_I386)
182735ef
AF
1472 CPUState *cs;
1473
bdc44640 1474 CPU_FOREACH(cs) {
182735ef 1475 X86CPU *cpu = X86_CPU(cs);
ab49ab5c 1476
02e51483 1477 if (!cpu->apic_state) {
182735ef 1478 cpu_interrupt(cs, CPU_INTERRUPT_NMI);
02c09195 1479 } else {
02e51483 1480 apic_deliver_nmi(cpu->apic_state);
02c09195 1481 }
ab49ab5c 1482 }
7f7f9752
ED
1483#elif defined(TARGET_S390X)
1484 CPUState *cs;
1485 S390CPU *cpu;
1486
bdc44640 1487 CPU_FOREACH(cs) {
7f7f9752
ED
1488 cpu = S390_CPU(cs);
1489 if (cpu->env.cpu_num == monitor_get_cpu_index()) {
1490 if (s390_cpu_restart(S390_CPU(cs)) == -1) {
1491 error_set(errp, QERR_UNSUPPORTED);
1492 return;
1493 }
1494 break;
1495 }
1496 }
ab49ab5c
LC
1497#else
1498 error_set(errp, QERR_UNSUPPORTED);
1499#endif
1500}