blob: b5844b7103412326578155c53a2ff46816ee3989 [file] [log] [blame]
Blue Swirl296af7c2010-03-29 19:23:50 +00001/*
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
Peter Maydell7b31bbc2016-01-26 18:16:56 +000025#include "qemu/osdep.h"
KONRAD Frederic8d4e9142017-02-23 18:29:08 +000026#include "qemu/config-file.h"
Paolo Bonzini33c11872016-03-15 16:58:45 +010027#include "cpu.h"
Paolo Bonzini83c90892012-12-17 18:19:49 +010028#include "monitor/monitor.h"
Markus Armbrustere688df62018-02-01 12:18:31 +010029#include "qapi/error.h"
Markus Armbruster112ed242018-02-26 17:13:27 -060030#include "qapi/qapi-commands-misc.h"
Markus Armbruster9af23982018-02-11 10:36:01 +010031#include "qapi/qapi-events-run-state.h"
Wenchao Xiaa4e15de2014-06-18 08:43:36 +020032#include "qapi/qmp/qerror.h"
Markus Armbrusterd49b6832015-03-17 18:29:20 +010033#include "qemu/error-report.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010034#include "sysemu/sysemu.h"
Max Reitzda31d592016-03-16 19:54:32 +010035#include "sysemu/block-backend.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010036#include "exec/gdbstub.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010037#include "sysemu/dma.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010038#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010039#include "sysemu/kvm.h"
Vincent Palatinb0cb0a62017-01-10 11:59:57 +010040#include "sysemu/hax.h"
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -050041#include "sysemu/hvf.h"
Justin Terry (VM)19306802018-01-22 13:07:49 -080042#include "sysemu/whpx.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010043#include "exec/exec-all.h"
Blue Swirl296af7c2010-03-29 19:23:50 +000044
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010045#include "qemu/thread.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010046#include "sysemu/cpus.h"
47#include "sysemu/qtest.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010048#include "qemu/main-loop.h"
Markus Armbruster922a01a2018-02-01 12:18:46 +010049#include "qemu/option.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010050#include "qemu/bitmap.h"
Liu Ping Fancb365642013-09-25 14:20:58 +080051#include "qemu/seqlock.h"
KONRAD Frederic8d4e9142017-02-23 18:29:08 +000052#include "tcg.h"
Alexey Kardashevskiy9cb805f2014-08-20 22:16:33 +100053#include "hw/nmi.h"
Pavel Dovgalyuk8b427042015-09-17 19:24:05 +030054#include "sysemu/replay.h"
Igor Mammedovafed5a52017-05-10 13:29:55 +020055#include "hw/boards.h"
Jan Kiszka0ff0fc12011-06-23 10:15:55 +020056
Jan Kiszka6d9cb732011-02-01 22:15:58 +010057#ifdef CONFIG_LINUX
58
59#include <sys/prctl.h>
60
Marcelo Tosattic0532a72010-10-11 15:31:21 -030061#ifndef PR_MCE_KILL
62#define PR_MCE_KILL 33
63#endif
64
Jan Kiszka6d9cb732011-02-01 22:15:58 +010065#ifndef PR_MCE_KILL_SET
66#define PR_MCE_KILL_SET 1
67#endif
68
69#ifndef PR_MCE_KILL_EARLY
70#define PR_MCE_KILL_EARLY 1
71#endif
72
73#endif /* CONFIG_LINUX */
74
Sebastian Tanase27498be2014-07-25 11:56:33 +020075int64_t max_delay;
76int64_t max_advance;
Blue Swirl296af7c2010-03-29 19:23:50 +000077
Jason J. Herne2adcc852015-09-08 13:12:33 -040078/* vcpu throttling controls */
79static QEMUTimer *throttle_timer;
80static unsigned int throttle_percentage;
81
82#define CPU_THROTTLE_PCT_MIN 1
83#define CPU_THROTTLE_PCT_MAX 99
84#define CPU_THROTTLE_TIMESLICE_NS 10000000
85
Tiejun Chen321bc0b2013-08-02 09:43:09 +080086bool cpu_is_stopped(CPUState *cpu)
87{
88 return cpu->stopped || !runstate_is_running();
89}
90
Andreas Färbera98ae1d2013-05-26 23:21:08 +020091static bool cpu_thread_is_idle(CPUState *cpu)
Peter Maydellac873f12012-07-19 16:52:27 +010092{
Andreas Färberc64ca812012-05-03 02:11:45 +020093 if (cpu->stop || cpu->queued_work_first) {
Peter Maydellac873f12012-07-19 16:52:27 +010094 return false;
95 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +080096 if (cpu_is_stopped(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +010097 return true;
98 }
Andreas Färber8c2e1b02013-08-25 18:53:55 +020099 if (!cpu->halted || cpu_has_work(cpu) ||
Alexander Graf215e79c2013-04-24 22:24:12 +0200100 kvm_halt_in_kernel()) {
Peter Maydellac873f12012-07-19 16:52:27 +0100101 return false;
102 }
103 return true;
104}
105
106static bool all_cpu_threads_idle(void)
107{
Andreas Färber182735e2013-05-29 22:29:20 +0200108 CPUState *cpu;
Peter Maydellac873f12012-07-19 16:52:27 +0100109
Andreas Färberbdc44642013-06-24 23:50:24 +0200110 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200111 if (!cpu_thread_is_idle(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +0100112 return false;
113 }
114 }
115 return true;
116}
117
Blue Swirl296af7c2010-03-29 19:23:50 +0000118/***********************************************************/
Paolo Bonzini946fb272011-09-12 13:57:37 +0200119/* guest cycle counter */
120
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200121/* Protected by TimersState seqlock */
122
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200123static bool icount_sleep = true;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200124/* Conversion factor from emulated instructions to virtual clock ticks. */
125static int icount_time_shift;
126/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
127#define MAX_ICOUNT_SHIFT 10
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200128
Paolo Bonzini946fb272011-09-12 13:57:37 +0200129typedef struct TimersState {
Liu Ping Fancb365642013-09-25 14:20:58 +0800130 /* Protected by BQL. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200131 int64_t cpu_ticks_prev;
132 int64_t cpu_ticks_offset;
Liu Ping Fancb365642013-09-25 14:20:58 +0800133
134 /* cpu_clock_offset can be read out of BQL, so protect it with
135 * this lock.
136 */
137 QemuSeqLock vm_clock_seqlock;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200138 int64_t cpu_clock_offset;
139 int32_t cpu_ticks_enabled;
140 int64_t dummy;
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200141
142 /* Compensate for varying guest execution speed. */
143 int64_t qemu_icount_bias;
144 /* Only written by TCG thread */
145 int64_t qemu_icount;
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300146 /* for adjusting icount */
147 int64_t vm_clock_warp_start;
148 QEMUTimer *icount_rt_timer;
149 QEMUTimer *icount_vm_timer;
150 QEMUTimer *icount_warp_timer;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200151} TimersState;
152
Liu Ping Fand9cd4002013-07-21 08:43:00 +0000153static TimersState timers_state;
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000154bool mttcg_enabled;
155
156/*
157 * We default to false if we know other options have been enabled
158 * which are currently incompatible with MTTCG. Otherwise when each
159 * guest (target) has been updated to support:
160 * - atomic instructions
161 * - memory ordering primitives (barriers)
162 * they can set the appropriate CONFIG flags in ${target}-softmmu.mak
163 *
164 * Once a guest architecture has been converted to the new primitives
165 * there are two remaining limitations to check.
166 *
167 * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
168 * - The host must have a stronger memory order than the guest
169 *
170 * It may be possible in future to support strong guests on weak hosts
171 * but that will require tagging all load/stores in a guest with their
172 * implicit memory order requirements which would likely slow things
173 * down a lot.
174 */
175
176static bool check_tcg_memory_orders_compatible(void)
177{
178#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
179 return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
180#else
181 return false;
182#endif
183}
184
185static bool default_mttcg_enabled(void)
186{
Alex Bennée83fd9622017-02-27 17:09:01 +0000187 if (use_icount || TCG_OVERSIZED_GUEST) {
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000188 return false;
189 } else {
190#ifdef TARGET_SUPPORTS_MTTCG
191 return check_tcg_memory_orders_compatible();
192#else
193 return false;
194#endif
195 }
196}
197
198void qemu_tcg_configure(QemuOpts *opts, Error **errp)
199{
200 const char *t = qemu_opt_get(opts, "thread");
201 if (t) {
202 if (strcmp(t, "multi") == 0) {
203 if (TCG_OVERSIZED_GUEST) {
204 error_setg(errp, "No MTTCG when guest word size > hosts");
Alex Bennée83fd9622017-02-27 17:09:01 +0000205 } else if (use_icount) {
206 error_setg(errp, "No MTTCG when icount is enabled");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000207 } else {
Nikunj A Dadhania86953502017-04-10 11:36:55 +0530208#ifndef TARGET_SUPPORTS_MTTCG
Alex Bennéec34c7622017-02-28 14:40:17 +0000209 error_report("Guest not yet converted to MTTCG - "
210 "you may get unexpected results");
211#endif
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000212 if (!check_tcg_memory_orders_compatible()) {
213 error_report("Guest expects a stronger memory ordering "
214 "than the host provides");
Pranith Kumar8cfef892017-03-25 16:19:23 -0400215 error_printf("This may cause strange/hard to debug errors\n");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000216 }
217 mttcg_enabled = true;
218 }
219 } else if (strcmp(t, "single") == 0) {
220 mttcg_enabled = false;
221 } else {
222 error_setg(errp, "Invalid 'thread' setting %s", t);
223 }
224 } else {
225 mttcg_enabled = default_mttcg_enabled();
226 }
227}
Paolo Bonzini946fb272011-09-12 13:57:37 +0200228
Alex Bennéee4cd9652017-03-31 16:09:42 +0100229/* The current number of executed instructions is based on what we
230 * originally budgeted minus the current state of the decrementing
231 * icount counters in extra/u16.low.
232 */
233static int64_t cpu_get_icount_executed(CPUState *cpu)
234{
235 return cpu->icount_budget - (cpu->icount_decr.u16.low + cpu->icount_extra);
236}
237
Alex Bennée512d3c82017-04-05 12:32:37 +0100238/*
239 * Update the global shared timer_state.qemu_icount to take into
240 * account executed instructions. This is done by the TCG vCPU
241 * thread so the main-loop can see time has moved forward.
242 */
243void cpu_update_icount(CPUState *cpu)
244{
245 int64_t executed = cpu_get_icount_executed(cpu);
246 cpu->icount_budget -= executed;
247
248#ifdef CONFIG_ATOMIC64
249 atomic_set__nocheck(&timers_state.qemu_icount,
250 atomic_read__nocheck(&timers_state.qemu_icount) +
251 executed);
252#else /* FIXME: we need 64bit atomics to do this safely */
253 timers_state.qemu_icount += executed;
254#endif
255}
256
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300257int64_t cpu_get_icount_raw(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200258{
Andreas Färber4917cf42013-05-27 05:17:50 +0200259 CPUState *cpu = current_cpu;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200260
Alex Bennée243c5f72017-03-30 18:49:22 +0100261 if (cpu && cpu->running) {
Paolo Bonzini414b15c2015-06-24 14:16:26 +0200262 if (!cpu->can_do_io) {
Alistair Francis493d89b2018-02-03 09:43:14 +0100263 error_report("Bad icount read");
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300264 exit(1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200265 }
Alex Bennéee4cd9652017-03-31 16:09:42 +0100266 /* Take into account what has run */
Alex Bennée1d059062017-04-05 10:53:47 +0100267 cpu_update_icount(cpu);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200268 }
Alex Bennée1d059062017-04-05 10:53:47 +0100269#ifdef CONFIG_ATOMIC64
270 return atomic_read__nocheck(&timers_state.qemu_icount);
271#else /* FIXME: we need 64bit atomics to do this safely */
272 return timers_state.qemu_icount;
273#endif
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300274}
275
276/* Return the virtual CPU time, based on the instruction counter. */
277static int64_t cpu_get_icount_locked(void)
278{
279 int64_t icount = cpu_get_icount_raw();
KONRAD Frederic3f031312014-08-01 01:37:15 +0200280 return timers_state.qemu_icount_bias + cpu_icount_to_ns(icount);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200281}
282
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200283int64_t cpu_get_icount(void)
284{
285 int64_t icount;
286 unsigned start;
287
288 do {
289 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
290 icount = cpu_get_icount_locked();
291 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
292
293 return icount;
294}
295
KONRAD Frederic3f031312014-08-01 01:37:15 +0200296int64_t cpu_icount_to_ns(int64_t icount)
297{
298 return icount << icount_time_shift;
299}
300
Cao jind90f3cc2016-07-29 19:05:38 +0800301/* return the time elapsed in VM between vm_start and vm_stop. Unless
302 * icount is active, cpu_get_ticks() uses units of the host CPU cycle
303 * counter.
304 *
305 * Caller must hold the BQL
306 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200307int64_t cpu_get_ticks(void)
308{
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100309 int64_t ticks;
310
Paolo Bonzini946fb272011-09-12 13:57:37 +0200311 if (use_icount) {
312 return cpu_get_icount();
313 }
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100314
315 ticks = timers_state.cpu_ticks_offset;
316 if (timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400317 ticks += cpu_get_host_ticks();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200318 }
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100319
320 if (timers_state.cpu_ticks_prev > ticks) {
321 /* Note: non increasing ticks may happen if the host uses
322 software suspend */
323 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
324 ticks = timers_state.cpu_ticks_prev;
325 }
326
327 timers_state.cpu_ticks_prev = ticks;
328 return ticks;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200329}
330
Liu Ping Fancb365642013-09-25 14:20:58 +0800331static int64_t cpu_get_clock_locked(void)
332{
Cao jin1d45cea2016-07-29 19:05:37 +0800333 int64_t time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800334
Cao jin1d45cea2016-07-29 19:05:37 +0800335 time = timers_state.cpu_clock_offset;
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100336 if (timers_state.cpu_ticks_enabled) {
Cao jin1d45cea2016-07-29 19:05:37 +0800337 time += get_clock();
Liu Ping Fancb365642013-09-25 14:20:58 +0800338 }
339
Cao jin1d45cea2016-07-29 19:05:37 +0800340 return time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800341}
342
Cao jind90f3cc2016-07-29 19:05:38 +0800343/* Return the monotonic time elapsed in VM, i.e.,
Peter Maydell8212ff82016-09-15 10:24:22 +0100344 * the time between vm_start and vm_stop
345 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200346int64_t cpu_get_clock(void)
347{
348 int64_t ti;
Liu Ping Fancb365642013-09-25 14:20:58 +0800349 unsigned start;
350
351 do {
352 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
353 ti = cpu_get_clock_locked();
354 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
355
356 return ti;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200357}
358
Liu Ping Fancb365642013-09-25 14:20:58 +0800359/* enable cpu_get_ticks()
Cao jin3224e872016-07-08 18:31:37 +0800360 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800361 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200362void cpu_enable_ticks(void)
363{
Liu Ping Fancb365642013-09-25 14:20:58 +0800364 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
Emilio G. Cota03719e42016-06-08 14:55:21 -0400365 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200366 if (!timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400367 timers_state.cpu_ticks_offset -= cpu_get_host_ticks();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200368 timers_state.cpu_clock_offset -= get_clock();
369 timers_state.cpu_ticks_enabled = 1;
370 }
Emilio G. Cota03719e42016-06-08 14:55:21 -0400371 seqlock_write_end(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200372}
373
374/* disable cpu_get_ticks() : the clock is stopped. You must not call
Liu Ping Fancb365642013-09-25 14:20:58 +0800375 * cpu_get_ticks() after that.
Cao jin3224e872016-07-08 18:31:37 +0800376 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800377 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200378void cpu_disable_ticks(void)
379{
Liu Ping Fancb365642013-09-25 14:20:58 +0800380 /* Here, the really thing protected by seqlock is cpu_clock_offset. */
Emilio G. Cota03719e42016-06-08 14:55:21 -0400381 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200382 if (timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400383 timers_state.cpu_ticks_offset += cpu_get_host_ticks();
Liu Ping Fancb365642013-09-25 14:20:58 +0800384 timers_state.cpu_clock_offset = cpu_get_clock_locked();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200385 timers_state.cpu_ticks_enabled = 0;
386 }
Emilio G. Cota03719e42016-06-08 14:55:21 -0400387 seqlock_write_end(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200388}
389
390/* Correlation between real and virtual time is always going to be
391 fairly approximate, so ignore small variation.
392 When the guest is idle real and virtual time will be aligned in
393 the IO wait loop. */
Rutuja Shah73bcb242016-03-21 21:32:30 +0530394#define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200395
396static void icount_adjust(void)
397{
398 int64_t cur_time;
399 int64_t cur_icount;
400 int64_t delta;
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200401
402 /* Protected by TimersState mutex. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200403 static int64_t last_delta;
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200404
Paolo Bonzini946fb272011-09-12 13:57:37 +0200405 /* If the VM is not running, then do nothing. */
406 if (!runstate_is_running()) {
407 return;
408 }
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200409
Emilio G. Cota03719e42016-06-08 14:55:21 -0400410 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200411 cur_time = cpu_get_clock_locked();
412 cur_icount = cpu_get_icount_locked();
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200413
Paolo Bonzini946fb272011-09-12 13:57:37 +0200414 delta = cur_icount - cur_time;
415 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
416 if (delta > 0
417 && last_delta + ICOUNT_WOBBLE < delta * 2
418 && icount_time_shift > 0) {
419 /* The guest is getting too far ahead. Slow time down. */
420 icount_time_shift--;
421 }
422 if (delta < 0
423 && last_delta - ICOUNT_WOBBLE > delta * 2
424 && icount_time_shift < MAX_ICOUNT_SHIFT) {
425 /* The guest is getting too far behind. Speed time up. */
426 icount_time_shift++;
427 }
428 last_delta = delta;
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200429 timers_state.qemu_icount_bias = cur_icount
430 - (timers_state.qemu_icount << icount_time_shift);
Emilio G. Cota03719e42016-06-08 14:55:21 -0400431 seqlock_write_end(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200432}
433
434static void icount_adjust_rt(void *opaque)
435{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300436 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyuk1979b902015-01-12 15:00:43 +0300437 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200438 icount_adjust();
439}
440
441static void icount_adjust_vm(void *opaque)
442{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300443 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100444 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530445 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200446 icount_adjust();
447}
448
449static int64_t qemu_icount_round(int64_t count)
450{
451 return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
452}
453
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300454static void icount_warp_rt(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200455{
Alex Bennéeccffff42016-04-04 15:35:48 +0100456 unsigned seq;
457 int64_t warp_start;
458
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200459 /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
460 * changes from -1 to another value, so the race here is okay.
461 */
Alex Bennéeccffff42016-04-04 15:35:48 +0100462 do {
463 seq = seqlock_read_begin(&timers_state.vm_clock_seqlock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300464 warp_start = timers_state.vm_clock_warp_start;
Alex Bennéeccffff42016-04-04 15:35:48 +0100465 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq));
466
467 if (warp_start == -1) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200468 return;
469 }
470
Emilio G. Cota03719e42016-06-08 14:55:21 -0400471 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200472 if (runstate_is_running()) {
Pavel Dovgalyuk8eda2062015-09-17 19:24:28 +0300473 int64_t clock = REPLAY_CLOCK(REPLAY_CLOCK_VIRTUAL_RT,
474 cpu_get_clock_locked());
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200475 int64_t warp_delta;
476
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300477 warp_delta = clock - timers_state.vm_clock_warp_start;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200478 if (use_icount == 2) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200479 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100480 * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
Paolo Bonzini946fb272011-09-12 13:57:37 +0200481 * far ahead of real time.
482 */
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200483 int64_t cur_icount = cpu_get_icount_locked();
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300484 int64_t delta = clock - cur_icount;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200485 warp_delta = MIN(warp_delta, delta);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200486 }
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200487 timers_state.qemu_icount_bias += warp_delta;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200488 }
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300489 timers_state.vm_clock_warp_start = -1;
Emilio G. Cota03719e42016-06-08 14:55:21 -0400490 seqlock_write_end(&timers_state.vm_clock_seqlock);
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200491
492 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
493 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
494 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200495}
496
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300497static void icount_timer_cb(void *opaque)
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300498{
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300499 /* No need for a checkpoint because the timer already synchronizes
500 * with CHECKPOINT_CLOCK_VIRTUAL_RT.
501 */
502 icount_warp_rt();
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300503}
504
Paolo Bonzini8156be52012-03-28 15:42:04 +0200505void qtest_clock_warp(int64_t dest)
506{
Alex Bligh40daca52013-08-21 16:03:02 +0100507 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800508 AioContext *aio_context;
Paolo Bonzini8156be52012-03-28 15:42:04 +0200509 assert(qtest_enabled());
Fam Zhengefef88b2015-01-19 17:51:43 +0800510 aio_context = qemu_get_aio_context();
Paolo Bonzini8156be52012-03-28 15:42:04 +0200511 while (clock < dest) {
Alex Bligh40daca52013-08-21 16:03:02 +0100512 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
Sergey Fedorovc9299e22014-06-10 13:10:28 +0400513 int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
Fam Zhengefef88b2015-01-19 17:51:43 +0800514
Emilio G. Cota03719e42016-06-08 14:55:21 -0400515 seqlock_write_begin(&timers_state.vm_clock_seqlock);
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200516 timers_state.qemu_icount_bias += warp;
Emilio G. Cota03719e42016-06-08 14:55:21 -0400517 seqlock_write_end(&timers_state.vm_clock_seqlock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200518
Alex Bligh40daca52013-08-21 16:03:02 +0100519 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800520 timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
Alex Bligh40daca52013-08-21 16:03:02 +0100521 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200522 }
Alex Bligh40daca52013-08-21 16:03:02 +0100523 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200524}
525
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300526void qemu_start_warp_timer(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200527{
Paolo Bonzinice78d182013-10-07 17:30:02 +0200528 int64_t clock;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200529 int64_t deadline;
530
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300531 if (!use_icount) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200532 return;
533 }
534
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300535 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
536 * do not fire, so computing the deadline does not make sense.
537 */
538 if (!runstate_is_running()) {
539 return;
540 }
541
542 /* warp clock deterministically in record/replay mode */
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300543 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) {
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300544 return;
545 }
546
Paolo Bonzinice78d182013-10-07 17:30:02 +0200547 if (!all_cpu_threads_idle()) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200548 return;
549 }
550
Paolo Bonzini8156be52012-03-28 15:42:04 +0200551 if (qtest_enabled()) {
552 /* When testing, qtest commands advance icount. */
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300553 return;
Paolo Bonzini8156be52012-03-28 15:42:04 +0200554 }
555
Alex Blighac70aaf2013-08-21 16:02:57 +0100556 /* We want to use the earliest deadline from ALL vm_clocks */
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300557 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT);
Alex Bligh40daca52013-08-21 16:03:02 +0100558 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200559 if (deadline < 0) {
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200560 static bool notified;
561 if (!icount_sleep && !notified) {
Alistair Francis3dc6f862017-07-12 06:57:41 -0700562 warn_report("icount sleep disabled and no active timers");
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200563 notified = true;
564 }
Paolo Bonzinice78d182013-10-07 17:30:02 +0200565 return;
Alex Blighac70aaf2013-08-21 16:02:57 +0100566 }
567
Paolo Bonzini946fb272011-09-12 13:57:37 +0200568 if (deadline > 0) {
569 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100570 * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to
Paolo Bonzini946fb272011-09-12 13:57:37 +0200571 * sleep. Otherwise, the CPU might be waiting for a future timer
572 * interrupt to wake it up, but the interrupt never comes because
573 * the vCPU isn't running any insns and thus doesn't advance the
Alex Bligh40daca52013-08-21 16:03:02 +0100574 * QEMU_CLOCK_VIRTUAL.
Paolo Bonzini946fb272011-09-12 13:57:37 +0200575 */
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200576 if (!icount_sleep) {
577 /*
578 * We never let VCPUs sleep in no sleep icount mode.
579 * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance
580 * to the next QEMU_CLOCK_VIRTUAL event and notify it.
581 * It is useful when we want a deterministic execution time,
582 * isolated from host latencies.
583 */
Emilio G. Cota03719e42016-06-08 14:55:21 -0400584 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200585 timers_state.qemu_icount_bias += deadline;
Emilio G. Cota03719e42016-06-08 14:55:21 -0400586 seqlock_write_end(&timers_state.vm_clock_seqlock);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200587 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
588 } else {
589 /*
590 * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some
591 * "real" time, (related to the time left until the next event) has
592 * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this.
593 * This avoids that the warps are visible externally; for example,
594 * you will not be sending network packets continuously instead of
595 * every 100ms.
596 */
Emilio G. Cota03719e42016-06-08 14:55:21 -0400597 seqlock_write_begin(&timers_state.vm_clock_seqlock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300598 if (timers_state.vm_clock_warp_start == -1
599 || timers_state.vm_clock_warp_start > clock) {
600 timers_state.vm_clock_warp_start = clock;
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200601 }
Emilio G. Cota03719e42016-06-08 14:55:21 -0400602 seqlock_write_end(&timers_state.vm_clock_seqlock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300603 timer_mod_anticipate(timers_state.icount_warp_timer,
604 clock + deadline);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200605 }
Alex Blighac70aaf2013-08-21 16:02:57 +0100606 } else if (deadline == 0) {
Alex Bligh40daca52013-08-21 16:03:02 +0100607 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200608 }
609}
610
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300611static void qemu_account_warp_timer(void)
612{
613 if (!use_icount || !icount_sleep) {
614 return;
615 }
616
617 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
618 * do not fire, so computing the deadline does not make sense.
619 */
620 if (!runstate_is_running()) {
621 return;
622 }
623
624 /* warp clock deterministically in record/replay mode */
625 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) {
626 return;
627 }
628
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300629 timer_del(timers_state.icount_warp_timer);
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300630 icount_warp_rt();
631}
632
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200633static bool icount_state_needed(void *opaque)
634{
635 return use_icount;
636}
637
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300638static bool warp_timer_state_needed(void *opaque)
639{
640 TimersState *s = opaque;
641 return s->icount_warp_timer != NULL;
642}
643
644static bool adjust_timers_state_needed(void *opaque)
645{
646 TimersState *s = opaque;
647 return s->icount_rt_timer != NULL;
648}
649
650/*
651 * Subsection for warp timer migration is optional, because may not be created
652 */
653static const VMStateDescription icount_vmstate_warp_timer = {
654 .name = "timer/icount/warp_timer",
655 .version_id = 1,
656 .minimum_version_id = 1,
657 .needed = warp_timer_state_needed,
658 .fields = (VMStateField[]) {
659 VMSTATE_INT64(vm_clock_warp_start, TimersState),
660 VMSTATE_TIMER_PTR(icount_warp_timer, TimersState),
661 VMSTATE_END_OF_LIST()
662 }
663};
664
665static const VMStateDescription icount_vmstate_adjust_timers = {
666 .name = "timer/icount/timers",
667 .version_id = 1,
668 .minimum_version_id = 1,
669 .needed = adjust_timers_state_needed,
670 .fields = (VMStateField[]) {
671 VMSTATE_TIMER_PTR(icount_rt_timer, TimersState),
672 VMSTATE_TIMER_PTR(icount_vm_timer, TimersState),
673 VMSTATE_END_OF_LIST()
674 }
675};
676
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200677/*
678 * This is a subsection for icount migration.
679 */
680static const VMStateDescription icount_vmstate_timers = {
681 .name = "timer/icount",
682 .version_id = 1,
683 .minimum_version_id = 1,
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200684 .needed = icount_state_needed,
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200685 .fields = (VMStateField[]) {
686 VMSTATE_INT64(qemu_icount_bias, TimersState),
687 VMSTATE_INT64(qemu_icount, TimersState),
688 VMSTATE_END_OF_LIST()
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300689 },
690 .subsections = (const VMStateDescription*[]) {
691 &icount_vmstate_warp_timer,
692 &icount_vmstate_adjust_timers,
693 NULL
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200694 }
695};
696
Paolo Bonzini946fb272011-09-12 13:57:37 +0200697static const VMStateDescription vmstate_timers = {
698 .name = "timer",
699 .version_id = 2,
700 .minimum_version_id = 1,
Juan Quintela35d08452014-04-16 16:01:33 +0200701 .fields = (VMStateField[]) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200702 VMSTATE_INT64(cpu_ticks_offset, TimersState),
703 VMSTATE_INT64(dummy, TimersState),
704 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
705 VMSTATE_END_OF_LIST()
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200706 },
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200707 .subsections = (const VMStateDescription*[]) {
708 &icount_vmstate_timers,
709 NULL
Paolo Bonzini946fb272011-09-12 13:57:37 +0200710 }
711};
712
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100713static void cpu_throttle_thread(CPUState *cpu, run_on_cpu_data opaque)
Jason J. Herne2adcc852015-09-08 13:12:33 -0400714{
Jason J. Herne2adcc852015-09-08 13:12:33 -0400715 double pct;
716 double throttle_ratio;
717 long sleeptime_ns;
718
719 if (!cpu_throttle_get_percentage()) {
720 return;
721 }
722
723 pct = (double)cpu_throttle_get_percentage()/100;
724 throttle_ratio = pct / (1 - pct);
725 sleeptime_ns = (long)(throttle_ratio * CPU_THROTTLE_TIMESLICE_NS);
726
727 qemu_mutex_unlock_iothread();
Jason J. Herne2adcc852015-09-08 13:12:33 -0400728 g_usleep(sleeptime_ns / 1000); /* Convert ns to us for usleep call */
729 qemu_mutex_lock_iothread();
Felipe Franciosi90bb0c02017-05-19 22:29:50 +0100730 atomic_set(&cpu->throttle_thread_scheduled, 0);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400731}
732
733static void cpu_throttle_timer_tick(void *opaque)
734{
735 CPUState *cpu;
736 double pct;
737
738 /* Stop the timer if needed */
739 if (!cpu_throttle_get_percentage()) {
740 return;
741 }
742 CPU_FOREACH(cpu) {
743 if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) {
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100744 async_run_on_cpu(cpu, cpu_throttle_thread,
745 RUN_ON_CPU_NULL);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400746 }
747 }
748
749 pct = (double)cpu_throttle_get_percentage()/100;
750 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
751 CPU_THROTTLE_TIMESLICE_NS / (1-pct));
752}
753
754void cpu_throttle_set(int new_throttle_pct)
755{
756 /* Ensure throttle percentage is within valid range */
757 new_throttle_pct = MIN(new_throttle_pct, CPU_THROTTLE_PCT_MAX);
758 new_throttle_pct = MAX(new_throttle_pct, CPU_THROTTLE_PCT_MIN);
759
760 atomic_set(&throttle_percentage, new_throttle_pct);
761
762 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
763 CPU_THROTTLE_TIMESLICE_NS);
764}
765
766void cpu_throttle_stop(void)
767{
768 atomic_set(&throttle_percentage, 0);
769}
770
771bool cpu_throttle_active(void)
772{
773 return (cpu_throttle_get_percentage() != 0);
774}
775
776int cpu_throttle_get_percentage(void)
777{
778 return atomic_read(&throttle_percentage);
779}
780
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400781void cpu_ticks_init(void)
782{
Emilio G. Cotaccdb3c12016-06-08 14:55:20 -0400783 seqlock_init(&timers_state.vm_clock_seqlock);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400784 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400785 throttle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
786 cpu_throttle_timer_tick, NULL);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400787}
788
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200789void configure_icount(QemuOpts *opts, Error **errp)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200790{
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200791 const char *option;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200792 char *rem_str = NULL;
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200793
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200794 option = qemu_opt_get(opts, "shift");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200795 if (!option) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200796 if (qemu_opt_get(opts, "align") != NULL) {
797 error_setg(errp, "Please specify shift option when using align");
798 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200799 return;
800 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200801
802 icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200803 if (icount_sleep) {
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300804 timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300805 icount_timer_cb, NULL);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200806 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200807
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200808 icount_align_option = qemu_opt_get_bool(opts, "align", false);
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200809
810 if (icount_align_option && !icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500811 error_setg(errp, "align=on and sleep=off are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200812 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200813 if (strcmp(option, "auto") != 0) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200814 errno = 0;
815 icount_time_shift = strtol(option, &rem_str, 0);
816 if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
817 error_setg(errp, "icount: Invalid shift value");
818 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200819 use_icount = 1;
820 return;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200821 } else if (icount_align_option) {
822 error_setg(errp, "shift=auto and align=on are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200823 } else if (!icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500824 error_setg(errp, "shift=auto and sleep=off are incompatible");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200825 }
826
827 use_icount = 2;
828
829 /* 125MIPS seems a reasonable initial guess at the guest speed.
830 It will be corrected fairly quickly anyway. */
831 icount_time_shift = 3;
832
833 /* Have both realtime and virtual time triggers for speed adjustment.
834 The realtime trigger catches emulated time passing too slowly,
835 the virtual time trigger catches emulated time passing too fast.
836 Realtime triggers occur even when idle, so use them less frequently
837 than VM triggers. */
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300838 timers_state.vm_clock_warp_start = -1;
839 timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300840 icount_adjust_rt, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300841 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300842 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300843 timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
Alex Bligh40daca52013-08-21 16:03:02 +0100844 icount_adjust_vm, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300845 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100846 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530847 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200848}
849
850/***********************************************************/
Alex Bennée65467062017-02-23 18:29:09 +0000851/* TCG vCPU kick timer
852 *
853 * The kick timer is responsible for moving single threaded vCPU
854 * emulation on to the next vCPU. If more than one vCPU is running a
855 * timer event with force a cpu->exit so the next vCPU can get
856 * scheduled.
857 *
858 * The timer is removed if all vCPUs are idle and restarted again once
859 * idleness is complete.
860 */
861
862static QEMUTimer *tcg_kick_vcpu_timer;
Alex Bennée791158d2017-02-23 18:29:10 +0000863static CPUState *tcg_current_rr_cpu;
Alex Bennée65467062017-02-23 18:29:09 +0000864
865#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
866
867static inline int64_t qemu_tcg_next_kick(void)
868{
869 return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
870}
871
Alex Bennée791158d2017-02-23 18:29:10 +0000872/* Kick the currently round-robin scheduled vCPU */
873static void qemu_cpu_kick_rr_cpu(void)
874{
875 CPUState *cpu;
Alex Bennée791158d2017-02-23 18:29:10 +0000876 do {
877 cpu = atomic_mb_read(&tcg_current_rr_cpu);
878 if (cpu) {
879 cpu_exit(cpu);
880 }
881 } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
882}
883
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100884static void do_nothing(CPUState *cpu, run_on_cpu_data unused)
885{
886}
887
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100888void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
889{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100890 if (!use_icount || type != QEMU_CLOCK_VIRTUAL) {
891 qemu_notify_event();
892 return;
893 }
894
Peter Maydellc52e7132018-04-10 13:02:25 +0100895 if (qemu_in_vcpu_thread()) {
896 /* A CPU is currently running; kick it back out to the
897 * tcg_cpu_exec() loop so it will recalculate its
898 * icount deadline immediately.
899 */
900 qemu_cpu_kick(current_cpu);
901 } else if (first_cpu) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100902 /* qemu_cpu_kick is not enough to kick a halted CPU out of
903 * qemu_tcg_wait_io_event. async_run_on_cpu, instead,
904 * causes cpu_thread_is_idle to return false. This way,
905 * handle_icount_deadline can run.
Peter Maydellc52e7132018-04-10 13:02:25 +0100906 * If we have no CPUs at all for some reason, we don't
907 * need to do anything.
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100908 */
909 async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
910 }
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100911}
912
Alex Bennée65467062017-02-23 18:29:09 +0000913static void kick_tcg_thread(void *opaque)
914{
915 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
Alex Bennée791158d2017-02-23 18:29:10 +0000916 qemu_cpu_kick_rr_cpu();
Alex Bennée65467062017-02-23 18:29:09 +0000917}
918
919static void start_tcg_kick_timer(void)
920{
Paolo Bonzinidb08b682018-01-11 13:53:12 +0100921 assert(!mttcg_enabled);
922 if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
Alex Bennée65467062017-02-23 18:29:09 +0000923 tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
924 kick_tcg_thread, NULL);
925 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
926 }
927}
928
929static void stop_tcg_kick_timer(void)
930{
Paolo Bonzinidb08b682018-01-11 13:53:12 +0100931 assert(!mttcg_enabled);
Alex Bennée65467062017-02-23 18:29:09 +0000932 if (tcg_kick_vcpu_timer) {
933 timer_del(tcg_kick_vcpu_timer);
934 tcg_kick_vcpu_timer = NULL;
935 }
936}
937
Alex Bennée65467062017-02-23 18:29:09 +0000938/***********************************************************/
Blue Swirl296af7c2010-03-29 19:23:50 +0000939void hw_error(const char *fmt, ...)
940{
941 va_list ap;
Andreas Färber55e5c282012-12-17 06:18:02 +0100942 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000943
944 va_start(ap, fmt);
945 fprintf(stderr, "qemu: hardware error: ");
946 vfprintf(stderr, fmt, ap);
947 fprintf(stderr, "\n");
Andreas Färberbdc44642013-06-24 23:50:24 +0200948 CPU_FOREACH(cpu) {
Andreas Färber55e5c282012-12-17 06:18:02 +0100949 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
Andreas Färber878096e2013-05-27 01:33:50 +0200950 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU);
Blue Swirl296af7c2010-03-29 19:23:50 +0000951 }
952 va_end(ap);
953 abort();
954}
955
956void cpu_synchronize_all_states(void)
957{
Andreas Färber182735e2013-05-29 22:29:20 +0200958 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000959
Andreas Färberbdc44642013-06-24 23:50:24 +0200960 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200961 cpu_synchronize_state(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -0500962 /* TODO: move to cpu_synchronize_state() */
963 if (hvf_enabled()) {
964 hvf_cpu_synchronize_state(cpu);
965 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000966 }
967}
968
969void cpu_synchronize_all_post_reset(void)
970{
Andreas Färber182735e2013-05-29 22:29:20 +0200971 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000972
Andreas Färberbdc44642013-06-24 23:50:24 +0200973 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200974 cpu_synchronize_post_reset(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -0500975 /* TODO: move to cpu_synchronize_post_reset() */
976 if (hvf_enabled()) {
977 hvf_cpu_synchronize_post_reset(cpu);
978 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000979 }
980}
981
982void cpu_synchronize_all_post_init(void)
983{
Andreas Färber182735e2013-05-29 22:29:20 +0200984 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000985
Andreas Färberbdc44642013-06-24 23:50:24 +0200986 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200987 cpu_synchronize_post_init(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -0500988 /* TODO: move to cpu_synchronize_post_init() */
989 if (hvf_enabled()) {
990 hvf_cpu_synchronize_post_init(cpu);
991 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000992 }
993}
994
David Gibson75e972d2017-05-26 14:46:28 +1000995void cpu_synchronize_all_pre_loadvm(void)
996{
997 CPUState *cpu;
998
999 CPU_FOREACH(cpu) {
1000 cpu_synchronize_pre_loadvm(cpu);
1001 }
1002}
1003
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001004static int do_vm_stop(RunState state, bool send_stop)
Blue Swirl296af7c2010-03-29 19:23:50 +00001005{
Kevin Wolf56983462013-07-05 13:49:54 +02001006 int ret = 0;
1007
Luiz Capitulino13548692011-07-29 15:36:43 -03001008 if (runstate_is_running()) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001009 cpu_disable_ticks();
Blue Swirl296af7c2010-03-29 19:23:50 +00001010 pause_all_vcpus();
Luiz Capitulinof5bbfba2011-07-29 15:04:45 -03001011 runstate_set(state);
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001012 vm_state_notify(0, state);
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001013 if (send_stop) {
1014 qapi_event_send_stop(&error_abort);
1015 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001016 }
Kevin Wolf56983462013-07-05 13:49:54 +02001017
Kevin Wolf594a45c2013-07-18 14:52:19 +02001018 bdrv_drain_all();
Pavel Dovgalyuk6d0ceb82016-09-26 11:08:16 +03001019 replay_disable_events();
John Snow22af08e2016-09-22 21:45:51 -04001020 ret = bdrv_flush_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02001021
Kevin Wolf56983462013-07-05 13:49:54 +02001022 return ret;
Blue Swirl296af7c2010-03-29 19:23:50 +00001023}
1024
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001025/* Special vm_stop() variant for terminating the process. Historically clients
1026 * did not expect a QMP STOP event and so we need to retain compatibility.
1027 */
1028int vm_shutdown(void)
1029{
1030 return do_vm_stop(RUN_STATE_SHUTDOWN, false);
1031}
1032
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001033static bool cpu_can_run(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001034{
Andreas Färber4fdeee72012-05-02 23:10:09 +02001035 if (cpu->stop) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001036 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001037 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +08001038 if (cpu_is_stopped(cpu)) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001039 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001040 }
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001041 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001042}
1043
Andreas Färber91325042013-05-27 02:07:49 +02001044static void cpu_handle_guest_debug(CPUState *cpu)
Jan Kiszka3c638d02010-06-25 16:56:56 +02001045{
Andreas Färber64f6b342013-05-27 02:06:09 +02001046 gdb_set_stop_cpu(cpu);
Jan Kiszka8cf71712011-02-07 12:19:16 +01001047 qemu_system_debug_request();
Andreas Färberf324e762012-05-02 23:26:21 +02001048 cpu->stopped = true;
Jan Kiszka3c638d02010-06-25 16:56:56 +02001049}
1050
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001051#ifdef CONFIG_LINUX
1052static void sigbus_reraise(void)
1053{
1054 sigset_t set;
1055 struct sigaction action;
1056
1057 memset(&action, 0, sizeof(action));
1058 action.sa_handler = SIG_DFL;
1059 if (!sigaction(SIGBUS, &action, NULL)) {
1060 raise(SIGBUS);
1061 sigemptyset(&set);
1062 sigaddset(&set, SIGBUS);
Peter Maydella2d17612016-05-16 18:33:59 +01001063 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001064 }
1065 perror("Failed to re-raise SIGBUS!\n");
1066 abort();
1067}
1068
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001069static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx)
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001070{
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001071 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) {
1072 sigbus_reraise();
1073 }
1074
Paolo Bonzini2ae41db2017-02-08 12:48:54 +01001075 if (current_cpu) {
1076 /* Called asynchronously in VCPU thread. */
1077 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) {
1078 sigbus_reraise();
1079 }
1080 } else {
1081 /* Called synchronously (via signalfd) in main thread. */
1082 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) {
1083 sigbus_reraise();
1084 }
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001085 }
1086}
1087
1088static void qemu_init_sigbus(void)
1089{
1090 struct sigaction action;
1091
1092 memset(&action, 0, sizeof(action));
1093 action.sa_flags = SA_SIGINFO;
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001094 action.sa_sigaction = sigbus_handler;
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001095 sigaction(SIGBUS, &action, NULL);
1096
1097 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
1098}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001099#else /* !CONFIG_LINUX */
1100static void qemu_init_sigbus(void)
1101{
1102}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001103#endif /* !CONFIG_LINUX */
Blue Swirl296af7c2010-03-29 19:23:50 +00001104
Stefan Weilb2532d82012-09-27 07:41:42 +02001105static QemuMutex qemu_global_mutex;
Blue Swirl296af7c2010-03-29 19:23:50 +00001106
1107static QemuThread io_thread;
1108
Blue Swirl296af7c2010-03-29 19:23:50 +00001109/* cpu creation */
1110static QemuCond qemu_cpu_cond;
1111/* system init */
Blue Swirl296af7c2010-03-29 19:23:50 +00001112static QemuCond qemu_pause_cond;
1113
Paolo Bonzinid3b12f52011-09-13 10:30:52 +02001114void qemu_init_cpu_loop(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001115{
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001116 qemu_init_sigbus();
Anthony Liguoried945922011-02-08 18:18:18 +01001117 qemu_cond_init(&qemu_cpu_cond);
Anthony Liguoried945922011-02-08 18:18:18 +01001118 qemu_cond_init(&qemu_pause_cond);
Blue Swirl296af7c2010-03-29 19:23:50 +00001119 qemu_mutex_init(&qemu_global_mutex);
Blue Swirl296af7c2010-03-29 19:23:50 +00001120
Jan Kiszkab7680cb2011-03-12 17:43:51 +01001121 qemu_thread_get_self(&io_thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001122}
1123
Paolo Bonzini14e6fe12016-10-31 10:36:08 +01001124void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -03001125{
Sergey Fedorovd148d902016-08-29 09:51:00 +02001126 do_run_on_cpu(cpu, func, data, &qemu_global_mutex);
Chegu Vinod3c022702013-06-24 03:49:41 -06001127}
1128
Gu Zheng4c055ab2016-05-12 09:18:13 +05301129static void qemu_kvm_destroy_vcpu(CPUState *cpu)
1130{
1131 if (kvm_destroy_vcpu(cpu) < 0) {
1132 error_report("kvm_destroy_vcpu failed");
1133 exit(EXIT_FAILURE);
1134 }
1135}
1136
1137static void qemu_tcg_destroy_vcpu(CPUState *cpu)
1138{
1139}
1140
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001141static void qemu_cpu_stop(CPUState *cpu, bool exit)
1142{
1143 g_assert(qemu_cpu_is_self(cpu));
1144 cpu->stop = false;
1145 cpu->stopped = true;
1146 if (exit) {
1147 cpu_exit(cpu);
1148 }
1149 qemu_cond_broadcast(&qemu_pause_cond);
1150}
1151
Andreas Färber509a0d72012-05-03 02:18:09 +02001152static void qemu_wait_io_event_common(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001153{
Alex Bennée37257942017-02-23 18:29:14 +00001154 atomic_mb_set(&cpu->thread_kicked, false);
Andreas Färber4fdeee72012-05-02 23:10:09 +02001155 if (cpu->stop) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001156 qemu_cpu_stop(cpu, false);
Blue Swirl296af7c2010-03-29 19:23:50 +00001157 }
Sergey Fedorova5403c62016-08-02 18:27:36 +01001158 process_queued_cpu_work(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001159}
1160
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001161static void qemu_tcg_rr_wait_io_event(CPUState *cpu)
Alex Bennée37257942017-02-23 18:29:14 +00001162{
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001163 while (all_cpu_threads_idle()) {
Alex Bennée65467062017-02-23 18:29:09 +00001164 stop_tcg_kick_timer();
KONRAD Fredericd5f8d612015-08-10 17:27:06 +02001165 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001166 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001167
Alex Bennée65467062017-02-23 18:29:09 +00001168 start_tcg_kick_timer();
1169
Alex Bennée37257942017-02-23 18:29:14 +00001170 qemu_wait_io_event_common(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001171}
1172
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001173static void qemu_wait_io_event(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001174{
Andreas Färbera98ae1d2013-05-26 23:21:08 +02001175 while (cpu_thread_is_idle(cpu)) {
Andreas Färberf5c121b2012-05-03 01:22:49 +02001176 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001177 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001178
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001179#ifdef _WIN32
1180 /* Eat dummy APC queued by qemu_cpu_kick_thread. */
1181 if (!tcg_enabled()) {
1182 SleepEx(0, TRUE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001183 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001184#endif
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001185 qemu_wait_io_event_common(cpu);
1186}
1187
Jan Kiszka7e97cd82011-02-07 12:19:12 +01001188static void *qemu_kvm_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001189{
Andreas Färber48a106b2013-05-27 02:20:39 +02001190 CPUState *cpu = arg;
Jan Kiszka84b49152011-02-01 22:15:50 +01001191 int r;
Blue Swirl296af7c2010-03-29 19:23:50 +00001192
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001193 rcu_register_thread();
1194
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001195 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001196 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001197 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001198 cpu->can_do_io = 1;
Andreas Färber4917cf42013-05-27 05:17:50 +02001199 current_cpu = cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001200
Andreas Färber504134d2012-12-17 06:38:45 +01001201 r = kvm_init_vcpu(cpu);
Jan Kiszka84b49152011-02-01 22:15:50 +01001202 if (r < 0) {
Alistair Francis493d89b2018-02-03 09:43:14 +01001203 error_report("kvm_init_vcpu failed: %s", strerror(-r));
Jan Kiszka84b49152011-02-01 22:15:50 +01001204 exit(1);
1205 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001206
Paolo Bonzini18268b62017-02-09 09:41:14 +01001207 kvm_init_cpu_signals(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001208
1209 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001210 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001211 qemu_cond_signal(&qemu_cpu_cond);
1212
Gu Zheng4c055ab2016-05-12 09:18:13 +05301213 do {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001214 if (cpu_can_run(cpu)) {
Andreas Färber1458c362013-05-26 23:46:55 +02001215 r = kvm_cpu_exec(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001216 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +02001217 cpu_handle_guest_debug(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001218 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001219 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001220 qemu_wait_io_event(cpu);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301221 } while (!cpu->unplug || cpu_can_run(cpu));
Blue Swirl296af7c2010-03-29 19:23:50 +00001222
Gu Zheng4c055ab2016-05-12 09:18:13 +05301223 qemu_kvm_destroy_vcpu(cpu);
Bharata B Rao2c579042016-05-12 09:18:14 +05301224 cpu->created = false;
1225 qemu_cond_signal(&qemu_cpu_cond);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301226 qemu_mutex_unlock_iothread();
Paolo Bonzini57615ed2018-01-30 11:04:36 -05001227 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001228 return NULL;
1229}
1230
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001231static void *qemu_dummy_cpu_thread_fn(void *arg)
1232{
1233#ifdef _WIN32
Alistair Francis493d89b2018-02-03 09:43:14 +01001234 error_report("qtest is not supported under Windows");
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001235 exit(1);
1236#else
Andreas Färber10a90212013-05-27 02:24:35 +02001237 CPUState *cpu = arg;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001238 sigset_t waitset;
1239 int r;
1240
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001241 rcu_register_thread();
1242
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001243 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001244 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001245 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001246 cpu->can_do_io = 1;
Alex Bennée37257942017-02-23 18:29:14 +00001247 current_cpu = cpu;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001248
1249 sigemptyset(&waitset);
1250 sigaddset(&waitset, SIG_IPI);
1251
1252 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001253 cpu->created = true;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001254 qemu_cond_signal(&qemu_cpu_cond);
1255
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001256 do {
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001257 qemu_mutex_unlock_iothread();
1258 do {
1259 int sig;
1260 r = sigwait(&waitset, &sig);
1261 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
1262 if (r == -1) {
1263 perror("sigwait");
1264 exit(1);
1265 }
1266 qemu_mutex_lock_iothread();
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001267 qemu_wait_io_event(cpu);
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001268 } while (!cpu->unplug);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001269
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001270 rcu_unregister_thread();
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001271 return NULL;
1272#endif
1273}
1274
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001275static int64_t tcg_get_icount_limit(void)
1276{
1277 int64_t deadline;
1278
1279 if (replay_mode != REPLAY_MODE_PLAY) {
1280 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1281
1282 /* Maintain prior (possibly buggy) behaviour where if no deadline
1283 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
1284 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1285 * nanoseconds.
1286 */
1287 if ((deadline < 0) || (deadline > INT32_MAX)) {
1288 deadline = INT32_MAX;
1289 }
1290
1291 return qemu_icount_round(deadline);
1292 } else {
1293 return replay_get_instructions();
1294 }
1295}
1296
Alex Bennée12e97002016-10-27 16:10:14 +01001297static void handle_icount_deadline(void)
1298{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001299 assert(qemu_in_vcpu_thread());
Alex Bennée12e97002016-10-27 16:10:14 +01001300 if (use_icount) {
1301 int64_t deadline =
1302 qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1303
1304 if (deadline == 0) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001305 /* Wake up other AioContexts. */
Alex Bennée12e97002016-10-27 16:10:14 +01001306 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001307 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Alex Bennée12e97002016-10-27 16:10:14 +01001308 }
1309 }
1310}
1311
Alex Bennée05248382017-03-29 16:46:59 +01001312static void prepare_icount_for_run(CPUState *cpu)
1313{
1314 if (use_icount) {
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001315 int insns_left;
Alex Bennée05248382017-03-29 16:46:59 +01001316
1317 /* These should always be cleared by process_icount_data after
1318 * each vCPU execution. However u16.high can be raised
1319 * asynchronously by cpu_exit/cpu_interrupt/tcg_handle_interrupt
1320 */
1321 g_assert(cpu->icount_decr.u16.low == 0);
1322 g_assert(cpu->icount_extra == 0);
1323
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001324 cpu->icount_budget = tcg_get_icount_limit();
1325 insns_left = MIN(0xffff, cpu->icount_budget);
1326 cpu->icount_decr.u16.low = insns_left;
1327 cpu->icount_extra = cpu->icount_budget - insns_left;
Alex Bennéed759c952018-02-27 12:52:48 +03001328
1329 replay_mutex_lock();
Alex Bennée05248382017-03-29 16:46:59 +01001330 }
1331}
1332
1333static void process_icount_data(CPUState *cpu)
1334{
1335 if (use_icount) {
Alex Bennéee4cd9652017-03-31 16:09:42 +01001336 /* Account for executed instructions */
Alex Bennée512d3c82017-04-05 12:32:37 +01001337 cpu_update_icount(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001338
1339 /* Reset the counters */
1340 cpu->icount_decr.u16.low = 0;
1341 cpu->icount_extra = 0;
Alex Bennéee4cd9652017-03-31 16:09:42 +01001342 cpu->icount_budget = 0;
1343
Alex Bennée05248382017-03-29 16:46:59 +01001344 replay_account_executed_instructions();
Alex Bennéed759c952018-02-27 12:52:48 +03001345
1346 replay_mutex_unlock();
Alex Bennée05248382017-03-29 16:46:59 +01001347 }
1348}
1349
1350
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001351static int tcg_cpu_exec(CPUState *cpu)
1352{
1353 int ret;
1354#ifdef CONFIG_PROFILER
1355 int64_t ti;
1356#endif
1357
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001358 assert(tcg_enabled());
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001359#ifdef CONFIG_PROFILER
1360 ti = profile_getclock();
1361#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001362 cpu_exec_start(cpu);
1363 ret = cpu_exec(cpu);
1364 cpu_exec_end(cpu);
1365#ifdef CONFIG_PROFILER
1366 tcg_time += profile_getclock() - ti;
1367#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001368 return ret;
1369}
1370
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001371/* Destroy any remaining vCPUs which have been unplugged and have
1372 * finished running
1373 */
1374static void deal_with_unplugged_cpus(void)
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001375{
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001376 CPUState *cpu;
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001377
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001378 CPU_FOREACH(cpu) {
1379 if (cpu->unplug && !cpu_can_run(cpu)) {
1380 qemu_tcg_destroy_vcpu(cpu);
1381 cpu->created = false;
1382 qemu_cond_signal(&qemu_cpu_cond);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001383 break;
1384 }
1385 }
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001386}
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001387
Alex Bennée65467062017-02-23 18:29:09 +00001388/* Single-threaded TCG
1389 *
1390 * In the single-threaded case each vCPU is simulated in turn. If
1391 * there is more than a single vCPU we create a simple timer to kick
1392 * the vCPU and ensure we don't get stuck in a tight loop in one vCPU.
1393 * This is done explicitly rather than relying on side-effects
1394 * elsewhere.
1395 */
1396
Alex Bennée37257942017-02-23 18:29:14 +00001397static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001398{
Andreas Färberc3586ba2012-05-03 01:41:24 +02001399 CPUState *cpu = arg;
Blue Swirl296af7c2010-03-29 19:23:50 +00001400
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001401 assert(tcg_enabled());
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001402 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001403 tcg_register_thread();
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001404
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001405 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001406 qemu_thread_get_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001407
David Hildenbrand5a9c9732018-02-09 20:52:39 +01001408 cpu->thread_id = qemu_get_thread_id();
1409 cpu->created = true;
1410 cpu->can_do_io = 1;
Blue Swirl296af7c2010-03-29 19:23:50 +00001411 qemu_cond_signal(&qemu_cpu_cond);
1412
Jan Kiszkafa7d1862011-08-22 18:35:25 +02001413 /* wait for initial kick-off after machine start */
Emilio G. Cotac28e3992015-04-27 12:45:28 -04001414 while (first_cpu->stopped) {
KONRAD Fredericd5f8d612015-08-10 17:27:06 +02001415 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001416
1417 /* process any pending work */
Andreas Färberbdc44642013-06-24 23:50:24 +02001418 CPU_FOREACH(cpu) {
Alex Bennée37257942017-02-23 18:29:14 +00001419 current_cpu = cpu;
Andreas Färber182735e2013-05-29 22:29:20 +02001420 qemu_wait_io_event_common(cpu);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001421 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001422 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001423
Alex Bennée65467062017-02-23 18:29:09 +00001424 start_tcg_kick_timer();
1425
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001426 cpu = first_cpu;
1427
Alex Bennéee5143e32017-02-23 18:29:12 +00001428 /* process any pending work */
1429 cpu->exit_request = 1;
1430
Blue Swirl296af7c2010-03-29 19:23:50 +00001431 while (1) {
Alex Bennéed759c952018-02-27 12:52:48 +03001432 qemu_mutex_unlock_iothread();
1433 replay_mutex_lock();
1434 qemu_mutex_lock_iothread();
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001435 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1436 qemu_account_warp_timer();
1437
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001438 /* Run the timers here. This is much more efficient than
1439 * waking up the I/O thread and waiting for completion.
1440 */
1441 handle_icount_deadline();
1442
Alex Bennéed759c952018-02-27 12:52:48 +03001443 replay_mutex_unlock();
1444
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001445 if (!cpu) {
1446 cpu = first_cpu;
1447 }
1448
Alex Bennéee5143e32017-02-23 18:29:12 +00001449 while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
1450
Alex Bennée791158d2017-02-23 18:29:10 +00001451 atomic_mb_set(&tcg_current_rr_cpu, cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001452 current_cpu = cpu;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001453
1454 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
1455 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
1456
1457 if (cpu_can_run(cpu)) {
1458 int r;
Alex Bennée05248382017-03-29 16:46:59 +01001459
Alex Bennéed759c952018-02-27 12:52:48 +03001460 qemu_mutex_unlock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001461 prepare_icount_for_run(cpu);
1462
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001463 r = tcg_cpu_exec(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001464
1465 process_icount_data(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001466 qemu_mutex_lock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001467
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001468 if (r == EXCP_DEBUG) {
1469 cpu_handle_guest_debug(cpu);
1470 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001471 } else if (r == EXCP_ATOMIC) {
1472 qemu_mutex_unlock_iothread();
1473 cpu_exec_step_atomic(cpu);
1474 qemu_mutex_lock_iothread();
1475 break;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001476 }
Alex Bennée37257942017-02-23 18:29:14 +00001477 } else if (cpu->stop) {
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001478 if (cpu->unplug) {
1479 cpu = CPU_NEXT(cpu);
1480 }
1481 break;
1482 }
1483
Alex Bennéee5143e32017-02-23 18:29:12 +00001484 cpu = CPU_NEXT(cpu);
1485 } /* while (cpu && !cpu->exit_request).. */
1486
Alex Bennée791158d2017-02-23 18:29:10 +00001487 /* Does not need atomic_mb_set because a spurious wakeup is okay. */
1488 atomic_set(&tcg_current_rr_cpu, NULL);
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001489
Alex Bennéee5143e32017-02-23 18:29:12 +00001490 if (cpu && cpu->exit_request) {
1491 atomic_mb_set(&cpu->exit_request, 0);
1492 }
Alex Blighac70aaf2013-08-21 16:02:57 +01001493
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001494 qemu_tcg_rr_wait_io_event(cpu ? cpu : QTAILQ_FIRST(&cpus));
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001495 deal_with_unplugged_cpus();
Blue Swirl296af7c2010-03-29 19:23:50 +00001496 }
1497
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001498 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001499 return NULL;
1500}
1501
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001502static void *qemu_hax_cpu_thread_fn(void *arg)
1503{
1504 CPUState *cpu = arg;
1505 int r;
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001506
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001507 rcu_register_thread();
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001508 qemu_mutex_lock_iothread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001509 qemu_thread_get_self(cpu->thread);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001510
1511 cpu->thread_id = qemu_get_thread_id();
1512 cpu->created = true;
1513 cpu->halted = 0;
1514 current_cpu = cpu;
1515
1516 hax_init_vcpu(cpu);
1517 qemu_cond_signal(&qemu_cpu_cond);
1518
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001519 do {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001520 if (cpu_can_run(cpu)) {
1521 r = hax_smp_cpu_exec(cpu);
1522 if (r == EXCP_DEBUG) {
1523 cpu_handle_guest_debug(cpu);
1524 }
1525 }
1526
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001527 qemu_wait_io_event(cpu);
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001528 } while (!cpu->unplug || cpu_can_run(cpu));
1529 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001530 return NULL;
1531}
1532
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001533/* The HVF-specific vCPU thread function. This one should only run when the host
1534 * CPU supports the VMX "unrestricted guest" feature. */
1535static void *qemu_hvf_cpu_thread_fn(void *arg)
1536{
1537 CPUState *cpu = arg;
1538
1539 int r;
1540
1541 assert(hvf_enabled());
1542
1543 rcu_register_thread();
1544
1545 qemu_mutex_lock_iothread();
1546 qemu_thread_get_self(cpu->thread);
1547
1548 cpu->thread_id = qemu_get_thread_id();
1549 cpu->can_do_io = 1;
1550 current_cpu = cpu;
1551
1552 hvf_init_vcpu(cpu);
1553
1554 /* signal CPU creation */
1555 cpu->created = true;
1556 qemu_cond_signal(&qemu_cpu_cond);
1557
1558 do {
1559 if (cpu_can_run(cpu)) {
1560 r = hvf_vcpu_exec(cpu);
1561 if (r == EXCP_DEBUG) {
1562 cpu_handle_guest_debug(cpu);
1563 }
1564 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001565 qemu_wait_io_event(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001566 } while (!cpu->unplug || cpu_can_run(cpu));
1567
1568 hvf_vcpu_destroy(cpu);
1569 cpu->created = false;
1570 qemu_cond_signal(&qemu_cpu_cond);
1571 qemu_mutex_unlock_iothread();
Paolo Bonzini8178e632018-01-30 11:05:21 -05001572 rcu_unregister_thread();
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001573 return NULL;
1574}
1575
Justin Terry (VM)19306802018-01-22 13:07:49 -08001576static void *qemu_whpx_cpu_thread_fn(void *arg)
1577{
1578 CPUState *cpu = arg;
1579 int r;
1580
1581 rcu_register_thread();
1582
1583 qemu_mutex_lock_iothread();
1584 qemu_thread_get_self(cpu->thread);
1585 cpu->thread_id = qemu_get_thread_id();
1586 current_cpu = cpu;
1587
1588 r = whpx_init_vcpu(cpu);
1589 if (r < 0) {
1590 fprintf(stderr, "whpx_init_vcpu failed: %s\n", strerror(-r));
1591 exit(1);
1592 }
1593
1594 /* signal CPU creation */
1595 cpu->created = true;
1596 qemu_cond_signal(&qemu_cpu_cond);
1597
1598 do {
1599 if (cpu_can_run(cpu)) {
1600 r = whpx_vcpu_exec(cpu);
1601 if (r == EXCP_DEBUG) {
1602 cpu_handle_guest_debug(cpu);
1603 }
1604 }
1605 while (cpu_thread_is_idle(cpu)) {
1606 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1607 }
1608 qemu_wait_io_event_common(cpu);
1609 } while (!cpu->unplug || cpu_can_run(cpu));
1610
1611 whpx_destroy_vcpu(cpu);
1612 cpu->created = false;
1613 qemu_cond_signal(&qemu_cpu_cond);
1614 qemu_mutex_unlock_iothread();
1615 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001616 return NULL;
1617}
1618
1619#ifdef _WIN32
1620static void CALLBACK dummy_apc_func(ULONG_PTR unused)
1621{
1622}
1623#endif
1624
Alex Bennée37257942017-02-23 18:29:14 +00001625/* Multi-threaded TCG
1626 *
1627 * In the multi-threaded case each vCPU has its own thread. The TLS
1628 * variable current_cpu can be used deep in the code to find the
1629 * current CPUState for a given thread.
1630 */
1631
1632static void *qemu_tcg_cpu_thread_fn(void *arg)
1633{
1634 CPUState *cpu = arg;
1635
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001636 assert(tcg_enabled());
Alex Bennéebf51c722017-03-30 18:32:29 +01001637 g_assert(!use_icount);
1638
Alex Bennée37257942017-02-23 18:29:14 +00001639 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001640 tcg_register_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001641
1642 qemu_mutex_lock_iothread();
1643 qemu_thread_get_self(cpu->thread);
1644
1645 cpu->thread_id = qemu_get_thread_id();
1646 cpu->created = true;
1647 cpu->can_do_io = 1;
1648 current_cpu = cpu;
1649 qemu_cond_signal(&qemu_cpu_cond);
1650
1651 /* process any pending work */
1652 cpu->exit_request = 1;
1653
Cédric Le Goater54961aa2018-04-25 15:18:28 +02001654 do {
Alex Bennée37257942017-02-23 18:29:14 +00001655 if (cpu_can_run(cpu)) {
1656 int r;
Alex Bennéed759c952018-02-27 12:52:48 +03001657 qemu_mutex_unlock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001658 r = tcg_cpu_exec(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001659 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001660 switch (r) {
1661 case EXCP_DEBUG:
1662 cpu_handle_guest_debug(cpu);
1663 break;
1664 case EXCP_HALTED:
1665 /* during start-up the vCPU is reset and the thread is
1666 * kicked several times. If we don't ensure we go back
1667 * to sleep in the halted state we won't cleanly
1668 * start-up when the vCPU is enabled.
1669 *
1670 * cpu->halted should ensure we sleep in wait_io_event
1671 */
1672 g_assert(cpu->halted);
1673 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001674 case EXCP_ATOMIC:
1675 qemu_mutex_unlock_iothread();
1676 cpu_exec_step_atomic(cpu);
1677 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001678 default:
1679 /* Ignore everything else? */
1680 break;
1681 }
1682 }
1683
Alex Bennée37257942017-02-23 18:29:14 +00001684 atomic_mb_set(&cpu->exit_request, 0);
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001685 qemu_wait_io_event(cpu);
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001686 } while (!cpu->unplug || cpu_can_run(cpu));
Alex Bennée37257942017-02-23 18:29:14 +00001687
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001688 qemu_tcg_destroy_vcpu(cpu);
1689 cpu->created = false;
1690 qemu_cond_signal(&qemu_cpu_cond);
1691 qemu_mutex_unlock_iothread();
1692 rcu_unregister_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001693 return NULL;
1694}
1695
Andreas Färber2ff09a42012-05-03 00:23:30 +02001696static void qemu_cpu_kick_thread(CPUState *cpu)
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001697{
1698#ifndef _WIN32
1699 int err;
1700
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001701 if (cpu->thread_kicked) {
1702 return;
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001703 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001704 cpu->thread_kicked = true;
Andreas Färber814e6122012-05-02 17:00:37 +02001705 err = pthread_kill(cpu->thread->thread, SIG_IPI);
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001706 if (err) {
1707 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
1708 exit(1);
1709 }
1710#else /* _WIN32 */
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001711 if (!qemu_cpu_is_self(cpu)) {
Justin Terry (VM)19306802018-01-22 13:07:49 -08001712 if (whpx_enabled()) {
1713 whpx_vcpu_kick(cpu);
1714 } else if (!QueueUserAPC(dummy_apc_func, cpu->hThread, 0)) {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001715 fprintf(stderr, "%s: QueueUserAPC failed with error %lu\n",
1716 __func__, GetLastError());
1717 exit(1);
1718 }
1719 }
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001720#endif
1721}
1722
Andreas Färberc08d7422012-05-03 04:34:15 +02001723void qemu_cpu_kick(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001724{
Andreas Färberf5c121b2012-05-03 01:22:49 +02001725 qemu_cond_broadcast(cpu->halt_cond);
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001726 if (tcg_enabled()) {
Alex Bennée791158d2017-02-23 18:29:10 +00001727 cpu_exit(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001728 /* NOP unless doing single-thread RR */
Alex Bennée791158d2017-02-23 18:29:10 +00001729 qemu_cpu_kick_rr_cpu();
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001730 } else {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001731 if (hax_enabled()) {
1732 /*
1733 * FIXME: race condition with the exit_request check in
1734 * hax_vcpu_hax_exec
1735 */
1736 cpu->exit_request = 1;
1737 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001738 qemu_cpu_kick_thread(cpu);
1739 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001740}
1741
Jan Kiszka46d62fa2011-02-01 22:15:59 +01001742void qemu_cpu_kick_self(void)
1743{
Andreas Färber4917cf42013-05-27 05:17:50 +02001744 assert(current_cpu);
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001745 qemu_cpu_kick_thread(current_cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001746}
1747
Andreas Färber60e82572012-05-02 22:23:49 +02001748bool qemu_cpu_is_self(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001749{
Andreas Färber814e6122012-05-02 17:00:37 +02001750 return qemu_thread_is_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001751}
1752
Paolo Bonzini79e2b9a2015-01-21 12:09:14 +01001753bool qemu_in_vcpu_thread(void)
Juan Quintelaaa723c22012-09-18 16:30:11 +02001754{
Andreas Färber4917cf42013-05-27 05:17:50 +02001755 return current_cpu && qemu_cpu_is_self(current_cpu);
Juan Quintelaaa723c22012-09-18 16:30:11 +02001756}
1757
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001758static __thread bool iothread_locked = false;
1759
1760bool qemu_mutex_iothread_locked(void)
1761{
1762 return iothread_locked;
1763}
1764
Blue Swirl296af7c2010-03-29 19:23:50 +00001765void qemu_mutex_lock_iothread(void)
1766{
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001767 g_assert(!qemu_mutex_iothread_locked());
1768 qemu_mutex_lock(&qemu_global_mutex);
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001769 iothread_locked = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001770}
1771
1772void qemu_mutex_unlock_iothread(void)
1773{
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001774 g_assert(qemu_mutex_iothread_locked());
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001775 iothread_locked = false;
Blue Swirl296af7c2010-03-29 19:23:50 +00001776 qemu_mutex_unlock(&qemu_global_mutex);
1777}
1778
Alex Bennéee8faee02016-10-27 16:09:58 +01001779static bool all_vcpus_paused(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001780{
Andreas Färberbdc44642013-06-24 23:50:24 +02001781 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001782
Andreas Färberbdc44642013-06-24 23:50:24 +02001783 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001784 if (!cpu->stopped) {
Alex Bennéee8faee02016-10-27 16:09:58 +01001785 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001786 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001787 }
1788
Alex Bennéee8faee02016-10-27 16:09:58 +01001789 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001790}
1791
1792void pause_all_vcpus(void)
1793{
Andreas Färberbdc44642013-06-24 23:50:24 +02001794 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001795
Alex Bligh40daca52013-08-21 16:03:02 +01001796 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
Andreas Färberbdc44642013-06-24 23:50:24 +02001797 CPU_FOREACH(cpu) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001798 if (qemu_cpu_is_self(cpu)) {
1799 qemu_cpu_stop(cpu, true);
1800 } else {
1801 cpu->stop = true;
1802 qemu_cpu_kick(cpu);
1803 }
Jan Kiszkad798e972012-02-17 18:31:16 +01001804 }
1805
Alex Bennéed759c952018-02-27 12:52:48 +03001806 /* We need to drop the replay_lock so any vCPU threads woken up
1807 * can finish their replay tasks
1808 */
1809 replay_mutex_unlock();
1810
Blue Swirl296af7c2010-03-29 19:23:50 +00001811 while (!all_vcpus_paused()) {
Paolo Bonzinibe7d6c52011-03-12 17:44:02 +01001812 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
Andreas Färberbdc44642013-06-24 23:50:24 +02001813 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001814 qemu_cpu_kick(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001815 }
1816 }
Alex Bennéed759c952018-02-27 12:52:48 +03001817
1818 qemu_mutex_unlock_iothread();
1819 replay_mutex_lock();
1820 qemu_mutex_lock_iothread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001821}
1822
Igor Mammedov29936832013-04-23 10:29:37 +02001823void cpu_resume(CPUState *cpu)
1824{
1825 cpu->stop = false;
1826 cpu->stopped = false;
1827 qemu_cpu_kick(cpu);
1828}
1829
Blue Swirl296af7c2010-03-29 19:23:50 +00001830void resume_all_vcpus(void)
1831{
Andreas Färberbdc44642013-06-24 23:50:24 +02001832 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001833
Alex Bligh40daca52013-08-21 16:03:02 +01001834 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
Andreas Färberbdc44642013-06-24 23:50:24 +02001835 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001836 cpu_resume(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001837 }
1838}
1839
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001840void cpu_remove_sync(CPUState *cpu)
Gu Zheng4c055ab2016-05-12 09:18:13 +05301841{
1842 cpu->stop = true;
1843 cpu->unplug = true;
1844 qemu_cpu_kick(cpu);
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001845 qemu_mutex_unlock_iothread();
1846 qemu_thread_join(cpu->thread);
1847 qemu_mutex_lock_iothread();
Bharata B Rao2c579042016-05-12 09:18:14 +05301848}
1849
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001850/* For temporary buffers for forming a name */
1851#define VCPU_THREAD_NAME_SIZE 16
1852
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001853static void qemu_tcg_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001854{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001855 char thread_name[VCPU_THREAD_NAME_SIZE];
Alex Bennée37257942017-02-23 18:29:14 +00001856 static QemuCond *single_tcg_halt_cond;
1857 static QemuThread *single_tcg_cpu_thread;
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001858 static int tcg_region_inited;
1859
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001860 assert(tcg_enabled());
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001861 /*
1862 * Initialize TCG regions--once. Now is a good time, because:
1863 * (1) TCG's init context, prologue and target globals have been set up.
1864 * (2) qemu_tcg_mttcg_enabled() works now (TCG init code runs before the
1865 * -accel flag is processed, so the check doesn't work then).
1866 */
1867 if (!tcg_region_inited) {
1868 tcg_region_inited = 1;
1869 tcg_region_init();
1870 }
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001871
Alex Bennée37257942017-02-23 18:29:14 +00001872 if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
Andreas Färber814e6122012-05-02 17:00:37 +02001873 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001874 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1875 qemu_cond_init(cpu->halt_cond);
Alex Bennée37257942017-02-23 18:29:14 +00001876
1877 if (qemu_tcg_mttcg_enabled()) {
1878 /* create a thread per vCPU with TCG (MTTCG) */
1879 parallel_cpus = true;
1880 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001881 cpu->cpu_index);
Alex Bennée37257942017-02-23 18:29:14 +00001882
1883 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1884 cpu, QEMU_THREAD_JOINABLE);
1885
1886 } else {
1887 /* share a single thread for all cpus with TCG */
1888 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
1889 qemu_thread_create(cpu->thread, thread_name,
1890 qemu_tcg_rr_cpu_thread_fn,
1891 cpu, QEMU_THREAD_JOINABLE);
1892
1893 single_tcg_halt_cond = cpu->halt_cond;
1894 single_tcg_cpu_thread = cpu->thread;
1895 }
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001896#ifdef _WIN32
Andreas Färber814e6122012-05-02 17:00:37 +02001897 cpu->hThread = qemu_thread_get_handle(cpu->thread);
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001898#endif
Blue Swirl296af7c2010-03-29 19:23:50 +00001899 } else {
Alex Bennée37257942017-02-23 18:29:14 +00001900 /* For non-MTTCG cases we share the thread */
1901 cpu->thread = single_tcg_cpu_thread;
1902 cpu->halt_cond = single_tcg_halt_cond;
David Hildenbranda3421732018-02-09 20:52:37 +01001903 cpu->thread_id = first_cpu->thread_id;
1904 cpu->can_do_io = 1;
1905 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001906 }
1907}
1908
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001909static void qemu_hax_start_vcpu(CPUState *cpu)
1910{
1911 char thread_name[VCPU_THREAD_NAME_SIZE];
1912
1913 cpu->thread = g_malloc0(sizeof(QemuThread));
1914 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1915 qemu_cond_init(cpu->halt_cond);
1916
1917 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX",
1918 cpu->cpu_index);
1919 qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn,
1920 cpu, QEMU_THREAD_JOINABLE);
1921#ifdef _WIN32
1922 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1923#endif
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001924}
1925
Andreas Färber48a106b2013-05-27 02:20:39 +02001926static void qemu_kvm_start_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001927{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001928 char thread_name[VCPU_THREAD_NAME_SIZE];
1929
Andreas Färber814e6122012-05-02 17:00:37 +02001930 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001931 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1932 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001933 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
1934 cpu->cpu_index);
1935 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
1936 cpu, QEMU_THREAD_JOINABLE);
Blue Swirl296af7c2010-03-29 19:23:50 +00001937}
1938
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001939static void qemu_hvf_start_vcpu(CPUState *cpu)
1940{
1941 char thread_name[VCPU_THREAD_NAME_SIZE];
1942
1943 /* HVF currently does not support TCG, and only runs in
1944 * unrestricted-guest mode. */
1945 assert(hvf_enabled());
1946
1947 cpu->thread = g_malloc0(sizeof(QemuThread));
1948 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1949 qemu_cond_init(cpu->halt_cond);
1950
1951 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF",
1952 cpu->cpu_index);
1953 qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn,
1954 cpu, QEMU_THREAD_JOINABLE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001955}
1956
Justin Terry (VM)19306802018-01-22 13:07:49 -08001957static void qemu_whpx_start_vcpu(CPUState *cpu)
1958{
1959 char thread_name[VCPU_THREAD_NAME_SIZE];
1960
1961 cpu->thread = g_malloc0(sizeof(QemuThread));
1962 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1963 qemu_cond_init(cpu->halt_cond);
1964 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX",
1965 cpu->cpu_index);
1966 qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn,
1967 cpu, QEMU_THREAD_JOINABLE);
1968#ifdef _WIN32
1969 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1970#endif
Justin Terry (VM)19306802018-01-22 13:07:49 -08001971}
1972
Andreas Färber10a90212013-05-27 02:24:35 +02001973static void qemu_dummy_start_vcpu(CPUState *cpu)
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001974{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001975 char thread_name[VCPU_THREAD_NAME_SIZE];
1976
Andreas Färber814e6122012-05-02 17:00:37 +02001977 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001978 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1979 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001980 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
1981 cpu->cpu_index);
1982 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001983 QEMU_THREAD_JOINABLE);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001984}
1985
Andreas Färberc643bed2013-05-27 03:23:24 +02001986void qemu_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001987{
Andreas Färberce3960e2012-12-17 03:27:07 +01001988 cpu->nr_cores = smp_cores;
1989 cpu->nr_threads = smp_threads;
Andreas Färberf324e762012-05-02 23:26:21 +02001990 cpu->stopped = true;
Peter Maydell56943e82016-01-21 14:15:04 +00001991
1992 if (!cpu->as) {
1993 /* If the target cpu hasn't set up any address spaces itself,
1994 * give it the default one.
1995 */
Peter Maydell12ebc9a2016-01-21 14:15:04 +00001996 cpu->num_ases = 1;
Peter Xu80ceb072017-11-23 17:23:32 +08001997 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
Peter Maydell56943e82016-01-21 14:15:04 +00001998 }
1999
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002000 if (kvm_enabled()) {
Andreas Färber48a106b2013-05-27 02:20:39 +02002001 qemu_kvm_start_vcpu(cpu);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002002 } else if (hax_enabled()) {
2003 qemu_hax_start_vcpu(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002004 } else if (hvf_enabled()) {
2005 qemu_hvf_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002006 } else if (tcg_enabled()) {
Andreas Färbere5ab30a2012-05-03 01:50:44 +02002007 qemu_tcg_init_vcpu(cpu);
Justin Terry (VM)19306802018-01-22 13:07:49 -08002008 } else if (whpx_enabled()) {
2009 qemu_whpx_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002010 } else {
Andreas Färber10a90212013-05-27 02:24:35 +02002011 qemu_dummy_start_vcpu(cpu);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002012 }
David Hildenbrand81e96312018-02-09 20:52:38 +01002013
2014 while (!cpu->created) {
2015 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
2016 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002017}
2018
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002019void cpu_stop_current(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00002020{
Andreas Färber4917cf42013-05-27 05:17:50 +02002021 if (current_cpu) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01002022 qemu_cpu_stop(current_cpu, true);
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002023 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002024}
2025
Kevin Wolf56983462013-07-05 13:49:54 +02002026int vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +00002027{
Juan Quintelaaa723c22012-09-18 16:30:11 +02002028 if (qemu_in_vcpu_thread()) {
Paolo Bonzini74892d22014-06-05 14:53:58 +02002029 qemu_system_vmstop_request_prepare();
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002030 qemu_system_vmstop_request(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00002031 /*
2032 * FIXME: should not return to device code in case
2033 * vm_stop() has been requested.
2034 */
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002035 cpu_stop_current();
Kevin Wolf56983462013-07-05 13:49:54 +02002036 return 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00002037 }
Kevin Wolf56983462013-07-05 13:49:54 +02002038
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00002039 return do_vm_stop(state, true);
Blue Swirl296af7c2010-03-29 19:23:50 +00002040}
2041
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002042/**
2043 * Prepare for (re)starting the VM.
2044 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
2045 * running or in case of an error condition), 0 otherwise.
2046 */
2047int vm_prepare_start(void)
2048{
2049 RunState requested;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002050
2051 qemu_vmstop_requested(&requested);
2052 if (runstate_is_running() && requested == RUN_STATE__MAX) {
2053 return -1;
2054 }
2055
2056 /* Ensure that a STOP/RESUME pair of events is emitted if a
2057 * vmstop request was pending. The BLOCK_IO_ERROR event, for
2058 * example, according to documentation is always followed by
2059 * the STOP event.
2060 */
2061 if (runstate_is_running()) {
2062 qapi_event_send_stop(&error_abort);
Markus Armbrusterf0561582018-04-23 10:45:18 +02002063 qapi_event_send_resume(&error_abort);
2064 return -1;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002065 }
2066
2067 /* We are sending this now, but the CPUs will be resumed shortly later */
2068 qapi_event_send_resume(&error_abort);
Markus Armbrusterf0561582018-04-23 10:45:18 +02002069
2070 replay_enable_events();
2071 cpu_enable_ticks();
2072 runstate_set(RUN_STATE_RUNNING);
2073 vm_state_notify(1, RUN_STATE_RUNNING);
2074 return 0;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002075}
2076
2077void vm_start(void)
2078{
2079 if (!vm_prepare_start()) {
2080 resume_all_vcpus();
2081 }
2082}
2083
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002084/* does a state transition even if the VM is already stopped,
2085 current state is forgotten forever */
Kevin Wolf56983462013-07-05 13:49:54 +02002086int vm_stop_force_state(RunState state)
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002087{
2088 if (runstate_is_running()) {
Kevin Wolf56983462013-07-05 13:49:54 +02002089 return vm_stop(state);
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002090 } else {
2091 runstate_set(state);
Wen Congyangb2780d32015-11-20 17:34:38 +08002092
2093 bdrv_drain_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02002094 /* Make sure to return an error if the flush in a previous vm_stop()
2095 * failed. */
John Snow22af08e2016-09-22 21:45:51 -04002096 return bdrv_flush_all();
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002097 }
2098}
2099
Stefan Weil9a78eea2010-10-22 23:03:33 +02002100void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
Blue Swirl262353c2010-05-04 19:55:35 +00002101{
2102 /* XXX: implement xxx_cpu_list for targets that still miss it */
Peter Maydelle916cbf2012-09-05 17:41:08 -03002103#if defined(cpu_list)
2104 cpu_list(f, cpu_fprintf);
Blue Swirl262353c2010-05-04 19:55:35 +00002105#endif
2106}
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002107
2108CpuInfoList *qmp_query_cpus(Error **errp)
2109{
Igor Mammedovafed5a52017-05-10 13:29:55 +02002110 MachineState *ms = MACHINE(qdev_get_machine());
2111 MachineClass *mc = MACHINE_GET_CLASS(ms);
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002112 CpuInfoList *head = NULL, *cur_item = NULL;
Andreas Färber182735e2013-05-29 22:29:20 +02002113 CPUState *cpu;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002114
Andreas Färberbdc44642013-06-24 23:50:24 +02002115 CPU_FOREACH(cpu) {
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002116 CpuInfoList *info;
Andreas Färber182735e2013-05-29 22:29:20 +02002117#if defined(TARGET_I386)
2118 X86CPU *x86_cpu = X86_CPU(cpu);
2119 CPUX86State *env = &x86_cpu->env;
2120#elif defined(TARGET_PPC)
2121 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
2122 CPUPPCState *env = &ppc_cpu->env;
2123#elif defined(TARGET_SPARC)
2124 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
2125 CPUSPARCState *env = &sparc_cpu->env;
Michael Clark25fa1942018-03-03 01:32:59 +13002126#elif defined(TARGET_RISCV)
2127 RISCVCPU *riscv_cpu = RISCV_CPU(cpu);
2128 CPURISCVState *env = &riscv_cpu->env;
Andreas Färber182735e2013-05-29 22:29:20 +02002129#elif defined(TARGET_MIPS)
2130 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
2131 CPUMIPSState *env = &mips_cpu->env;
Bastian Koppelmann48e06fe2014-09-01 12:59:46 +01002132#elif defined(TARGET_TRICORE)
2133 TriCoreCPU *tricore_cpu = TRICORE_CPU(cpu);
2134 CPUTriCoreState *env = &tricore_cpu->env;
Viktor Mihajlovski9d0306d2018-02-16 17:08:37 +01002135#elif defined(TARGET_S390X)
2136 S390CPU *s390_cpu = S390_CPU(cpu);
2137 CPUS390XState *env = &s390_cpu->env;
Andreas Färber182735e2013-05-29 22:29:20 +02002138#endif
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002139
Andreas Färbercb446ec2013-05-01 14:24:52 +02002140 cpu_synchronize_state(cpu);
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002141
2142 info = g_malloc0(sizeof(*info));
2143 info->value = g_malloc0(sizeof(*info->value));
Andreas Färber55e5c282012-12-17 06:18:02 +01002144 info->value->CPU = cpu->cpu_index;
Andreas Färber182735e2013-05-29 22:29:20 +02002145 info->value->current = (cpu == first_cpu);
Andreas Färber259186a2013-01-17 18:51:17 +01002146 info->value->halted = cpu->halted;
Eduardo Habkost58f88d42015-05-08 16:04:22 -03002147 info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
Andreas Färber9f09e182012-05-03 06:59:07 +02002148 info->value->thread_id = cpu->thread_id;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002149#if defined(TARGET_I386)
Eric Blake86f4b682015-11-18 01:52:59 -07002150 info->value->arch = CPU_INFO_ARCH_X86;
Eric Blake544a3732016-02-17 23:48:27 -07002151 info->value->u.x86.pc = env->eip + env->segs[R_CS].base;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002152#elif defined(TARGET_PPC)
Eric Blake86f4b682015-11-18 01:52:59 -07002153 info->value->arch = CPU_INFO_ARCH_PPC;
Eric Blake544a3732016-02-17 23:48:27 -07002154 info->value->u.ppc.nip = env->nip;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002155#elif defined(TARGET_SPARC)
Eric Blake86f4b682015-11-18 01:52:59 -07002156 info->value->arch = CPU_INFO_ARCH_SPARC;
Eric Blake544a3732016-02-17 23:48:27 -07002157 info->value->u.q_sparc.pc = env->pc;
2158 info->value->u.q_sparc.npc = env->npc;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002159#elif defined(TARGET_MIPS)
Eric Blake86f4b682015-11-18 01:52:59 -07002160 info->value->arch = CPU_INFO_ARCH_MIPS;
Eric Blake544a3732016-02-17 23:48:27 -07002161 info->value->u.q_mips.PC = env->active_tc.PC;
Bastian Koppelmann48e06fe2014-09-01 12:59:46 +01002162#elif defined(TARGET_TRICORE)
Eric Blake86f4b682015-11-18 01:52:59 -07002163 info->value->arch = CPU_INFO_ARCH_TRICORE;
Eric Blake544a3732016-02-17 23:48:27 -07002164 info->value->u.tricore.PC = env->PC;
Viktor Mihajlovski9d0306d2018-02-16 17:08:37 +01002165#elif defined(TARGET_S390X)
2166 info->value->arch = CPU_INFO_ARCH_S390;
2167 info->value->u.s390.cpu_state = env->cpu_state;
Michael Clark25fa1942018-03-03 01:32:59 +13002168#elif defined(TARGET_RISCV)
2169 info->value->arch = CPU_INFO_ARCH_RISCV;
2170 info->value->u.riscv.pc = env->pc;
Eric Blake86f4b682015-11-18 01:52:59 -07002171#else
2172 info->value->arch = CPU_INFO_ARCH_OTHER;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002173#endif
Igor Mammedovafed5a52017-05-10 13:29:55 +02002174 info->value->has_props = !!mc->cpu_index_to_instance_props;
2175 if (info->value->has_props) {
2176 CpuInstanceProperties *props;
2177 props = g_malloc0(sizeof(*props));
2178 *props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
2179 info->value->props = props;
2180 }
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002181
2182 /* XXX: waiting for the qapi to support GSList */
2183 if (!cur_item) {
2184 head = cur_item = info;
2185 } else {
2186 cur_item->next = info;
2187 cur_item = info;
2188 }
2189 }
2190
2191 return head;
2192}
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002193
Laszlo Ersekdaa9d2b2018-04-27 21:28:51 +02002194static CpuInfoArch sysemu_target_to_cpuinfo_arch(SysEmuTarget target)
2195{
2196 /*
2197 * The @SysEmuTarget -> @CpuInfoArch mapping below is based on the
2198 * TARGET_ARCH -> TARGET_BASE_ARCH mapping in the "configure" script.
2199 */
2200 switch (target) {
2201 case SYS_EMU_TARGET_I386:
2202 case SYS_EMU_TARGET_X86_64:
2203 return CPU_INFO_ARCH_X86;
2204
2205 case SYS_EMU_TARGET_PPC:
2206 case SYS_EMU_TARGET_PPCEMB:
2207 case SYS_EMU_TARGET_PPC64:
2208 return CPU_INFO_ARCH_PPC;
2209
2210 case SYS_EMU_TARGET_SPARC:
2211 case SYS_EMU_TARGET_SPARC64:
2212 return CPU_INFO_ARCH_SPARC;
2213
2214 case SYS_EMU_TARGET_MIPS:
2215 case SYS_EMU_TARGET_MIPSEL:
2216 case SYS_EMU_TARGET_MIPS64:
2217 case SYS_EMU_TARGET_MIPS64EL:
2218 return CPU_INFO_ARCH_MIPS;
2219
2220 case SYS_EMU_TARGET_TRICORE:
2221 return CPU_INFO_ARCH_TRICORE;
2222
2223 case SYS_EMU_TARGET_S390X:
2224 return CPU_INFO_ARCH_S390;
2225
2226 case SYS_EMU_TARGET_RISCV32:
2227 case SYS_EMU_TARGET_RISCV64:
2228 return CPU_INFO_ARCH_RISCV;
2229
2230 default:
2231 return CPU_INFO_ARCH_OTHER;
2232 }
2233}
2234
2235static void cpustate_to_cpuinfo_s390(CpuInfoS390 *info, const CPUState *cpu)
2236{
2237#ifdef TARGET_S390X
2238 S390CPU *s390_cpu = S390_CPU(cpu);
2239 CPUS390XState *env = &s390_cpu->env;
2240
2241 info->cpu_state = env->cpu_state;
2242#else
2243 abort();
2244#endif
2245}
2246
Luiz Capitulinoce74ee32018-02-16 17:08:38 +01002247/*
2248 * fast means: we NEVER interrupt vCPU threads to retrieve
2249 * information from KVM.
2250 */
2251CpuInfoFastList *qmp_query_cpus_fast(Error **errp)
2252{
2253 MachineState *ms = MACHINE(qdev_get_machine());
2254 MachineClass *mc = MACHINE_GET_CLASS(ms);
2255 CpuInfoFastList *head = NULL, *cur_item = NULL;
Laszlo Ersekdaa9d2b2018-04-27 21:28:51 +02002256 SysEmuTarget target = qapi_enum_parse(&SysEmuTarget_lookup, TARGET_NAME,
2257 -1, &error_abort);
Luiz Capitulinoce74ee32018-02-16 17:08:38 +01002258 CPUState *cpu;
2259
2260 CPU_FOREACH(cpu) {
2261 CpuInfoFastList *info = g_malloc0(sizeof(*info));
2262 info->value = g_malloc0(sizeof(*info->value));
2263
2264 info->value->cpu_index = cpu->cpu_index;
2265 info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
2266 info->value->thread_id = cpu->thread_id;
2267
2268 info->value->has_props = !!mc->cpu_index_to_instance_props;
2269 if (info->value->has_props) {
2270 CpuInstanceProperties *props;
2271 props = g_malloc0(sizeof(*props));
2272 *props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
2273 info->value->props = props;
2274 }
2275
Laszlo Ersekdaa9d2b2018-04-27 21:28:51 +02002276 info->value->arch = sysemu_target_to_cpuinfo_arch(target);
2277 info->value->target = target;
2278 if (target == SYS_EMU_TARGET_S390X) {
2279 cpustate_to_cpuinfo_s390(&info->value->u.s390x, cpu);
Laszlo Ersekdaa9d2b2018-04-27 21:28:51 +02002280 }
2281
Luiz Capitulinoce74ee32018-02-16 17:08:38 +01002282 if (!cur_item) {
2283 head = cur_item = info;
2284 } else {
2285 cur_item->next = info;
2286 cur_item = info;
2287 }
2288 }
2289
2290 return head;
2291}
2292
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002293void qmp_memsave(int64_t addr, int64_t size, const char *filename,
2294 bool has_cpu, int64_t cpu_index, Error **errp)
2295{
2296 FILE *f;
2297 uint32_t l;
Andreas Färber55e5c282012-12-17 06:18:02 +01002298 CPUState *cpu;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002299 uint8_t buf[1024];
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002300 int64_t orig_addr = addr, orig_size = size;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002301
2302 if (!has_cpu) {
2303 cpu_index = 0;
2304 }
2305
Andreas Färber151d1322013-02-15 15:41:49 +01002306 cpu = qemu_get_cpu(cpu_index);
2307 if (cpu == NULL) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002308 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
2309 "a CPU number");
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002310 return;
2311 }
2312
2313 f = fopen(filename, "wb");
2314 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002315 error_setg_file_open(errp, errno, filename);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002316 return;
2317 }
2318
2319 while (size != 0) {
2320 l = sizeof(buf);
2321 if (l > size)
2322 l = size;
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302323 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002324 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
2325 " specified", orig_addr, orig_size);
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302326 goto exit;
2327 }
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002328 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002329 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002330 goto exit;
2331 }
2332 addr += l;
2333 size -= l;
2334 }
2335
2336exit:
2337 fclose(f);
2338}
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002339
2340void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
2341 Error **errp)
2342{
2343 FILE *f;
2344 uint32_t l;
2345 uint8_t buf[1024];
2346
2347 f = fopen(filename, "wb");
2348 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002349 error_setg_file_open(errp, errno, filename);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002350 return;
2351 }
2352
2353 while (size != 0) {
2354 l = sizeof(buf);
2355 if (l > size)
2356 l = size;
Stefan Weileb6282f2014-04-07 20:28:23 +02002357 cpu_physical_memory_read(addr, buf, l);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002358 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002359 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002360 goto exit;
2361 }
2362 addr += l;
2363 size -= l;
2364 }
2365
2366exit:
2367 fclose(f);
2368}
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002369
2370void qmp_inject_nmi(Error **errp)
2371{
Alexey Kardashevskiy9cb805f2014-08-20 22:16:33 +10002372 nmi_monitor_handle(monitor_get_cpu_index(), errp);
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002373}
Sebastian Tanase27498be2014-07-25 11:56:33 +02002374
2375void dump_drift_info(FILE *f, fprintf_function cpu_fprintf)
2376{
2377 if (!use_icount) {
2378 return;
2379 }
2380
2381 cpu_fprintf(f, "Host - Guest clock %"PRIi64" ms\n",
2382 (cpu_get_clock() - cpu_get_icount())/SCALE_MS);
2383 if (icount_align_option) {
2384 cpu_fprintf(f, "Max guest delay %"PRIi64" ms\n", -max_delay/SCALE_MS);
2385 cpu_fprintf(f, "Max guest advance %"PRIi64" ms\n", max_advance/SCALE_MS);
2386 } else {
2387 cpu_fprintf(f, "Max guest delay NA\n");
2388 cpu_fprintf(f, "Max guest advance NA\n");
2389 }
2390}