]> git.proxmox.com Git - mirror_qemu.git/blame - cpus.c
qemu-timer: do not include sysemu/cpus.h from util/qemu-timer.h
[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. */
7b31bbc2 26#include "qemu/osdep.h"
33c11879 27#include "qemu-common.h"
8d4e9146 28#include "qemu/config-file.h"
33c11879 29#include "cpu.h"
83c9089e 30#include "monitor/monitor.h"
a4e15de9 31#include "qapi/qmp/qerror.h"
d49b6836 32#include "qemu/error-report.h"
9c17d615 33#include "sysemu/sysemu.h"
da31d594 34#include "sysemu/block-backend.h"
022c62cb 35#include "exec/gdbstub.h"
9c17d615 36#include "sysemu/dma.h"
b3946626 37#include "sysemu/hw_accel.h"
9c17d615 38#include "sysemu/kvm.h"
b0cb0a66 39#include "sysemu/hax.h"
de0b36b6 40#include "qmp-commands.h"
63c91552 41#include "exec/exec-all.h"
296af7c9 42
1de7afc9 43#include "qemu/thread.h"
9c17d615
PB
44#include "sysemu/cpus.h"
45#include "sysemu/qtest.h"
1de7afc9
PB
46#include "qemu/main-loop.h"
47#include "qemu/bitmap.h"
cb365646 48#include "qemu/seqlock.h"
8d4e9146 49#include "tcg.h"
a4e15de9 50#include "qapi-event.h"
9cb805fd 51#include "hw/nmi.h"
8b427044 52#include "sysemu/replay.h"
0ff0fc19 53
6d9cb73c
JK
54#ifdef CONFIG_LINUX
55
56#include <sys/prctl.h>
57
c0532a76
MT
58#ifndef PR_MCE_KILL
59#define PR_MCE_KILL 33
60#endif
61
6d9cb73c
JK
62#ifndef PR_MCE_KILL_SET
63#define PR_MCE_KILL_SET 1
64#endif
65
66#ifndef PR_MCE_KILL_EARLY
67#define PR_MCE_KILL_EARLY 1
68#endif
69
70#endif /* CONFIG_LINUX */
71
27498bef
ST
72int64_t max_delay;
73int64_t max_advance;
296af7c9 74
2adcc85d
JH
75/* vcpu throttling controls */
76static QEMUTimer *throttle_timer;
77static unsigned int throttle_percentage;
78
79#define CPU_THROTTLE_PCT_MIN 1
80#define CPU_THROTTLE_PCT_MAX 99
81#define CPU_THROTTLE_TIMESLICE_NS 10000000
82
321bc0b2
TC
83bool cpu_is_stopped(CPUState *cpu)
84{
85 return cpu->stopped || !runstate_is_running();
86}
87
a98ae1d8 88static bool cpu_thread_is_idle(CPUState *cpu)
ac873f1e 89{
c64ca814 90 if (cpu->stop || cpu->queued_work_first) {
ac873f1e
PM
91 return false;
92 }
321bc0b2 93 if (cpu_is_stopped(cpu)) {
ac873f1e
PM
94 return true;
95 }
8c2e1b00 96 if (!cpu->halted || cpu_has_work(cpu) ||
215e79c0 97 kvm_halt_in_kernel()) {
ac873f1e
PM
98 return false;
99 }
100 return true;
101}
102
103static bool all_cpu_threads_idle(void)
104{
182735ef 105 CPUState *cpu;
ac873f1e 106
bdc44640 107 CPU_FOREACH(cpu) {
182735ef 108 if (!cpu_thread_is_idle(cpu)) {
ac873f1e
PM
109 return false;
110 }
111 }
112 return true;
113}
114
946fb27c
PB
115/***********************************************************/
116/* guest cycle counter */
117
a3270e19
PB
118/* Protected by TimersState seqlock */
119
5045e9d9 120static bool icount_sleep = true;
71468395 121static int64_t vm_clock_warp_start = -1;
946fb27c
PB
122/* Conversion factor from emulated instructions to virtual clock ticks. */
123static int icount_time_shift;
124/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
125#define MAX_ICOUNT_SHIFT 10
a3270e19 126
946fb27c
PB
127static QEMUTimer *icount_rt_timer;
128static QEMUTimer *icount_vm_timer;
129static QEMUTimer *icount_warp_timer;
946fb27c
PB
130
131typedef struct TimersState {
cb365646 132 /* Protected by BQL. */
946fb27c
PB
133 int64_t cpu_ticks_prev;
134 int64_t cpu_ticks_offset;
cb365646
LPF
135
136 /* cpu_clock_offset can be read out of BQL, so protect it with
137 * this lock.
138 */
139 QemuSeqLock vm_clock_seqlock;
946fb27c
PB
140 int64_t cpu_clock_offset;
141 int32_t cpu_ticks_enabled;
142 int64_t dummy;
c96778bb
FK
143
144 /* Compensate for varying guest execution speed. */
145 int64_t qemu_icount_bias;
146 /* Only written by TCG thread */
147 int64_t qemu_icount;
946fb27c
PB
148} TimersState;
149
d9cd4007 150static TimersState timers_state;
8d4e9146
FK
151bool mttcg_enabled;
152
153/*
154 * We default to false if we know other options have been enabled
155 * which are currently incompatible with MTTCG. Otherwise when each
156 * guest (target) has been updated to support:
157 * - atomic instructions
158 * - memory ordering primitives (barriers)
159 * they can set the appropriate CONFIG flags in ${target}-softmmu.mak
160 *
161 * Once a guest architecture has been converted to the new primitives
162 * there are two remaining limitations to check.
163 *
164 * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
165 * - The host must have a stronger memory order than the guest
166 *
167 * It may be possible in future to support strong guests on weak hosts
168 * but that will require tagging all load/stores in a guest with their
169 * implicit memory order requirements which would likely slow things
170 * down a lot.
171 */
172
173static bool check_tcg_memory_orders_compatible(void)
174{
175#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
176 return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
177#else
178 return false;
179#endif
180}
181
182static bool default_mttcg_enabled(void)
183{
83fd9629 184 if (use_icount || TCG_OVERSIZED_GUEST) {
8d4e9146
FK
185 return false;
186 } else {
187#ifdef TARGET_SUPPORTS_MTTCG
188 return check_tcg_memory_orders_compatible();
189#else
190 return false;
191#endif
192 }
193}
194
195void qemu_tcg_configure(QemuOpts *opts, Error **errp)
196{
197 const char *t = qemu_opt_get(opts, "thread");
198 if (t) {
199 if (strcmp(t, "multi") == 0) {
200 if (TCG_OVERSIZED_GUEST) {
201 error_setg(errp, "No MTTCG when guest word size > hosts");
83fd9629
AB
202 } else if (use_icount) {
203 error_setg(errp, "No MTTCG when icount is enabled");
8d4e9146 204 } else {
c34c7620
AB
205#ifndef TARGET_SUPPORT_MTTCG
206 error_report("Guest not yet converted to MTTCG - "
207 "you may get unexpected results");
208#endif
8d4e9146
FK
209 if (!check_tcg_memory_orders_compatible()) {
210 error_report("Guest expects a stronger memory ordering "
211 "than the host provides");
212 error_printf("This may cause strange/hard to debug errors");
213 }
214 mttcg_enabled = true;
215 }
216 } else if (strcmp(t, "single") == 0) {
217 mttcg_enabled = false;
218 } else {
219 error_setg(errp, "Invalid 'thread' setting %s", t);
220 }
221 } else {
222 mttcg_enabled = default_mttcg_enabled();
223 }
224}
946fb27c 225
2a62914b 226int64_t cpu_get_icount_raw(void)
946fb27c
PB
227{
228 int64_t icount;
4917cf44 229 CPUState *cpu = current_cpu;
946fb27c 230
c96778bb 231 icount = timers_state.qemu_icount;
4917cf44 232 if (cpu) {
414b15c9 233 if (!cpu->can_do_io) {
2a62914b
PD
234 fprintf(stderr, "Bad icount read\n");
235 exit(1);
946fb27c 236 }
28ecfd7a 237 icount -= (cpu->icount_decr.u16.low + cpu->icount_extra);
946fb27c 238 }
2a62914b
PD
239 return icount;
240}
241
242/* Return the virtual CPU time, based on the instruction counter. */
243static int64_t cpu_get_icount_locked(void)
244{
245 int64_t icount = cpu_get_icount_raw();
3f031313 246 return timers_state.qemu_icount_bias + cpu_icount_to_ns(icount);
946fb27c
PB
247}
248
17a15f1b
PB
249int64_t cpu_get_icount(void)
250{
251 int64_t icount;
252 unsigned start;
253
254 do {
255 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
256 icount = cpu_get_icount_locked();
257 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
258
259 return icount;
260}
261
3f031313
FK
262int64_t cpu_icount_to_ns(int64_t icount)
263{
264 return icount << icount_time_shift;
265}
266
d90f3cca
C
267/* return the time elapsed in VM between vm_start and vm_stop. Unless
268 * icount is active, cpu_get_ticks() uses units of the host CPU cycle
269 * counter.
270 *
271 * Caller must hold the BQL
272 */
946fb27c
PB
273int64_t cpu_get_ticks(void)
274{
5f3e3101
PB
275 int64_t ticks;
276
946fb27c
PB
277 if (use_icount) {
278 return cpu_get_icount();
279 }
5f3e3101
PB
280
281 ticks = timers_state.cpu_ticks_offset;
282 if (timers_state.cpu_ticks_enabled) {
4a7428c5 283 ticks += cpu_get_host_ticks();
5f3e3101
PB
284 }
285
286 if (timers_state.cpu_ticks_prev > ticks) {
287 /* Note: non increasing ticks may happen if the host uses
288 software suspend */
289 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
290 ticks = timers_state.cpu_ticks_prev;
946fb27c 291 }
5f3e3101
PB
292
293 timers_state.cpu_ticks_prev = ticks;
294 return ticks;
946fb27c
PB
295}
296
cb365646 297static int64_t cpu_get_clock_locked(void)
946fb27c 298{
1d45cea5 299 int64_t time;
cb365646 300
1d45cea5 301 time = timers_state.cpu_clock_offset;
5f3e3101 302 if (timers_state.cpu_ticks_enabled) {
1d45cea5 303 time += get_clock();
946fb27c 304 }
cb365646 305
1d45cea5 306 return time;
cb365646
LPF
307}
308
d90f3cca 309/* Return the monotonic time elapsed in VM, i.e.,
8212ff86
PM
310 * the time between vm_start and vm_stop
311 */
cb365646
LPF
312int64_t cpu_get_clock(void)
313{
314 int64_t ti;
315 unsigned start;
316
317 do {
318 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
319 ti = cpu_get_clock_locked();
320 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
321
322 return ti;
946fb27c
PB
323}
324
cb365646 325/* enable cpu_get_ticks()
3224e878 326 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
cb365646 327 */
946fb27c
PB
328void cpu_enable_ticks(void)
329{
cb365646 330 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
03719e44 331 seqlock_write_begin(&timers_state.vm_clock_seqlock);
946fb27c 332 if (!timers_state.cpu_ticks_enabled) {
4a7428c5 333 timers_state.cpu_ticks_offset -= cpu_get_host_ticks();
946fb27c
PB
334 timers_state.cpu_clock_offset -= get_clock();
335 timers_state.cpu_ticks_enabled = 1;
336 }
03719e44 337 seqlock_write_end(&timers_state.vm_clock_seqlock);
946fb27c
PB
338}
339
340/* disable cpu_get_ticks() : the clock is stopped. You must not call
cb365646 341 * cpu_get_ticks() after that.
3224e878 342 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
cb365646 343 */
946fb27c
PB
344void cpu_disable_ticks(void)
345{
cb365646 346 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
03719e44 347 seqlock_write_begin(&timers_state.vm_clock_seqlock);
946fb27c 348 if (timers_state.cpu_ticks_enabled) {
4a7428c5 349 timers_state.cpu_ticks_offset += cpu_get_host_ticks();
cb365646 350 timers_state.cpu_clock_offset = cpu_get_clock_locked();
946fb27c
PB
351 timers_state.cpu_ticks_enabled = 0;
352 }
03719e44 353 seqlock_write_end(&timers_state.vm_clock_seqlock);
946fb27c
PB
354}
355
356/* Correlation between real and virtual time is always going to be
357 fairly approximate, so ignore small variation.
358 When the guest is idle real and virtual time will be aligned in
359 the IO wait loop. */
73bcb24d 360#define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10)
946fb27c
PB
361
362static void icount_adjust(void)
363{
364 int64_t cur_time;
365 int64_t cur_icount;
366 int64_t delta;
a3270e19
PB
367
368 /* Protected by TimersState mutex. */
946fb27c 369 static int64_t last_delta;
468cc7cf 370
946fb27c
PB
371 /* If the VM is not running, then do nothing. */
372 if (!runstate_is_running()) {
373 return;
374 }
468cc7cf 375
03719e44 376 seqlock_write_begin(&timers_state.vm_clock_seqlock);
17a15f1b
PB
377 cur_time = cpu_get_clock_locked();
378 cur_icount = cpu_get_icount_locked();
468cc7cf 379
946fb27c
PB
380 delta = cur_icount - cur_time;
381 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
382 if (delta > 0
383 && last_delta + ICOUNT_WOBBLE < delta * 2
384 && icount_time_shift > 0) {
385 /* The guest is getting too far ahead. Slow time down. */
386 icount_time_shift--;
387 }
388 if (delta < 0
389 && last_delta - ICOUNT_WOBBLE > delta * 2
390 && icount_time_shift < MAX_ICOUNT_SHIFT) {
391 /* The guest is getting too far behind. Speed time up. */
392 icount_time_shift++;
393 }
394 last_delta = delta;
c96778bb
FK
395 timers_state.qemu_icount_bias = cur_icount
396 - (timers_state.qemu_icount << icount_time_shift);
03719e44 397 seqlock_write_end(&timers_state.vm_clock_seqlock);
946fb27c
PB
398}
399
400static void icount_adjust_rt(void *opaque)
401{
40daca54 402 timer_mod(icount_rt_timer,
1979b908 403 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
946fb27c
PB
404 icount_adjust();
405}
406
407static void icount_adjust_vm(void *opaque)
408{
40daca54
AB
409 timer_mod(icount_vm_timer,
410 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
73bcb24d 411 NANOSECONDS_PER_SECOND / 10);
946fb27c
PB
412 icount_adjust();
413}
414
415static int64_t qemu_icount_round(int64_t count)
416{
417 return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
418}
419
efab87cf 420static void icount_warp_rt(void)
946fb27c 421{
ccffff48
AB
422 unsigned seq;
423 int64_t warp_start;
424
17a15f1b
PB
425 /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
426 * changes from -1 to another value, so the race here is okay.
427 */
ccffff48
AB
428 do {
429 seq = seqlock_read_begin(&timers_state.vm_clock_seqlock);
430 warp_start = vm_clock_warp_start;
431 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq));
432
433 if (warp_start == -1) {
946fb27c
PB
434 return;
435 }
436
03719e44 437 seqlock_write_begin(&timers_state.vm_clock_seqlock);
946fb27c 438 if (runstate_is_running()) {
8eda206e
PD
439 int64_t clock = REPLAY_CLOCK(REPLAY_CLOCK_VIRTUAL_RT,
440 cpu_get_clock_locked());
8ed961d9
PB
441 int64_t warp_delta;
442
443 warp_delta = clock - vm_clock_warp_start;
444 if (use_icount == 2) {
946fb27c 445 /*
40daca54 446 * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
946fb27c
PB
447 * far ahead of real time.
448 */
17a15f1b 449 int64_t cur_icount = cpu_get_icount_locked();
bf2a7ddb 450 int64_t delta = clock - cur_icount;
8ed961d9 451 warp_delta = MIN(warp_delta, delta);
946fb27c 452 }
c96778bb 453 timers_state.qemu_icount_bias += warp_delta;
946fb27c
PB
454 }
455 vm_clock_warp_start = -1;
03719e44 456 seqlock_write_end(&timers_state.vm_clock_seqlock);
8ed961d9
PB
457
458 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
459 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
460 }
946fb27c
PB
461}
462
e76d1798 463static void icount_timer_cb(void *opaque)
efab87cf 464{
e76d1798
PD
465 /* No need for a checkpoint because the timer already synchronizes
466 * with CHECKPOINT_CLOCK_VIRTUAL_RT.
467 */
468 icount_warp_rt();
efab87cf
PD
469}
470
8156be56
PB
471void qtest_clock_warp(int64_t dest)
472{
40daca54 473 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
efef88b3 474 AioContext *aio_context;
8156be56 475 assert(qtest_enabled());
efef88b3 476 aio_context = qemu_get_aio_context();
8156be56 477 while (clock < dest) {
40daca54 478 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
c9299e2f 479 int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
efef88b3 480
03719e44 481 seqlock_write_begin(&timers_state.vm_clock_seqlock);
c96778bb 482 timers_state.qemu_icount_bias += warp;
03719e44 483 seqlock_write_end(&timers_state.vm_clock_seqlock);
17a15f1b 484
40daca54 485 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
efef88b3 486 timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
40daca54 487 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
8156be56 488 }
40daca54 489 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
8156be56
PB
490}
491
e76d1798 492void qemu_start_warp_timer(void)
946fb27c 493{
ce78d18c 494 int64_t clock;
946fb27c
PB
495 int64_t deadline;
496
e76d1798 497 if (!use_icount) {
946fb27c
PB
498 return;
499 }
500
8bd7f71d
PD
501 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
502 * do not fire, so computing the deadline does not make sense.
503 */
504 if (!runstate_is_running()) {
505 return;
506 }
507
508 /* warp clock deterministically in record/replay mode */
e76d1798 509 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) {
8bd7f71d
PD
510 return;
511 }
512
ce78d18c 513 if (!all_cpu_threads_idle()) {
946fb27c
PB
514 return;
515 }
516
8156be56
PB
517 if (qtest_enabled()) {
518 /* When testing, qtest commands advance icount. */
e76d1798 519 return;
8156be56
PB
520 }
521
ac70aafc 522 /* We want to use the earliest deadline from ALL vm_clocks */
bf2a7ddb 523 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT);
40daca54 524 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
ce78d18c 525 if (deadline < 0) {
d7a0f71d
VC
526 static bool notified;
527 if (!icount_sleep && !notified) {
528 error_report("WARNING: icount sleep disabled and no active timers");
529 notified = true;
530 }
ce78d18c 531 return;
ac70aafc
AB
532 }
533
946fb27c
PB
534 if (deadline > 0) {
535 /*
40daca54 536 * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to
946fb27c
PB
537 * sleep. Otherwise, the CPU might be waiting for a future timer
538 * interrupt to wake it up, but the interrupt never comes because
539 * the vCPU isn't running any insns and thus doesn't advance the
40daca54 540 * QEMU_CLOCK_VIRTUAL.
946fb27c 541 */
5045e9d9
VC
542 if (!icount_sleep) {
543 /*
544 * We never let VCPUs sleep in no sleep icount mode.
545 * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance
546 * to the next QEMU_CLOCK_VIRTUAL event and notify it.
547 * It is useful when we want a deterministic execution time,
548 * isolated from host latencies.
549 */
03719e44 550 seqlock_write_begin(&timers_state.vm_clock_seqlock);
5045e9d9 551 timers_state.qemu_icount_bias += deadline;
03719e44 552 seqlock_write_end(&timers_state.vm_clock_seqlock);
5045e9d9
VC
553 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
554 } else {
555 /*
556 * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some
557 * "real" time, (related to the time left until the next event) has
558 * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this.
559 * This avoids that the warps are visible externally; for example,
560 * you will not be sending network packets continuously instead of
561 * every 100ms.
562 */
03719e44 563 seqlock_write_begin(&timers_state.vm_clock_seqlock);
5045e9d9
VC
564 if (vm_clock_warp_start == -1 || vm_clock_warp_start > clock) {
565 vm_clock_warp_start = clock;
566 }
03719e44 567 seqlock_write_end(&timers_state.vm_clock_seqlock);
5045e9d9 568 timer_mod_anticipate(icount_warp_timer, clock + deadline);
ce78d18c 569 }
ac70aafc 570 } else if (deadline == 0) {
40daca54 571 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
946fb27c
PB
572 }
573}
574
e76d1798
PD
575static void qemu_account_warp_timer(void)
576{
577 if (!use_icount || !icount_sleep) {
578 return;
579 }
580
581 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
582 * do not fire, so computing the deadline does not make sense.
583 */
584 if (!runstate_is_running()) {
585 return;
586 }
587
588 /* warp clock deterministically in record/replay mode */
589 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) {
590 return;
591 }
592
593 timer_del(icount_warp_timer);
594 icount_warp_rt();
595}
596
d09eae37
FK
597static bool icount_state_needed(void *opaque)
598{
599 return use_icount;
600}
601
602/*
603 * This is a subsection for icount migration.
604 */
605static const VMStateDescription icount_vmstate_timers = {
606 .name = "timer/icount",
607 .version_id = 1,
608 .minimum_version_id = 1,
5cd8cada 609 .needed = icount_state_needed,
d09eae37
FK
610 .fields = (VMStateField[]) {
611 VMSTATE_INT64(qemu_icount_bias, TimersState),
612 VMSTATE_INT64(qemu_icount, TimersState),
613 VMSTATE_END_OF_LIST()
614 }
615};
616
946fb27c
PB
617static const VMStateDescription vmstate_timers = {
618 .name = "timer",
619 .version_id = 2,
620 .minimum_version_id = 1,
35d08458 621 .fields = (VMStateField[]) {
946fb27c
PB
622 VMSTATE_INT64(cpu_ticks_offset, TimersState),
623 VMSTATE_INT64(dummy, TimersState),
624 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
625 VMSTATE_END_OF_LIST()
d09eae37 626 },
5cd8cada
JQ
627 .subsections = (const VMStateDescription*[]) {
628 &icount_vmstate_timers,
629 NULL
946fb27c
PB
630 }
631};
632
14e6fe12 633static void cpu_throttle_thread(CPUState *cpu, run_on_cpu_data opaque)
2adcc85d 634{
2adcc85d
JH
635 double pct;
636 double throttle_ratio;
637 long sleeptime_ns;
638
639 if (!cpu_throttle_get_percentage()) {
640 return;
641 }
642
643 pct = (double)cpu_throttle_get_percentage()/100;
644 throttle_ratio = pct / (1 - pct);
645 sleeptime_ns = (long)(throttle_ratio * CPU_THROTTLE_TIMESLICE_NS);
646
647 qemu_mutex_unlock_iothread();
648 atomic_set(&cpu->throttle_thread_scheduled, 0);
649 g_usleep(sleeptime_ns / 1000); /* Convert ns to us for usleep call */
650 qemu_mutex_lock_iothread();
651}
652
653static void cpu_throttle_timer_tick(void *opaque)
654{
655 CPUState *cpu;
656 double pct;
657
658 /* Stop the timer if needed */
659 if (!cpu_throttle_get_percentage()) {
660 return;
661 }
662 CPU_FOREACH(cpu) {
663 if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) {
14e6fe12
PB
664 async_run_on_cpu(cpu, cpu_throttle_thread,
665 RUN_ON_CPU_NULL);
2adcc85d
JH
666 }
667 }
668
669 pct = (double)cpu_throttle_get_percentage()/100;
670 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
671 CPU_THROTTLE_TIMESLICE_NS / (1-pct));
672}
673
674void cpu_throttle_set(int new_throttle_pct)
675{
676 /* Ensure throttle percentage is within valid range */
677 new_throttle_pct = MIN(new_throttle_pct, CPU_THROTTLE_PCT_MAX);
678 new_throttle_pct = MAX(new_throttle_pct, CPU_THROTTLE_PCT_MIN);
679
680 atomic_set(&throttle_percentage, new_throttle_pct);
681
682 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
683 CPU_THROTTLE_TIMESLICE_NS);
684}
685
686void cpu_throttle_stop(void)
687{
688 atomic_set(&throttle_percentage, 0);
689}
690
691bool cpu_throttle_active(void)
692{
693 return (cpu_throttle_get_percentage() != 0);
694}
695
696int cpu_throttle_get_percentage(void)
697{
698 return atomic_read(&throttle_percentage);
699}
700
4603ea01
PD
701void cpu_ticks_init(void)
702{
ccdb3c1f 703 seqlock_init(&timers_state.vm_clock_seqlock);
4603ea01 704 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
2adcc85d
JH
705 throttle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
706 cpu_throttle_timer_tick, NULL);
4603ea01
PD
707}
708
1ad9580b 709void configure_icount(QemuOpts *opts, Error **errp)
946fb27c 710{
1ad9580b 711 const char *option;
a8bfac37 712 char *rem_str = NULL;
1ad9580b 713
1ad9580b 714 option = qemu_opt_get(opts, "shift");
946fb27c 715 if (!option) {
a8bfac37
ST
716 if (qemu_opt_get(opts, "align") != NULL) {
717 error_setg(errp, "Please specify shift option when using align");
718 }
946fb27c
PB
719 return;
720 }
f1f4b57e
VC
721
722 icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
5045e9d9
VC
723 if (icount_sleep) {
724 icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
e76d1798 725 icount_timer_cb, NULL);
5045e9d9 726 }
f1f4b57e 727
a8bfac37 728 icount_align_option = qemu_opt_get_bool(opts, "align", false);
f1f4b57e
VC
729
730 if (icount_align_option && !icount_sleep) {
778d9f9b 731 error_setg(errp, "align=on and sleep=off are incompatible");
f1f4b57e 732 }
946fb27c 733 if (strcmp(option, "auto") != 0) {
a8bfac37
ST
734 errno = 0;
735 icount_time_shift = strtol(option, &rem_str, 0);
736 if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
737 error_setg(errp, "icount: Invalid shift value");
738 }
946fb27c
PB
739 use_icount = 1;
740 return;
a8bfac37
ST
741 } else if (icount_align_option) {
742 error_setg(errp, "shift=auto and align=on are incompatible");
f1f4b57e 743 } else if (!icount_sleep) {
778d9f9b 744 error_setg(errp, "shift=auto and sleep=off are incompatible");
946fb27c
PB
745 }
746
747 use_icount = 2;
748
749 /* 125MIPS seems a reasonable initial guess at the guest speed.
750 It will be corrected fairly quickly anyway. */
751 icount_time_shift = 3;
752
753 /* Have both realtime and virtual time triggers for speed adjustment.
754 The realtime trigger catches emulated time passing too slowly,
755 the virtual time trigger catches emulated time passing too fast.
756 Realtime triggers occur even when idle, so use them less frequently
757 than VM triggers. */
bf2a7ddb
PD
758 icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT,
759 icount_adjust_rt, NULL);
40daca54 760 timer_mod(icount_rt_timer,
bf2a7ddb 761 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
40daca54
AB
762 icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
763 icount_adjust_vm, NULL);
764 timer_mod(icount_vm_timer,
765 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
73bcb24d 766 NANOSECONDS_PER_SECOND / 10);
946fb27c
PB
767}
768
6546706d
AB
769/***********************************************************/
770/* TCG vCPU kick timer
771 *
772 * The kick timer is responsible for moving single threaded vCPU
773 * emulation on to the next vCPU. If more than one vCPU is running a
774 * timer event with force a cpu->exit so the next vCPU can get
775 * scheduled.
776 *
777 * The timer is removed if all vCPUs are idle and restarted again once
778 * idleness is complete.
779 */
780
781static QEMUTimer *tcg_kick_vcpu_timer;
791158d9 782static CPUState *tcg_current_rr_cpu;
6546706d
AB
783
784#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
785
786static inline int64_t qemu_tcg_next_kick(void)
787{
788 return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
789}
790
791158d9
AB
791/* Kick the currently round-robin scheduled vCPU */
792static void qemu_cpu_kick_rr_cpu(void)
793{
794 CPUState *cpu;
791158d9
AB
795 do {
796 cpu = atomic_mb_read(&tcg_current_rr_cpu);
797 if (cpu) {
798 cpu_exit(cpu);
799 }
800 } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
801}
802
6546706d
AB
803static void kick_tcg_thread(void *opaque)
804{
805 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
791158d9 806 qemu_cpu_kick_rr_cpu();
6546706d
AB
807}
808
809static void start_tcg_kick_timer(void)
810{
37257942 811 if (!mttcg_enabled && !tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
6546706d
AB
812 tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
813 kick_tcg_thread, NULL);
814 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
815 }
816}
817
818static void stop_tcg_kick_timer(void)
819{
820 if (tcg_kick_vcpu_timer) {
821 timer_del(tcg_kick_vcpu_timer);
822 tcg_kick_vcpu_timer = NULL;
823 }
824}
825
296af7c9
BS
826/***********************************************************/
827void hw_error(const char *fmt, ...)
828{
829 va_list ap;
55e5c285 830 CPUState *cpu;
296af7c9
BS
831
832 va_start(ap, fmt);
833 fprintf(stderr, "qemu: hardware error: ");
834 vfprintf(stderr, fmt, ap);
835 fprintf(stderr, "\n");
bdc44640 836 CPU_FOREACH(cpu) {
55e5c285 837 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
878096ee 838 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU);
296af7c9
BS
839 }
840 va_end(ap);
841 abort();
842}
843
844void cpu_synchronize_all_states(void)
845{
182735ef 846 CPUState *cpu;
296af7c9 847
bdc44640 848 CPU_FOREACH(cpu) {
182735ef 849 cpu_synchronize_state(cpu);
296af7c9
BS
850 }
851}
852
853void cpu_synchronize_all_post_reset(void)
854{
182735ef 855 CPUState *cpu;
296af7c9 856
bdc44640 857 CPU_FOREACH(cpu) {
182735ef 858 cpu_synchronize_post_reset(cpu);
296af7c9
BS
859 }
860}
861
862void cpu_synchronize_all_post_init(void)
863{
182735ef 864 CPUState *cpu;
296af7c9 865
bdc44640 866 CPU_FOREACH(cpu) {
182735ef 867 cpu_synchronize_post_init(cpu);
296af7c9
BS
868 }
869}
870
56983463 871static int do_vm_stop(RunState state)
296af7c9 872{
56983463
KW
873 int ret = 0;
874
1354869c 875 if (runstate_is_running()) {
296af7c9 876 cpu_disable_ticks();
296af7c9 877 pause_all_vcpus();
f5bbfba1 878 runstate_set(state);
1dfb4dd9 879 vm_state_notify(0, state);
a4e15de9 880 qapi_event_send_stop(&error_abort);
296af7c9 881 }
56983463 882
594a45ce 883 bdrv_drain_all();
6d0ceb80 884 replay_disable_events();
22af08ea 885 ret = bdrv_flush_all();
594a45ce 886
56983463 887 return ret;
296af7c9
BS
888}
889
a1fcaa73 890static bool cpu_can_run(CPUState *cpu)
296af7c9 891{
4fdeee7c 892 if (cpu->stop) {
a1fcaa73 893 return false;
0ab07c62 894 }
321bc0b2 895 if (cpu_is_stopped(cpu)) {
a1fcaa73 896 return false;
0ab07c62 897 }
a1fcaa73 898 return true;
296af7c9
BS
899}
900
91325046 901static void cpu_handle_guest_debug(CPUState *cpu)
83f338f7 902{
64f6b346 903 gdb_set_stop_cpu(cpu);
8cf71710 904 qemu_system_debug_request();
f324e766 905 cpu->stopped = true;
3c638d06
JK
906}
907
6d9cb73c
JK
908#ifdef CONFIG_LINUX
909static void sigbus_reraise(void)
910{
911 sigset_t set;
912 struct sigaction action;
913
914 memset(&action, 0, sizeof(action));
915 action.sa_handler = SIG_DFL;
916 if (!sigaction(SIGBUS, &action, NULL)) {
917 raise(SIGBUS);
918 sigemptyset(&set);
919 sigaddset(&set, SIGBUS);
a2d1761d 920 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
6d9cb73c
JK
921 }
922 perror("Failed to re-raise SIGBUS!\n");
923 abort();
924}
925
d98d4072 926static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx)
6d9cb73c 927{
a16fc07e
PB
928 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) {
929 sigbus_reraise();
930 }
931
2ae41db2
PB
932 if (current_cpu) {
933 /* Called asynchronously in VCPU thread. */
934 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) {
935 sigbus_reraise();
936 }
937 } else {
938 /* Called synchronously (via signalfd) in main thread. */
939 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) {
940 sigbus_reraise();
941 }
6d9cb73c
JK
942 }
943}
944
945static void qemu_init_sigbus(void)
946{
947 struct sigaction action;
948
949 memset(&action, 0, sizeof(action));
950 action.sa_flags = SA_SIGINFO;
d98d4072 951 action.sa_sigaction = sigbus_handler;
6d9cb73c
JK
952 sigaction(SIGBUS, &action, NULL);
953
954 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
955}
6d9cb73c 956#else /* !CONFIG_LINUX */
6d9cb73c
JK
957static void qemu_init_sigbus(void)
958{
959}
a16fc07e 960#endif /* !CONFIG_LINUX */
ff48eb5f 961
b2532d88 962static QemuMutex qemu_global_mutex;
296af7c9
BS
963
964static QemuThread io_thread;
965
296af7c9
BS
966/* cpu creation */
967static QemuCond qemu_cpu_cond;
968/* system init */
296af7c9
BS
969static QemuCond qemu_pause_cond;
970
d3b12f5d 971void qemu_init_cpu_loop(void)
296af7c9 972{
6d9cb73c 973 qemu_init_sigbus();
ed94592b 974 qemu_cond_init(&qemu_cpu_cond);
ed94592b 975 qemu_cond_init(&qemu_pause_cond);
296af7c9 976 qemu_mutex_init(&qemu_global_mutex);
296af7c9 977
b7680cb6 978 qemu_thread_get_self(&io_thread);
296af7c9
BS
979}
980
14e6fe12 981void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
e82bcec2 982{
d148d90e 983 do_run_on_cpu(cpu, func, data, &qemu_global_mutex);
3c02270d
CV
984}
985
4c055ab5
GZ
986static void qemu_kvm_destroy_vcpu(CPUState *cpu)
987{
988 if (kvm_destroy_vcpu(cpu) < 0) {
989 error_report("kvm_destroy_vcpu failed");
990 exit(EXIT_FAILURE);
991 }
992}
993
994static void qemu_tcg_destroy_vcpu(CPUState *cpu)
995{
996}
997
509a0d78 998static void qemu_wait_io_event_common(CPUState *cpu)
296af7c9 999{
37257942 1000 atomic_mb_set(&cpu->thread_kicked, false);
4fdeee7c
AF
1001 if (cpu->stop) {
1002 cpu->stop = false;
f324e766 1003 cpu->stopped = true;
96bce683 1004 qemu_cond_broadcast(&qemu_pause_cond);
296af7c9 1005 }
a5403c69 1006 process_queued_cpu_work(cpu);
37257942
AB
1007}
1008
1009static bool qemu_tcg_should_sleep(CPUState *cpu)
1010{
1011 if (mttcg_enabled) {
1012 return cpu_thread_is_idle(cpu);
1013 } else {
1014 return all_cpu_threads_idle();
1015 }
296af7c9
BS
1016}
1017
d5f8d613 1018static void qemu_tcg_wait_io_event(CPUState *cpu)
296af7c9 1019{
37257942 1020 while (qemu_tcg_should_sleep(cpu)) {
6546706d 1021 stop_tcg_kick_timer();
d5f8d613 1022 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
16400322 1023 }
296af7c9 1024
6546706d
AB
1025 start_tcg_kick_timer();
1026
37257942 1027 qemu_wait_io_event_common(cpu);
296af7c9
BS
1028}
1029
fd529e8f 1030static void qemu_kvm_wait_io_event(CPUState *cpu)
296af7c9 1031{
a98ae1d8 1032 while (cpu_thread_is_idle(cpu)) {
f5c121b8 1033 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
16400322 1034 }
296af7c9 1035
509a0d78 1036 qemu_wait_io_event_common(cpu);
296af7c9
BS
1037}
1038
7e97cd88 1039static void *qemu_kvm_cpu_thread_fn(void *arg)
296af7c9 1040{
48a106bd 1041 CPUState *cpu = arg;
84b4915d 1042 int r;
296af7c9 1043
ab28bd23
PB
1044 rcu_register_thread();
1045
2e7f7a3c 1046 qemu_mutex_lock_iothread();
814e612e 1047 qemu_thread_get_self(cpu->thread);
9f09e18a 1048 cpu->thread_id = qemu_get_thread_id();
626cf8f4 1049 cpu->can_do_io = 1;
4917cf44 1050 current_cpu = cpu;
296af7c9 1051
504134d2 1052 r = kvm_init_vcpu(cpu);
84b4915d
JK
1053 if (r < 0) {
1054 fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
1055 exit(1);
1056 }
296af7c9 1057
18268b60 1058 kvm_init_cpu_signals(cpu);
296af7c9
BS
1059
1060 /* signal CPU creation */
61a46217 1061 cpu->created = true;
296af7c9
BS
1062 qemu_cond_signal(&qemu_cpu_cond);
1063
4c055ab5 1064 do {
a1fcaa73 1065 if (cpu_can_run(cpu)) {
1458c363 1066 r = kvm_cpu_exec(cpu);
83f338f7 1067 if (r == EXCP_DEBUG) {
91325046 1068 cpu_handle_guest_debug(cpu);
83f338f7 1069 }
0ab07c62 1070 }
fd529e8f 1071 qemu_kvm_wait_io_event(cpu);
4c055ab5 1072 } while (!cpu->unplug || cpu_can_run(cpu));
296af7c9 1073
4c055ab5 1074 qemu_kvm_destroy_vcpu(cpu);
2c579042
BR
1075 cpu->created = false;
1076 qemu_cond_signal(&qemu_cpu_cond);
4c055ab5 1077 qemu_mutex_unlock_iothread();
296af7c9
BS
1078 return NULL;
1079}
1080
c7f0f3b1
AL
1081static void *qemu_dummy_cpu_thread_fn(void *arg)
1082{
1083#ifdef _WIN32
1084 fprintf(stderr, "qtest is not supported under Windows\n");
1085 exit(1);
1086#else
10a9021d 1087 CPUState *cpu = arg;
c7f0f3b1
AL
1088 sigset_t waitset;
1089 int r;
1090
ab28bd23
PB
1091 rcu_register_thread();
1092
c7f0f3b1 1093 qemu_mutex_lock_iothread();
814e612e 1094 qemu_thread_get_self(cpu->thread);
9f09e18a 1095 cpu->thread_id = qemu_get_thread_id();
626cf8f4 1096 cpu->can_do_io = 1;
37257942 1097 current_cpu = cpu;
c7f0f3b1
AL
1098
1099 sigemptyset(&waitset);
1100 sigaddset(&waitset, SIG_IPI);
1101
1102 /* signal CPU creation */
61a46217 1103 cpu->created = true;
c7f0f3b1
AL
1104 qemu_cond_signal(&qemu_cpu_cond);
1105
c7f0f3b1 1106 while (1) {
c7f0f3b1
AL
1107 qemu_mutex_unlock_iothread();
1108 do {
1109 int sig;
1110 r = sigwait(&waitset, &sig);
1111 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
1112 if (r == -1) {
1113 perror("sigwait");
1114 exit(1);
1115 }
1116 qemu_mutex_lock_iothread();
509a0d78 1117 qemu_wait_io_event_common(cpu);
c7f0f3b1
AL
1118 }
1119
1120 return NULL;
1121#endif
1122}
1123
1be7fcb8
AB
1124static int64_t tcg_get_icount_limit(void)
1125{
1126 int64_t deadline;
1127
1128 if (replay_mode != REPLAY_MODE_PLAY) {
1129 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1130
1131 /* Maintain prior (possibly buggy) behaviour where if no deadline
1132 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
1133 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1134 * nanoseconds.
1135 */
1136 if ((deadline < 0) || (deadline > INT32_MAX)) {
1137 deadline = INT32_MAX;
1138 }
1139
1140 return qemu_icount_round(deadline);
1141 } else {
1142 return replay_get_instructions();
1143 }
1144}
1145
12e9700d
AB
1146static void handle_icount_deadline(void)
1147{
1148 if (use_icount) {
1149 int64_t deadline =
1150 qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1151
1152 if (deadline == 0) {
1153 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
1154 }
1155 }
1156}
1157
1be7fcb8
AB
1158static int tcg_cpu_exec(CPUState *cpu)
1159{
1160 int ret;
1161#ifdef CONFIG_PROFILER
1162 int64_t ti;
1163#endif
1164
1165#ifdef CONFIG_PROFILER
1166 ti = profile_getclock();
1167#endif
1168 if (use_icount) {
1169 int64_t count;
1170 int decr;
1171 timers_state.qemu_icount -= (cpu->icount_decr.u16.low
1172 + cpu->icount_extra);
1173 cpu->icount_decr.u16.low = 0;
1174 cpu->icount_extra = 0;
1175 count = tcg_get_icount_limit();
1176 timers_state.qemu_icount += count;
1177 decr = (count > 0xffff) ? 0xffff : count;
1178 count -= decr;
1179 cpu->icount_decr.u16.low = decr;
1180 cpu->icount_extra = count;
1181 }
8d04fb55 1182 qemu_mutex_unlock_iothread();
1be7fcb8
AB
1183 cpu_exec_start(cpu);
1184 ret = cpu_exec(cpu);
1185 cpu_exec_end(cpu);
8d04fb55 1186 qemu_mutex_lock_iothread();
1be7fcb8
AB
1187#ifdef CONFIG_PROFILER
1188 tcg_time += profile_getclock() - ti;
1189#endif
1190 if (use_icount) {
1191 /* Fold pending instructions back into the
1192 instruction counter, and clear the interrupt flag. */
1193 timers_state.qemu_icount -= (cpu->icount_decr.u16.low
1194 + cpu->icount_extra);
1195 cpu->icount_decr.u32 = 0;
1196 cpu->icount_extra = 0;
1197 replay_account_executed_instructions();
1198 }
1199 return ret;
1200}
1201
c93bbbef
AB
1202/* Destroy any remaining vCPUs which have been unplugged and have
1203 * finished running
1204 */
1205static void deal_with_unplugged_cpus(void)
1be7fcb8 1206{
c93bbbef 1207 CPUState *cpu;
1be7fcb8 1208
c93bbbef
AB
1209 CPU_FOREACH(cpu) {
1210 if (cpu->unplug && !cpu_can_run(cpu)) {
1211 qemu_tcg_destroy_vcpu(cpu);
1212 cpu->created = false;
1213 qemu_cond_signal(&qemu_cpu_cond);
1be7fcb8
AB
1214 break;
1215 }
1216 }
1be7fcb8 1217}
bdb7ca67 1218
6546706d
AB
1219/* Single-threaded TCG
1220 *
1221 * In the single-threaded case each vCPU is simulated in turn. If
1222 * there is more than a single vCPU we create a simple timer to kick
1223 * the vCPU and ensure we don't get stuck in a tight loop in one vCPU.
1224 * This is done explicitly rather than relying on side-effects
1225 * elsewhere.
1226 */
1227
37257942 1228static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
296af7c9 1229{
c3586ba7 1230 CPUState *cpu = arg;
296af7c9 1231
ab28bd23
PB
1232 rcu_register_thread();
1233
2e7f7a3c 1234 qemu_mutex_lock_iothread();
814e612e 1235 qemu_thread_get_self(cpu->thread);
296af7c9 1236
38fcbd3f
AF
1237 CPU_FOREACH(cpu) {
1238 cpu->thread_id = qemu_get_thread_id();
1239 cpu->created = true;
626cf8f4 1240 cpu->can_do_io = 1;
38fcbd3f 1241 }
296af7c9
BS
1242 qemu_cond_signal(&qemu_cpu_cond);
1243
fa7d1867 1244 /* wait for initial kick-off after machine start */
c28e399c 1245 while (first_cpu->stopped) {
d5f8d613 1246 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
8e564b4e
JK
1247
1248 /* process any pending work */
bdc44640 1249 CPU_FOREACH(cpu) {
37257942 1250 current_cpu = cpu;
182735ef 1251 qemu_wait_io_event_common(cpu);
8e564b4e 1252 }
0ab07c62 1253 }
296af7c9 1254
6546706d
AB
1255 start_tcg_kick_timer();
1256
c93bbbef
AB
1257 cpu = first_cpu;
1258
e5143e30
AB
1259 /* process any pending work */
1260 cpu->exit_request = 1;
1261
296af7c9 1262 while (1) {
c93bbbef
AB
1263 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1264 qemu_account_warp_timer();
1265
1266 if (!cpu) {
1267 cpu = first_cpu;
1268 }
1269
e5143e30
AB
1270 while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
1271
791158d9 1272 atomic_mb_set(&tcg_current_rr_cpu, cpu);
37257942 1273 current_cpu = cpu;
c93bbbef
AB
1274
1275 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
1276 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
1277
1278 if (cpu_can_run(cpu)) {
1279 int r;
1280 r = tcg_cpu_exec(cpu);
1281 if (r == EXCP_DEBUG) {
1282 cpu_handle_guest_debug(cpu);
1283 break;
08e73c48
PK
1284 } else if (r == EXCP_ATOMIC) {
1285 qemu_mutex_unlock_iothread();
1286 cpu_exec_step_atomic(cpu);
1287 qemu_mutex_lock_iothread();
1288 break;
c93bbbef 1289 }
37257942 1290 } else if (cpu->stop) {
c93bbbef
AB
1291 if (cpu->unplug) {
1292 cpu = CPU_NEXT(cpu);
1293 }
1294 break;
1295 }
1296
e5143e30
AB
1297 cpu = CPU_NEXT(cpu);
1298 } /* while (cpu && !cpu->exit_request).. */
1299
791158d9
AB
1300 /* Does not need atomic_mb_set because a spurious wakeup is okay. */
1301 atomic_set(&tcg_current_rr_cpu, NULL);
c93bbbef 1302
e5143e30
AB
1303 if (cpu && cpu->exit_request) {
1304 atomic_mb_set(&cpu->exit_request, 0);
1305 }
ac70aafc 1306
12e9700d 1307 handle_icount_deadline();
ac70aafc 1308
37257942 1309 qemu_tcg_wait_io_event(cpu ? cpu : QTAILQ_FIRST(&cpus));
c93bbbef 1310 deal_with_unplugged_cpus();
296af7c9
BS
1311 }
1312
1313 return NULL;
1314}
1315
b0cb0a66
VP
1316static void *qemu_hax_cpu_thread_fn(void *arg)
1317{
1318 CPUState *cpu = arg;
1319 int r;
1320 qemu_thread_get_self(cpu->thread);
1321 qemu_mutex_lock(&qemu_global_mutex);
1322
1323 cpu->thread_id = qemu_get_thread_id();
1324 cpu->created = true;
1325 cpu->halted = 0;
1326 current_cpu = cpu;
1327
1328 hax_init_vcpu(cpu);
1329 qemu_cond_signal(&qemu_cpu_cond);
1330
1331 while (1) {
1332 if (cpu_can_run(cpu)) {
1333 r = hax_smp_cpu_exec(cpu);
1334 if (r == EXCP_DEBUG) {
1335 cpu_handle_guest_debug(cpu);
1336 }
1337 }
1338
1339 while (cpu_thread_is_idle(cpu)) {
1340 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1341 }
1342#ifdef _WIN32
1343 SleepEx(0, TRUE);
1344#endif
1345 qemu_wait_io_event_common(cpu);
1346 }
1347 return NULL;
1348}
1349
1350#ifdef _WIN32
1351static void CALLBACK dummy_apc_func(ULONG_PTR unused)
1352{
1353}
1354#endif
1355
37257942
AB
1356/* Multi-threaded TCG
1357 *
1358 * In the multi-threaded case each vCPU has its own thread. The TLS
1359 * variable current_cpu can be used deep in the code to find the
1360 * current CPUState for a given thread.
1361 */
1362
1363static void *qemu_tcg_cpu_thread_fn(void *arg)
1364{
1365 CPUState *cpu = arg;
1366
1367 rcu_register_thread();
1368
1369 qemu_mutex_lock_iothread();
1370 qemu_thread_get_self(cpu->thread);
1371
1372 cpu->thread_id = qemu_get_thread_id();
1373 cpu->created = true;
1374 cpu->can_do_io = 1;
1375 current_cpu = cpu;
1376 qemu_cond_signal(&qemu_cpu_cond);
1377
1378 /* process any pending work */
1379 cpu->exit_request = 1;
1380
1381 while (1) {
1382 if (cpu_can_run(cpu)) {
1383 int r;
1384 r = tcg_cpu_exec(cpu);
1385 switch (r) {
1386 case EXCP_DEBUG:
1387 cpu_handle_guest_debug(cpu);
1388 break;
1389 case EXCP_HALTED:
1390 /* during start-up the vCPU is reset and the thread is
1391 * kicked several times. If we don't ensure we go back
1392 * to sleep in the halted state we won't cleanly
1393 * start-up when the vCPU is enabled.
1394 *
1395 * cpu->halted should ensure we sleep in wait_io_event
1396 */
1397 g_assert(cpu->halted);
1398 break;
08e73c48
PK
1399 case EXCP_ATOMIC:
1400 qemu_mutex_unlock_iothread();
1401 cpu_exec_step_atomic(cpu);
1402 qemu_mutex_lock_iothread();
37257942
AB
1403 default:
1404 /* Ignore everything else? */
1405 break;
1406 }
1407 }
1408
1409 handle_icount_deadline();
1410
1411 atomic_mb_set(&cpu->exit_request, 0);
1412 qemu_tcg_wait_io_event(cpu);
1413 }
1414
1415 return NULL;
1416}
1417
2ff09a40 1418static void qemu_cpu_kick_thread(CPUState *cpu)
cc015e9a
PB
1419{
1420#ifndef _WIN32
1421 int err;
1422
e0c38211
PB
1423 if (cpu->thread_kicked) {
1424 return;
9102deda 1425 }
e0c38211 1426 cpu->thread_kicked = true;
814e612e 1427 err = pthread_kill(cpu->thread->thread, SIG_IPI);
cc015e9a
PB
1428 if (err) {
1429 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
1430 exit(1);
1431 }
1432#else /* _WIN32 */
b0cb0a66
VP
1433 if (!qemu_cpu_is_self(cpu)) {
1434 if (!QueueUserAPC(dummy_apc_func, cpu->hThread, 0)) {
1435 fprintf(stderr, "%s: QueueUserAPC failed with error %lu\n",
1436 __func__, GetLastError());
1437 exit(1);
1438 }
1439 }
e0c38211
PB
1440#endif
1441}
ed9164a3 1442
c08d7424 1443void qemu_cpu_kick(CPUState *cpu)
296af7c9 1444{
f5c121b8 1445 qemu_cond_broadcast(cpu->halt_cond);
e0c38211 1446 if (tcg_enabled()) {
791158d9 1447 cpu_exit(cpu);
37257942 1448 /* NOP unless doing single-thread RR */
791158d9 1449 qemu_cpu_kick_rr_cpu();
e0c38211 1450 } else {
b0cb0a66
VP
1451 if (hax_enabled()) {
1452 /*
1453 * FIXME: race condition with the exit_request check in
1454 * hax_vcpu_hax_exec
1455 */
1456 cpu->exit_request = 1;
1457 }
e0c38211
PB
1458 qemu_cpu_kick_thread(cpu);
1459 }
296af7c9
BS
1460}
1461
46d62fac 1462void qemu_cpu_kick_self(void)
296af7c9 1463{
4917cf44 1464 assert(current_cpu);
9102deda 1465 qemu_cpu_kick_thread(current_cpu);
296af7c9
BS
1466}
1467
60e82579 1468bool qemu_cpu_is_self(CPUState *cpu)
296af7c9 1469{
814e612e 1470 return qemu_thread_is_self(cpu->thread);
296af7c9
BS
1471}
1472
79e2b9ae 1473bool qemu_in_vcpu_thread(void)
aa723c23 1474{
4917cf44 1475 return current_cpu && qemu_cpu_is_self(current_cpu);
aa723c23
JQ
1476}
1477
afbe7053
PB
1478static __thread bool iothread_locked = false;
1479
1480bool qemu_mutex_iothread_locked(void)
1481{
1482 return iothread_locked;
1483}
1484
296af7c9
BS
1485void qemu_mutex_lock_iothread(void)
1486{
8d04fb55
JK
1487 g_assert(!qemu_mutex_iothread_locked());
1488 qemu_mutex_lock(&qemu_global_mutex);
afbe7053 1489 iothread_locked = true;
296af7c9
BS
1490}
1491
1492void qemu_mutex_unlock_iothread(void)
1493{
8d04fb55 1494 g_assert(qemu_mutex_iothread_locked());
afbe7053 1495 iothread_locked = false;
296af7c9
BS
1496 qemu_mutex_unlock(&qemu_global_mutex);
1497}
1498
e8faee06 1499static bool all_vcpus_paused(void)
296af7c9 1500{
bdc44640 1501 CPUState *cpu;
296af7c9 1502
bdc44640 1503 CPU_FOREACH(cpu) {
182735ef 1504 if (!cpu->stopped) {
e8faee06 1505 return false;
0ab07c62 1506 }
296af7c9
BS
1507 }
1508
e8faee06 1509 return true;
296af7c9
BS
1510}
1511
1512void pause_all_vcpus(void)
1513{
bdc44640 1514 CPUState *cpu;
296af7c9 1515
40daca54 1516 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
bdc44640 1517 CPU_FOREACH(cpu) {
182735ef
AF
1518 cpu->stop = true;
1519 qemu_cpu_kick(cpu);
296af7c9
BS
1520 }
1521
aa723c23 1522 if (qemu_in_vcpu_thread()) {
d798e974 1523 cpu_stop_current();
d798e974
JK
1524 }
1525
296af7c9 1526 while (!all_vcpus_paused()) {
be7d6c57 1527 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
bdc44640 1528 CPU_FOREACH(cpu) {
182735ef 1529 qemu_cpu_kick(cpu);
296af7c9
BS
1530 }
1531 }
1532}
1533
2993683b
IM
1534void cpu_resume(CPUState *cpu)
1535{
1536 cpu->stop = false;
1537 cpu->stopped = false;
1538 qemu_cpu_kick(cpu);
1539}
1540
296af7c9
BS
1541void resume_all_vcpus(void)
1542{
bdc44640 1543 CPUState *cpu;
296af7c9 1544
40daca54 1545 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
bdc44640 1546 CPU_FOREACH(cpu) {
182735ef 1547 cpu_resume(cpu);
296af7c9
BS
1548 }
1549}
1550
4c055ab5
GZ
1551void cpu_remove(CPUState *cpu)
1552{
1553 cpu->stop = true;
1554 cpu->unplug = true;
1555 qemu_cpu_kick(cpu);
1556}
1557
2c579042
BR
1558void cpu_remove_sync(CPUState *cpu)
1559{
1560 cpu_remove(cpu);
1561 while (cpu->created) {
1562 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1563 }
1564}
1565
4900116e
DDAG
1566/* For temporary buffers for forming a name */
1567#define VCPU_THREAD_NAME_SIZE 16
1568
e5ab30a2 1569static void qemu_tcg_init_vcpu(CPUState *cpu)
296af7c9 1570{
4900116e 1571 char thread_name[VCPU_THREAD_NAME_SIZE];
37257942
AB
1572 static QemuCond *single_tcg_halt_cond;
1573 static QemuThread *single_tcg_cpu_thread;
4900116e 1574
37257942 1575 if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
814e612e 1576 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1577 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1578 qemu_cond_init(cpu->halt_cond);
37257942
AB
1579
1580 if (qemu_tcg_mttcg_enabled()) {
1581 /* create a thread per vCPU with TCG (MTTCG) */
1582 parallel_cpus = true;
1583 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
4900116e 1584 cpu->cpu_index);
37257942
AB
1585
1586 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1587 cpu, QEMU_THREAD_JOINABLE);
1588
1589 } else {
1590 /* share a single thread for all cpus with TCG */
1591 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
1592 qemu_thread_create(cpu->thread, thread_name,
1593 qemu_tcg_rr_cpu_thread_fn,
1594 cpu, QEMU_THREAD_JOINABLE);
1595
1596 single_tcg_halt_cond = cpu->halt_cond;
1597 single_tcg_cpu_thread = cpu->thread;
1598 }
1ecf47bf 1599#ifdef _WIN32
814e612e 1600 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1ecf47bf 1601#endif
61a46217 1602 while (!cpu->created) {
18a85728 1603 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1604 }
296af7c9 1605 } else {
37257942
AB
1606 /* For non-MTTCG cases we share the thread */
1607 cpu->thread = single_tcg_cpu_thread;
1608 cpu->halt_cond = single_tcg_halt_cond;
296af7c9
BS
1609 }
1610}
1611
b0cb0a66
VP
1612static void qemu_hax_start_vcpu(CPUState *cpu)
1613{
1614 char thread_name[VCPU_THREAD_NAME_SIZE];
1615
1616 cpu->thread = g_malloc0(sizeof(QemuThread));
1617 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1618 qemu_cond_init(cpu->halt_cond);
1619
1620 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX",
1621 cpu->cpu_index);
1622 qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn,
1623 cpu, QEMU_THREAD_JOINABLE);
1624#ifdef _WIN32
1625 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1626#endif
1627 while (!cpu->created) {
1628 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1629 }
1630}
1631
48a106bd 1632static void qemu_kvm_start_vcpu(CPUState *cpu)
296af7c9 1633{
4900116e
DDAG
1634 char thread_name[VCPU_THREAD_NAME_SIZE];
1635
814e612e 1636 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1637 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1638 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1639 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
1640 cpu->cpu_index);
1641 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
1642 cpu, QEMU_THREAD_JOINABLE);
61a46217 1643 while (!cpu->created) {
18a85728 1644 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
0ab07c62 1645 }
296af7c9
BS
1646}
1647
10a9021d 1648static void qemu_dummy_start_vcpu(CPUState *cpu)
c7f0f3b1 1649{
4900116e
DDAG
1650 char thread_name[VCPU_THREAD_NAME_SIZE];
1651
814e612e 1652 cpu->thread = g_malloc0(sizeof(QemuThread));
f5c121b8
AF
1653 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1654 qemu_cond_init(cpu->halt_cond);
4900116e
DDAG
1655 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
1656 cpu->cpu_index);
1657 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
c7f0f3b1 1658 QEMU_THREAD_JOINABLE);
61a46217 1659 while (!cpu->created) {
c7f0f3b1
AL
1660 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1661 }
1662}
1663
c643bed9 1664void qemu_init_vcpu(CPUState *cpu)
296af7c9 1665{
ce3960eb
AF
1666 cpu->nr_cores = smp_cores;
1667 cpu->nr_threads = smp_threads;
f324e766 1668 cpu->stopped = true;
56943e8c
PM
1669
1670 if (!cpu->as) {
1671 /* If the target cpu hasn't set up any address spaces itself,
1672 * give it the default one.
1673 */
6731d864
PC
1674 AddressSpace *as = address_space_init_shareable(cpu->memory,
1675 "cpu-memory");
12ebc9a7 1676 cpu->num_ases = 1;
6731d864 1677 cpu_address_space_init(cpu, as, 0);
56943e8c
PM
1678 }
1679
0ab07c62 1680 if (kvm_enabled()) {
48a106bd 1681 qemu_kvm_start_vcpu(cpu);
b0cb0a66
VP
1682 } else if (hax_enabled()) {
1683 qemu_hax_start_vcpu(cpu);
c7f0f3b1 1684 } else if (tcg_enabled()) {
e5ab30a2 1685 qemu_tcg_init_vcpu(cpu);
c7f0f3b1 1686 } else {
10a9021d 1687 qemu_dummy_start_vcpu(cpu);
0ab07c62 1688 }
296af7c9
BS
1689}
1690
b4a3d965 1691void cpu_stop_current(void)
296af7c9 1692{
4917cf44
AF
1693 if (current_cpu) {
1694 current_cpu->stop = false;
1695 current_cpu->stopped = true;
1696 cpu_exit(current_cpu);
96bce683 1697 qemu_cond_broadcast(&qemu_pause_cond);
b4a3d965 1698 }
296af7c9
BS
1699}
1700
56983463 1701int vm_stop(RunState state)
296af7c9 1702{
aa723c23 1703 if (qemu_in_vcpu_thread()) {
74892d24 1704 qemu_system_vmstop_request_prepare();
1dfb4dd9 1705 qemu_system_vmstop_request(state);
296af7c9
BS
1706 /*
1707 * FIXME: should not return to device code in case
1708 * vm_stop() has been requested.
1709 */
b4a3d965 1710 cpu_stop_current();
56983463 1711 return 0;
296af7c9 1712 }
56983463
KW
1713
1714 return do_vm_stop(state);
296af7c9
BS
1715}
1716
2d76e823
CI
1717/**
1718 * Prepare for (re)starting the VM.
1719 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
1720 * running or in case of an error condition), 0 otherwise.
1721 */
1722int vm_prepare_start(void)
1723{
1724 RunState requested;
1725 int res = 0;
1726
1727 qemu_vmstop_requested(&requested);
1728 if (runstate_is_running() && requested == RUN_STATE__MAX) {
1729 return -1;
1730 }
1731
1732 /* Ensure that a STOP/RESUME pair of events is emitted if a
1733 * vmstop request was pending. The BLOCK_IO_ERROR event, for
1734 * example, according to documentation is always followed by
1735 * the STOP event.
1736 */
1737 if (runstate_is_running()) {
1738 qapi_event_send_stop(&error_abort);
1739 res = -1;
1740 } else {
1741 replay_enable_events();
1742 cpu_enable_ticks();
1743 runstate_set(RUN_STATE_RUNNING);
1744 vm_state_notify(1, RUN_STATE_RUNNING);
1745 }
1746
1747 /* We are sending this now, but the CPUs will be resumed shortly later */
1748 qapi_event_send_resume(&error_abort);
1749 return res;
1750}
1751
1752void vm_start(void)
1753{
1754 if (!vm_prepare_start()) {
1755 resume_all_vcpus();
1756 }
1757}
1758
8a9236f1
LC
1759/* does a state transition even if the VM is already stopped,
1760 current state is forgotten forever */
56983463 1761int vm_stop_force_state(RunState state)
8a9236f1
LC
1762{
1763 if (runstate_is_running()) {
56983463 1764 return vm_stop(state);
8a9236f1
LC
1765 } else {
1766 runstate_set(state);
b2780d32
WC
1767
1768 bdrv_drain_all();
594a45ce
KW
1769 /* Make sure to return an error if the flush in a previous vm_stop()
1770 * failed. */
22af08ea 1771 return bdrv_flush_all();
8a9236f1
LC
1772 }
1773}
1774
9a78eead 1775void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
262353cb
BS
1776{
1777 /* XXX: implement xxx_cpu_list for targets that still miss it */
e916cbf8
PM
1778#if defined(cpu_list)
1779 cpu_list(f, cpu_fprintf);
262353cb
BS
1780#endif
1781}
de0b36b6
LC
1782
1783CpuInfoList *qmp_query_cpus(Error **errp)
1784{
1785 CpuInfoList *head = NULL, *cur_item = NULL;
182735ef 1786 CPUState *cpu;
de0b36b6 1787
bdc44640 1788 CPU_FOREACH(cpu) {
de0b36b6 1789 CpuInfoList *info;
182735ef
AF
1790#if defined(TARGET_I386)
1791 X86CPU *x86_cpu = X86_CPU(cpu);
1792 CPUX86State *env = &x86_cpu->env;
1793#elif defined(TARGET_PPC)
1794 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
1795 CPUPPCState *env = &ppc_cpu->env;
1796#elif defined(TARGET_SPARC)
1797 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
1798 CPUSPARCState *env = &sparc_cpu->env;
1799#elif defined(TARGET_MIPS)
1800 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
1801 CPUMIPSState *env = &mips_cpu->env;
48e06fe0
BK
1802#elif defined(TARGET_TRICORE)
1803 TriCoreCPU *tricore_cpu = TRICORE_CPU(cpu);
1804 CPUTriCoreState *env = &tricore_cpu->env;
182735ef 1805#endif
de0b36b6 1806
cb446eca 1807 cpu_synchronize_state(cpu);
de0b36b6
LC
1808
1809 info = g_malloc0(sizeof(*info));
1810 info->value = g_malloc0(sizeof(*info->value));
55e5c285 1811 info->value->CPU = cpu->cpu_index;
182735ef 1812 info->value->current = (cpu == first_cpu);
259186a7 1813 info->value->halted = cpu->halted;
58f88d4b 1814 info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
9f09e18a 1815 info->value->thread_id = cpu->thread_id;
de0b36b6 1816#if defined(TARGET_I386)
86f4b687 1817 info->value->arch = CPU_INFO_ARCH_X86;
544a3731 1818 info->value->u.x86.pc = env->eip + env->segs[R_CS].base;
de0b36b6 1819#elif defined(TARGET_PPC)
86f4b687 1820 info->value->arch = CPU_INFO_ARCH_PPC;
544a3731 1821 info->value->u.ppc.nip = env->nip;
de0b36b6 1822#elif defined(TARGET_SPARC)
86f4b687 1823 info->value->arch = CPU_INFO_ARCH_SPARC;
544a3731
EB
1824 info->value->u.q_sparc.pc = env->pc;
1825 info->value->u.q_sparc.npc = env->npc;
de0b36b6 1826#elif defined(TARGET_MIPS)
86f4b687 1827 info->value->arch = CPU_INFO_ARCH_MIPS;
544a3731 1828 info->value->u.q_mips.PC = env->active_tc.PC;
48e06fe0 1829#elif defined(TARGET_TRICORE)
86f4b687 1830 info->value->arch = CPU_INFO_ARCH_TRICORE;
544a3731 1831 info->value->u.tricore.PC = env->PC;
86f4b687
EB
1832#else
1833 info->value->arch = CPU_INFO_ARCH_OTHER;
de0b36b6
LC
1834#endif
1835
1836 /* XXX: waiting for the qapi to support GSList */
1837 if (!cur_item) {
1838 head = cur_item = info;
1839 } else {
1840 cur_item->next = info;
1841 cur_item = info;
1842 }
1843 }
1844
1845 return head;
1846}
0cfd6a9a
LC
1847
1848void qmp_memsave(int64_t addr, int64_t size, const char *filename,
1849 bool has_cpu, int64_t cpu_index, Error **errp)
1850{
1851 FILE *f;
1852 uint32_t l;
55e5c285 1853 CPUState *cpu;
0cfd6a9a 1854 uint8_t buf[1024];
0dc9daf0 1855 int64_t orig_addr = addr, orig_size = size;
0cfd6a9a
LC
1856
1857 if (!has_cpu) {
1858 cpu_index = 0;
1859 }
1860
151d1322
AF
1861 cpu = qemu_get_cpu(cpu_index);
1862 if (cpu == NULL) {
c6bd8c70
MA
1863 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
1864 "a CPU number");
0cfd6a9a
LC
1865 return;
1866 }
1867
1868 f = fopen(filename, "wb");
1869 if (!f) {
618da851 1870 error_setg_file_open(errp, errno, filename);
0cfd6a9a
LC
1871 return;
1872 }
1873
1874 while (size != 0) {
1875 l = sizeof(buf);
1876 if (l > size)
1877 l = size;
2f4d0f59 1878 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
0dc9daf0
BP
1879 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
1880 " specified", orig_addr, orig_size);
2f4d0f59
AK
1881 goto exit;
1882 }
0cfd6a9a 1883 if (fwrite(buf, 1, l, f) != l) {
c6bd8c70 1884 error_setg(errp, QERR_IO_ERROR);
0cfd6a9a
LC
1885 goto exit;
1886 }
1887 addr += l;
1888 size -= l;
1889 }
1890
1891exit:
1892 fclose(f);
1893}
6d3962bf
LC
1894
1895void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
1896 Error **errp)
1897{
1898 FILE *f;
1899 uint32_t l;
1900 uint8_t buf[1024];
1901
1902 f = fopen(filename, "wb");
1903 if (!f) {
618da851 1904 error_setg_file_open(errp, errno, filename);
6d3962bf
LC
1905 return;
1906 }
1907
1908 while (size != 0) {
1909 l = sizeof(buf);
1910 if (l > size)
1911 l = size;
eb6282f2 1912 cpu_physical_memory_read(addr, buf, l);
6d3962bf 1913 if (fwrite(buf, 1, l, f) != l) {
c6bd8c70 1914 error_setg(errp, QERR_IO_ERROR);
6d3962bf
LC
1915 goto exit;
1916 }
1917 addr += l;
1918 size -= l;
1919 }
1920
1921exit:
1922 fclose(f);
1923}
ab49ab5c
LC
1924
1925void qmp_inject_nmi(Error **errp)
1926{
9cb805fd 1927 nmi_monitor_handle(monitor_get_cpu_index(), errp);
ab49ab5c 1928}
27498bef
ST
1929
1930void dump_drift_info(FILE *f, fprintf_function cpu_fprintf)
1931{
1932 if (!use_icount) {
1933 return;
1934 }
1935
1936 cpu_fprintf(f, "Host - Guest clock %"PRIi64" ms\n",
1937 (cpu_get_clock() - cpu_get_icount())/SCALE_MS);
1938 if (icount_align_option) {
1939 cpu_fprintf(f, "Max guest delay %"PRIi64" ms\n", -max_delay/SCALE_MS);
1940 cpu_fprintf(f, "Max guest advance %"PRIi64" ms\n", max_advance/SCALE_MS);
1941 } else {
1942 cpu_fprintf(f, "Max guest delay NA\n");
1943 cpu_fprintf(f, "Max guest advance NA\n");
1944 }
1945}