]> git.proxmox.com Git - mirror_qemu.git/blame - cpus.c
savevm: Remove all the unneeded version_minimum_id_old (usb)
[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,
433 .minimum_version_id_old = 1,
434 .fields = (VMStateField[]) {
435 VMSTATE_INT64(cpu_ticks_offset, TimersState),
436 VMSTATE_INT64(dummy, TimersState),
437 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
438 VMSTATE_END_OF_LIST()
439 }
440};
441
442void configure_icount(const char *option)
443{
cb365646 444 seqlock_init(&timers_state.vm_clock_seqlock, NULL);
946fb27c
PB
445 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
446 if (!option) {
447 return;
448 }
449
40daca54
AB
450 icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME,
451 icount_warp_rt, NULL);
946fb27c
PB
452 if (strcmp(option, "auto") != 0) {
453 icount_time_shift = strtol(option, NULL, 0);
454 use_icount = 1;
455 return;
456 }
457
458 use_icount = 2;
459
460 /* 125MIPS seems a reasonable initial guess at the guest speed.
461 It will be corrected fairly quickly anyway. */
462 icount_time_shift = 3;
463
464 /* Have both realtime and virtual time triggers for speed adjustment.
465 The realtime trigger catches emulated time passing too slowly,
466 the virtual time trigger catches emulated time passing too fast.
467 Realtime triggers occur even when idle, so use them less frequently
468 than VM triggers. */
40daca54
AB
469 icount_rt_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
470 icount_adjust_rt, NULL);
471 timer_mod(icount_rt_timer,
472 qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + 1000);
473 icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
474 icount_adjust_vm, NULL);
475 timer_mod(icount_vm_timer,
476 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
477 get_ticks_per_sec() / 10);
946fb27c
PB
478}
479
296af7c9
BS
480/***********************************************************/
481void hw_error(const char *fmt, ...)
482{
483 va_list ap;
55e5c285 484 CPUState *cpu;
296af7c9
BS
485
486 va_start(ap, fmt);
487 fprintf(stderr, "qemu: hardware error: ");
488 vfprintf(stderr, fmt, ap);
489 fprintf(stderr, "\n");
bdc44640 490 CPU_FOREACH(cpu) {
55e5c285 491 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
878096ee 492 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU);
296af7c9
BS
493 }
494 va_end(ap);
495 abort();
496}
497
498void cpu_synchronize_all_states(void)
499{
182735ef 500 CPUState *cpu;
296af7c9 501
bdc44640 502 CPU_FOREACH(cpu) {
182735ef 503 cpu_synchronize_state(cpu);
296af7c9
BS
504 }
505}
506
507void cpu_synchronize_all_post_reset(void)
508{
182735ef 509 CPUState *cpu;
296af7c9 510
bdc44640 511 CPU_FOREACH(cpu) {
182735ef 512 cpu_synchronize_post_reset(cpu);
296af7c9
BS
513 }
514}
515
516void cpu_synchronize_all_post_init(void)
517{
182735ef 518 CPUState *cpu;
296af7c9 519
bdc44640 520 CPU_FOREACH(cpu) {
182735ef 521 cpu_synchronize_post_init(cpu);
296af7c9
BS
522 }
523}
524
56983463 525static int do_vm_stop(RunState state)
296af7c9 526{
56983463
KW
527 int ret = 0;
528
1354869c 529 if (runstate_is_running()) {
296af7c9 530 cpu_disable_ticks();
296af7c9 531 pause_all_vcpus();
f5bbfba1 532 runstate_set(state);
1dfb4dd9 533 vm_state_notify(0, state);
296af7c9
BS
534 monitor_protocol_event(QEVENT_STOP, NULL);
535 }
56983463 536
594a45ce
KW
537 bdrv_drain_all();
538 ret = bdrv_flush_all();
539
56983463 540 return ret;
296af7c9
BS
541}
542
a1fcaa73 543static bool cpu_can_run(CPUState *cpu)
296af7c9 544{
4fdeee7c 545 if (cpu->stop) {
a1fcaa73 546 return false;
0ab07c62 547 }
321bc0b2 548 if (cpu_is_stopped(cpu)) {
a1fcaa73 549 return false;
0ab07c62 550 }
a1fcaa73 551 return true;
296af7c9
BS
552}
553
91325046 554static void cpu_handle_guest_debug(CPUState *cpu)
83f338f7 555{
64f6b346 556 gdb_set_stop_cpu(cpu);
8cf71710 557 qemu_system_debug_request();
f324e766 558 cpu->stopped = true;
3c638d06
JK
559}
560
714bd040
PB
561static void cpu_signal(int sig)
562{
4917cf44
AF
563 if (current_cpu) {
564 cpu_exit(current_cpu);
714bd040
PB
565 }
566 exit_request = 1;
567}
714bd040 568
6d9cb73c
JK
569#ifdef CONFIG_LINUX
570static void sigbus_reraise(void)
571{
572 sigset_t set;
573 struct sigaction action;
574
575 memset(&action, 0, sizeof(action));
576 action.sa_handler = SIG_DFL;
577 if (!sigaction(SIGBUS, &action, NULL)) {
578 raise(SIGBUS);
579 sigemptyset(&set);
580 sigaddset(&set, SIGBUS);
581 sigprocmask(SIG_UNBLOCK, &set, NULL);
582 }
583 perror("Failed to re-raise SIGBUS!\n");
584 abort();
585}
586
587static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
588 void *ctx)
589{
590 if (kvm_on_sigbus(siginfo->ssi_code,
591 (void *)(intptr_t)siginfo->ssi_addr)) {
592 sigbus_reraise();
593 }
594}
595
596static void qemu_init_sigbus(void)
597{
598 struct sigaction action;
599
600 memset(&action, 0, sizeof(action));
601 action.sa_flags = SA_SIGINFO;
602 action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
603 sigaction(SIGBUS, &action, NULL);
604
605 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
606}
607
290adf38 608static void qemu_kvm_eat_signals(CPUState *cpu)
1ab3c6c0
JK
609{
610 struct timespec ts = { 0, 0 };
611 siginfo_t siginfo;
612 sigset_t waitset;
613 sigset_t chkset;
614 int r;
615
616 sigemptyset(&waitset);
617 sigaddset(&waitset, SIG_IPI);
618 sigaddset(&waitset, SIGBUS);
619
620 do {
621 r = sigtimedwait(&waitset, &siginfo, &ts);
622 if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
623 perror("sigtimedwait");
624 exit(1);
625 }
626
627 switch (r) {
628 case SIGBUS:
290adf38 629 if (kvm_on_sigbus_vcpu(cpu, siginfo.si_code, siginfo.si_addr)) {
1ab3c6c0
JK
630 sigbus_reraise();
631 }
632 break;
633 default:
634 break;
635 }
636
637 r = sigpending(&chkset);
638 if (r == -1) {
639 perror("sigpending");
640 exit(1);
641 }
642 } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
1ab3c6c0
JK
643}
644
6d9cb73c
JK
645#else /* !CONFIG_LINUX */
646
647static void qemu_init_sigbus(void)
648{
649}
1ab3c6c0 650
290adf38 651static void qemu_kvm_eat_signals(CPUState *cpu)
1ab3c6c0
JK
652{
653}
6d9cb73c
JK
654#endif /* !CONFIG_LINUX */
655
296af7c9 656#ifndef _WIN32
55f8d6ac
JK
657static void dummy_signal(int sig)
658{
659}
55f8d6ac 660
13618e05 661static void qemu_kvm_init_cpu_signals(CPUState *cpu)
714bd040
PB
662{
663 int r;
664 sigset_t set;
665 struct sigaction sigact;
666
667 memset(&sigact, 0, sizeof(sigact));
668 sigact.sa_handler = dummy_signal;
669 sigaction(SIG_IPI, &sigact, NULL);
670
714bd040
PB
671 pthread_sigmask(SIG_BLOCK, NULL, &set);
672 sigdelset(&set, SIG_IPI);
714bd040 673 sigdelset(&set, SIGBUS);
491d6e80 674 r = kvm_set_signal_mask(cpu, &set);
714bd040
PB
675 if (r) {
676 fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
677 exit(1);
678 }
679}
680
681static void qemu_tcg_init_cpu_signals(void)
682{
714bd040
PB
683 sigset_t set;
684 struct sigaction sigact;
685
686 memset(&sigact, 0, sizeof(sigact));
687 sigact.sa_handler = cpu_signal;
688 sigaction(SIG_IPI, &sigact, NULL);
689
690 sigemptyset(&set);
691 sigaddset(&set, SIG_IPI);
692 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
714bd040
PB
693}
694
55f8d6ac 695#else /* _WIN32 */
13618e05 696static void qemu_kvm_init_cpu_signals(CPUState *cpu)
ff48eb5f 697{
714bd040
PB
698 abort();
699}
ff48eb5f 700
714bd040
PB
701static void qemu_tcg_init_cpu_signals(void)
702{
ff48eb5f 703}
714bd040 704#endif /* _WIN32 */
ff48eb5f 705
b2532d88 706static QemuMutex qemu_global_mutex;
46daff13
PB
707static QemuCond qemu_io_proceeded_cond;
708static bool iothread_requesting_mutex;
296af7c9
BS
709
710static QemuThread io_thread;
711
712static QemuThread *tcg_cpu_thread;
713static QemuCond *tcg_halt_cond;
714
296af7c9
BS
715/* cpu creation */
716static QemuCond qemu_cpu_cond;
717/* system init */
296af7c9 718static QemuCond qemu_pause_cond;
e82bcec2 719static QemuCond qemu_work_cond;
296af7c9 720
d3b12f5d 721void qemu_init_cpu_loop(void)
296af7c9 722{
6d9cb73c 723 qemu_init_sigbus();
ed94592b 724 qemu_cond_init(&qemu_cpu_cond);
ed94592b
AL
725 qemu_cond_init(&qemu_pause_cond);
726 qemu_cond_init(&qemu_work_cond);
46daff13 727 qemu_cond_init(&qemu_io_proceeded_cond);
296af7c9 728 qemu_mutex_init(&qemu_global_mutex);
296af7c9 729
b7680cb6 730 qemu_thread_get_self(&io_thread);
296af7c9
BS
731}
732
f100f0b3 733void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
e82bcec2
MT
734{
735 struct qemu_work_item wi;
736
60e82579 737 if (qemu_cpu_is_self(cpu)) {
e82bcec2
MT
738 func(data);
739 return;
740 }
741
742 wi.func = func;
743 wi.data = data;
3c02270d 744 wi.free = false;
c64ca814
AF
745 if (cpu->queued_work_first == NULL) {
746 cpu->queued_work_first = &wi;
0ab07c62 747 } else {
c64ca814 748 cpu->queued_work_last->next = &wi;
0ab07c62 749 }
c64ca814 750 cpu->queued_work_last = &wi;
e82bcec2
MT
751 wi.next = NULL;
752 wi.done = false;
753
c08d7424 754 qemu_cpu_kick(cpu);
e82bcec2 755 while (!wi.done) {
4917cf44 756 CPUState *self_cpu = current_cpu;
e82bcec2
MT
757
758 qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
4917cf44 759 current_cpu = self_cpu;
e82bcec2
MT
760 }
761}
762
3c02270d
CV
763void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
764{
765 struct qemu_work_item *wi;
766
767 if (qemu_cpu_is_self(cpu)) {
768 func(data);
769 return;
770 }
771
772 wi = g_malloc0(sizeof(struct qemu_work_item));
773 wi->func = func;
774 wi->data = data;
775 wi->free = true;
776 if (cpu->queued_work_first == NULL) {
777 cpu->queued_work_first = wi;
778 } else {
779 cpu->queued_work_last->next = wi;
780 }
781 cpu->queued_work_last = wi;
782 wi->next = NULL;
783 wi->done = false;
784
785 qemu_cpu_kick(cpu);
786}
787
6d45b109 788static void flush_queued_work(CPUState *cpu)
e82bcec2
MT
789{
790 struct qemu_work_item *wi;
791
c64ca814 792 if (cpu->queued_work_first == NULL) {
e82bcec2 793 return;
0ab07c62 794 }
e82bcec2 795
c64ca814
AF
796 while ((wi = cpu->queued_work_first)) {
797 cpu->queued_work_first = wi->next;
e82bcec2
MT
798 wi->func(wi->data);
799 wi->done = true;
3c02270d
CV
800 if (wi->free) {
801 g_free(wi);
802 }
e82bcec2 803 }
c64ca814 804 cpu->queued_work_last = NULL;
e82bcec2
MT
805 qemu_cond_broadcast(&qemu_work_cond);
806}
807
509a0d78 808static void qemu_wait_io_event_common(CPUState *cpu)
296af7c9 809{
4fdeee7c
AF
810 if (cpu->stop) {
811 cpu->stop = false;
f324e766 812 cpu->stopped = true;
296af7c9
BS
813 qemu_cond_signal(&qemu_pause_cond);
814 }
6d45b109 815 flush_queued_work(cpu);
216fc9a4 816 cpu->thread_kicked = false;
296af7c9
BS
817}
818
6cabe1f3 819static void qemu_tcg_wait_io_event(void)
296af7c9 820{
182735ef 821 CPUState *cpu;
6cabe1f3 822
16400322 823 while (all_cpu_threads_idle()) {
ab33fcda
PB
824 /* Start accounting real time to the virtual clock if the CPUs
825 are idle. */
40daca54 826 qemu_clock_warp(QEMU_CLOCK_VIRTUAL);
9705fbb5 827 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
16400322 828 }
296af7c9 829
46daff13
PB
830 while (iothread_requesting_mutex) {
831 qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
832 }
6cabe1f3 833
bdc44640 834 CPU_FOREACH(cpu) {
182735ef 835 qemu_wait_io_event_common(cpu);
6cabe1f3 836 }
296af7c9
BS
837}
838
fd529e8f 839static void qemu_kvm_wait_io_event(CPUState *cpu)
296af7c9 840{
a98ae1d8 841 while (cpu_thread_is_idle(cpu)) {
f5c121b8 842 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
16400322 843 }
296af7c9 844
290adf38 845 qemu_kvm_eat_signals(cpu);
509a0d78 846 qemu_wait_io_event_common(cpu);
296af7c9
BS
847}
848
7e97cd88 849static void *qemu_kvm_cpu_thread_fn(void *arg)
296af7c9 850{
48a106bd 851 CPUState *cpu = arg;
84b4915d 852 int r;
296af7c9 853
6164e6d6 854 qemu_mutex_lock(&qemu_global_mutex);
814e612e 855 qemu_thread_get_self(cpu->thread);
9f09e18a 856 cpu->thread_id = qemu_get_thread_id();
4917cf44 857 current_cpu = cpu;
296af7c9 858
504134d2 859 r = kvm_init_vcpu(cpu);
84b4915d
JK
860 if (r < 0) {
861 fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
862 exit(1);
863 }
296af7c9 864
13618e05 865 qemu_kvm_init_cpu_signals(cpu);
296af7c9
BS
866
867 /* signal CPU creation */
61a46217 868 cpu->created = true;
296af7c9
BS
869 qemu_cond_signal(&qemu_cpu_cond);
870
296af7c9 871 while (1) {
a1fcaa73 872 if (cpu_can_run(cpu)) {
1458c363 873 r = kvm_cpu_exec(cpu);
83f338f7 874 if (r == EXCP_DEBUG) {
91325046 875 cpu_handle_guest_debug(cpu);
83f338f7 876 }
0ab07c62 877 }
fd529e8f 878 qemu_kvm_wait_io_event(cpu);
296af7c9
BS
879 }
880
881 return NULL;
882}
883
c7f0f3b1
AL
884static void *qemu_dummy_cpu_thread_fn(void *arg)
885{
886#ifdef _WIN32
887 fprintf(stderr, "qtest is not supported under Windows\n");
888 exit(1);
889#else
10a9021d 890 CPUState *cpu = arg;
c7f0f3b1
AL
891 sigset_t waitset;
892 int r;
893
894 qemu_mutex_lock_iothread();
814e612e 895 qemu_thread_get_self(cpu->thread);
9f09e18a 896 cpu->thread_id = qemu_get_thread_id();
c7f0f3b1
AL
897
898 sigemptyset(&waitset);
899 sigaddset(&waitset, SIG_IPI);
900
901 /* signal CPU creation */
61a46217 902 cpu->created = true;
c7f0f3b1
AL
903 qemu_cond_signal(&qemu_cpu_cond);
904
4917cf44 905 current_cpu = cpu;
c7f0f3b1 906 while (1) {
4917cf44 907 current_cpu = NULL;
c7f0f3b1
AL
908 qemu_mutex_unlock_iothread();
909 do {
910 int sig;
911 r = sigwait(&waitset, &sig);
912 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
913 if (r == -1) {
914 perror("sigwait");
915 exit(1);
916 }
917 qemu_mutex_lock_iothread();
4917cf44 918 current_cpu = cpu;
509a0d78 919 qemu_wait_io_event_common(cpu);
c7f0f3b1
AL
920 }
921
922 return NULL;
923#endif
924}
925
bdb7ca67
JK
926static void tcg_exec_all(void);
927
7e97cd88 928static void *qemu_tcg_cpu_thread_fn(void *arg)
296af7c9 929{
c3586ba7 930 CPUState *cpu = arg;
296af7c9 931
55f8d6ac 932 qemu_tcg_init_cpu_signals();
814e612e 933 qemu_thread_get_self(cpu->thread);
296af7c9 934
296af7c9 935 qemu_mutex_lock(&qemu_global_mutex);
38fcbd3f
AF
936 CPU_FOREACH(cpu) {
937 cpu->thread_id = qemu_get_thread_id();
938 cpu->created = true;
939 }
296af7c9
BS
940 qemu_cond_signal(&qemu_cpu_cond);
941
fa7d1867 942 /* wait for initial kick-off after machine start */
bdc44640 943 while (QTAILQ_FIRST(&cpus)->stopped) {
fa7d1867 944 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
8e564b4e
JK
945
946 /* process any pending work */
bdc44640 947 CPU_FOREACH(cpu) {
182735ef 948 qemu_wait_io_event_common(cpu);
8e564b4e 949 }
0ab07c62 950 }
296af7c9
BS
951
952 while (1) {
bdb7ca67 953 tcg_exec_all();
ac70aafc
AB
954
955 if (use_icount) {
40daca54 956 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ac70aafc
AB
957
958 if (deadline == 0) {
40daca54 959 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
ac70aafc 960 }
3b2319a3 961 }
6cabe1f3 962 qemu_tcg_wait_io_event();
296af7c9
BS
963 }
964
965 return NULL;
966}
967
2ff09a40 968static void qemu_cpu_kick_thread(CPUState *cpu)
cc015e9a
PB
969{
970#ifndef _WIN32
971 int err;
972
814e612e 973 err = pthread_kill(cpu->thread->thread, SIG_IPI);
cc015e9a
PB
974 if (err) {
975 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
976 exit(1);
977 }
978#else /* _WIN32 */
60e82579 979 if (!qemu_cpu_is_self(cpu)) {
ed9164a3
OH
980 CONTEXT tcgContext;
981
982 if (SuspendThread(cpu->hThread) == (DWORD)-1) {
7f1721df 983 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
ed9164a3
OH
984 GetLastError());
985 exit(1);
986 }
987
988 /* On multi-core systems, we are not sure that the thread is actually
989 * suspended until we can get the context.
990 */
991 tcgContext.ContextFlags = CONTEXT_CONTROL;
992 while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
993 continue;
994 }
995
cc015e9a 996 cpu_signal(0);
ed9164a3
OH
997
998 if (ResumeThread(cpu->hThread) == (DWORD)-1) {
7f1721df 999 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
ed9164a3
OH
1000 GetLastError());
1001 exit(1);
1002 }
cc015e9a
PB
1003 }
1004#endif
1005}
1006
c08d7424 1007void qemu_cpu_kick(CPUState *cpu)
296af7c9 1008{
f5c121b8 1009 qemu_cond_broadcast(cpu->halt_cond);
216fc9a4 1010 if (!tcg_enabled() && !cpu->thread_kicked) {
2ff09a40 1011 qemu_cpu_kick_thread(cpu);
216fc9a4 1012 cpu->thread_kicked = true;
aa2c364b 1013 }
296af7c9
BS
1014}
1015
46d62fac 1016void qemu_cpu_kick_self(void)
296af7c9 1017{
b55c22c6 1018#ifndef _WIN32
4917cf44 1019 assert(current_cpu);
296af7c9 1020
4917cf44
AF
1021 if (!current_cpu->thread_kicked) {
1022 qemu_cpu_kick_thread(current_cpu);
1023 current_cpu->thread_kicked = true;
296af7c9 1024 }
b55c22c6
PB
1025#else
1026 abort();
1027#endif
296af7c9
BS
1028}
1029
60e82579 1030bool qemu_cpu_is_self(CPUState *cpu)
296af7c9 1031{
814e612e 1032 return qemu_thread_is_self(cpu->thread);
296af7c9
BS
1033}
1034
aa723c23
JQ
1035static bool qemu_in_vcpu_thread(void)
1036{
4917cf44 1037 return current_cpu && qemu_cpu_is_self(current_cpu);
aa723c23
JQ
1038}
1039
296af7c9
BS
1040void qemu_mutex_lock_iothread(void)
1041{
c7f0f3b1 1042 if (!tcg_enabled()) {
296af7c9 1043 qemu_mutex_lock(&qemu_global_mutex);
1a28cac3 1044 } else {
46daff13 1045 iothread_requesting_mutex = true;
1a28cac3 1046 if (qemu_mutex_trylock(&qemu_global_mutex)) {
182735ef 1047 qemu_cpu_kick_thread(first_cpu);
1a28cac3
MT
1048 qemu_mutex_lock(&qemu_global_mutex);
1049 }
46daff13
PB
1050 iothread_requesting_mutex = false;
1051 qemu_cond_broadcast(&qemu_io_proceeded_cond);
1a28cac3 1052 }
296af7c9
BS
1053}
1054
1055void qemu_mutex_unlock_iothread(void)
1056{
1057 qemu_mutex_unlock(&qemu_global_mutex);
1058}
1059
1060static int all_vcpus_paused(void)
1061{
bdc44640 1062 CPUState *cpu;
296af7c9 1063
bdc44640 1064 CPU_FOREACH(cpu) {
182735ef 1065 if (!cpu->stopped) {
296af7c9 1066 return 0;
0ab07c62 1067 }
296af7c9
BS
1068 }
1069
1070 return 1;
1071}
1072
1073void pause_all_vcpus(void)
1074{
bdc44640 1075 CPUState *cpu;
296af7c9 1076
40daca54 1077 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
bdc44640 1078 CPU_FOREACH(cpu) {
182735ef
AF
1079 cpu->stop = true;
1080 qemu_cpu_kick(cpu);
296af7c9
BS
1081 }
1082
aa723c23 1083 if (qemu_in_vcpu_thread()) {
d798e974
JK
1084 cpu_stop_current();
1085 if (!kvm_enabled()) {
bdc44640 1086 CPU_FOREACH(cpu) {
182735ef
AF
1087 cpu->stop = false;
1088 cpu->stopped = true;
d798e974
JK
1089 }
1090 return;
1091 }
1092 }
1093
296af7c9 1094 while (!all_vcpus_paused()) {
be7d6c57 1095 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
bdc44640 1096 CPU_FOREACH(cpu) {
182735ef 1097 qemu_cpu_kick(cpu);
296af7c9
BS
1098 }
1099 }
1100}
1101
2993683b
IM
1102void cpu_resume(CPUState *cpu)
1103{
1104 cpu->stop = false;
1105 cpu->stopped = false;
1106 qemu_cpu_kick(cpu);
1107}
1108
296af7c9
BS
1109void resume_all_vcpus(void)
1110{
bdc44640 1111 CPUState *cpu;
296af7c9 1112
40daca54 1113 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
bdc44640 1114 CPU_FOREACH(cpu) {
182735ef 1115 cpu_resume(cpu);
296af7c9
BS
1116 }
1117}
1118
4900116e
DDAG
1119/* For temporary buffers for forming a name */
1120#define VCPU_THREAD_NAME_SIZE 16
1121
e5ab30a2 1122static void qemu_tcg_init_vcpu(CPUState *cpu)
296af7c9 1123{
4900116e
DDAG
1124 char thread_name[VCPU_THREAD_NAME_SIZE];
1125
09daed84
EI
1126 tcg_cpu_address_space_init(cpu, cpu->as);
1127
296af7c9
BS
1128 /* share a single thread for all cpus with TCG */
1129 if (!tcg_cpu_thread) {
814e612e 1130 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1131 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1132 qemu_cond_init(cpu->halt_cond);
1133 tcg_halt_cond = cpu->halt_cond;
4900116e
DDAG
1134 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
1135 cpu->cpu_index);
1136 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1137 cpu, QEMU_THREAD_JOINABLE);
1ecf47bf 1138#ifdef _WIN32
814e612e 1139 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1ecf47bf 1140#endif
61a46217 1141 while (!cpu->created) {
18a85728 1142 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1143 }
814e612e 1144 tcg_cpu_thread = cpu->thread;
296af7c9 1145 } else {
814e612e 1146 cpu->thread = tcg_cpu_thread;
f5c121b8 1147 cpu->halt_cond = tcg_halt_cond;
296af7c9
BS
1148 }
1149}
1150
48a106bd 1151static void qemu_kvm_start_vcpu(CPUState *cpu)
296af7c9 1152{
4900116e
DDAG
1153 char thread_name[VCPU_THREAD_NAME_SIZE];
1154
814e612e 1155 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1156 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1157 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1158 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
1159 cpu->cpu_index);
1160 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
1161 cpu, QEMU_THREAD_JOINABLE);
61a46217 1162 while (!cpu->created) {
18a85728 1163 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1164 }
296af7c9
BS
1165}
1166
10a9021d 1167static void qemu_dummy_start_vcpu(CPUState *cpu)
c7f0f3b1 1168{
4900116e
DDAG
1169 char thread_name[VCPU_THREAD_NAME_SIZE];
1170
814e612e 1171 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1172 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1173 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1174 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
1175 cpu->cpu_index);
1176 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
c7f0f3b1 1177 QEMU_THREAD_JOINABLE);
61a46217 1178 while (!cpu->created) {
c7f0f3b1
AL
1179 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1180 }
1181}
1182
c643bed9 1183void qemu_init_vcpu(CPUState *cpu)
296af7c9 1184{
ce3960eb
AF
1185 cpu->nr_cores = smp_cores;
1186 cpu->nr_threads = smp_threads;
f324e766 1187 cpu->stopped = true;
0ab07c62 1188 if (kvm_enabled()) {
48a106bd 1189 qemu_kvm_start_vcpu(cpu);
c7f0f3b1 1190 } else if (tcg_enabled()) {
e5ab30a2 1191 qemu_tcg_init_vcpu(cpu);
c7f0f3b1 1192 } else {
10a9021d 1193 qemu_dummy_start_vcpu(cpu);
0ab07c62 1194 }
296af7c9
BS
1195}
1196
b4a3d965 1197void cpu_stop_current(void)
296af7c9 1198{
4917cf44
AF
1199 if (current_cpu) {
1200 current_cpu->stop = false;
1201 current_cpu->stopped = true;
1202 cpu_exit(current_cpu);
67bb172f 1203 qemu_cond_signal(&qemu_pause_cond);
b4a3d965 1204 }
296af7c9
BS
1205}
1206
56983463 1207int vm_stop(RunState state)
296af7c9 1208{
aa723c23 1209 if (qemu_in_vcpu_thread()) {
1dfb4dd9 1210 qemu_system_vmstop_request(state);
296af7c9
BS
1211 /*
1212 * FIXME: should not return to device code in case
1213 * vm_stop() has been requested.
1214 */
b4a3d965 1215 cpu_stop_current();
56983463 1216 return 0;
296af7c9 1217 }
56983463
KW
1218
1219 return do_vm_stop(state);
296af7c9
BS
1220}
1221
8a9236f1
LC
1222/* does a state transition even if the VM is already stopped,
1223 current state is forgotten forever */
56983463 1224int vm_stop_force_state(RunState state)
8a9236f1
LC
1225{
1226 if (runstate_is_running()) {
56983463 1227 return vm_stop(state);
8a9236f1
LC
1228 } else {
1229 runstate_set(state);
594a45ce
KW
1230 /* Make sure to return an error if the flush in a previous vm_stop()
1231 * failed. */
1232 return bdrv_flush_all();
8a9236f1
LC
1233 }
1234}
1235
9349b4f9 1236static int tcg_cpu_exec(CPUArchState *env)
296af7c9 1237{
efee7340 1238 CPUState *cpu = ENV_GET_CPU(env);
296af7c9
BS
1239 int ret;
1240#ifdef CONFIG_PROFILER
1241 int64_t ti;
1242#endif
1243
1244#ifdef CONFIG_PROFILER
1245 ti = profile_getclock();
1246#endif
1247 if (use_icount) {
1248 int64_t count;
ac70aafc 1249 int64_t deadline;
296af7c9 1250 int decr;
28ecfd7a
AF
1251 qemu_icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
1252 cpu->icount_decr.u16.low = 0;
efee7340 1253 cpu->icount_extra = 0;
40daca54 1254 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ac70aafc
AB
1255
1256 /* Maintain prior (possibly buggy) behaviour where if no deadline
40daca54 1257 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
ac70aafc
AB
1258 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1259 * nanoseconds.
1260 */
1261 if ((deadline < 0) || (deadline > INT32_MAX)) {
1262 deadline = INT32_MAX;
1263 }
1264
1265 count = qemu_icount_round(deadline);
296af7c9
BS
1266 qemu_icount += count;
1267 decr = (count > 0xffff) ? 0xffff : count;
1268 count -= decr;
28ecfd7a 1269 cpu->icount_decr.u16.low = decr;
efee7340 1270 cpu->icount_extra = count;
296af7c9
BS
1271 }
1272 ret = cpu_exec(env);
1273#ifdef CONFIG_PROFILER
1274 qemu_time += profile_getclock() - ti;
1275#endif
1276 if (use_icount) {
1277 /* Fold pending instructions back into the
1278 instruction counter, and clear the interrupt flag. */
28ecfd7a
AF
1279 qemu_icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
1280 cpu->icount_decr.u32 = 0;
efee7340 1281 cpu->icount_extra = 0;
296af7c9
BS
1282 }
1283 return ret;
1284}
1285
bdb7ca67 1286static void tcg_exec_all(void)
296af7c9 1287{
9a36085b
JK
1288 int r;
1289
40daca54
AB
1290 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1291 qemu_clock_warp(QEMU_CLOCK_VIRTUAL);
ab33fcda 1292
0ab07c62 1293 if (next_cpu == NULL) {
296af7c9 1294 next_cpu = first_cpu;
0ab07c62 1295 }
bdc44640 1296 for (; next_cpu != NULL && !exit_request; next_cpu = CPU_NEXT(next_cpu)) {
182735ef
AF
1297 CPUState *cpu = next_cpu;
1298 CPUArchState *env = cpu->env_ptr;
296af7c9 1299
40daca54 1300 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
ed2803da 1301 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
296af7c9 1302
a1fcaa73 1303 if (cpu_can_run(cpu)) {
bdb7ca67 1304 r = tcg_cpu_exec(env);
9a36085b 1305 if (r == EXCP_DEBUG) {
91325046 1306 cpu_handle_guest_debug(cpu);
3c638d06
JK
1307 break;
1308 }
f324e766 1309 } else if (cpu->stop || cpu->stopped) {
296af7c9
BS
1310 break;
1311 }
1312 }
c629a4bc 1313 exit_request = 0;
296af7c9
BS
1314}
1315
1316void set_numa_modes(void)
1317{
1b1ed8dc 1318 CPUState *cpu;
296af7c9
BS
1319 int i;
1320
bdc44640 1321 CPU_FOREACH(cpu) {
296af7c9 1322 for (i = 0; i < nb_numa_nodes; i++) {
55e5c285 1323 if (test_bit(cpu->cpu_index, node_cpumask[i])) {
1b1ed8dc 1324 cpu->numa_node = i;
296af7c9
BS
1325 }
1326 }
1327 }
1328}
1329
9a78eead 1330void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
262353cb
BS
1331{
1332 /* XXX: implement xxx_cpu_list for targets that still miss it */
e916cbf8
PM
1333#if defined(cpu_list)
1334 cpu_list(f, cpu_fprintf);
262353cb
BS
1335#endif
1336}
de0b36b6
LC
1337
1338CpuInfoList *qmp_query_cpus(Error **errp)
1339{
1340 CpuInfoList *head = NULL, *cur_item = NULL;
182735ef 1341 CPUState *cpu;
de0b36b6 1342
bdc44640 1343 CPU_FOREACH(cpu) {
de0b36b6 1344 CpuInfoList *info;
182735ef
AF
1345#if defined(TARGET_I386)
1346 X86CPU *x86_cpu = X86_CPU(cpu);
1347 CPUX86State *env = &x86_cpu->env;
1348#elif defined(TARGET_PPC)
1349 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
1350 CPUPPCState *env = &ppc_cpu->env;
1351#elif defined(TARGET_SPARC)
1352 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
1353 CPUSPARCState *env = &sparc_cpu->env;
1354#elif defined(TARGET_MIPS)
1355 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
1356 CPUMIPSState *env = &mips_cpu->env;
1357#endif
de0b36b6 1358
cb446eca 1359 cpu_synchronize_state(cpu);
de0b36b6
LC
1360
1361 info = g_malloc0(sizeof(*info));
1362 info->value = g_malloc0(sizeof(*info->value));
55e5c285 1363 info->value->CPU = cpu->cpu_index;
182735ef 1364 info->value->current = (cpu == first_cpu);
259186a7 1365 info->value->halted = cpu->halted;
9f09e18a 1366 info->value->thread_id = cpu->thread_id;
de0b36b6
LC
1367#if defined(TARGET_I386)
1368 info->value->has_pc = true;
1369 info->value->pc = env->eip + env->segs[R_CS].base;
1370#elif defined(TARGET_PPC)
1371 info->value->has_nip = true;
1372 info->value->nip = env->nip;
1373#elif defined(TARGET_SPARC)
1374 info->value->has_pc = true;
1375 info->value->pc = env->pc;
1376 info->value->has_npc = true;
1377 info->value->npc = env->npc;
1378#elif defined(TARGET_MIPS)
1379 info->value->has_PC = true;
1380 info->value->PC = env->active_tc.PC;
1381#endif
1382
1383 /* XXX: waiting for the qapi to support GSList */
1384 if (!cur_item) {
1385 head = cur_item = info;
1386 } else {
1387 cur_item->next = info;
1388 cur_item = info;
1389 }
1390 }
1391
1392 return head;
1393}
0cfd6a9a
LC
1394
1395void qmp_memsave(int64_t addr, int64_t size, const char *filename,
1396 bool has_cpu, int64_t cpu_index, Error **errp)
1397{
1398 FILE *f;
1399 uint32_t l;
55e5c285 1400 CPUState *cpu;
0cfd6a9a
LC
1401 uint8_t buf[1024];
1402
1403 if (!has_cpu) {
1404 cpu_index = 0;
1405 }
1406
151d1322
AF
1407 cpu = qemu_get_cpu(cpu_index);
1408 if (cpu == NULL) {
0cfd6a9a
LC
1409 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
1410 "a CPU number");
1411 return;
1412 }
1413
1414 f = fopen(filename, "wb");
1415 if (!f) {
618da851 1416 error_setg_file_open(errp, errno, filename);
0cfd6a9a
LC
1417 return;
1418 }
1419
1420 while (size != 0) {
1421 l = sizeof(buf);
1422 if (l > size)
1423 l = size;
2f4d0f59
AK
1424 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
1425 error_setg(errp, "Invalid addr 0x%016" PRIx64 "specified", addr);
1426 goto exit;
1427 }
0cfd6a9a
LC
1428 if (fwrite(buf, 1, l, f) != l) {
1429 error_set(errp, QERR_IO_ERROR);
1430 goto exit;
1431 }
1432 addr += l;
1433 size -= l;
1434 }
1435
1436exit:
1437 fclose(f);
1438}
6d3962bf
LC
1439
1440void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
1441 Error **errp)
1442{
1443 FILE *f;
1444 uint32_t l;
1445 uint8_t buf[1024];
1446
1447 f = fopen(filename, "wb");
1448 if (!f) {
618da851 1449 error_setg_file_open(errp, errno, filename);
6d3962bf
LC
1450 return;
1451 }
1452
1453 while (size != 0) {
1454 l = sizeof(buf);
1455 if (l > size)
1456 l = size;
eb6282f2 1457 cpu_physical_memory_read(addr, buf, l);
6d3962bf
LC
1458 if (fwrite(buf, 1, l, f) != l) {
1459 error_set(errp, QERR_IO_ERROR);
1460 goto exit;
1461 }
1462 addr += l;
1463 size -= l;
1464 }
1465
1466exit:
1467 fclose(f);
1468}
ab49ab5c
LC
1469
1470void qmp_inject_nmi(Error **errp)
1471{
1472#if defined(TARGET_I386)
182735ef
AF
1473 CPUState *cs;
1474
bdc44640 1475 CPU_FOREACH(cs) {
182735ef 1476 X86CPU *cpu = X86_CPU(cs);
ab49ab5c 1477
02e51483 1478 if (!cpu->apic_state) {
182735ef 1479 cpu_interrupt(cs, CPU_INTERRUPT_NMI);
02c09195 1480 } else {
02e51483 1481 apic_deliver_nmi(cpu->apic_state);
02c09195 1482 }
ab49ab5c 1483 }
7f7f9752
ED
1484#elif defined(TARGET_S390X)
1485 CPUState *cs;
1486 S390CPU *cpu;
1487
bdc44640 1488 CPU_FOREACH(cs) {
7f7f9752
ED
1489 cpu = S390_CPU(cs);
1490 if (cpu->env.cpu_num == monitor_get_cpu_index()) {
1491 if (s390_cpu_restart(S390_CPU(cs)) == -1) {
1492 error_set(errp, QERR_UNSUPPORTED);
1493 return;
1494 }
1495 break;
1496 }
1497 }
ab49ab5c
LC
1498#else
1499 error_set(errp, QERR_UNSUPPORTED);
1500#endif
1501}