blob: f4ad855b774e9a9e357173e60395a1f2556f432e [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"
Markus Armbrustera8d25322019-05-23 16:35:08 +020026#include "qemu-common.h"
KONRAD Frederic8d4e9142017-02-23 18:29:08 +000027#include "qemu/config-file.h"
Markus Armbrusterd6454272019-08-12 07:23:45 +020028#include "migration/vmstate.h"
Paolo Bonzini83c90892012-12-17 18:19:49 +010029#include "monitor/monitor.h"
Markus Armbrustere688df62018-02-01 12:18:31 +010030#include "qapi/error.h"
Markus Armbruster112ed242018-02-26 17:13:27 -060031#include "qapi/qapi-commands-misc.h"
Markus Armbruster9af23982018-02-11 10:36:01 +010032#include "qapi/qapi-events-run-state.h"
Wenchao Xiaa4e15de2014-06-18 08:43:36 +020033#include "qapi/qmp/qerror.h"
Markus Armbrusterd49b6832015-03-17 18:29:20 +010034#include "qemu/error-report.h"
Markus Armbruster76c86612019-04-17 21:17:53 +020035#include "qemu/qemu-print.h"
Markus Armbruster14a48c12019-05-23 16:35:05 +020036#include "sysemu/tcg.h"
Max Reitzda31d592016-03-16 19:54:32 +010037#include "sysemu/block-backend.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010038#include "exec/gdbstub.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010039#include "sysemu/dma.h"
Vincent Palatinb3946622017-01-10 11:59:55 +010040#include "sysemu/hw_accel.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010041#include "sysemu/kvm.h"
Vincent Palatinb0cb0a62017-01-10 11:59:57 +010042#include "sysemu/hax.h"
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -050043#include "sysemu/hvf.h"
Justin Terry (VM)19306802018-01-22 13:07:49 -080044#include "sysemu/whpx.h"
Paolo Bonzini63c91552016-03-15 13:18:37 +010045#include "exec/exec-all.h"
Blue Swirl296af7c2010-03-29 19:23:50 +000046
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010047#include "qemu/thread.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010048#include "sysemu/cpus.h"
49#include "sysemu/qtest.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010050#include "qemu/main-loop.h"
Markus Armbruster922a01a2018-02-01 12:18:46 +010051#include "qemu/option.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010052#include "qemu/bitmap.h"
Liu Ping Fancb365642013-09-25 14:20:58 +080053#include "qemu/seqlock.h"
Richard Henderson9c09a252019-03-14 13:06:29 -070054#include "qemu/guest-random.h"
KONRAD Frederic8d4e9142017-02-23 18:29:08 +000055#include "tcg.h"
Alexey Kardashevskiy9cb805f2014-08-20 22:16:33 +100056#include "hw/nmi.h"
Pavel Dovgalyuk8b427042015-09-17 19:24:05 +030057#include "sysemu/replay.h"
Markus Armbruster54d31232019-08-12 07:23:59 +020058#include "sysemu/runstate.h"
Like Xu5cc87672019-05-19 04:54:21 +080059#include "hw/boards.h"
Markus Armbruster650d1032019-08-12 07:23:48 +020060#include "hw/hw.h"
Jan Kiszka0ff0fc12011-06-23 10:15:55 +020061
Jan Kiszka6d9cb732011-02-01 22:15:58 +010062#ifdef CONFIG_LINUX
63
64#include <sys/prctl.h>
65
Marcelo Tosattic0532a72010-10-11 15:31:21 -030066#ifndef PR_MCE_KILL
67#define PR_MCE_KILL 33
68#endif
69
Jan Kiszka6d9cb732011-02-01 22:15:58 +010070#ifndef PR_MCE_KILL_SET
71#define PR_MCE_KILL_SET 1
72#endif
73
74#ifndef PR_MCE_KILL_EARLY
75#define PR_MCE_KILL_EARLY 1
76#endif
77
78#endif /* CONFIG_LINUX */
79
Sebastian Tanase27498be2014-07-25 11:56:33 +020080int64_t max_delay;
81int64_t max_advance;
Blue Swirl296af7c2010-03-29 19:23:50 +000082
Jason J. Herne2adcc852015-09-08 13:12:33 -040083/* vcpu throttling controls */
84static QEMUTimer *throttle_timer;
85static unsigned int throttle_percentage;
86
87#define CPU_THROTTLE_PCT_MIN 1
88#define CPU_THROTTLE_PCT_MAX 99
89#define CPU_THROTTLE_TIMESLICE_NS 10000000
90
Tiejun Chen321bc0b2013-08-02 09:43:09 +080091bool cpu_is_stopped(CPUState *cpu)
92{
93 return cpu->stopped || !runstate_is_running();
94}
95
Andreas Färbera98ae1d2013-05-26 23:21:08 +020096static bool cpu_thread_is_idle(CPUState *cpu)
Peter Maydellac873f12012-07-19 16:52:27 +010097{
Andreas Färberc64ca812012-05-03 02:11:45 +020098 if (cpu->stop || cpu->queued_work_first) {
Peter Maydellac873f12012-07-19 16:52:27 +010099 return false;
100 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +0800101 if (cpu_is_stopped(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +0100102 return true;
103 }
Andreas Färber8c2e1b02013-08-25 18:53:55 +0200104 if (!cpu->halted || cpu_has_work(cpu) ||
Alexander Graf215e79c2013-04-24 22:24:12 +0200105 kvm_halt_in_kernel()) {
Peter Maydellac873f12012-07-19 16:52:27 +0100106 return false;
107 }
108 return true;
109}
110
111static bool all_cpu_threads_idle(void)
112{
Andreas Färber182735e2013-05-29 22:29:20 +0200113 CPUState *cpu;
Peter Maydellac873f12012-07-19 16:52:27 +0100114
Andreas Färberbdc44642013-06-24 23:50:24 +0200115 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200116 if (!cpu_thread_is_idle(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +0100117 return false;
118 }
119 }
120 return true;
121}
122
Blue Swirl296af7c2010-03-29 19:23:50 +0000123/***********************************************************/
Paolo Bonzini946fb272011-09-12 13:57:37 +0200124/* guest cycle counter */
125
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200126/* Protected by TimersState seqlock */
127
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200128static bool icount_sleep = true;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200129/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
130#define MAX_ICOUNT_SHIFT 10
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200131
Paolo Bonzini946fb272011-09-12 13:57:37 +0200132typedef struct TimersState {
Liu Ping Fancb365642013-09-25 14:20:58 +0800133 /* Protected by BQL. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200134 int64_t cpu_ticks_prev;
135 int64_t cpu_ticks_offset;
Liu Ping Fancb365642013-09-25 14:20:58 +0800136
Paolo Bonzini94377112018-08-14 09:57:16 +0200137 /* Protect fields that can be respectively read outside the
138 * BQL, and written from multiple threads.
Liu Ping Fancb365642013-09-25 14:20:58 +0800139 */
140 QemuSeqLock vm_clock_seqlock;
Paolo Bonzini94377112018-08-14 09:57:16 +0200141 QemuSpin vm_clock_lock;
142
143 int16_t cpu_ticks_enabled;
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200144
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200145 /* Conversion factor from emulated instructions to virtual clock ticks. */
Paolo Bonzini94377112018-08-14 09:57:16 +0200146 int16_t icount_time_shift;
147
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200148 /* Compensate for varying guest execution speed. */
149 int64_t qemu_icount_bias;
Paolo Bonzini94377112018-08-14 09:57:16 +0200150
151 int64_t vm_clock_warp_start;
152 int64_t cpu_clock_offset;
153
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200154 /* Only written by TCG thread */
155 int64_t qemu_icount;
Paolo Bonzini94377112018-08-14 09:57:16 +0200156
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300157 /* for adjusting icount */
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300158 QEMUTimer *icount_rt_timer;
159 QEMUTimer *icount_vm_timer;
160 QEMUTimer *icount_warp_timer;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200161} TimersState;
162
Liu Ping Fand9cd4002013-07-21 08:43:00 +0000163static TimersState timers_state;
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000164bool mttcg_enabled;
165
166/*
167 * We default to false if we know other options have been enabled
168 * which are currently incompatible with MTTCG. Otherwise when each
169 * guest (target) has been updated to support:
170 * - atomic instructions
171 * - memory ordering primitives (barriers)
172 * they can set the appropriate CONFIG flags in ${target}-softmmu.mak
173 *
174 * Once a guest architecture has been converted to the new primitives
175 * there are two remaining limitations to check.
176 *
177 * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
178 * - The host must have a stronger memory order than the guest
179 *
180 * It may be possible in future to support strong guests on weak hosts
181 * but that will require tagging all load/stores in a guest with their
182 * implicit memory order requirements which would likely slow things
183 * down a lot.
184 */
185
186static bool check_tcg_memory_orders_compatible(void)
187{
188#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
189 return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
190#else
191 return false;
192#endif
193}
194
195static bool default_mttcg_enabled(void)
196{
Alex Bennée83fd9622017-02-27 17:09:01 +0000197 if (use_icount || TCG_OVERSIZED_GUEST) {
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000198 return false;
199 } else {
200#ifdef TARGET_SUPPORTS_MTTCG
201 return check_tcg_memory_orders_compatible();
202#else
203 return false;
204#endif
205 }
206}
207
208void qemu_tcg_configure(QemuOpts *opts, Error **errp)
209{
210 const char *t = qemu_opt_get(opts, "thread");
211 if (t) {
212 if (strcmp(t, "multi") == 0) {
213 if (TCG_OVERSIZED_GUEST) {
214 error_setg(errp, "No MTTCG when guest word size > hosts");
Alex Bennée83fd9622017-02-27 17:09:01 +0000215 } else if (use_icount) {
216 error_setg(errp, "No MTTCG when icount is enabled");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000217 } else {
Nikunj A Dadhania86953502017-04-10 11:36:55 +0530218#ifndef TARGET_SUPPORTS_MTTCG
Markus Armbruster07656912018-10-17 10:26:28 +0200219 warn_report("Guest not yet converted to MTTCG - "
220 "you may get unexpected results");
Alex Bennéec34c7622017-02-28 14:40:17 +0000221#endif
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000222 if (!check_tcg_memory_orders_compatible()) {
Markus Armbruster07656912018-10-17 10:26:28 +0200223 warn_report("Guest expects a stronger memory ordering "
224 "than the host provides");
Pranith Kumar8cfef892017-03-25 16:19:23 -0400225 error_printf("This may cause strange/hard to debug errors\n");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000226 }
227 mttcg_enabled = true;
228 }
229 } else if (strcmp(t, "single") == 0) {
230 mttcg_enabled = false;
231 } else {
232 error_setg(errp, "Invalid 'thread' setting %s", t);
233 }
234 } else {
235 mttcg_enabled = default_mttcg_enabled();
236 }
237}
Paolo Bonzini946fb272011-09-12 13:57:37 +0200238
Alex Bennéee4cd9652017-03-31 16:09:42 +0100239/* The current number of executed instructions is based on what we
240 * originally budgeted minus the current state of the decrementing
241 * icount counters in extra/u16.low.
242 */
243static int64_t cpu_get_icount_executed(CPUState *cpu)
244{
Richard Henderson5e140192019-03-28 11:54:23 -1000245 return (cpu->icount_budget -
246 (cpu_neg(cpu)->icount_decr.u16.low + cpu->icount_extra));
Alex Bennéee4cd9652017-03-31 16:09:42 +0100247}
248
Alex Bennée512d3c82017-04-05 12:32:37 +0100249/*
250 * Update the global shared timer_state.qemu_icount to take into
251 * account executed instructions. This is done by the TCG vCPU
252 * thread so the main-loop can see time has moved forward.
253 */
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200254static void cpu_update_icount_locked(CPUState *cpu)
Alex Bennée512d3c82017-04-05 12:32:37 +0100255{
256 int64_t executed = cpu_get_icount_executed(cpu);
257 cpu->icount_budget -= executed;
258
Emilio G. Cota38adcb62018-09-10 19:27:49 -0400259 atomic_set_i64(&timers_state.qemu_icount,
260 timers_state.qemu_icount + executed);
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200261}
262
263/*
264 * Update the global shared timer_state.qemu_icount to take into
265 * account executed instructions. This is done by the TCG vCPU
266 * thread so the main-loop can see time has moved forward.
267 */
268void cpu_update_icount(CPUState *cpu)
269{
270 seqlock_write_lock(&timers_state.vm_clock_seqlock,
271 &timers_state.vm_clock_lock);
272 cpu_update_icount_locked(cpu);
Paolo Bonzini94377112018-08-14 09:57:16 +0200273 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
274 &timers_state.vm_clock_lock);
Alex Bennée512d3c82017-04-05 12:32:37 +0100275}
276
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200277static int64_t cpu_get_icount_raw_locked(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200278{
Andreas Färber4917cf42013-05-27 05:17:50 +0200279 CPUState *cpu = current_cpu;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200280
Alex Bennée243c5f72017-03-30 18:49:22 +0100281 if (cpu && cpu->running) {
Paolo Bonzini414b15c2015-06-24 14:16:26 +0200282 if (!cpu->can_do_io) {
Alistair Francis493d89b2018-02-03 09:43:14 +0100283 error_report("Bad icount read");
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300284 exit(1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200285 }
Alex Bennéee4cd9652017-03-31 16:09:42 +0100286 /* Take into account what has run */
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200287 cpu_update_icount_locked(cpu);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200288 }
Emilio G. Cota38adcb62018-09-10 19:27:49 -0400289 /* The read is protected by the seqlock, but needs atomic64 to avoid UB */
290 return atomic_read_i64(&timers_state.qemu_icount);
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200291}
292
293static int64_t cpu_get_icount_locked(void)
294{
295 int64_t icount = cpu_get_icount_raw_locked();
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400296 return atomic_read_i64(&timers_state.qemu_icount_bias) +
297 cpu_icount_to_ns(icount);
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200298}
299
300int64_t cpu_get_icount_raw(void)
301{
302 int64_t icount;
303 unsigned start;
304
305 do {
306 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
307 icount = cpu_get_icount_raw_locked();
308 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
309
310 return icount;
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300311}
312
313/* Return the virtual CPU time, based on the instruction counter. */
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200314int64_t cpu_get_icount(void)
315{
316 int64_t icount;
317 unsigned start;
318
319 do {
320 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
321 icount = cpu_get_icount_locked();
322 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
323
324 return icount;
325}
326
KONRAD Frederic3f031312014-08-01 01:37:15 +0200327int64_t cpu_icount_to_ns(int64_t icount)
328{
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200329 return icount << atomic_read(&timers_state.icount_time_shift);
KONRAD Frederic3f031312014-08-01 01:37:15 +0200330}
331
Paolo Bonzinif2a4ad62018-08-18 09:36:16 +0200332static int64_t cpu_get_ticks_locked(void)
333{
334 int64_t ticks = timers_state.cpu_ticks_offset;
335 if (timers_state.cpu_ticks_enabled) {
336 ticks += cpu_get_host_ticks();
337 }
338
339 if (timers_state.cpu_ticks_prev > ticks) {
340 /* Non increasing ticks may happen if the host uses software suspend. */
341 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
342 ticks = timers_state.cpu_ticks_prev;
343 }
344
345 timers_state.cpu_ticks_prev = ticks;
346 return ticks;
347}
348
Cao jind90f3cc2016-07-29 19:05:38 +0800349/* return the time elapsed in VM between vm_start and vm_stop. Unless
350 * icount is active, cpu_get_ticks() uses units of the host CPU cycle
351 * counter.
Cao jind90f3cc2016-07-29 19:05:38 +0800352 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200353int64_t cpu_get_ticks(void)
354{
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100355 int64_t ticks;
356
Paolo Bonzini946fb272011-09-12 13:57:37 +0200357 if (use_icount) {
358 return cpu_get_icount();
359 }
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100360
Paolo Bonzinif2a4ad62018-08-18 09:36:16 +0200361 qemu_spin_lock(&timers_state.vm_clock_lock);
362 ticks = cpu_get_ticks_locked();
363 qemu_spin_unlock(&timers_state.vm_clock_lock);
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100364 return ticks;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200365}
366
Liu Ping Fancb365642013-09-25 14:20:58 +0800367static int64_t cpu_get_clock_locked(void)
368{
Cao jin1d45cea2016-07-29 19:05:37 +0800369 int64_t time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800370
Cao jin1d45cea2016-07-29 19:05:37 +0800371 time = timers_state.cpu_clock_offset;
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100372 if (timers_state.cpu_ticks_enabled) {
Cao jin1d45cea2016-07-29 19:05:37 +0800373 time += get_clock();
Liu Ping Fancb365642013-09-25 14:20:58 +0800374 }
375
Cao jin1d45cea2016-07-29 19:05:37 +0800376 return time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800377}
378
Cao jind90f3cc2016-07-29 19:05:38 +0800379/* Return the monotonic time elapsed in VM, i.e.,
Peter Maydell8212ff82016-09-15 10:24:22 +0100380 * the time between vm_start and vm_stop
381 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200382int64_t cpu_get_clock(void)
383{
384 int64_t ti;
Liu Ping Fancb365642013-09-25 14:20:58 +0800385 unsigned start;
386
387 do {
388 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
389 ti = cpu_get_clock_locked();
390 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
391
392 return ti;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200393}
394
Liu Ping Fancb365642013-09-25 14:20:58 +0800395/* enable cpu_get_ticks()
Cao jin3224e872016-07-08 18:31:37 +0800396 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800397 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200398void cpu_enable_ticks(void)
399{
Paolo Bonzini94377112018-08-14 09:57:16 +0200400 seqlock_write_lock(&timers_state.vm_clock_seqlock,
401 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200402 if (!timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400403 timers_state.cpu_ticks_offset -= cpu_get_host_ticks();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200404 timers_state.cpu_clock_offset -= get_clock();
405 timers_state.cpu_ticks_enabled = 1;
406 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200407 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
408 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200409}
410
411/* disable cpu_get_ticks() : the clock is stopped. You must not call
Liu Ping Fancb365642013-09-25 14:20:58 +0800412 * cpu_get_ticks() after that.
Cao jin3224e872016-07-08 18:31:37 +0800413 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800414 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200415void cpu_disable_ticks(void)
416{
Paolo Bonzini94377112018-08-14 09:57:16 +0200417 seqlock_write_lock(&timers_state.vm_clock_seqlock,
418 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200419 if (timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400420 timers_state.cpu_ticks_offset += cpu_get_host_ticks();
Liu Ping Fancb365642013-09-25 14:20:58 +0800421 timers_state.cpu_clock_offset = cpu_get_clock_locked();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200422 timers_state.cpu_ticks_enabled = 0;
423 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200424 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
425 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200426}
427
428/* Correlation between real and virtual time is always going to be
429 fairly approximate, so ignore small variation.
430 When the guest is idle real and virtual time will be aligned in
431 the IO wait loop. */
Rutuja Shah73bcb242016-03-21 21:32:30 +0530432#define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200433
434static void icount_adjust(void)
435{
436 int64_t cur_time;
437 int64_t cur_icount;
438 int64_t delta;
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200439
440 /* Protected by TimersState mutex. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200441 static int64_t last_delta;
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200442
Paolo Bonzini946fb272011-09-12 13:57:37 +0200443 /* If the VM is not running, then do nothing. */
444 if (!runstate_is_running()) {
445 return;
446 }
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200447
Paolo Bonzini94377112018-08-14 09:57:16 +0200448 seqlock_write_lock(&timers_state.vm_clock_seqlock,
449 &timers_state.vm_clock_lock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200450 cur_time = cpu_get_clock_locked();
451 cur_icount = cpu_get_icount_locked();
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200452
Paolo Bonzini946fb272011-09-12 13:57:37 +0200453 delta = cur_icount - cur_time;
454 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
455 if (delta > 0
456 && last_delta + ICOUNT_WOBBLE < delta * 2
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200457 && timers_state.icount_time_shift > 0) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200458 /* The guest is getting too far ahead. Slow time down. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200459 atomic_set(&timers_state.icount_time_shift,
460 timers_state.icount_time_shift - 1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200461 }
462 if (delta < 0
463 && last_delta - ICOUNT_WOBBLE > delta * 2
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200464 && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200465 /* The guest is getting too far behind. Speed time up. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200466 atomic_set(&timers_state.icount_time_shift,
467 timers_state.icount_time_shift + 1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200468 }
469 last_delta = delta;
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400470 atomic_set_i64(&timers_state.qemu_icount_bias,
471 cur_icount - (timers_state.qemu_icount
472 << timers_state.icount_time_shift));
Paolo Bonzini94377112018-08-14 09:57:16 +0200473 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
474 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200475}
476
477static void icount_adjust_rt(void *opaque)
478{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300479 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyuk1979b902015-01-12 15:00:43 +0300480 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200481 icount_adjust();
482}
483
484static void icount_adjust_vm(void *opaque)
485{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300486 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100487 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530488 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200489 icount_adjust();
490}
491
492static int64_t qemu_icount_round(int64_t count)
493{
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200494 int shift = atomic_read(&timers_state.icount_time_shift);
495 return (count + (1 << shift) - 1) >> shift;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200496}
497
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300498static void icount_warp_rt(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200499{
Alex Bennéeccffff42016-04-04 15:35:48 +0100500 unsigned seq;
501 int64_t warp_start;
502
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200503 /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
504 * changes from -1 to another value, so the race here is okay.
505 */
Alex Bennéeccffff42016-04-04 15:35:48 +0100506 do {
507 seq = seqlock_read_begin(&timers_state.vm_clock_seqlock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300508 warp_start = timers_state.vm_clock_warp_start;
Alex Bennéeccffff42016-04-04 15:35:48 +0100509 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq));
510
511 if (warp_start == -1) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200512 return;
513 }
514
Paolo Bonzini94377112018-08-14 09:57:16 +0200515 seqlock_write_lock(&timers_state.vm_clock_seqlock,
516 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200517 if (runstate_is_running()) {
Paolo Bonzini74c0b812018-10-08 13:24:14 +0200518 int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT,
519 cpu_get_clock_locked());
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200520 int64_t warp_delta;
521
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300522 warp_delta = clock - timers_state.vm_clock_warp_start;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200523 if (use_icount == 2) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200524 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100525 * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
Paolo Bonzini946fb272011-09-12 13:57:37 +0200526 * far ahead of real time.
527 */
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200528 int64_t cur_icount = cpu_get_icount_locked();
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300529 int64_t delta = clock - cur_icount;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200530 warp_delta = MIN(warp_delta, delta);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200531 }
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400532 atomic_set_i64(&timers_state.qemu_icount_bias,
533 timers_state.qemu_icount_bias + warp_delta);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200534 }
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300535 timers_state.vm_clock_warp_start = -1;
Paolo Bonzini94377112018-08-14 09:57:16 +0200536 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
537 &timers_state.vm_clock_lock);
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200538
539 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
540 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
541 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200542}
543
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300544static void icount_timer_cb(void *opaque)
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300545{
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300546 /* No need for a checkpoint because the timer already synchronizes
547 * with CHECKPOINT_CLOCK_VIRTUAL_RT.
548 */
549 icount_warp_rt();
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300550}
551
Paolo Bonzini8156be52012-03-28 15:42:04 +0200552void qtest_clock_warp(int64_t dest)
553{
Alex Bligh40daca52013-08-21 16:03:02 +0100554 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800555 AioContext *aio_context;
Paolo Bonzini8156be52012-03-28 15:42:04 +0200556 assert(qtest_enabled());
Fam Zhengefef88b2015-01-19 17:51:43 +0800557 aio_context = qemu_get_aio_context();
Paolo Bonzini8156be52012-03-28 15:42:04 +0200558 while (clock < dest) {
Alex Bligh40daca52013-08-21 16:03:02 +0100559 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
Sergey Fedorovc9299e22014-06-10 13:10:28 +0400560 int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
Fam Zhengefef88b2015-01-19 17:51:43 +0800561
Paolo Bonzini94377112018-08-14 09:57:16 +0200562 seqlock_write_lock(&timers_state.vm_clock_seqlock,
563 &timers_state.vm_clock_lock);
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400564 atomic_set_i64(&timers_state.qemu_icount_bias,
565 timers_state.qemu_icount_bias + warp);
Paolo Bonzini94377112018-08-14 09:57:16 +0200566 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
567 &timers_state.vm_clock_lock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200568
Alex Bligh40daca52013-08-21 16:03:02 +0100569 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800570 timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
Alex Bligh40daca52013-08-21 16:03:02 +0100571 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200572 }
Alex Bligh40daca52013-08-21 16:03:02 +0100573 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200574}
575
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300576void qemu_start_warp_timer(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200577{
Paolo Bonzinice78d182013-10-07 17:30:02 +0200578 int64_t clock;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200579 int64_t deadline;
580
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300581 if (!use_icount) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200582 return;
583 }
584
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300585 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
586 * do not fire, so computing the deadline does not make sense.
587 */
588 if (!runstate_is_running()) {
589 return;
590 }
591
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300592 if (replay_mode != REPLAY_MODE_PLAY) {
593 if (!all_cpu_threads_idle()) {
594 return;
595 }
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300596
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300597 if (qtest_enabled()) {
598 /* When testing, qtest commands advance icount. */
599 return;
600 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200601
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300602 replay_checkpoint(CHECKPOINT_CLOCK_WARP_START);
603 } else {
604 /* warp clock deterministically in record/replay mode */
605 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) {
606 /* vCPU is sleeping and warp can't be started.
607 It is probably a race condition: notification sent
608 to vCPU was processed in advance and vCPU went to sleep.
609 Therefore we have to wake it up for doing someting. */
610 if (replay_has_checkpoint()) {
611 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
612 }
613 return;
614 }
Paolo Bonzini8156be52012-03-28 15:42:04 +0200615 }
616
Alex Blighac70aaf2013-08-21 16:02:57 +0100617 /* We want to use the earliest deadline from ALL vm_clocks */
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300618 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT);
Alex Bligh40daca52013-08-21 16:03:02 +0100619 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200620 if (deadline < 0) {
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200621 static bool notified;
622 if (!icount_sleep && !notified) {
Alistair Francis3dc6f862017-07-12 06:57:41 -0700623 warn_report("icount sleep disabled and no active timers");
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200624 notified = true;
625 }
Paolo Bonzinice78d182013-10-07 17:30:02 +0200626 return;
Alex Blighac70aaf2013-08-21 16:02:57 +0100627 }
628
Paolo Bonzini946fb272011-09-12 13:57:37 +0200629 if (deadline > 0) {
630 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100631 * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to
Paolo Bonzini946fb272011-09-12 13:57:37 +0200632 * sleep. Otherwise, the CPU might be waiting for a future timer
633 * interrupt to wake it up, but the interrupt never comes because
634 * the vCPU isn't running any insns and thus doesn't advance the
Alex Bligh40daca52013-08-21 16:03:02 +0100635 * QEMU_CLOCK_VIRTUAL.
Paolo Bonzini946fb272011-09-12 13:57:37 +0200636 */
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200637 if (!icount_sleep) {
638 /*
639 * We never let VCPUs sleep in no sleep icount mode.
640 * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance
641 * to the next QEMU_CLOCK_VIRTUAL event and notify it.
642 * It is useful when we want a deterministic execution time,
643 * isolated from host latencies.
644 */
Paolo Bonzini94377112018-08-14 09:57:16 +0200645 seqlock_write_lock(&timers_state.vm_clock_seqlock,
646 &timers_state.vm_clock_lock);
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400647 atomic_set_i64(&timers_state.qemu_icount_bias,
648 timers_state.qemu_icount_bias + deadline);
Paolo Bonzini94377112018-08-14 09:57:16 +0200649 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
650 &timers_state.vm_clock_lock);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200651 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
652 } else {
653 /*
654 * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some
655 * "real" time, (related to the time left until the next event) has
656 * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this.
657 * This avoids that the warps are visible externally; for example,
658 * you will not be sending network packets continuously instead of
659 * every 100ms.
660 */
Paolo Bonzini94377112018-08-14 09:57:16 +0200661 seqlock_write_lock(&timers_state.vm_clock_seqlock,
662 &timers_state.vm_clock_lock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300663 if (timers_state.vm_clock_warp_start == -1
664 || timers_state.vm_clock_warp_start > clock) {
665 timers_state.vm_clock_warp_start = clock;
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200666 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200667 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
668 &timers_state.vm_clock_lock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300669 timer_mod_anticipate(timers_state.icount_warp_timer,
670 clock + deadline);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200671 }
Alex Blighac70aaf2013-08-21 16:02:57 +0100672 } else if (deadline == 0) {
Alex Bligh40daca52013-08-21 16:03:02 +0100673 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200674 }
675}
676
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300677static void qemu_account_warp_timer(void)
678{
679 if (!use_icount || !icount_sleep) {
680 return;
681 }
682
683 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
684 * do not fire, so computing the deadline does not make sense.
685 */
686 if (!runstate_is_running()) {
687 return;
688 }
689
690 /* warp clock deterministically in record/replay mode */
691 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) {
692 return;
693 }
694
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300695 timer_del(timers_state.icount_warp_timer);
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300696 icount_warp_rt();
697}
698
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200699static bool icount_state_needed(void *opaque)
700{
701 return use_icount;
702}
703
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300704static bool warp_timer_state_needed(void *opaque)
705{
706 TimersState *s = opaque;
707 return s->icount_warp_timer != NULL;
708}
709
710static bool adjust_timers_state_needed(void *opaque)
711{
712 TimersState *s = opaque;
713 return s->icount_rt_timer != NULL;
714}
715
716/*
717 * Subsection for warp timer migration is optional, because may not be created
718 */
719static const VMStateDescription icount_vmstate_warp_timer = {
720 .name = "timer/icount/warp_timer",
721 .version_id = 1,
722 .minimum_version_id = 1,
723 .needed = warp_timer_state_needed,
724 .fields = (VMStateField[]) {
725 VMSTATE_INT64(vm_clock_warp_start, TimersState),
726 VMSTATE_TIMER_PTR(icount_warp_timer, TimersState),
727 VMSTATE_END_OF_LIST()
728 }
729};
730
731static const VMStateDescription icount_vmstate_adjust_timers = {
732 .name = "timer/icount/timers",
733 .version_id = 1,
734 .minimum_version_id = 1,
735 .needed = adjust_timers_state_needed,
736 .fields = (VMStateField[]) {
737 VMSTATE_TIMER_PTR(icount_rt_timer, TimersState),
738 VMSTATE_TIMER_PTR(icount_vm_timer, TimersState),
739 VMSTATE_END_OF_LIST()
740 }
741};
742
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200743/*
744 * This is a subsection for icount migration.
745 */
746static const VMStateDescription icount_vmstate_timers = {
747 .name = "timer/icount",
748 .version_id = 1,
749 .minimum_version_id = 1,
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200750 .needed = icount_state_needed,
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200751 .fields = (VMStateField[]) {
752 VMSTATE_INT64(qemu_icount_bias, TimersState),
753 VMSTATE_INT64(qemu_icount, TimersState),
754 VMSTATE_END_OF_LIST()
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300755 },
756 .subsections = (const VMStateDescription*[]) {
757 &icount_vmstate_warp_timer,
758 &icount_vmstate_adjust_timers,
759 NULL
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200760 }
761};
762
Paolo Bonzini946fb272011-09-12 13:57:37 +0200763static const VMStateDescription vmstate_timers = {
764 .name = "timer",
765 .version_id = 2,
766 .minimum_version_id = 1,
Juan Quintela35d08452014-04-16 16:01:33 +0200767 .fields = (VMStateField[]) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200768 VMSTATE_INT64(cpu_ticks_offset, TimersState),
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200769 VMSTATE_UNUSED(8),
Paolo Bonzini946fb272011-09-12 13:57:37 +0200770 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
771 VMSTATE_END_OF_LIST()
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200772 },
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200773 .subsections = (const VMStateDescription*[]) {
774 &icount_vmstate_timers,
775 NULL
Paolo Bonzini946fb272011-09-12 13:57:37 +0200776 }
777};
778
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100779static void cpu_throttle_thread(CPUState *cpu, run_on_cpu_data opaque)
Jason J. Herne2adcc852015-09-08 13:12:33 -0400780{
Jason J. Herne2adcc852015-09-08 13:12:33 -0400781 double pct;
782 double throttle_ratio;
783 long sleeptime_ns;
784
785 if (!cpu_throttle_get_percentage()) {
786 return;
787 }
788
789 pct = (double)cpu_throttle_get_percentage()/100;
790 throttle_ratio = pct / (1 - pct);
791 sleeptime_ns = (long)(throttle_ratio * CPU_THROTTLE_TIMESLICE_NS);
792
793 qemu_mutex_unlock_iothread();
Jason J. Herne2adcc852015-09-08 13:12:33 -0400794 g_usleep(sleeptime_ns / 1000); /* Convert ns to us for usleep call */
795 qemu_mutex_lock_iothread();
Felipe Franciosi90bb0c02017-05-19 22:29:50 +0100796 atomic_set(&cpu->throttle_thread_scheduled, 0);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400797}
798
799static void cpu_throttle_timer_tick(void *opaque)
800{
801 CPUState *cpu;
802 double pct;
803
804 /* Stop the timer if needed */
805 if (!cpu_throttle_get_percentage()) {
806 return;
807 }
808 CPU_FOREACH(cpu) {
809 if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) {
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100810 async_run_on_cpu(cpu, cpu_throttle_thread,
811 RUN_ON_CPU_NULL);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400812 }
813 }
814
815 pct = (double)cpu_throttle_get_percentage()/100;
816 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
817 CPU_THROTTLE_TIMESLICE_NS / (1-pct));
818}
819
820void cpu_throttle_set(int new_throttle_pct)
821{
822 /* Ensure throttle percentage is within valid range */
823 new_throttle_pct = MIN(new_throttle_pct, CPU_THROTTLE_PCT_MAX);
824 new_throttle_pct = MAX(new_throttle_pct, CPU_THROTTLE_PCT_MIN);
825
826 atomic_set(&throttle_percentage, new_throttle_pct);
827
828 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
829 CPU_THROTTLE_TIMESLICE_NS);
830}
831
832void cpu_throttle_stop(void)
833{
834 atomic_set(&throttle_percentage, 0);
835}
836
837bool cpu_throttle_active(void)
838{
839 return (cpu_throttle_get_percentage() != 0);
840}
841
842int cpu_throttle_get_percentage(void)
843{
844 return atomic_read(&throttle_percentage);
845}
846
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400847void cpu_ticks_init(void)
848{
Emilio G. Cotaccdb3c12016-06-08 14:55:20 -0400849 seqlock_init(&timers_state.vm_clock_seqlock);
Emilio G. Cota87a09cd2018-09-03 13:18:29 -0400850 qemu_spin_init(&timers_state.vm_clock_lock);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400851 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400852 throttle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
853 cpu_throttle_timer_tick, NULL);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400854}
855
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200856void configure_icount(QemuOpts *opts, Error **errp)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200857{
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200858 const char *option;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200859 char *rem_str = NULL;
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200860
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200861 option = qemu_opt_get(opts, "shift");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200862 if (!option) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200863 if (qemu_opt_get(opts, "align") != NULL) {
864 error_setg(errp, "Please specify shift option when using align");
865 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200866 return;
867 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200868
869 icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200870 if (icount_sleep) {
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300871 timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300872 icount_timer_cb, NULL);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200873 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200874
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200875 icount_align_option = qemu_opt_get_bool(opts, "align", false);
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200876
877 if (icount_align_option && !icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500878 error_setg(errp, "align=on and sleep=off are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200879 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200880 if (strcmp(option, "auto") != 0) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200881 errno = 0;
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200882 timers_state.icount_time_shift = strtol(option, &rem_str, 0);
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200883 if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
884 error_setg(errp, "icount: Invalid shift value");
885 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200886 use_icount = 1;
887 return;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200888 } else if (icount_align_option) {
889 error_setg(errp, "shift=auto and align=on are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200890 } else if (!icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500891 error_setg(errp, "shift=auto and sleep=off are incompatible");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200892 }
893
894 use_icount = 2;
895
896 /* 125MIPS seems a reasonable initial guess at the guest speed.
897 It will be corrected fairly quickly anyway. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200898 timers_state.icount_time_shift = 3;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200899
900 /* Have both realtime and virtual time triggers for speed adjustment.
901 The realtime trigger catches emulated time passing too slowly,
902 the virtual time trigger catches emulated time passing too fast.
903 Realtime triggers occur even when idle, so use them less frequently
904 than VM triggers. */
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300905 timers_state.vm_clock_warp_start = -1;
906 timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300907 icount_adjust_rt, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300908 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300909 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300910 timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
Alex Bligh40daca52013-08-21 16:03:02 +0100911 icount_adjust_vm, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300912 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100913 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530914 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200915}
916
917/***********************************************************/
Alex Bennée65467062017-02-23 18:29:09 +0000918/* TCG vCPU kick timer
919 *
920 * The kick timer is responsible for moving single threaded vCPU
921 * emulation on to the next vCPU. If more than one vCPU is running a
922 * timer event with force a cpu->exit so the next vCPU can get
923 * scheduled.
924 *
925 * The timer is removed if all vCPUs are idle and restarted again once
926 * idleness is complete.
927 */
928
929static QEMUTimer *tcg_kick_vcpu_timer;
Alex Bennée791158d2017-02-23 18:29:10 +0000930static CPUState *tcg_current_rr_cpu;
Alex Bennée65467062017-02-23 18:29:09 +0000931
932#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
933
934static inline int64_t qemu_tcg_next_kick(void)
935{
936 return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
937}
938
Alex Bennée791158d2017-02-23 18:29:10 +0000939/* Kick the currently round-robin scheduled vCPU */
940static void qemu_cpu_kick_rr_cpu(void)
941{
942 CPUState *cpu;
Alex Bennée791158d2017-02-23 18:29:10 +0000943 do {
944 cpu = atomic_mb_read(&tcg_current_rr_cpu);
945 if (cpu) {
946 cpu_exit(cpu);
947 }
948 } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
949}
950
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100951static void do_nothing(CPUState *cpu, run_on_cpu_data unused)
952{
953}
954
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100955void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
956{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100957 if (!use_icount || type != QEMU_CLOCK_VIRTUAL) {
958 qemu_notify_event();
959 return;
960 }
961
Peter Maydellc52e7132018-04-10 13:02:25 +0100962 if (qemu_in_vcpu_thread()) {
963 /* A CPU is currently running; kick it back out to the
964 * tcg_cpu_exec() loop so it will recalculate its
965 * icount deadline immediately.
966 */
967 qemu_cpu_kick(current_cpu);
968 } else if (first_cpu) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100969 /* qemu_cpu_kick is not enough to kick a halted CPU out of
970 * qemu_tcg_wait_io_event. async_run_on_cpu, instead,
971 * causes cpu_thread_is_idle to return false. This way,
972 * handle_icount_deadline can run.
Peter Maydellc52e7132018-04-10 13:02:25 +0100973 * If we have no CPUs at all for some reason, we don't
974 * need to do anything.
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100975 */
976 async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
977 }
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100978}
979
Alex Bennée65467062017-02-23 18:29:09 +0000980static void kick_tcg_thread(void *opaque)
981{
982 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
Alex Bennée791158d2017-02-23 18:29:10 +0000983 qemu_cpu_kick_rr_cpu();
Alex Bennée65467062017-02-23 18:29:09 +0000984}
985
986static void start_tcg_kick_timer(void)
987{
Paolo Bonzinidb08b682018-01-11 13:53:12 +0100988 assert(!mttcg_enabled);
989 if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
Alex Bennée65467062017-02-23 18:29:09 +0000990 tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
991 kick_tcg_thread, NULL);
Alex Bennée1926ab22018-09-27 18:17:24 +0100992 }
993 if (tcg_kick_vcpu_timer && !timer_pending(tcg_kick_vcpu_timer)) {
Alex Bennée65467062017-02-23 18:29:09 +0000994 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
995 }
996}
997
998static void stop_tcg_kick_timer(void)
999{
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001000 assert(!mttcg_enabled);
Alex Bennée1926ab22018-09-27 18:17:24 +01001001 if (tcg_kick_vcpu_timer && timer_pending(tcg_kick_vcpu_timer)) {
Alex Bennée65467062017-02-23 18:29:09 +00001002 timer_del(tcg_kick_vcpu_timer);
Alex Bennée65467062017-02-23 18:29:09 +00001003 }
1004}
1005
Alex Bennée65467062017-02-23 18:29:09 +00001006/***********************************************************/
Blue Swirl296af7c2010-03-29 19:23:50 +00001007void hw_error(const char *fmt, ...)
1008{
1009 va_list ap;
Andreas Färber55e5c282012-12-17 06:18:02 +01001010 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001011
1012 va_start(ap, fmt);
1013 fprintf(stderr, "qemu: hardware error: ");
1014 vfprintf(stderr, fmt, ap);
1015 fprintf(stderr, "\n");
Andreas Färberbdc44642013-06-24 23:50:24 +02001016 CPU_FOREACH(cpu) {
Andreas Färber55e5c282012-12-17 06:18:02 +01001017 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
Markus Armbruster90c84c52019-04-17 21:18:02 +02001018 cpu_dump_state(cpu, stderr, CPU_DUMP_FPU);
Blue Swirl296af7c2010-03-29 19:23:50 +00001019 }
1020 va_end(ap);
1021 abort();
1022}
1023
1024void cpu_synchronize_all_states(void)
1025{
Andreas Färber182735e2013-05-29 22:29:20 +02001026 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001027
Andreas Färberbdc44642013-06-24 23:50:24 +02001028 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001029 cpu_synchronize_state(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001030 /* TODO: move to cpu_synchronize_state() */
1031 if (hvf_enabled()) {
1032 hvf_cpu_synchronize_state(cpu);
1033 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001034 }
1035}
1036
1037void cpu_synchronize_all_post_reset(void)
1038{
Andreas Färber182735e2013-05-29 22:29:20 +02001039 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001040
Andreas Färberbdc44642013-06-24 23:50:24 +02001041 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001042 cpu_synchronize_post_reset(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001043 /* TODO: move to cpu_synchronize_post_reset() */
1044 if (hvf_enabled()) {
1045 hvf_cpu_synchronize_post_reset(cpu);
1046 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001047 }
1048}
1049
1050void cpu_synchronize_all_post_init(void)
1051{
Andreas Färber182735e2013-05-29 22:29:20 +02001052 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001053
Andreas Färberbdc44642013-06-24 23:50:24 +02001054 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001055 cpu_synchronize_post_init(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001056 /* TODO: move to cpu_synchronize_post_init() */
1057 if (hvf_enabled()) {
1058 hvf_cpu_synchronize_post_init(cpu);
1059 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001060 }
1061}
1062
David Gibson75e972d2017-05-26 14:46:28 +10001063void cpu_synchronize_all_pre_loadvm(void)
1064{
1065 CPUState *cpu;
1066
1067 CPU_FOREACH(cpu) {
1068 cpu_synchronize_pre_loadvm(cpu);
1069 }
1070}
1071
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001072static int do_vm_stop(RunState state, bool send_stop)
Blue Swirl296af7c2010-03-29 19:23:50 +00001073{
Kevin Wolf56983462013-07-05 13:49:54 +02001074 int ret = 0;
1075
Luiz Capitulino13548692011-07-29 15:36:43 -03001076 if (runstate_is_running()) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001077 cpu_disable_ticks();
Blue Swirl296af7c2010-03-29 19:23:50 +00001078 pause_all_vcpus();
Luiz Capitulinof5bbfba2011-07-29 15:04:45 -03001079 runstate_set(state);
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001080 vm_state_notify(0, state);
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001081 if (send_stop) {
Peter Xu3ab72382018-08-15 21:37:37 +08001082 qapi_event_send_stop();
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001083 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001084 }
Kevin Wolf56983462013-07-05 13:49:54 +02001085
Kevin Wolf594a45c2013-07-18 14:52:19 +02001086 bdrv_drain_all();
Pavel Dovgalyuk6d0ceb82016-09-26 11:08:16 +03001087 replay_disable_events();
John Snow22af08e2016-09-22 21:45:51 -04001088 ret = bdrv_flush_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02001089
Kevin Wolf56983462013-07-05 13:49:54 +02001090 return ret;
Blue Swirl296af7c2010-03-29 19:23:50 +00001091}
1092
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001093/* Special vm_stop() variant for terminating the process. Historically clients
1094 * did not expect a QMP STOP event and so we need to retain compatibility.
1095 */
1096int vm_shutdown(void)
1097{
1098 return do_vm_stop(RUN_STATE_SHUTDOWN, false);
1099}
1100
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001101static bool cpu_can_run(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001102{
Andreas Färber4fdeee72012-05-02 23:10:09 +02001103 if (cpu->stop) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001104 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001105 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +08001106 if (cpu_is_stopped(cpu)) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001107 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001108 }
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001109 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001110}
1111
Andreas Färber91325042013-05-27 02:07:49 +02001112static void cpu_handle_guest_debug(CPUState *cpu)
Jan Kiszka3c638d02010-06-25 16:56:56 +02001113{
Andreas Färber64f6b342013-05-27 02:06:09 +02001114 gdb_set_stop_cpu(cpu);
Jan Kiszka8cf71712011-02-07 12:19:16 +01001115 qemu_system_debug_request();
Andreas Färberf324e762012-05-02 23:26:21 +02001116 cpu->stopped = true;
Jan Kiszka3c638d02010-06-25 16:56:56 +02001117}
1118
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001119#ifdef CONFIG_LINUX
1120static void sigbus_reraise(void)
1121{
1122 sigset_t set;
1123 struct sigaction action;
1124
1125 memset(&action, 0, sizeof(action));
1126 action.sa_handler = SIG_DFL;
1127 if (!sigaction(SIGBUS, &action, NULL)) {
1128 raise(SIGBUS);
1129 sigemptyset(&set);
1130 sigaddset(&set, SIGBUS);
Peter Maydella2d17612016-05-16 18:33:59 +01001131 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001132 }
1133 perror("Failed to re-raise SIGBUS!\n");
1134 abort();
1135}
1136
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001137static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx)
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001138{
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001139 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) {
1140 sigbus_reraise();
1141 }
1142
Paolo Bonzini2ae41db2017-02-08 12:48:54 +01001143 if (current_cpu) {
1144 /* Called asynchronously in VCPU thread. */
1145 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) {
1146 sigbus_reraise();
1147 }
1148 } else {
1149 /* Called synchronously (via signalfd) in main thread. */
1150 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) {
1151 sigbus_reraise();
1152 }
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001153 }
1154}
1155
1156static void qemu_init_sigbus(void)
1157{
1158 struct sigaction action;
1159
1160 memset(&action, 0, sizeof(action));
1161 action.sa_flags = SA_SIGINFO;
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001162 action.sa_sigaction = sigbus_handler;
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001163 sigaction(SIGBUS, &action, NULL);
1164
1165 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
1166}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001167#else /* !CONFIG_LINUX */
1168static void qemu_init_sigbus(void)
1169{
1170}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001171#endif /* !CONFIG_LINUX */
Blue Swirl296af7c2010-03-29 19:23:50 +00001172
Stefan Weilb2532d82012-09-27 07:41:42 +02001173static QemuMutex qemu_global_mutex;
Blue Swirl296af7c2010-03-29 19:23:50 +00001174
1175static QemuThread io_thread;
1176
Blue Swirl296af7c2010-03-29 19:23:50 +00001177/* cpu creation */
1178static QemuCond qemu_cpu_cond;
1179/* system init */
Blue Swirl296af7c2010-03-29 19:23:50 +00001180static QemuCond qemu_pause_cond;
1181
Paolo Bonzinid3b12f52011-09-13 10:30:52 +02001182void qemu_init_cpu_loop(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001183{
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001184 qemu_init_sigbus();
Anthony Liguoried945922011-02-08 18:18:18 +01001185 qemu_cond_init(&qemu_cpu_cond);
Anthony Liguoried945922011-02-08 18:18:18 +01001186 qemu_cond_init(&qemu_pause_cond);
Blue Swirl296af7c2010-03-29 19:23:50 +00001187 qemu_mutex_init(&qemu_global_mutex);
Blue Swirl296af7c2010-03-29 19:23:50 +00001188
Jan Kiszkab7680cb2011-03-12 17:43:51 +01001189 qemu_thread_get_self(&io_thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001190}
1191
Paolo Bonzini14e6fe12016-10-31 10:36:08 +01001192void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -03001193{
Sergey Fedorovd148d902016-08-29 09:51:00 +02001194 do_run_on_cpu(cpu, func, data, &qemu_global_mutex);
Chegu Vinod3c022702013-06-24 03:49:41 -06001195}
1196
Gu Zheng4c055ab2016-05-12 09:18:13 +05301197static void qemu_kvm_destroy_vcpu(CPUState *cpu)
1198{
1199 if (kvm_destroy_vcpu(cpu) < 0) {
1200 error_report("kvm_destroy_vcpu failed");
1201 exit(EXIT_FAILURE);
1202 }
1203}
1204
1205static void qemu_tcg_destroy_vcpu(CPUState *cpu)
1206{
1207}
1208
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001209static void qemu_cpu_stop(CPUState *cpu, bool exit)
1210{
1211 g_assert(qemu_cpu_is_self(cpu));
1212 cpu->stop = false;
1213 cpu->stopped = true;
1214 if (exit) {
1215 cpu_exit(cpu);
1216 }
1217 qemu_cond_broadcast(&qemu_pause_cond);
1218}
1219
Andreas Färber509a0d72012-05-03 02:18:09 +02001220static void qemu_wait_io_event_common(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001221{
Alex Bennée37257942017-02-23 18:29:14 +00001222 atomic_mb_set(&cpu->thread_kicked, false);
Andreas Färber4fdeee72012-05-02 23:10:09 +02001223 if (cpu->stop) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001224 qemu_cpu_stop(cpu, false);
Blue Swirl296af7c2010-03-29 19:23:50 +00001225 }
Sergey Fedorova5403c62016-08-02 18:27:36 +01001226 process_queued_cpu_work(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001227}
1228
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001229static void qemu_tcg_rr_wait_io_event(void)
Alex Bennée37257942017-02-23 18:29:14 +00001230{
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001231 CPUState *cpu;
1232
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001233 while (all_cpu_threads_idle()) {
Alex Bennée65467062017-02-23 18:29:09 +00001234 stop_tcg_kick_timer();
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001235 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001236 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001237
Alex Bennée65467062017-02-23 18:29:09 +00001238 start_tcg_kick_timer();
1239
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001240 CPU_FOREACH(cpu) {
1241 qemu_wait_io_event_common(cpu);
1242 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001243}
1244
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001245static void qemu_wait_io_event(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001246{
Andreas Färbera98ae1d2013-05-26 23:21:08 +02001247 while (cpu_thread_is_idle(cpu)) {
Andreas Färberf5c121b2012-05-03 01:22:49 +02001248 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001249 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001250
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001251#ifdef _WIN32
1252 /* Eat dummy APC queued by qemu_cpu_kick_thread. */
1253 if (!tcg_enabled()) {
1254 SleepEx(0, TRUE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001255 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001256#endif
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001257 qemu_wait_io_event_common(cpu);
1258}
1259
Jan Kiszka7e97cd82011-02-07 12:19:12 +01001260static void *qemu_kvm_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001261{
Andreas Färber48a106b2013-05-27 02:20:39 +02001262 CPUState *cpu = arg;
Jan Kiszka84b49152011-02-01 22:15:50 +01001263 int r;
Blue Swirl296af7c2010-03-29 19:23:50 +00001264
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001265 rcu_register_thread();
1266
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001267 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001268 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001269 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001270 cpu->can_do_io = 1;
Andreas Färber4917cf42013-05-27 05:17:50 +02001271 current_cpu = cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001272
Andreas Färber504134d2012-12-17 06:38:45 +01001273 r = kvm_init_vcpu(cpu);
Jan Kiszka84b49152011-02-01 22:15:50 +01001274 if (r < 0) {
Alistair Francis493d89b2018-02-03 09:43:14 +01001275 error_report("kvm_init_vcpu failed: %s", strerror(-r));
Jan Kiszka84b49152011-02-01 22:15:50 +01001276 exit(1);
1277 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001278
Paolo Bonzini18268b62017-02-09 09:41:14 +01001279 kvm_init_cpu_signals(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001280
1281 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001282 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001283 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001284 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Blue Swirl296af7c2010-03-29 19:23:50 +00001285
Gu Zheng4c055ab2016-05-12 09:18:13 +05301286 do {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001287 if (cpu_can_run(cpu)) {
Andreas Färber1458c362013-05-26 23:46:55 +02001288 r = kvm_cpu_exec(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001289 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +02001290 cpu_handle_guest_debug(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001291 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001292 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001293 qemu_wait_io_event(cpu);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301294 } while (!cpu->unplug || cpu_can_run(cpu));
Blue Swirl296af7c2010-03-29 19:23:50 +00001295
Gu Zheng4c055ab2016-05-12 09:18:13 +05301296 qemu_kvm_destroy_vcpu(cpu);
Bharata B Rao2c579042016-05-12 09:18:14 +05301297 cpu->created = false;
1298 qemu_cond_signal(&qemu_cpu_cond);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301299 qemu_mutex_unlock_iothread();
Paolo Bonzini57615ed2018-01-30 11:04:36 -05001300 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001301 return NULL;
1302}
1303
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001304static void *qemu_dummy_cpu_thread_fn(void *arg)
1305{
1306#ifdef _WIN32
Alistair Francis493d89b2018-02-03 09:43:14 +01001307 error_report("qtest is not supported under Windows");
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001308 exit(1);
1309#else
Andreas Färber10a90212013-05-27 02:24:35 +02001310 CPUState *cpu = arg;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001311 sigset_t waitset;
1312 int r;
1313
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001314 rcu_register_thread();
1315
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001316 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001317 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001318 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001319 cpu->can_do_io = 1;
Alex Bennée37257942017-02-23 18:29:14 +00001320 current_cpu = cpu;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001321
1322 sigemptyset(&waitset);
1323 sigaddset(&waitset, SIG_IPI);
1324
1325 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001326 cpu->created = true;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001327 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001328 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001329
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001330 do {
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001331 qemu_mutex_unlock_iothread();
1332 do {
1333 int sig;
1334 r = sigwait(&waitset, &sig);
1335 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
1336 if (r == -1) {
1337 perror("sigwait");
1338 exit(1);
1339 }
1340 qemu_mutex_lock_iothread();
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001341 qemu_wait_io_event(cpu);
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001342 } while (!cpu->unplug);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001343
David Hildenbrandd40bfcb2019-02-18 10:21:57 +01001344 qemu_mutex_unlock_iothread();
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001345 rcu_unregister_thread();
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001346 return NULL;
1347#endif
1348}
1349
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001350static int64_t tcg_get_icount_limit(void)
1351{
1352 int64_t deadline;
1353
1354 if (replay_mode != REPLAY_MODE_PLAY) {
1355 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1356
1357 /* Maintain prior (possibly buggy) behaviour where if no deadline
1358 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
1359 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1360 * nanoseconds.
1361 */
1362 if ((deadline < 0) || (deadline > INT32_MAX)) {
1363 deadline = INT32_MAX;
1364 }
1365
1366 return qemu_icount_round(deadline);
1367 } else {
1368 return replay_get_instructions();
1369 }
1370}
1371
Alex Bennée12e97002016-10-27 16:10:14 +01001372static void handle_icount_deadline(void)
1373{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001374 assert(qemu_in_vcpu_thread());
Alex Bennée12e97002016-10-27 16:10:14 +01001375 if (use_icount) {
1376 int64_t deadline =
1377 qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
1378
1379 if (deadline == 0) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001380 /* Wake up other AioContexts. */
Alex Bennée12e97002016-10-27 16:10:14 +01001381 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001382 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Alex Bennée12e97002016-10-27 16:10:14 +01001383 }
1384 }
1385}
1386
Alex Bennée05248382017-03-29 16:46:59 +01001387static void prepare_icount_for_run(CPUState *cpu)
1388{
1389 if (use_icount) {
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001390 int insns_left;
Alex Bennée05248382017-03-29 16:46:59 +01001391
1392 /* These should always be cleared by process_icount_data after
1393 * each vCPU execution. However u16.high can be raised
1394 * asynchronously by cpu_exit/cpu_interrupt/tcg_handle_interrupt
1395 */
Richard Henderson5e140192019-03-28 11:54:23 -10001396 g_assert(cpu_neg(cpu)->icount_decr.u16.low == 0);
Alex Bennée05248382017-03-29 16:46:59 +01001397 g_assert(cpu->icount_extra == 0);
1398
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001399 cpu->icount_budget = tcg_get_icount_limit();
1400 insns_left = MIN(0xffff, cpu->icount_budget);
Richard Henderson5e140192019-03-28 11:54:23 -10001401 cpu_neg(cpu)->icount_decr.u16.low = insns_left;
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001402 cpu->icount_extra = cpu->icount_budget - insns_left;
Alex Bennéed759c952018-02-27 12:52:48 +03001403
1404 replay_mutex_lock();
Alex Bennée05248382017-03-29 16:46:59 +01001405 }
1406}
1407
1408static void process_icount_data(CPUState *cpu)
1409{
1410 if (use_icount) {
Alex Bennéee4cd9652017-03-31 16:09:42 +01001411 /* Account for executed instructions */
Alex Bennée512d3c82017-04-05 12:32:37 +01001412 cpu_update_icount(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001413
1414 /* Reset the counters */
Richard Henderson5e140192019-03-28 11:54:23 -10001415 cpu_neg(cpu)->icount_decr.u16.low = 0;
Alex Bennée05248382017-03-29 16:46:59 +01001416 cpu->icount_extra = 0;
Alex Bennéee4cd9652017-03-31 16:09:42 +01001417 cpu->icount_budget = 0;
1418
Alex Bennée05248382017-03-29 16:46:59 +01001419 replay_account_executed_instructions();
Alex Bennéed759c952018-02-27 12:52:48 +03001420
1421 replay_mutex_unlock();
Alex Bennée05248382017-03-29 16:46:59 +01001422 }
1423}
1424
1425
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001426static int tcg_cpu_exec(CPUState *cpu)
1427{
1428 int ret;
1429#ifdef CONFIG_PROFILER
1430 int64_t ti;
1431#endif
1432
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001433 assert(tcg_enabled());
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001434#ifdef CONFIG_PROFILER
1435 ti = profile_getclock();
1436#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001437 cpu_exec_start(cpu);
1438 ret = cpu_exec(cpu);
1439 cpu_exec_end(cpu);
1440#ifdef CONFIG_PROFILER
Emilio G. Cota72fd2ef2018-10-10 10:48:53 -04001441 atomic_set(&tcg_ctx->prof.cpu_exec_time,
1442 tcg_ctx->prof.cpu_exec_time + profile_getclock() - ti);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001443#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001444 return ret;
1445}
1446
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001447/* Destroy any remaining vCPUs which have been unplugged and have
1448 * finished running
1449 */
1450static void deal_with_unplugged_cpus(void)
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001451{
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001452 CPUState *cpu;
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001453
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001454 CPU_FOREACH(cpu) {
1455 if (cpu->unplug && !cpu_can_run(cpu)) {
1456 qemu_tcg_destroy_vcpu(cpu);
1457 cpu->created = false;
1458 qemu_cond_signal(&qemu_cpu_cond);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001459 break;
1460 }
1461 }
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001462}
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001463
Alex Bennée65467062017-02-23 18:29:09 +00001464/* Single-threaded TCG
1465 *
1466 * In the single-threaded case each vCPU is simulated in turn. If
1467 * there is more than a single vCPU we create a simple timer to kick
1468 * the vCPU and ensure we don't get stuck in a tight loop in one vCPU.
1469 * This is done explicitly rather than relying on side-effects
1470 * elsewhere.
1471 */
1472
Alex Bennée37257942017-02-23 18:29:14 +00001473static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001474{
Andreas Färberc3586ba2012-05-03 01:41:24 +02001475 CPUState *cpu = arg;
Blue Swirl296af7c2010-03-29 19:23:50 +00001476
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001477 assert(tcg_enabled());
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001478 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001479 tcg_register_thread();
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001480
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001481 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001482 qemu_thread_get_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001483
David Hildenbrand5a9c9732018-02-09 20:52:39 +01001484 cpu->thread_id = qemu_get_thread_id();
1485 cpu->created = true;
1486 cpu->can_do_io = 1;
Blue Swirl296af7c2010-03-29 19:23:50 +00001487 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001488 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Blue Swirl296af7c2010-03-29 19:23:50 +00001489
Jan Kiszkafa7d1862011-08-22 18:35:25 +02001490 /* wait for initial kick-off after machine start */
Emilio G. Cotac28e3992015-04-27 12:45:28 -04001491 while (first_cpu->stopped) {
KONRAD Fredericd5f8d612015-08-10 17:27:06 +02001492 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001493
1494 /* process any pending work */
Andreas Färberbdc44642013-06-24 23:50:24 +02001495 CPU_FOREACH(cpu) {
Alex Bennée37257942017-02-23 18:29:14 +00001496 current_cpu = cpu;
Andreas Färber182735e2013-05-29 22:29:20 +02001497 qemu_wait_io_event_common(cpu);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001498 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001499 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001500
Alex Bennée65467062017-02-23 18:29:09 +00001501 start_tcg_kick_timer();
1502
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001503 cpu = first_cpu;
1504
Alex Bennéee5143e32017-02-23 18:29:12 +00001505 /* process any pending work */
1506 cpu->exit_request = 1;
1507
Blue Swirl296af7c2010-03-29 19:23:50 +00001508 while (1) {
Alex Bennéed759c952018-02-27 12:52:48 +03001509 qemu_mutex_unlock_iothread();
1510 replay_mutex_lock();
1511 qemu_mutex_lock_iothread();
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001512 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1513 qemu_account_warp_timer();
1514
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001515 /* Run the timers here. This is much more efficient than
1516 * waking up the I/O thread and waiting for completion.
1517 */
1518 handle_icount_deadline();
1519
Alex Bennéed759c952018-02-27 12:52:48 +03001520 replay_mutex_unlock();
1521
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001522 if (!cpu) {
1523 cpu = first_cpu;
1524 }
1525
Alex Bennéee5143e32017-02-23 18:29:12 +00001526 while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
1527
Alex Bennée791158d2017-02-23 18:29:10 +00001528 atomic_mb_set(&tcg_current_rr_cpu, cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001529 current_cpu = cpu;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001530
1531 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
1532 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
1533
1534 if (cpu_can_run(cpu)) {
1535 int r;
Alex Bennée05248382017-03-29 16:46:59 +01001536
Alex Bennéed759c952018-02-27 12:52:48 +03001537 qemu_mutex_unlock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001538 prepare_icount_for_run(cpu);
1539
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001540 r = tcg_cpu_exec(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001541
1542 process_icount_data(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001543 qemu_mutex_lock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001544
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001545 if (r == EXCP_DEBUG) {
1546 cpu_handle_guest_debug(cpu);
1547 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001548 } else if (r == EXCP_ATOMIC) {
1549 qemu_mutex_unlock_iothread();
1550 cpu_exec_step_atomic(cpu);
1551 qemu_mutex_lock_iothread();
1552 break;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001553 }
Alex Bennée37257942017-02-23 18:29:14 +00001554 } else if (cpu->stop) {
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001555 if (cpu->unplug) {
1556 cpu = CPU_NEXT(cpu);
1557 }
1558 break;
1559 }
1560
Alex Bennéee5143e32017-02-23 18:29:12 +00001561 cpu = CPU_NEXT(cpu);
1562 } /* while (cpu && !cpu->exit_request).. */
1563
Alex Bennée791158d2017-02-23 18:29:10 +00001564 /* Does not need atomic_mb_set because a spurious wakeup is okay. */
1565 atomic_set(&tcg_current_rr_cpu, NULL);
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001566
Alex Bennéee5143e32017-02-23 18:29:12 +00001567 if (cpu && cpu->exit_request) {
1568 atomic_mb_set(&cpu->exit_request, 0);
1569 }
Alex Blighac70aaf2013-08-21 16:02:57 +01001570
Clement Deschamps013aabd2018-10-21 16:21:03 +02001571 if (use_icount && all_cpu_threads_idle()) {
1572 /*
1573 * When all cpus are sleeping (e.g in WFI), to avoid a deadlock
1574 * in the main_loop, wake it up in order to start the warp timer.
1575 */
1576 qemu_notify_event();
1577 }
1578
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001579 qemu_tcg_rr_wait_io_event();
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001580 deal_with_unplugged_cpus();
Blue Swirl296af7c2010-03-29 19:23:50 +00001581 }
1582
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001583 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001584 return NULL;
1585}
1586
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001587static void *qemu_hax_cpu_thread_fn(void *arg)
1588{
1589 CPUState *cpu = arg;
1590 int r;
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001591
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001592 rcu_register_thread();
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001593 qemu_mutex_lock_iothread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001594 qemu_thread_get_self(cpu->thread);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001595
1596 cpu->thread_id = qemu_get_thread_id();
1597 cpu->created = true;
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001598 current_cpu = cpu;
1599
1600 hax_init_vcpu(cpu);
1601 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001602 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001603
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001604 do {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001605 if (cpu_can_run(cpu)) {
1606 r = hax_smp_cpu_exec(cpu);
1607 if (r == EXCP_DEBUG) {
1608 cpu_handle_guest_debug(cpu);
1609 }
1610 }
1611
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001612 qemu_wait_io_event(cpu);
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001613 } while (!cpu->unplug || cpu_can_run(cpu));
1614 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001615 return NULL;
1616}
1617
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001618/* The HVF-specific vCPU thread function. This one should only run when the host
1619 * CPU supports the VMX "unrestricted guest" feature. */
1620static void *qemu_hvf_cpu_thread_fn(void *arg)
1621{
1622 CPUState *cpu = arg;
1623
1624 int r;
1625
1626 assert(hvf_enabled());
1627
1628 rcu_register_thread();
1629
1630 qemu_mutex_lock_iothread();
1631 qemu_thread_get_self(cpu->thread);
1632
1633 cpu->thread_id = qemu_get_thread_id();
1634 cpu->can_do_io = 1;
1635 current_cpu = cpu;
1636
1637 hvf_init_vcpu(cpu);
1638
1639 /* signal CPU creation */
1640 cpu->created = true;
1641 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001642 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001643
1644 do {
1645 if (cpu_can_run(cpu)) {
1646 r = hvf_vcpu_exec(cpu);
1647 if (r == EXCP_DEBUG) {
1648 cpu_handle_guest_debug(cpu);
1649 }
1650 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001651 qemu_wait_io_event(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001652 } while (!cpu->unplug || cpu_can_run(cpu));
1653
1654 hvf_vcpu_destroy(cpu);
1655 cpu->created = false;
1656 qemu_cond_signal(&qemu_cpu_cond);
1657 qemu_mutex_unlock_iothread();
Paolo Bonzini8178e632018-01-30 11:05:21 -05001658 rcu_unregister_thread();
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001659 return NULL;
1660}
1661
Justin Terry (VM)19306802018-01-22 13:07:49 -08001662static void *qemu_whpx_cpu_thread_fn(void *arg)
1663{
1664 CPUState *cpu = arg;
1665 int r;
1666
1667 rcu_register_thread();
1668
1669 qemu_mutex_lock_iothread();
1670 qemu_thread_get_self(cpu->thread);
1671 cpu->thread_id = qemu_get_thread_id();
1672 current_cpu = cpu;
1673
1674 r = whpx_init_vcpu(cpu);
1675 if (r < 0) {
1676 fprintf(stderr, "whpx_init_vcpu failed: %s\n", strerror(-r));
1677 exit(1);
1678 }
1679
1680 /* signal CPU creation */
1681 cpu->created = true;
1682 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001683 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Justin Terry (VM)19306802018-01-22 13:07:49 -08001684
1685 do {
1686 if (cpu_can_run(cpu)) {
1687 r = whpx_vcpu_exec(cpu);
1688 if (r == EXCP_DEBUG) {
1689 cpu_handle_guest_debug(cpu);
1690 }
1691 }
1692 while (cpu_thread_is_idle(cpu)) {
1693 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1694 }
1695 qemu_wait_io_event_common(cpu);
1696 } while (!cpu->unplug || cpu_can_run(cpu));
1697
1698 whpx_destroy_vcpu(cpu);
1699 cpu->created = false;
1700 qemu_cond_signal(&qemu_cpu_cond);
1701 qemu_mutex_unlock_iothread();
1702 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001703 return NULL;
1704}
1705
1706#ifdef _WIN32
1707static void CALLBACK dummy_apc_func(ULONG_PTR unused)
1708{
1709}
1710#endif
1711
Alex Bennée37257942017-02-23 18:29:14 +00001712/* Multi-threaded TCG
1713 *
1714 * In the multi-threaded case each vCPU has its own thread. The TLS
1715 * variable current_cpu can be used deep in the code to find the
1716 * current CPUState for a given thread.
1717 */
1718
1719static void *qemu_tcg_cpu_thread_fn(void *arg)
1720{
1721 CPUState *cpu = arg;
1722
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001723 assert(tcg_enabled());
Alex Bennéebf51c722017-03-30 18:32:29 +01001724 g_assert(!use_icount);
1725
Alex Bennée37257942017-02-23 18:29:14 +00001726 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001727 tcg_register_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001728
1729 qemu_mutex_lock_iothread();
1730 qemu_thread_get_self(cpu->thread);
1731
1732 cpu->thread_id = qemu_get_thread_id();
1733 cpu->created = true;
1734 cpu->can_do_io = 1;
1735 current_cpu = cpu;
1736 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001737 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Alex Bennée37257942017-02-23 18:29:14 +00001738
1739 /* process any pending work */
1740 cpu->exit_request = 1;
1741
Cédric Le Goater54961aa2018-04-25 15:18:28 +02001742 do {
Alex Bennée37257942017-02-23 18:29:14 +00001743 if (cpu_can_run(cpu)) {
1744 int r;
Alex Bennéed759c952018-02-27 12:52:48 +03001745 qemu_mutex_unlock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001746 r = tcg_cpu_exec(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001747 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001748 switch (r) {
1749 case EXCP_DEBUG:
1750 cpu_handle_guest_debug(cpu);
1751 break;
1752 case EXCP_HALTED:
1753 /* during start-up the vCPU is reset and the thread is
1754 * kicked several times. If we don't ensure we go back
1755 * to sleep in the halted state we won't cleanly
1756 * start-up when the vCPU is enabled.
1757 *
1758 * cpu->halted should ensure we sleep in wait_io_event
1759 */
1760 g_assert(cpu->halted);
1761 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001762 case EXCP_ATOMIC:
1763 qemu_mutex_unlock_iothread();
1764 cpu_exec_step_atomic(cpu);
1765 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001766 default:
1767 /* Ignore everything else? */
1768 break;
1769 }
1770 }
1771
Alex Bennée37257942017-02-23 18:29:14 +00001772 atomic_mb_set(&cpu->exit_request, 0);
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001773 qemu_wait_io_event(cpu);
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001774 } while (!cpu->unplug || cpu_can_run(cpu));
Alex Bennée37257942017-02-23 18:29:14 +00001775
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001776 qemu_tcg_destroy_vcpu(cpu);
1777 cpu->created = false;
1778 qemu_cond_signal(&qemu_cpu_cond);
1779 qemu_mutex_unlock_iothread();
1780 rcu_unregister_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001781 return NULL;
1782}
1783
Andreas Färber2ff09a42012-05-03 00:23:30 +02001784static void qemu_cpu_kick_thread(CPUState *cpu)
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001785{
1786#ifndef _WIN32
1787 int err;
1788
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001789 if (cpu->thread_kicked) {
1790 return;
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001791 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001792 cpu->thread_kicked = true;
Andreas Färber814e6122012-05-02 17:00:37 +02001793 err = pthread_kill(cpu->thread->thread, SIG_IPI);
Laurent Vivierd455ebc2019-01-02 15:16:03 +01001794 if (err && err != ESRCH) {
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001795 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
1796 exit(1);
1797 }
1798#else /* _WIN32 */
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001799 if (!qemu_cpu_is_self(cpu)) {
Justin Terry (VM)19306802018-01-22 13:07:49 -08001800 if (whpx_enabled()) {
1801 whpx_vcpu_kick(cpu);
1802 } else if (!QueueUserAPC(dummy_apc_func, cpu->hThread, 0)) {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001803 fprintf(stderr, "%s: QueueUserAPC failed with error %lu\n",
1804 __func__, GetLastError());
1805 exit(1);
1806 }
1807 }
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001808#endif
1809}
1810
Andreas Färberc08d7422012-05-03 04:34:15 +02001811void qemu_cpu_kick(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001812{
Andreas Färberf5c121b2012-05-03 01:22:49 +02001813 qemu_cond_broadcast(cpu->halt_cond);
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001814 if (tcg_enabled()) {
Alex Bennée791158d2017-02-23 18:29:10 +00001815 cpu_exit(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001816 /* NOP unless doing single-thread RR */
Alex Bennée791158d2017-02-23 18:29:10 +00001817 qemu_cpu_kick_rr_cpu();
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001818 } else {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001819 if (hax_enabled()) {
1820 /*
1821 * FIXME: race condition with the exit_request check in
1822 * hax_vcpu_hax_exec
1823 */
1824 cpu->exit_request = 1;
1825 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001826 qemu_cpu_kick_thread(cpu);
1827 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001828}
1829
Jan Kiszka46d62fa2011-02-01 22:15:59 +01001830void qemu_cpu_kick_self(void)
1831{
Andreas Färber4917cf42013-05-27 05:17:50 +02001832 assert(current_cpu);
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001833 qemu_cpu_kick_thread(current_cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001834}
1835
Andreas Färber60e82572012-05-02 22:23:49 +02001836bool qemu_cpu_is_self(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001837{
Andreas Färber814e6122012-05-02 17:00:37 +02001838 return qemu_thread_is_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001839}
1840
Paolo Bonzini79e2b9a2015-01-21 12:09:14 +01001841bool qemu_in_vcpu_thread(void)
Juan Quintelaaa723c22012-09-18 16:30:11 +02001842{
Andreas Färber4917cf42013-05-27 05:17:50 +02001843 return current_cpu && qemu_cpu_is_self(current_cpu);
Juan Quintelaaa723c22012-09-18 16:30:11 +02001844}
1845
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001846static __thread bool iothread_locked = false;
1847
1848bool qemu_mutex_iothread_locked(void)
1849{
1850 return iothread_locked;
1851}
1852
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001853/*
1854 * The BQL is taken from so many places that it is worth profiling the
1855 * callers directly, instead of funneling them all through a single function.
1856 */
1857void qemu_mutex_lock_iothread_impl(const char *file, int line)
Blue Swirl296af7c2010-03-29 19:23:50 +00001858{
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001859 QemuMutexLockFunc bql_lock = atomic_read(&qemu_bql_mutex_lock_func);
1860
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001861 g_assert(!qemu_mutex_iothread_locked());
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001862 bql_lock(&qemu_global_mutex, file, line);
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001863 iothread_locked = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001864}
1865
1866void qemu_mutex_unlock_iothread(void)
1867{
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001868 g_assert(qemu_mutex_iothread_locked());
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001869 iothread_locked = false;
Blue Swirl296af7c2010-03-29 19:23:50 +00001870 qemu_mutex_unlock(&qemu_global_mutex);
1871}
1872
Alex Bennéee8faee02016-10-27 16:09:58 +01001873static bool all_vcpus_paused(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001874{
Andreas Färberbdc44642013-06-24 23:50:24 +02001875 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001876
Andreas Färberbdc44642013-06-24 23:50:24 +02001877 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001878 if (!cpu->stopped) {
Alex Bennéee8faee02016-10-27 16:09:58 +01001879 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001880 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001881 }
1882
Alex Bennéee8faee02016-10-27 16:09:58 +01001883 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001884}
1885
1886void pause_all_vcpus(void)
1887{
Andreas Färberbdc44642013-06-24 23:50:24 +02001888 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001889
Alex Bligh40daca52013-08-21 16:03:02 +01001890 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
Andreas Färberbdc44642013-06-24 23:50:24 +02001891 CPU_FOREACH(cpu) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001892 if (qemu_cpu_is_self(cpu)) {
1893 qemu_cpu_stop(cpu, true);
1894 } else {
1895 cpu->stop = true;
1896 qemu_cpu_kick(cpu);
1897 }
Jan Kiszkad798e972012-02-17 18:31:16 +01001898 }
1899
Alex Bennéed759c952018-02-27 12:52:48 +03001900 /* We need to drop the replay_lock so any vCPU threads woken up
1901 * can finish their replay tasks
1902 */
1903 replay_mutex_unlock();
1904
Blue Swirl296af7c2010-03-29 19:23:50 +00001905 while (!all_vcpus_paused()) {
Paolo Bonzinibe7d6c52011-03-12 17:44:02 +01001906 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
Andreas Färberbdc44642013-06-24 23:50:24 +02001907 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001908 qemu_cpu_kick(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001909 }
1910 }
Alex Bennéed759c952018-02-27 12:52:48 +03001911
1912 qemu_mutex_unlock_iothread();
1913 replay_mutex_lock();
1914 qemu_mutex_lock_iothread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001915}
1916
Igor Mammedov29936832013-04-23 10:29:37 +02001917void cpu_resume(CPUState *cpu)
1918{
1919 cpu->stop = false;
1920 cpu->stopped = false;
1921 qemu_cpu_kick(cpu);
1922}
1923
Blue Swirl296af7c2010-03-29 19:23:50 +00001924void resume_all_vcpus(void)
1925{
Andreas Färberbdc44642013-06-24 23:50:24 +02001926 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001927
Alex Bligh40daca52013-08-21 16:03:02 +01001928 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
Andreas Färberbdc44642013-06-24 23:50:24 +02001929 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001930 cpu_resume(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001931 }
1932}
1933
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001934void cpu_remove_sync(CPUState *cpu)
Gu Zheng4c055ab2016-05-12 09:18:13 +05301935{
1936 cpu->stop = true;
1937 cpu->unplug = true;
1938 qemu_cpu_kick(cpu);
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001939 qemu_mutex_unlock_iothread();
1940 qemu_thread_join(cpu->thread);
1941 qemu_mutex_lock_iothread();
Bharata B Rao2c579042016-05-12 09:18:14 +05301942}
1943
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001944/* For temporary buffers for forming a name */
1945#define VCPU_THREAD_NAME_SIZE 16
1946
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001947static void qemu_tcg_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001948{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001949 char thread_name[VCPU_THREAD_NAME_SIZE];
Alex Bennée37257942017-02-23 18:29:14 +00001950 static QemuCond *single_tcg_halt_cond;
1951 static QemuThread *single_tcg_cpu_thread;
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001952 static int tcg_region_inited;
1953
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001954 assert(tcg_enabled());
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001955 /*
1956 * Initialize TCG regions--once. Now is a good time, because:
1957 * (1) TCG's init context, prologue and target globals have been set up.
1958 * (2) qemu_tcg_mttcg_enabled() works now (TCG init code runs before the
1959 * -accel flag is processed, so the check doesn't work then).
1960 */
1961 if (!tcg_region_inited) {
1962 tcg_region_inited = 1;
1963 tcg_region_init();
1964 }
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001965
Alex Bennée37257942017-02-23 18:29:14 +00001966 if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
Andreas Färber814e6122012-05-02 17:00:37 +02001967 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001968 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1969 qemu_cond_init(cpu->halt_cond);
Alex Bennée37257942017-02-23 18:29:14 +00001970
1971 if (qemu_tcg_mttcg_enabled()) {
1972 /* create a thread per vCPU with TCG (MTTCG) */
1973 parallel_cpus = true;
1974 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001975 cpu->cpu_index);
Alex Bennée37257942017-02-23 18:29:14 +00001976
1977 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1978 cpu, QEMU_THREAD_JOINABLE);
1979
1980 } else {
1981 /* share a single thread for all cpus with TCG */
1982 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
1983 qemu_thread_create(cpu->thread, thread_name,
1984 qemu_tcg_rr_cpu_thread_fn,
1985 cpu, QEMU_THREAD_JOINABLE);
1986
1987 single_tcg_halt_cond = cpu->halt_cond;
1988 single_tcg_cpu_thread = cpu->thread;
1989 }
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001990#ifdef _WIN32
Andreas Färber814e6122012-05-02 17:00:37 +02001991 cpu->hThread = qemu_thread_get_handle(cpu->thread);
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001992#endif
Blue Swirl296af7c2010-03-29 19:23:50 +00001993 } else {
Alex Bennée37257942017-02-23 18:29:14 +00001994 /* For non-MTTCG cases we share the thread */
1995 cpu->thread = single_tcg_cpu_thread;
1996 cpu->halt_cond = single_tcg_halt_cond;
David Hildenbranda3421732018-02-09 20:52:37 +01001997 cpu->thread_id = first_cpu->thread_id;
1998 cpu->can_do_io = 1;
1999 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00002000 }
2001}
2002
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002003static void qemu_hax_start_vcpu(CPUState *cpu)
2004{
2005 char thread_name[VCPU_THREAD_NAME_SIZE];
2006
2007 cpu->thread = g_malloc0(sizeof(QemuThread));
2008 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2009 qemu_cond_init(cpu->halt_cond);
2010
2011 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX",
2012 cpu->cpu_index);
2013 qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn,
2014 cpu, QEMU_THREAD_JOINABLE);
2015#ifdef _WIN32
2016 cpu->hThread = qemu_thread_get_handle(cpu->thread);
2017#endif
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002018}
2019
Andreas Färber48a106b2013-05-27 02:20:39 +02002020static void qemu_kvm_start_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00002021{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002022 char thread_name[VCPU_THREAD_NAME_SIZE];
2023
Andreas Färber814e6122012-05-02 17:00:37 +02002024 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02002025 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2026 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002027 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
2028 cpu->cpu_index);
2029 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
2030 cpu, QEMU_THREAD_JOINABLE);
Blue Swirl296af7c2010-03-29 19:23:50 +00002031}
2032
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002033static void qemu_hvf_start_vcpu(CPUState *cpu)
2034{
2035 char thread_name[VCPU_THREAD_NAME_SIZE];
2036
2037 /* HVF currently does not support TCG, and only runs in
2038 * unrestricted-guest mode. */
2039 assert(hvf_enabled());
2040
2041 cpu->thread = g_malloc0(sizeof(QemuThread));
2042 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2043 qemu_cond_init(cpu->halt_cond);
2044
2045 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF",
2046 cpu->cpu_index);
2047 qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn,
2048 cpu, QEMU_THREAD_JOINABLE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002049}
2050
Justin Terry (VM)19306802018-01-22 13:07:49 -08002051static void qemu_whpx_start_vcpu(CPUState *cpu)
2052{
2053 char thread_name[VCPU_THREAD_NAME_SIZE];
2054
2055 cpu->thread = g_malloc0(sizeof(QemuThread));
2056 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2057 qemu_cond_init(cpu->halt_cond);
2058 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX",
2059 cpu->cpu_index);
2060 qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn,
2061 cpu, QEMU_THREAD_JOINABLE);
2062#ifdef _WIN32
2063 cpu->hThread = qemu_thread_get_handle(cpu->thread);
2064#endif
Justin Terry (VM)19306802018-01-22 13:07:49 -08002065}
2066
Andreas Färber10a90212013-05-27 02:24:35 +02002067static void qemu_dummy_start_vcpu(CPUState *cpu)
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002068{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002069 char thread_name[VCPU_THREAD_NAME_SIZE];
2070
Andreas Färber814e6122012-05-02 17:00:37 +02002071 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02002072 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2073 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002074 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
2075 cpu->cpu_index);
2076 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002077 QEMU_THREAD_JOINABLE);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002078}
2079
Andreas Färberc643bed2013-05-27 03:23:24 +02002080void qemu_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00002081{
Like Xu5cc87672019-05-19 04:54:21 +08002082 MachineState *ms = MACHINE(qdev_get_machine());
2083
2084 cpu->nr_cores = ms->smp.cores;
2085 cpu->nr_threads = ms->smp.threads;
Andreas Färberf324e762012-05-02 23:26:21 +02002086 cpu->stopped = true;
Richard Henderson9c09a252019-03-14 13:06:29 -07002087 cpu->random_seed = qemu_guest_random_seed_thread_part1();
Peter Maydell56943e82016-01-21 14:15:04 +00002088
2089 if (!cpu->as) {
2090 /* If the target cpu hasn't set up any address spaces itself,
2091 * give it the default one.
2092 */
Peter Maydell12ebc9a2016-01-21 14:15:04 +00002093 cpu->num_ases = 1;
Peter Xu80ceb072017-11-23 17:23:32 +08002094 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
Peter Maydell56943e82016-01-21 14:15:04 +00002095 }
2096
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002097 if (kvm_enabled()) {
Andreas Färber48a106b2013-05-27 02:20:39 +02002098 qemu_kvm_start_vcpu(cpu);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002099 } else if (hax_enabled()) {
2100 qemu_hax_start_vcpu(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002101 } else if (hvf_enabled()) {
2102 qemu_hvf_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002103 } else if (tcg_enabled()) {
Andreas Färbere5ab30a2012-05-03 01:50:44 +02002104 qemu_tcg_init_vcpu(cpu);
Justin Terry (VM)19306802018-01-22 13:07:49 -08002105 } else if (whpx_enabled()) {
2106 qemu_whpx_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002107 } else {
Andreas Färber10a90212013-05-27 02:24:35 +02002108 qemu_dummy_start_vcpu(cpu);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002109 }
David Hildenbrand81e96312018-02-09 20:52:38 +01002110
2111 while (!cpu->created) {
2112 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
2113 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002114}
2115
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002116void cpu_stop_current(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00002117{
Andreas Färber4917cf42013-05-27 05:17:50 +02002118 if (current_cpu) {
Peter Maydell0ec7e672019-01-07 15:23:47 +00002119 current_cpu->stop = true;
2120 cpu_exit(current_cpu);
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002121 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002122}
2123
Kevin Wolf56983462013-07-05 13:49:54 +02002124int vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +00002125{
Juan Quintelaaa723c22012-09-18 16:30:11 +02002126 if (qemu_in_vcpu_thread()) {
Paolo Bonzini74892d22014-06-05 14:53:58 +02002127 qemu_system_vmstop_request_prepare();
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002128 qemu_system_vmstop_request(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00002129 /*
2130 * FIXME: should not return to device code in case
2131 * vm_stop() has been requested.
2132 */
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002133 cpu_stop_current();
Kevin Wolf56983462013-07-05 13:49:54 +02002134 return 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00002135 }
Kevin Wolf56983462013-07-05 13:49:54 +02002136
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00002137 return do_vm_stop(state, true);
Blue Swirl296af7c2010-03-29 19:23:50 +00002138}
2139
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002140/**
2141 * Prepare for (re)starting the VM.
2142 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
2143 * running or in case of an error condition), 0 otherwise.
2144 */
2145int vm_prepare_start(void)
2146{
2147 RunState requested;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002148
2149 qemu_vmstop_requested(&requested);
2150 if (runstate_is_running() && requested == RUN_STATE__MAX) {
2151 return -1;
2152 }
2153
2154 /* Ensure that a STOP/RESUME pair of events is emitted if a
2155 * vmstop request was pending. The BLOCK_IO_ERROR event, for
2156 * example, according to documentation is always followed by
2157 * the STOP event.
2158 */
2159 if (runstate_is_running()) {
Peter Xu3ab72382018-08-15 21:37:37 +08002160 qapi_event_send_stop();
2161 qapi_event_send_resume();
Markus Armbrusterf0561582018-04-23 10:45:18 +02002162 return -1;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002163 }
2164
2165 /* We are sending this now, but the CPUs will be resumed shortly later */
Peter Xu3ab72382018-08-15 21:37:37 +08002166 qapi_event_send_resume();
Markus Armbrusterf0561582018-04-23 10:45:18 +02002167
2168 replay_enable_events();
2169 cpu_enable_ticks();
2170 runstate_set(RUN_STATE_RUNNING);
2171 vm_state_notify(1, RUN_STATE_RUNNING);
2172 return 0;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002173}
2174
2175void vm_start(void)
2176{
2177 if (!vm_prepare_start()) {
2178 resume_all_vcpus();
2179 }
2180}
2181
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002182/* does a state transition even if the VM is already stopped,
2183 current state is forgotten forever */
Kevin Wolf56983462013-07-05 13:49:54 +02002184int vm_stop_force_state(RunState state)
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002185{
2186 if (runstate_is_running()) {
Kevin Wolf56983462013-07-05 13:49:54 +02002187 return vm_stop(state);
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002188 } else {
2189 runstate_set(state);
Wen Congyangb2780d32015-11-20 17:34:38 +08002190
2191 bdrv_drain_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02002192 /* Make sure to return an error if the flush in a previous vm_stop()
2193 * failed. */
John Snow22af08e2016-09-22 21:45:51 -04002194 return bdrv_flush_all();
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002195 }
2196}
2197
Markus Armbruster04424282019-04-17 21:17:57 +02002198void list_cpus(const char *optarg)
Blue Swirl262353c2010-05-04 19:55:35 +00002199{
2200 /* XXX: implement xxx_cpu_list for targets that still miss it */
Peter Maydelle916cbf2012-09-05 17:41:08 -03002201#if defined(cpu_list)
Markus Armbruster04424282019-04-17 21:17:57 +02002202 cpu_list();
Blue Swirl262353c2010-05-04 19:55:35 +00002203#endif
2204}
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002205
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002206void qmp_memsave(int64_t addr, int64_t size, const char *filename,
2207 bool has_cpu, int64_t cpu_index, Error **errp)
2208{
2209 FILE *f;
2210 uint32_t l;
Andreas Färber55e5c282012-12-17 06:18:02 +01002211 CPUState *cpu;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002212 uint8_t buf[1024];
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002213 int64_t orig_addr = addr, orig_size = size;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002214
2215 if (!has_cpu) {
2216 cpu_index = 0;
2217 }
2218
Andreas Färber151d1322013-02-15 15:41:49 +01002219 cpu = qemu_get_cpu(cpu_index);
2220 if (cpu == NULL) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002221 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
2222 "a CPU number");
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002223 return;
2224 }
2225
2226 f = fopen(filename, "wb");
2227 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002228 error_setg_file_open(errp, errno, filename);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002229 return;
2230 }
2231
2232 while (size != 0) {
2233 l = sizeof(buf);
2234 if (l > size)
2235 l = size;
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302236 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002237 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
2238 " specified", orig_addr, orig_size);
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302239 goto exit;
2240 }
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002241 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002242 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002243 goto exit;
2244 }
2245 addr += l;
2246 size -= l;
2247 }
2248
2249exit:
2250 fclose(f);
2251}
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002252
2253void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
2254 Error **errp)
2255{
2256 FILE *f;
2257 uint32_t l;
2258 uint8_t buf[1024];
2259
2260 f = fopen(filename, "wb");
2261 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002262 error_setg_file_open(errp, errno, filename);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002263 return;
2264 }
2265
2266 while (size != 0) {
2267 l = sizeof(buf);
2268 if (l > size)
2269 l = size;
Stefan Weileb6282f2014-04-07 20:28:23 +02002270 cpu_physical_memory_read(addr, buf, l);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002271 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002272 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002273 goto exit;
2274 }
2275 addr += l;
2276 size -= l;
2277 }
2278
2279exit:
2280 fclose(f);
2281}
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002282
2283void qmp_inject_nmi(Error **errp)
2284{
Alexey Kardashevskiy9cb805f2014-08-20 22:16:33 +10002285 nmi_monitor_handle(monitor_get_cpu_index(), errp);
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002286}
Sebastian Tanase27498be2014-07-25 11:56:33 +02002287
Markus Armbruster76c86612019-04-17 21:17:53 +02002288void dump_drift_info(void)
Sebastian Tanase27498be2014-07-25 11:56:33 +02002289{
2290 if (!use_icount) {
2291 return;
2292 }
2293
Markus Armbruster76c86612019-04-17 21:17:53 +02002294 qemu_printf("Host - Guest clock %"PRIi64" ms\n",
Sebastian Tanase27498be2014-07-25 11:56:33 +02002295 (cpu_get_clock() - cpu_get_icount())/SCALE_MS);
2296 if (icount_align_option) {
Markus Armbruster76c86612019-04-17 21:17:53 +02002297 qemu_printf("Max guest delay %"PRIi64" ms\n",
2298 -max_delay / SCALE_MS);
2299 qemu_printf("Max guest advance %"PRIi64" ms\n",
2300 max_advance / SCALE_MS);
Sebastian Tanase27498be2014-07-25 11:56:33 +02002301 } else {
Markus Armbruster76c86612019-04-17 21:17:53 +02002302 qemu_printf("Max guest delay NA\n");
2303 qemu_printf("Max guest advance NA\n");
Sebastian Tanase27498be2014-07-25 11:56:33 +02002304 }
2305}