blob: d2c61ff1558aa83894ffb40233600859f937c40b [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
Yury Kotovbd1f7ff2019-09-09 16:13:34 +030080static QemuMutex qemu_global_mutex;
81
Sebastian Tanase27498be2014-07-25 11:56:33 +020082int64_t max_delay;
83int64_t max_advance;
Blue Swirl296af7c2010-03-29 19:23:50 +000084
Jason J. Herne2adcc852015-09-08 13:12:33 -040085/* vcpu throttling controls */
86static QEMUTimer *throttle_timer;
87static unsigned int throttle_percentage;
88
89#define CPU_THROTTLE_PCT_MIN 1
90#define CPU_THROTTLE_PCT_MAX 99
91#define CPU_THROTTLE_TIMESLICE_NS 10000000
92
Tiejun Chen321bc0b2013-08-02 09:43:09 +080093bool cpu_is_stopped(CPUState *cpu)
94{
95 return cpu->stopped || !runstate_is_running();
96}
97
Andreas Färbera98ae1d2013-05-26 23:21:08 +020098static bool cpu_thread_is_idle(CPUState *cpu)
Peter Maydellac873f12012-07-19 16:52:27 +010099{
Andreas Färberc64ca812012-05-03 02:11:45 +0200100 if (cpu->stop || cpu->queued_work_first) {
Peter Maydellac873f12012-07-19 16:52:27 +0100101 return false;
102 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +0800103 if (cpu_is_stopped(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +0100104 return true;
105 }
Andreas Färber8c2e1b02013-08-25 18:53:55 +0200106 if (!cpu->halted || cpu_has_work(cpu) ||
Alexander Graf215e79c2013-04-24 22:24:12 +0200107 kvm_halt_in_kernel()) {
Peter Maydellac873f12012-07-19 16:52:27 +0100108 return false;
109 }
110 return true;
111}
112
113static bool all_cpu_threads_idle(void)
114{
Andreas Färber182735e2013-05-29 22:29:20 +0200115 CPUState *cpu;
Peter Maydellac873f12012-07-19 16:52:27 +0100116
Andreas Färberbdc44642013-06-24 23:50:24 +0200117 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200118 if (!cpu_thread_is_idle(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +0100119 return false;
120 }
121 }
122 return true;
123}
124
Blue Swirl296af7c2010-03-29 19:23:50 +0000125/***********************************************************/
Paolo Bonzini946fb272011-09-12 13:57:37 +0200126/* guest cycle counter */
127
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200128/* Protected by TimersState seqlock */
129
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200130static bool icount_sleep = true;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200131/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
132#define MAX_ICOUNT_SHIFT 10
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200133
Paolo Bonzini946fb272011-09-12 13:57:37 +0200134typedef struct TimersState {
Liu Ping Fancb365642013-09-25 14:20:58 +0800135 /* Protected by BQL. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200136 int64_t cpu_ticks_prev;
137 int64_t cpu_ticks_offset;
Liu Ping Fancb365642013-09-25 14:20:58 +0800138
Paolo Bonzini94377112018-08-14 09:57:16 +0200139 /* Protect fields that can be respectively read outside the
140 * BQL, and written from multiple threads.
Liu Ping Fancb365642013-09-25 14:20:58 +0800141 */
142 QemuSeqLock vm_clock_seqlock;
Paolo Bonzini94377112018-08-14 09:57:16 +0200143 QemuSpin vm_clock_lock;
144
145 int16_t cpu_ticks_enabled;
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200146
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200147 /* Conversion factor from emulated instructions to virtual clock ticks. */
Paolo Bonzini94377112018-08-14 09:57:16 +0200148 int16_t icount_time_shift;
149
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200150 /* Compensate for varying guest execution speed. */
151 int64_t qemu_icount_bias;
Paolo Bonzini94377112018-08-14 09:57:16 +0200152
153 int64_t vm_clock_warp_start;
154 int64_t cpu_clock_offset;
155
KONRAD Fredericc96778b2014-08-01 01:37:09 +0200156 /* Only written by TCG thread */
157 int64_t qemu_icount;
Paolo Bonzini94377112018-08-14 09:57:16 +0200158
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300159 /* for adjusting icount */
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300160 QEMUTimer *icount_rt_timer;
161 QEMUTimer *icount_vm_timer;
162 QEMUTimer *icount_warp_timer;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200163} TimersState;
164
Liu Ping Fand9cd4002013-07-21 08:43:00 +0000165static TimersState timers_state;
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000166bool mttcg_enabled;
167
168/*
169 * We default to false if we know other options have been enabled
170 * which are currently incompatible with MTTCG. Otherwise when each
171 * guest (target) has been updated to support:
172 * - atomic instructions
173 * - memory ordering primitives (barriers)
174 * they can set the appropriate CONFIG flags in ${target}-softmmu.mak
175 *
176 * Once a guest architecture has been converted to the new primitives
177 * there are two remaining limitations to check.
178 *
179 * - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
180 * - The host must have a stronger memory order than the guest
181 *
182 * It may be possible in future to support strong guests on weak hosts
183 * but that will require tagging all load/stores in a guest with their
184 * implicit memory order requirements which would likely slow things
185 * down a lot.
186 */
187
188static bool check_tcg_memory_orders_compatible(void)
189{
190#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
191 return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
192#else
193 return false;
194#endif
195}
196
197static bool default_mttcg_enabled(void)
198{
Alex Bennée83fd9622017-02-27 17:09:01 +0000199 if (use_icount || TCG_OVERSIZED_GUEST) {
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000200 return false;
201 } else {
202#ifdef TARGET_SUPPORTS_MTTCG
203 return check_tcg_memory_orders_compatible();
204#else
205 return false;
206#endif
207 }
208}
209
210void qemu_tcg_configure(QemuOpts *opts, Error **errp)
211{
212 const char *t = qemu_opt_get(opts, "thread");
213 if (t) {
214 if (strcmp(t, "multi") == 0) {
215 if (TCG_OVERSIZED_GUEST) {
216 error_setg(errp, "No MTTCG when guest word size > hosts");
Alex Bennée83fd9622017-02-27 17:09:01 +0000217 } else if (use_icount) {
218 error_setg(errp, "No MTTCG when icount is enabled");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000219 } else {
Nikunj A Dadhania86953502017-04-10 11:36:55 +0530220#ifndef TARGET_SUPPORTS_MTTCG
Markus Armbruster07656912018-10-17 10:26:28 +0200221 warn_report("Guest not yet converted to MTTCG - "
222 "you may get unexpected results");
Alex Bennéec34c7622017-02-28 14:40:17 +0000223#endif
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000224 if (!check_tcg_memory_orders_compatible()) {
Markus Armbruster07656912018-10-17 10:26:28 +0200225 warn_report("Guest expects a stronger memory ordering "
226 "than the host provides");
Pranith Kumar8cfef892017-03-25 16:19:23 -0400227 error_printf("This may cause strange/hard to debug errors\n");
KONRAD Frederic8d4e9142017-02-23 18:29:08 +0000228 }
229 mttcg_enabled = true;
230 }
231 } else if (strcmp(t, "single") == 0) {
232 mttcg_enabled = false;
233 } else {
234 error_setg(errp, "Invalid 'thread' setting %s", t);
235 }
236 } else {
237 mttcg_enabled = default_mttcg_enabled();
238 }
239}
Paolo Bonzini946fb272011-09-12 13:57:37 +0200240
Alex Bennéee4cd9652017-03-31 16:09:42 +0100241/* The current number of executed instructions is based on what we
242 * originally budgeted minus the current state of the decrementing
243 * icount counters in extra/u16.low.
244 */
245static int64_t cpu_get_icount_executed(CPUState *cpu)
246{
Richard Henderson5e140192019-03-28 11:54:23 -1000247 return (cpu->icount_budget -
248 (cpu_neg(cpu)->icount_decr.u16.low + cpu->icount_extra));
Alex Bennéee4cd9652017-03-31 16:09:42 +0100249}
250
Alex Bennée512d3c82017-04-05 12:32:37 +0100251/*
252 * Update the global shared timer_state.qemu_icount to take into
253 * account executed instructions. This is done by the TCG vCPU
254 * thread so the main-loop can see time has moved forward.
255 */
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200256static void cpu_update_icount_locked(CPUState *cpu)
Alex Bennée512d3c82017-04-05 12:32:37 +0100257{
258 int64_t executed = cpu_get_icount_executed(cpu);
259 cpu->icount_budget -= executed;
260
Emilio G. Cota38adcb62018-09-10 19:27:49 -0400261 atomic_set_i64(&timers_state.qemu_icount,
262 timers_state.qemu_icount + executed);
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200263}
264
265/*
266 * Update the global shared timer_state.qemu_icount to take into
267 * account executed instructions. This is done by the TCG vCPU
268 * thread so the main-loop can see time has moved forward.
269 */
270void cpu_update_icount(CPUState *cpu)
271{
272 seqlock_write_lock(&timers_state.vm_clock_seqlock,
273 &timers_state.vm_clock_lock);
274 cpu_update_icount_locked(cpu);
Paolo Bonzini94377112018-08-14 09:57:16 +0200275 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
276 &timers_state.vm_clock_lock);
Alex Bennée512d3c82017-04-05 12:32:37 +0100277}
278
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200279static int64_t cpu_get_icount_raw_locked(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200280{
Andreas Färber4917cf42013-05-27 05:17:50 +0200281 CPUState *cpu = current_cpu;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200282
Alex Bennée243c5f72017-03-30 18:49:22 +0100283 if (cpu && cpu->running) {
Paolo Bonzini414b15c2015-06-24 14:16:26 +0200284 if (!cpu->can_do_io) {
Alistair Francis493d89b2018-02-03 09:43:14 +0100285 error_report("Bad icount read");
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300286 exit(1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200287 }
Alex Bennéee4cd9652017-03-31 16:09:42 +0100288 /* Take into account what has run */
Paolo Bonzini9b4e6f42018-09-11 13:15:32 +0200289 cpu_update_icount_locked(cpu);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200290 }
Emilio G. Cota38adcb62018-09-10 19:27:49 -0400291 /* The read is protected by the seqlock, but needs atomic64 to avoid UB */
292 return atomic_read_i64(&timers_state.qemu_icount);
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200293}
294
295static int64_t cpu_get_icount_locked(void)
296{
297 int64_t icount = cpu_get_icount_raw_locked();
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400298 return atomic_read_i64(&timers_state.qemu_icount_bias) +
299 cpu_icount_to_ns(icount);
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200300}
301
302int64_t cpu_get_icount_raw(void)
303{
304 int64_t icount;
305 unsigned start;
306
307 do {
308 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
309 icount = cpu_get_icount_raw_locked();
310 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
311
312 return icount;
Pavel Dovgalyuk2a629142014-12-08 10:53:45 +0300313}
314
315/* Return the virtual CPU time, based on the instruction counter. */
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200316int64_t cpu_get_icount(void)
317{
318 int64_t icount;
319 unsigned start;
320
321 do {
322 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
323 icount = cpu_get_icount_locked();
324 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
325
326 return icount;
327}
328
KONRAD Frederic3f031312014-08-01 01:37:15 +0200329int64_t cpu_icount_to_ns(int64_t icount)
330{
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200331 return icount << atomic_read(&timers_state.icount_time_shift);
KONRAD Frederic3f031312014-08-01 01:37:15 +0200332}
333
Paolo Bonzinif2a4ad62018-08-18 09:36:16 +0200334static int64_t cpu_get_ticks_locked(void)
335{
336 int64_t ticks = timers_state.cpu_ticks_offset;
337 if (timers_state.cpu_ticks_enabled) {
338 ticks += cpu_get_host_ticks();
339 }
340
341 if (timers_state.cpu_ticks_prev > ticks) {
342 /* Non increasing ticks may happen if the host uses software suspend. */
343 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
344 ticks = timers_state.cpu_ticks_prev;
345 }
346
347 timers_state.cpu_ticks_prev = ticks;
348 return ticks;
349}
350
Cao jind90f3cc2016-07-29 19:05:38 +0800351/* return the time elapsed in VM between vm_start and vm_stop. Unless
352 * icount is active, cpu_get_ticks() uses units of the host CPU cycle
353 * counter.
Cao jind90f3cc2016-07-29 19:05:38 +0800354 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200355int64_t cpu_get_ticks(void)
356{
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100357 int64_t ticks;
358
Paolo Bonzini946fb272011-09-12 13:57:37 +0200359 if (use_icount) {
360 return cpu_get_icount();
361 }
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100362
Paolo Bonzinif2a4ad62018-08-18 09:36:16 +0200363 qemu_spin_lock(&timers_state.vm_clock_lock);
364 ticks = cpu_get_ticks_locked();
365 qemu_spin_unlock(&timers_state.vm_clock_lock);
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100366 return ticks;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200367}
368
Liu Ping Fancb365642013-09-25 14:20:58 +0800369static int64_t cpu_get_clock_locked(void)
370{
Cao jin1d45cea2016-07-29 19:05:37 +0800371 int64_t time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800372
Cao jin1d45cea2016-07-29 19:05:37 +0800373 time = timers_state.cpu_clock_offset;
Paolo Bonzini5f3e3102013-10-28 17:32:18 +0100374 if (timers_state.cpu_ticks_enabled) {
Cao jin1d45cea2016-07-29 19:05:37 +0800375 time += get_clock();
Liu Ping Fancb365642013-09-25 14:20:58 +0800376 }
377
Cao jin1d45cea2016-07-29 19:05:37 +0800378 return time;
Liu Ping Fancb365642013-09-25 14:20:58 +0800379}
380
Cao jind90f3cc2016-07-29 19:05:38 +0800381/* Return the monotonic time elapsed in VM, i.e.,
Peter Maydell8212ff82016-09-15 10:24:22 +0100382 * the time between vm_start and vm_stop
383 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200384int64_t cpu_get_clock(void)
385{
386 int64_t ti;
Liu Ping Fancb365642013-09-25 14:20:58 +0800387 unsigned start;
388
389 do {
390 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
391 ti = cpu_get_clock_locked();
392 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
393
394 return ti;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200395}
396
Liu Ping Fancb365642013-09-25 14:20:58 +0800397/* enable cpu_get_ticks()
Cao jin3224e872016-07-08 18:31:37 +0800398 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800399 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200400void cpu_enable_ticks(void)
401{
Paolo Bonzini94377112018-08-14 09:57:16 +0200402 seqlock_write_lock(&timers_state.vm_clock_seqlock,
403 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200404 if (!timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400405 timers_state.cpu_ticks_offset -= cpu_get_host_ticks();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200406 timers_state.cpu_clock_offset -= get_clock();
407 timers_state.cpu_ticks_enabled = 1;
408 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200409 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
410 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200411}
412
413/* disable cpu_get_ticks() : the clock is stopped. You must not call
Liu Ping Fancb365642013-09-25 14:20:58 +0800414 * cpu_get_ticks() after that.
Cao jin3224e872016-07-08 18:31:37 +0800415 * Caller must hold BQL which serves as mutex for vm_clock_seqlock.
Liu Ping Fancb365642013-09-25 14:20:58 +0800416 */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200417void cpu_disable_ticks(void)
418{
Paolo Bonzini94377112018-08-14 09:57:16 +0200419 seqlock_write_lock(&timers_state.vm_clock_seqlock,
420 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200421 if (timers_state.cpu_ticks_enabled) {
Christopher Covington4a7428c2015-09-25 10:42:21 -0400422 timers_state.cpu_ticks_offset += cpu_get_host_ticks();
Liu Ping Fancb365642013-09-25 14:20:58 +0800423 timers_state.cpu_clock_offset = cpu_get_clock_locked();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200424 timers_state.cpu_ticks_enabled = 0;
425 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200426 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
427 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200428}
429
430/* Correlation between real and virtual time is always going to be
431 fairly approximate, so ignore small variation.
432 When the guest is idle real and virtual time will be aligned in
433 the IO wait loop. */
Rutuja Shah73bcb242016-03-21 21:32:30 +0530434#define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200435
436static void icount_adjust(void)
437{
438 int64_t cur_time;
439 int64_t cur_icount;
440 int64_t delta;
Paolo Bonzinia3270e12013-10-07 17:18:15 +0200441
442 /* Protected by TimersState mutex. */
Paolo Bonzini946fb272011-09-12 13:57:37 +0200443 static int64_t last_delta;
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200444
Paolo Bonzini946fb272011-09-12 13:57:37 +0200445 /* If the VM is not running, then do nothing. */
446 if (!runstate_is_running()) {
447 return;
448 }
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200449
Paolo Bonzini94377112018-08-14 09:57:16 +0200450 seqlock_write_lock(&timers_state.vm_clock_seqlock,
451 &timers_state.vm_clock_lock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200452 cur_time = cpu_get_clock_locked();
453 cur_icount = cpu_get_icount_locked();
Paolo Bonzini468cc7c2013-10-07 17:21:51 +0200454
Paolo Bonzini946fb272011-09-12 13:57:37 +0200455 delta = cur_icount - cur_time;
456 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
457 if (delta > 0
458 && last_delta + ICOUNT_WOBBLE < delta * 2
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200459 && timers_state.icount_time_shift > 0) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200460 /* The guest is getting too far ahead. Slow time down. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200461 atomic_set(&timers_state.icount_time_shift,
462 timers_state.icount_time_shift - 1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200463 }
464 if (delta < 0
465 && last_delta - ICOUNT_WOBBLE > delta * 2
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200466 && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200467 /* The guest is getting too far behind. Speed time up. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200468 atomic_set(&timers_state.icount_time_shift,
469 timers_state.icount_time_shift + 1);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200470 }
471 last_delta = delta;
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400472 atomic_set_i64(&timers_state.qemu_icount_bias,
473 cur_icount - (timers_state.qemu_icount
474 << timers_state.icount_time_shift));
Paolo Bonzini94377112018-08-14 09:57:16 +0200475 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
476 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200477}
478
479static void icount_adjust_rt(void *opaque)
480{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300481 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyuk1979b902015-01-12 15:00:43 +0300482 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200483 icount_adjust();
484}
485
486static void icount_adjust_vm(void *opaque)
487{
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300488 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100489 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530490 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200491 icount_adjust();
492}
493
494static int64_t qemu_icount_round(int64_t count)
495{
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200496 int shift = atomic_read(&timers_state.icount_time_shift);
497 return (count + (1 << shift) - 1) >> shift;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200498}
499
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300500static void icount_warp_rt(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200501{
Alex Bennéeccffff42016-04-04 15:35:48 +0100502 unsigned seq;
503 int64_t warp_start;
504
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200505 /* The icount_warp_timer is rescheduled soon after vm_clock_warp_start
506 * changes from -1 to another value, so the race here is okay.
507 */
Alex Bennéeccffff42016-04-04 15:35:48 +0100508 do {
509 seq = seqlock_read_begin(&timers_state.vm_clock_seqlock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300510 warp_start = timers_state.vm_clock_warp_start;
Alex Bennéeccffff42016-04-04 15:35:48 +0100511 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq));
512
513 if (warp_start == -1) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200514 return;
515 }
516
Paolo Bonzini94377112018-08-14 09:57:16 +0200517 seqlock_write_lock(&timers_state.vm_clock_seqlock,
518 &timers_state.vm_clock_lock);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200519 if (runstate_is_running()) {
Paolo Bonzini74c0b812018-10-08 13:24:14 +0200520 int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT,
521 cpu_get_clock_locked());
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200522 int64_t warp_delta;
523
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300524 warp_delta = clock - timers_state.vm_clock_warp_start;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200525 if (use_icount == 2) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200526 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100527 * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
Paolo Bonzini946fb272011-09-12 13:57:37 +0200528 * far ahead of real time.
529 */
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200530 int64_t cur_icount = cpu_get_icount_locked();
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300531 int64_t delta = clock - cur_icount;
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200532 warp_delta = MIN(warp_delta, delta);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200533 }
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400534 atomic_set_i64(&timers_state.qemu_icount_bias,
535 timers_state.qemu_icount_bias + warp_delta);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200536 }
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300537 timers_state.vm_clock_warp_start = -1;
Paolo Bonzini94377112018-08-14 09:57:16 +0200538 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
539 &timers_state.vm_clock_lock);
Paolo Bonzini8ed961d2013-10-07 17:26:07 +0200540
541 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
542 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
543 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200544}
545
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300546static void icount_timer_cb(void *opaque)
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300547{
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300548 /* No need for a checkpoint because the timer already synchronizes
549 * with CHECKPOINT_CLOCK_VIRTUAL_RT.
550 */
551 icount_warp_rt();
Pavel Dovgalyukefab87c2015-09-17 19:24:39 +0300552}
553
Paolo Bonzini8156be52012-03-28 15:42:04 +0200554void qtest_clock_warp(int64_t dest)
555{
Alex Bligh40daca52013-08-21 16:03:02 +0100556 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800557 AioContext *aio_context;
Paolo Bonzini8156be52012-03-28 15:42:04 +0200558 assert(qtest_enabled());
Fam Zhengefef88b2015-01-19 17:51:43 +0800559 aio_context = qemu_get_aio_context();
Paolo Bonzini8156be52012-03-28 15:42:04 +0200560 while (clock < dest) {
Pavel Dovgalyukdcb15782019-07-25 11:44:26 +0300561 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
562 QEMU_TIMER_ATTR_ALL);
Sergey Fedorovc9299e22014-06-10 13:10:28 +0400563 int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
Fam Zhengefef88b2015-01-19 17:51:43 +0800564
Paolo Bonzini94377112018-08-14 09:57:16 +0200565 seqlock_write_lock(&timers_state.vm_clock_seqlock,
566 &timers_state.vm_clock_lock);
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400567 atomic_set_i64(&timers_state.qemu_icount_bias,
568 timers_state.qemu_icount_bias + warp);
Paolo Bonzini94377112018-08-14 09:57:16 +0200569 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
570 &timers_state.vm_clock_lock);
Paolo Bonzini17a15f12013-10-03 15:17:25 +0200571
Alex Bligh40daca52013-08-21 16:03:02 +0100572 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Fam Zhengefef88b2015-01-19 17:51:43 +0800573 timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
Alex Bligh40daca52013-08-21 16:03:02 +0100574 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200575 }
Alex Bligh40daca52013-08-21 16:03:02 +0100576 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini8156be52012-03-28 15:42:04 +0200577}
578
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300579void qemu_start_warp_timer(void)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200580{
Paolo Bonzinice78d182013-10-07 17:30:02 +0200581 int64_t clock;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200582 int64_t deadline;
583
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300584 if (!use_icount) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200585 return;
586 }
587
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300588 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
589 * do not fire, so computing the deadline does not make sense.
590 */
591 if (!runstate_is_running()) {
592 return;
593 }
594
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300595 if (replay_mode != REPLAY_MODE_PLAY) {
596 if (!all_cpu_threads_idle()) {
597 return;
598 }
Pavel Dovgalyuk8bd7f712015-09-17 19:24:44 +0300599
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300600 if (qtest_enabled()) {
601 /* When testing, qtest commands advance icount. */
602 return;
603 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200604
Pavel Dovgalyuk0c081852018-09-12 11:19:45 +0300605 replay_checkpoint(CHECKPOINT_CLOCK_WARP_START);
606 } else {
607 /* warp clock deterministically in record/replay mode */
608 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) {
609 /* vCPU is sleeping and warp can't be started.
610 It is probably a race condition: notification sent
611 to vCPU was processed in advance and vCPU went to sleep.
612 Therefore we have to wake it up for doing someting. */
613 if (replay_has_checkpoint()) {
614 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
615 }
616 return;
617 }
Paolo Bonzini8156be52012-03-28 15:42:04 +0200618 }
619
Alex Blighac70aaf2013-08-21 16:02:57 +0100620 /* We want to use the earliest deadline from ALL vm_clocks */
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300621 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT);
Pavel Dovgalyukdcb15782019-07-25 11:44:26 +0300622 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
623 ~QEMU_TIMER_ATTR_EXTERNAL);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200624 if (deadline < 0) {
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200625 static bool notified;
626 if (!icount_sleep && !notified) {
Alistair Francis3dc6f862017-07-12 06:57:41 -0700627 warn_report("icount sleep disabled and no active timers");
Victor CLEMENTd7a0f712015-05-29 17:14:06 +0200628 notified = true;
629 }
Paolo Bonzinice78d182013-10-07 17:30:02 +0200630 return;
Alex Blighac70aaf2013-08-21 16:02:57 +0100631 }
632
Paolo Bonzini946fb272011-09-12 13:57:37 +0200633 if (deadline > 0) {
634 /*
Alex Bligh40daca52013-08-21 16:03:02 +0100635 * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to
Paolo Bonzini946fb272011-09-12 13:57:37 +0200636 * sleep. Otherwise, the CPU might be waiting for a future timer
637 * interrupt to wake it up, but the interrupt never comes because
638 * the vCPU isn't running any insns and thus doesn't advance the
Alex Bligh40daca52013-08-21 16:03:02 +0100639 * QEMU_CLOCK_VIRTUAL.
Paolo Bonzini946fb272011-09-12 13:57:37 +0200640 */
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200641 if (!icount_sleep) {
642 /*
643 * We never let VCPUs sleep in no sleep icount mode.
644 * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance
645 * to the next QEMU_CLOCK_VIRTUAL event and notify it.
646 * It is useful when we want a deterministic execution time,
647 * isolated from host latencies.
648 */
Paolo Bonzini94377112018-08-14 09:57:16 +0200649 seqlock_write_lock(&timers_state.vm_clock_seqlock,
650 &timers_state.vm_clock_lock);
Emilio G. Cotac97595d2018-09-10 19:27:50 -0400651 atomic_set_i64(&timers_state.qemu_icount_bias,
652 timers_state.qemu_icount_bias + deadline);
Paolo Bonzini94377112018-08-14 09:57:16 +0200653 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
654 &timers_state.vm_clock_lock);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200655 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
656 } else {
657 /*
658 * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some
659 * "real" time, (related to the time left until the next event) has
660 * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this.
661 * This avoids that the warps are visible externally; for example,
662 * you will not be sending network packets continuously instead of
663 * every 100ms.
664 */
Paolo Bonzini94377112018-08-14 09:57:16 +0200665 seqlock_write_lock(&timers_state.vm_clock_seqlock,
666 &timers_state.vm_clock_lock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300667 if (timers_state.vm_clock_warp_start == -1
668 || timers_state.vm_clock_warp_start > clock) {
669 timers_state.vm_clock_warp_start = clock;
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200670 }
Paolo Bonzini94377112018-08-14 09:57:16 +0200671 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
672 &timers_state.vm_clock_lock);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300673 timer_mod_anticipate(timers_state.icount_warp_timer,
674 clock + deadline);
Paolo Bonzinice78d182013-10-07 17:30:02 +0200675 }
Alex Blighac70aaf2013-08-21 16:02:57 +0100676 } else if (deadline == 0) {
Alex Bligh40daca52013-08-21 16:03:02 +0100677 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200678 }
679}
680
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300681static void qemu_account_warp_timer(void)
682{
683 if (!use_icount || !icount_sleep) {
684 return;
685 }
686
687 /* Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers
688 * do not fire, so computing the deadline does not make sense.
689 */
690 if (!runstate_is_running()) {
691 return;
692 }
693
694 /* warp clock deterministically in record/replay mode */
695 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) {
696 return;
697 }
698
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300699 timer_del(timers_state.icount_warp_timer);
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300700 icount_warp_rt();
701}
702
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200703static bool icount_state_needed(void *opaque)
704{
705 return use_icount;
706}
707
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300708static bool warp_timer_state_needed(void *opaque)
709{
710 TimersState *s = opaque;
711 return s->icount_warp_timer != NULL;
712}
713
714static bool adjust_timers_state_needed(void *opaque)
715{
716 TimersState *s = opaque;
717 return s->icount_rt_timer != NULL;
718}
719
720/*
721 * Subsection for warp timer migration is optional, because may not be created
722 */
723static const VMStateDescription icount_vmstate_warp_timer = {
724 .name = "timer/icount/warp_timer",
725 .version_id = 1,
726 .minimum_version_id = 1,
727 .needed = warp_timer_state_needed,
728 .fields = (VMStateField[]) {
729 VMSTATE_INT64(vm_clock_warp_start, TimersState),
730 VMSTATE_TIMER_PTR(icount_warp_timer, TimersState),
731 VMSTATE_END_OF_LIST()
732 }
733};
734
735static const VMStateDescription icount_vmstate_adjust_timers = {
736 .name = "timer/icount/timers",
737 .version_id = 1,
738 .minimum_version_id = 1,
739 .needed = adjust_timers_state_needed,
740 .fields = (VMStateField[]) {
741 VMSTATE_TIMER_PTR(icount_rt_timer, TimersState),
742 VMSTATE_TIMER_PTR(icount_vm_timer, TimersState),
743 VMSTATE_END_OF_LIST()
744 }
745};
746
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200747/*
748 * This is a subsection for icount migration.
749 */
750static const VMStateDescription icount_vmstate_timers = {
751 .name = "timer/icount",
752 .version_id = 1,
753 .minimum_version_id = 1,
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200754 .needed = icount_state_needed,
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200755 .fields = (VMStateField[]) {
756 VMSTATE_INT64(qemu_icount_bias, TimersState),
757 VMSTATE_INT64(qemu_icount, TimersState),
758 VMSTATE_END_OF_LIST()
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300759 },
760 .subsections = (const VMStateDescription*[]) {
761 &icount_vmstate_warp_timer,
762 &icount_vmstate_adjust_timers,
763 NULL
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200764 }
765};
766
Paolo Bonzini946fb272011-09-12 13:57:37 +0200767static const VMStateDescription vmstate_timers = {
768 .name = "timer",
769 .version_id = 2,
770 .minimum_version_id = 1,
Juan Quintela35d08452014-04-16 16:01:33 +0200771 .fields = (VMStateField[]) {
Paolo Bonzini946fb272011-09-12 13:57:37 +0200772 VMSTATE_INT64(cpu_ticks_offset, TimersState),
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200773 VMSTATE_UNUSED(8),
Paolo Bonzini946fb272011-09-12 13:57:37 +0200774 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
775 VMSTATE_END_OF_LIST()
KONRAD Fredericd09eae32014-08-01 01:37:10 +0200776 },
Juan Quintela5cd8cad2014-09-23 14:09:54 +0200777 .subsections = (const VMStateDescription*[]) {
778 &icount_vmstate_timers,
779 NULL
Paolo Bonzini946fb272011-09-12 13:57:37 +0200780 }
781};
782
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100783static void cpu_throttle_thread(CPUState *cpu, run_on_cpu_data opaque)
Jason J. Herne2adcc852015-09-08 13:12:33 -0400784{
Jason J. Herne2adcc852015-09-08 13:12:33 -0400785 double pct;
786 double throttle_ratio;
Yury Kotovbd1f7ff2019-09-09 16:13:34 +0300787 int64_t sleeptime_ns, endtime_ns;
Jason J. Herne2adcc852015-09-08 13:12:33 -0400788
789 if (!cpu_throttle_get_percentage()) {
790 return;
791 }
792
793 pct = (double)cpu_throttle_get_percentage()/100;
794 throttle_ratio = pct / (1 - pct);
Yury Kotovbd1f7ff2019-09-09 16:13:34 +0300795 /* Add 1ns to fix double's rounding error (like 0.9999999...) */
796 sleeptime_ns = (int64_t)(throttle_ratio * CPU_THROTTLE_TIMESLICE_NS + 1);
797 endtime_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + sleeptime_ns;
798 while (sleeptime_ns > 0 && !cpu->stop) {
799 if (sleeptime_ns > SCALE_MS) {
800 qemu_cond_timedwait(cpu->halt_cond, &qemu_global_mutex,
801 sleeptime_ns / SCALE_MS);
802 } else {
803 qemu_mutex_unlock_iothread();
804 g_usleep(sleeptime_ns / SCALE_US);
805 qemu_mutex_lock_iothread();
806 }
807 sleeptime_ns = endtime_ns - qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
808 }
Felipe Franciosi90bb0c02017-05-19 22:29:50 +0100809 atomic_set(&cpu->throttle_thread_scheduled, 0);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400810}
811
812static void cpu_throttle_timer_tick(void *opaque)
813{
814 CPUState *cpu;
815 double pct;
816
817 /* Stop the timer if needed */
818 if (!cpu_throttle_get_percentage()) {
819 return;
820 }
821 CPU_FOREACH(cpu) {
822 if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) {
Paolo Bonzini14e6fe12016-10-31 10:36:08 +0100823 async_run_on_cpu(cpu, cpu_throttle_thread,
824 RUN_ON_CPU_NULL);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400825 }
826 }
827
828 pct = (double)cpu_throttle_get_percentage()/100;
829 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
830 CPU_THROTTLE_TIMESLICE_NS / (1-pct));
831}
832
833void cpu_throttle_set(int new_throttle_pct)
834{
835 /* Ensure throttle percentage is within valid range */
836 new_throttle_pct = MIN(new_throttle_pct, CPU_THROTTLE_PCT_MAX);
837 new_throttle_pct = MAX(new_throttle_pct, CPU_THROTTLE_PCT_MIN);
838
839 atomic_set(&throttle_percentage, new_throttle_pct);
840
841 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
842 CPU_THROTTLE_TIMESLICE_NS);
843}
844
845void cpu_throttle_stop(void)
846{
847 atomic_set(&throttle_percentage, 0);
848}
849
850bool cpu_throttle_active(void)
851{
852 return (cpu_throttle_get_percentage() != 0);
853}
854
855int cpu_throttle_get_percentage(void)
856{
857 return atomic_read(&throttle_percentage);
858}
859
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400860void cpu_ticks_init(void)
861{
Emilio G. Cotaccdb3c12016-06-08 14:55:20 -0400862 seqlock_init(&timers_state.vm_clock_seqlock);
Emilio G. Cota87a09cd2018-09-03 13:18:29 -0400863 qemu_spin_init(&timers_state.vm_clock_lock);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400864 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
Jason J. Herne2adcc852015-09-08 13:12:33 -0400865 throttle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
866 cpu_throttle_timer_tick, NULL);
Pavel Dovgalyuk4603ea02014-09-01 09:34:49 +0400867}
868
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200869void configure_icount(QemuOpts *opts, Error **errp)
Paolo Bonzini946fb272011-09-12 13:57:37 +0200870{
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200871 const char *option;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200872 char *rem_str = NULL;
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200873
Sebastian Tanase1ad95802014-07-25 11:56:28 +0200874 option = qemu_opt_get(opts, "shift");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200875 if (!option) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200876 if (qemu_opt_get(opts, "align") != NULL) {
877 error_setg(errp, "Please specify shift option when using align");
878 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200879 return;
880 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200881
882 icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200883 if (icount_sleep) {
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300884 timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyuke76d1792016-03-10 14:56:09 +0300885 icount_timer_cb, NULL);
Victor CLEMENT5045e9d92015-05-29 17:14:04 +0200886 }
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200887
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200888 icount_align_option = qemu_opt_get_bool(opts, "align", false);
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200889
890 if (icount_align_option && !icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500891 error_setg(errp, "align=on and sleep=off are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200892 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200893 if (strcmp(option, "auto") != 0) {
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200894 errno = 0;
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200895 timers_state.icount_time_shift = strtol(option, &rem_str, 0);
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200896 if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
897 error_setg(errp, "icount: Invalid shift value");
898 }
Paolo Bonzini946fb272011-09-12 13:57:37 +0200899 use_icount = 1;
900 return;
Sebastian Tanasea8bfac32014-07-25 11:56:29 +0200901 } else if (icount_align_option) {
902 error_setg(errp, "shift=auto and align=on are incompatible");
Victor CLEMENTf1f4b572015-05-29 17:14:05 +0200903 } else if (!icount_sleep) {
Pranith Kumar778d9f92016-02-26 10:16:51 -0500904 error_setg(errp, "shift=auto and sleep=off are incompatible");
Paolo Bonzini946fb272011-09-12 13:57:37 +0200905 }
906
907 use_icount = 2;
908
909 /* 125MIPS seems a reasonable initial guess at the guest speed.
910 It will be corrected fairly quickly anyway. */
Paolo Bonzinic1ff0732018-08-14 09:31:58 +0200911 timers_state.icount_time_shift = 3;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200912
913 /* Have both realtime and virtual time triggers for speed adjustment.
914 The realtime trigger catches emulated time passing too slowly,
915 the virtual time trigger catches emulated time passing too fast.
916 Realtime triggers occur even when idle, so use them less frequently
917 than VM triggers. */
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300918 timers_state.vm_clock_warp_start = -1;
919 timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300920 icount_adjust_rt, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300921 timer_mod(timers_state.icount_rt_timer,
Pavel Dovgalyukbf2a7dd2014-11-26 13:40:55 +0300922 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300923 timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
Alex Bligh40daca52013-08-21 16:03:02 +0100924 icount_adjust_vm, NULL);
Pavel Dovgalyukb39e3f32018-01-11 11:26:10 +0300925 timer_mod(timers_state.icount_vm_timer,
Alex Bligh40daca52013-08-21 16:03:02 +0100926 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
Rutuja Shah73bcb242016-03-21 21:32:30 +0530927 NANOSECONDS_PER_SECOND / 10);
Paolo Bonzini946fb272011-09-12 13:57:37 +0200928}
929
930/***********************************************************/
Alex Bennée65467062017-02-23 18:29:09 +0000931/* TCG vCPU kick timer
932 *
933 * The kick timer is responsible for moving single threaded vCPU
934 * emulation on to the next vCPU. If more than one vCPU is running a
935 * timer event with force a cpu->exit so the next vCPU can get
936 * scheduled.
937 *
938 * The timer is removed if all vCPUs are idle and restarted again once
939 * idleness is complete.
940 */
941
942static QEMUTimer *tcg_kick_vcpu_timer;
Alex Bennée791158d2017-02-23 18:29:10 +0000943static CPUState *tcg_current_rr_cpu;
Alex Bennée65467062017-02-23 18:29:09 +0000944
945#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
946
947static inline int64_t qemu_tcg_next_kick(void)
948{
949 return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
950}
951
Alex Bennée791158d2017-02-23 18:29:10 +0000952/* Kick the currently round-robin scheduled vCPU */
953static void qemu_cpu_kick_rr_cpu(void)
954{
955 CPUState *cpu;
Alex Bennée791158d2017-02-23 18:29:10 +0000956 do {
957 cpu = atomic_mb_read(&tcg_current_rr_cpu);
958 if (cpu) {
959 cpu_exit(cpu);
960 }
961 } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
962}
963
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100964static void do_nothing(CPUState *cpu, run_on_cpu_data unused)
965{
966}
967
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100968void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
969{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100970 if (!use_icount || type != QEMU_CLOCK_VIRTUAL) {
971 qemu_notify_event();
972 return;
973 }
974
Peter Maydellc52e7132018-04-10 13:02:25 +0100975 if (qemu_in_vcpu_thread()) {
976 /* A CPU is currently running; kick it back out to the
977 * tcg_cpu_exec() loop so it will recalculate its
978 * icount deadline immediately.
979 */
980 qemu_cpu_kick(current_cpu);
981 } else if (first_cpu) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100982 /* qemu_cpu_kick is not enough to kick a halted CPU out of
983 * qemu_tcg_wait_io_event. async_run_on_cpu, instead,
984 * causes cpu_thread_is_idle to return false. This way,
985 * handle_icount_deadline can run.
Peter Maydellc52e7132018-04-10 13:02:25 +0100986 * If we have no CPUs at all for some reason, we don't
987 * need to do anything.
Paolo Bonzini6b8f0182017-03-02 19:56:40 +0100988 */
989 async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
990 }
Paolo Bonzini3f53bc62017-03-03 11:50:29 +0100991}
992
Alex Bennée65467062017-02-23 18:29:09 +0000993static void kick_tcg_thread(void *opaque)
994{
995 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
Alex Bennée791158d2017-02-23 18:29:10 +0000996 qemu_cpu_kick_rr_cpu();
Alex Bennée65467062017-02-23 18:29:09 +0000997}
998
999static void start_tcg_kick_timer(void)
1000{
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001001 assert(!mttcg_enabled);
1002 if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
Alex Bennée65467062017-02-23 18:29:09 +00001003 tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
1004 kick_tcg_thread, NULL);
Alex Bennée1926ab22018-09-27 18:17:24 +01001005 }
1006 if (tcg_kick_vcpu_timer && !timer_pending(tcg_kick_vcpu_timer)) {
Alex Bennée65467062017-02-23 18:29:09 +00001007 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
1008 }
1009}
1010
1011static void stop_tcg_kick_timer(void)
1012{
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001013 assert(!mttcg_enabled);
Alex Bennée1926ab22018-09-27 18:17:24 +01001014 if (tcg_kick_vcpu_timer && timer_pending(tcg_kick_vcpu_timer)) {
Alex Bennée65467062017-02-23 18:29:09 +00001015 timer_del(tcg_kick_vcpu_timer);
Alex Bennée65467062017-02-23 18:29:09 +00001016 }
1017}
1018
Alex Bennée65467062017-02-23 18:29:09 +00001019/***********************************************************/
Blue Swirl296af7c2010-03-29 19:23:50 +00001020void hw_error(const char *fmt, ...)
1021{
1022 va_list ap;
Andreas Färber55e5c282012-12-17 06:18:02 +01001023 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001024
1025 va_start(ap, fmt);
1026 fprintf(stderr, "qemu: hardware error: ");
1027 vfprintf(stderr, fmt, ap);
1028 fprintf(stderr, "\n");
Andreas Färberbdc44642013-06-24 23:50:24 +02001029 CPU_FOREACH(cpu) {
Andreas Färber55e5c282012-12-17 06:18:02 +01001030 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
Markus Armbruster90c84c52019-04-17 21:18:02 +02001031 cpu_dump_state(cpu, stderr, CPU_DUMP_FPU);
Blue Swirl296af7c2010-03-29 19:23:50 +00001032 }
1033 va_end(ap);
1034 abort();
1035}
1036
1037void cpu_synchronize_all_states(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_state(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001043 /* TODO: move to cpu_synchronize_state() */
1044 if (hvf_enabled()) {
1045 hvf_cpu_synchronize_state(cpu);
1046 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001047 }
1048}
1049
1050void cpu_synchronize_all_post_reset(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_reset(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001056 /* TODO: move to cpu_synchronize_post_reset() */
1057 if (hvf_enabled()) {
1058 hvf_cpu_synchronize_post_reset(cpu);
1059 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001060 }
1061}
1062
1063void cpu_synchronize_all_post_init(void)
1064{
Andreas Färber182735e2013-05-29 22:29:20 +02001065 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001066
Andreas Färberbdc44642013-06-24 23:50:24 +02001067 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001068 cpu_synchronize_post_init(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001069 /* TODO: move to cpu_synchronize_post_init() */
1070 if (hvf_enabled()) {
1071 hvf_cpu_synchronize_post_init(cpu);
1072 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001073 }
1074}
1075
David Gibson75e972d2017-05-26 14:46:28 +10001076void cpu_synchronize_all_pre_loadvm(void)
1077{
1078 CPUState *cpu;
1079
1080 CPU_FOREACH(cpu) {
1081 cpu_synchronize_pre_loadvm(cpu);
1082 }
1083}
1084
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001085static int do_vm_stop(RunState state, bool send_stop)
Blue Swirl296af7c2010-03-29 19:23:50 +00001086{
Kevin Wolf56983462013-07-05 13:49:54 +02001087 int ret = 0;
1088
Luiz Capitulino13548692011-07-29 15:36:43 -03001089 if (runstate_is_running()) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001090 cpu_disable_ticks();
Blue Swirl296af7c2010-03-29 19:23:50 +00001091 pause_all_vcpus();
Luiz Capitulinof5bbfba2011-07-29 15:04:45 -03001092 runstate_set(state);
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001093 vm_state_notify(0, state);
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001094 if (send_stop) {
Peter Xu3ab72382018-08-15 21:37:37 +08001095 qapi_event_send_stop();
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001096 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001097 }
Kevin Wolf56983462013-07-05 13:49:54 +02001098
Kevin Wolf594a45c2013-07-18 14:52:19 +02001099 bdrv_drain_all();
Pavel Dovgalyuk6d0ceb82016-09-26 11:08:16 +03001100 replay_disable_events();
John Snow22af08e2016-09-22 21:45:51 -04001101 ret = bdrv_flush_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02001102
Kevin Wolf56983462013-07-05 13:49:54 +02001103 return ret;
Blue Swirl296af7c2010-03-29 19:23:50 +00001104}
1105
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00001106/* Special vm_stop() variant for terminating the process. Historically clients
1107 * did not expect a QMP STOP event and so we need to retain compatibility.
1108 */
1109int vm_shutdown(void)
1110{
1111 return do_vm_stop(RUN_STATE_SHUTDOWN, false);
1112}
1113
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001114static bool cpu_can_run(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001115{
Andreas Färber4fdeee72012-05-02 23:10:09 +02001116 if (cpu->stop) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001117 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001118 }
Tiejun Chen321bc0b2013-08-02 09:43:09 +08001119 if (cpu_is_stopped(cpu)) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001120 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001121 }
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001122 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001123}
1124
Andreas Färber91325042013-05-27 02:07:49 +02001125static void cpu_handle_guest_debug(CPUState *cpu)
Jan Kiszka3c638d02010-06-25 16:56:56 +02001126{
Andreas Färber64f6b342013-05-27 02:06:09 +02001127 gdb_set_stop_cpu(cpu);
Jan Kiszka8cf71712011-02-07 12:19:16 +01001128 qemu_system_debug_request();
Andreas Färberf324e762012-05-02 23:26:21 +02001129 cpu->stopped = true;
Jan Kiszka3c638d02010-06-25 16:56:56 +02001130}
1131
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001132#ifdef CONFIG_LINUX
1133static void sigbus_reraise(void)
1134{
1135 sigset_t set;
1136 struct sigaction action;
1137
1138 memset(&action, 0, sizeof(action));
1139 action.sa_handler = SIG_DFL;
1140 if (!sigaction(SIGBUS, &action, NULL)) {
1141 raise(SIGBUS);
1142 sigemptyset(&set);
1143 sigaddset(&set, SIGBUS);
Peter Maydella2d17612016-05-16 18:33:59 +01001144 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001145 }
1146 perror("Failed to re-raise SIGBUS!\n");
1147 abort();
1148}
1149
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001150static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx)
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001151{
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001152 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) {
1153 sigbus_reraise();
1154 }
1155
Paolo Bonzini2ae41db2017-02-08 12:48:54 +01001156 if (current_cpu) {
1157 /* Called asynchronously in VCPU thread. */
1158 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) {
1159 sigbus_reraise();
1160 }
1161 } else {
1162 /* Called synchronously (via signalfd) in main thread. */
1163 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) {
1164 sigbus_reraise();
1165 }
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001166 }
1167}
1168
1169static void qemu_init_sigbus(void)
1170{
1171 struct sigaction action;
1172
1173 memset(&action, 0, sizeof(action));
1174 action.sa_flags = SA_SIGINFO;
Paolo Bonzinid98d4072017-02-08 13:22:12 +01001175 action.sa_sigaction = sigbus_handler;
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001176 sigaction(SIGBUS, &action, NULL);
1177
1178 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
1179}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001180#else /* !CONFIG_LINUX */
1181static void qemu_init_sigbus(void)
1182{
1183}
Paolo Bonzinia16fc072017-02-09 09:50:02 +01001184#endif /* !CONFIG_LINUX */
Blue Swirl296af7c2010-03-29 19:23:50 +00001185
Blue Swirl296af7c2010-03-29 19:23:50 +00001186static QemuThread io_thread;
1187
Blue Swirl296af7c2010-03-29 19:23:50 +00001188/* cpu creation */
1189static QemuCond qemu_cpu_cond;
1190/* system init */
Blue Swirl296af7c2010-03-29 19:23:50 +00001191static QemuCond qemu_pause_cond;
1192
Paolo Bonzinid3b12f52011-09-13 10:30:52 +02001193void qemu_init_cpu_loop(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001194{
Jan Kiszka6d9cb732011-02-01 22:15:58 +01001195 qemu_init_sigbus();
Anthony Liguoried945922011-02-08 18:18:18 +01001196 qemu_cond_init(&qemu_cpu_cond);
Anthony Liguoried945922011-02-08 18:18:18 +01001197 qemu_cond_init(&qemu_pause_cond);
Blue Swirl296af7c2010-03-29 19:23:50 +00001198 qemu_mutex_init(&qemu_global_mutex);
Blue Swirl296af7c2010-03-29 19:23:50 +00001199
Jan Kiszkab7680cb2011-03-12 17:43:51 +01001200 qemu_thread_get_self(&io_thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001201}
1202
Paolo Bonzini14e6fe12016-10-31 10:36:08 +01001203void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -03001204{
Sergey Fedorovd148d902016-08-29 09:51:00 +02001205 do_run_on_cpu(cpu, func, data, &qemu_global_mutex);
Chegu Vinod3c022702013-06-24 03:49:41 -06001206}
1207
Gu Zheng4c055ab2016-05-12 09:18:13 +05301208static void qemu_kvm_destroy_vcpu(CPUState *cpu)
1209{
1210 if (kvm_destroy_vcpu(cpu) < 0) {
1211 error_report("kvm_destroy_vcpu failed");
1212 exit(EXIT_FAILURE);
1213 }
1214}
1215
1216static void qemu_tcg_destroy_vcpu(CPUState *cpu)
1217{
1218}
1219
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001220static void qemu_cpu_stop(CPUState *cpu, bool exit)
1221{
1222 g_assert(qemu_cpu_is_self(cpu));
1223 cpu->stop = false;
1224 cpu->stopped = true;
1225 if (exit) {
1226 cpu_exit(cpu);
1227 }
1228 qemu_cond_broadcast(&qemu_pause_cond);
1229}
1230
Andreas Färber509a0d72012-05-03 02:18:09 +02001231static void qemu_wait_io_event_common(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001232{
Alex Bennée37257942017-02-23 18:29:14 +00001233 atomic_mb_set(&cpu->thread_kicked, false);
Andreas Färber4fdeee72012-05-02 23:10:09 +02001234 if (cpu->stop) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001235 qemu_cpu_stop(cpu, false);
Blue Swirl296af7c2010-03-29 19:23:50 +00001236 }
Sergey Fedorova5403c62016-08-02 18:27:36 +01001237 process_queued_cpu_work(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001238}
1239
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001240static void qemu_tcg_rr_wait_io_event(void)
Alex Bennée37257942017-02-23 18:29:14 +00001241{
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001242 CPUState *cpu;
1243
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001244 while (all_cpu_threads_idle()) {
Alex Bennée65467062017-02-23 18:29:09 +00001245 stop_tcg_kick_timer();
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001246 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001247 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001248
Alex Bennée65467062017-02-23 18:29:09 +00001249 start_tcg_kick_timer();
1250
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001251 CPU_FOREACH(cpu) {
1252 qemu_wait_io_event_common(cpu);
1253 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001254}
1255
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001256static void qemu_wait_io_event(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001257{
Andreas Färbera98ae1d2013-05-26 23:21:08 +02001258 while (cpu_thread_is_idle(cpu)) {
Andreas Färberf5c121b2012-05-03 01:22:49 +02001259 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +01001260 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001261
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001262#ifdef _WIN32
1263 /* Eat dummy APC queued by qemu_cpu_kick_thread. */
1264 if (!tcg_enabled()) {
1265 SleepEx(0, TRUE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001266 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001267#endif
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001268 qemu_wait_io_event_common(cpu);
1269}
1270
Jan Kiszka7e97cd82011-02-07 12:19:12 +01001271static void *qemu_kvm_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001272{
Andreas Färber48a106b2013-05-27 02:20:39 +02001273 CPUState *cpu = arg;
Jan Kiszka84b49152011-02-01 22:15:50 +01001274 int r;
Blue Swirl296af7c2010-03-29 19:23:50 +00001275
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001276 rcu_register_thread();
1277
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001278 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001279 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001280 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001281 cpu->can_do_io = 1;
Andreas Färber4917cf42013-05-27 05:17:50 +02001282 current_cpu = cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001283
Andreas Färber504134d2012-12-17 06:38:45 +01001284 r = kvm_init_vcpu(cpu);
Jan Kiszka84b49152011-02-01 22:15:50 +01001285 if (r < 0) {
Alistair Francis493d89b2018-02-03 09:43:14 +01001286 error_report("kvm_init_vcpu failed: %s", strerror(-r));
Jan Kiszka84b49152011-02-01 22:15:50 +01001287 exit(1);
1288 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001289
Paolo Bonzini18268b62017-02-09 09:41:14 +01001290 kvm_init_cpu_signals(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001291
1292 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001293 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001294 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001295 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Blue Swirl296af7c2010-03-29 19:23:50 +00001296
Gu Zheng4c055ab2016-05-12 09:18:13 +05301297 do {
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001298 if (cpu_can_run(cpu)) {
Andreas Färber1458c362013-05-26 23:46:55 +02001299 r = kvm_cpu_exec(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001300 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +02001301 cpu_handle_guest_debug(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +01001302 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001303 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001304 qemu_wait_io_event(cpu);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301305 } while (!cpu->unplug || cpu_can_run(cpu));
Blue Swirl296af7c2010-03-29 19:23:50 +00001306
Gu Zheng4c055ab2016-05-12 09:18:13 +05301307 qemu_kvm_destroy_vcpu(cpu);
Bharata B Rao2c579042016-05-12 09:18:14 +05301308 cpu->created = false;
1309 qemu_cond_signal(&qemu_cpu_cond);
Gu Zheng4c055ab2016-05-12 09:18:13 +05301310 qemu_mutex_unlock_iothread();
Paolo Bonzini57615ed2018-01-30 11:04:36 -05001311 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001312 return NULL;
1313}
1314
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001315static void *qemu_dummy_cpu_thread_fn(void *arg)
1316{
1317#ifdef _WIN32
Alistair Francis493d89b2018-02-03 09:43:14 +01001318 error_report("qtest is not supported under Windows");
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001319 exit(1);
1320#else
Andreas Färber10a90212013-05-27 02:24:35 +02001321 CPUState *cpu = arg;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001322 sigset_t waitset;
1323 int r;
1324
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001325 rcu_register_thread();
1326
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001327 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001328 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +02001329 cpu->thread_id = qemu_get_thread_id();
Pavel Dovgalyuk626cf8f2014-12-08 10:53:17 +03001330 cpu->can_do_io = 1;
Alex Bennée37257942017-02-23 18:29:14 +00001331 current_cpu = cpu;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001332
1333 sigemptyset(&waitset);
1334 sigaddset(&waitset, SIG_IPI);
1335
1336 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +02001337 cpu->created = true;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001338 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001339 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001340
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001341 do {
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001342 qemu_mutex_unlock_iothread();
1343 do {
1344 int sig;
1345 r = sigwait(&waitset, &sig);
1346 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
1347 if (r == -1) {
1348 perror("sigwait");
1349 exit(1);
1350 }
1351 qemu_mutex_lock_iothread();
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001352 qemu_wait_io_event(cpu);
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001353 } while (!cpu->unplug);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001354
David Hildenbrandd40bfcb2019-02-18 10:21:57 +01001355 qemu_mutex_unlock_iothread();
Paolo Bonzinid2831ab2018-01-30 11:04:53 -05001356 rcu_unregister_thread();
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001357 return NULL;
1358#endif
1359}
1360
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001361static int64_t tcg_get_icount_limit(void)
1362{
1363 int64_t deadline;
1364
1365 if (replay_mode != REPLAY_MODE_PLAY) {
Pavel Dovgalyukdcb15782019-07-25 11:44:26 +03001366 /*
1367 * Include all the timers, because they may need an attention.
1368 * Too long CPU execution may create unnecessary delay in UI.
1369 */
1370 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
1371 QEMU_TIMER_ATTR_ALL);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001372
1373 /* Maintain prior (possibly buggy) behaviour where if no deadline
1374 * was set (as there is no QEMU_CLOCK_VIRTUAL timer) or it is more than
1375 * INT32_MAX nanoseconds ahead, we still use INT32_MAX
1376 * nanoseconds.
1377 */
1378 if ((deadline < 0) || (deadline > INT32_MAX)) {
1379 deadline = INT32_MAX;
1380 }
1381
1382 return qemu_icount_round(deadline);
1383 } else {
1384 return replay_get_instructions();
1385 }
1386}
1387
Alex Bennée12e97002016-10-27 16:10:14 +01001388static void handle_icount_deadline(void)
1389{
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001390 assert(qemu_in_vcpu_thread());
Alex Bennée12e97002016-10-27 16:10:14 +01001391 if (use_icount) {
Pavel Dovgalyukdcb15782019-07-25 11:44:26 +03001392 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
1393 QEMU_TIMER_ATTR_ALL);
Alex Bennée12e97002016-10-27 16:10:14 +01001394
1395 if (deadline == 0) {
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001396 /* Wake up other AioContexts. */
Alex Bennée12e97002016-10-27 16:10:14 +01001397 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001398 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
Alex Bennée12e97002016-10-27 16:10:14 +01001399 }
1400 }
1401}
1402
Alex Bennée05248382017-03-29 16:46:59 +01001403static void prepare_icount_for_run(CPUState *cpu)
1404{
1405 if (use_icount) {
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001406 int insns_left;
Alex Bennée05248382017-03-29 16:46:59 +01001407
1408 /* These should always be cleared by process_icount_data after
1409 * each vCPU execution. However u16.high can be raised
1410 * asynchronously by cpu_exit/cpu_interrupt/tcg_handle_interrupt
1411 */
Richard Henderson5e140192019-03-28 11:54:23 -10001412 g_assert(cpu_neg(cpu)->icount_decr.u16.low == 0);
Alex Bennée05248382017-03-29 16:46:59 +01001413 g_assert(cpu->icount_extra == 0);
1414
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001415 cpu->icount_budget = tcg_get_icount_limit();
1416 insns_left = MIN(0xffff, cpu->icount_budget);
Richard Henderson5e140192019-03-28 11:54:23 -10001417 cpu_neg(cpu)->icount_decr.u16.low = insns_left;
Alex Bennéeeda5f7c2017-04-05 12:35:48 +01001418 cpu->icount_extra = cpu->icount_budget - insns_left;
Alex Bennéed759c952018-02-27 12:52:48 +03001419
1420 replay_mutex_lock();
Alex Bennée05248382017-03-29 16:46:59 +01001421 }
1422}
1423
1424static void process_icount_data(CPUState *cpu)
1425{
1426 if (use_icount) {
Alex Bennéee4cd9652017-03-31 16:09:42 +01001427 /* Account for executed instructions */
Alex Bennée512d3c82017-04-05 12:32:37 +01001428 cpu_update_icount(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001429
1430 /* Reset the counters */
Richard Henderson5e140192019-03-28 11:54:23 -10001431 cpu_neg(cpu)->icount_decr.u16.low = 0;
Alex Bennée05248382017-03-29 16:46:59 +01001432 cpu->icount_extra = 0;
Alex Bennéee4cd9652017-03-31 16:09:42 +01001433 cpu->icount_budget = 0;
1434
Alex Bennée05248382017-03-29 16:46:59 +01001435 replay_account_executed_instructions();
Alex Bennéed759c952018-02-27 12:52:48 +03001436
1437 replay_mutex_unlock();
Alex Bennée05248382017-03-29 16:46:59 +01001438 }
1439}
1440
1441
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001442static int tcg_cpu_exec(CPUState *cpu)
1443{
1444 int ret;
1445#ifdef CONFIG_PROFILER
1446 int64_t ti;
1447#endif
1448
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001449 assert(tcg_enabled());
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001450#ifdef CONFIG_PROFILER
1451 ti = profile_getclock();
1452#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001453 cpu_exec_start(cpu);
1454 ret = cpu_exec(cpu);
1455 cpu_exec_end(cpu);
1456#ifdef CONFIG_PROFILER
Emilio G. Cota72fd2ef2018-10-10 10:48:53 -04001457 atomic_set(&tcg_ctx->prof.cpu_exec_time,
1458 tcg_ctx->prof.cpu_exec_time + profile_getclock() - ti);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001459#endif
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001460 return ret;
1461}
1462
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001463/* Destroy any remaining vCPUs which have been unplugged and have
1464 * finished running
1465 */
1466static void deal_with_unplugged_cpus(void)
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001467{
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001468 CPUState *cpu;
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001469
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001470 CPU_FOREACH(cpu) {
1471 if (cpu->unplug && !cpu_can_run(cpu)) {
1472 qemu_tcg_destroy_vcpu(cpu);
1473 cpu->created = false;
1474 qemu_cond_signal(&qemu_cpu_cond);
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001475 break;
1476 }
1477 }
Alex Bennée1be7fcb2016-10-27 16:10:08 +01001478}
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001479
Alex Bennée65467062017-02-23 18:29:09 +00001480/* Single-threaded TCG
1481 *
1482 * In the single-threaded case each vCPU is simulated in turn. If
1483 * there is more than a single vCPU we create a simple timer to kick
1484 * the vCPU and ensure we don't get stuck in a tight loop in one vCPU.
1485 * This is done explicitly rather than relying on side-effects
1486 * elsewhere.
1487 */
1488
Alex Bennée37257942017-02-23 18:29:14 +00001489static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +00001490{
Andreas Färberc3586ba2012-05-03 01:41:24 +02001491 CPUState *cpu = arg;
Blue Swirl296af7c2010-03-29 19:23:50 +00001492
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001493 assert(tcg_enabled());
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001494 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001495 tcg_register_thread();
Paolo Bonziniab28bd22015-07-09 08:55:38 +02001496
Paolo Bonzini2e7f7a32015-06-18 18:47:18 +02001497 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +02001498 qemu_thread_get_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001499
David Hildenbrand5a9c9732018-02-09 20:52:39 +01001500 cpu->thread_id = qemu_get_thread_id();
1501 cpu->created = true;
1502 cpu->can_do_io = 1;
Blue Swirl296af7c2010-03-29 19:23:50 +00001503 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001504 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Blue Swirl296af7c2010-03-29 19:23:50 +00001505
Jan Kiszkafa7d1862011-08-22 18:35:25 +02001506 /* wait for initial kick-off after machine start */
Emilio G. Cotac28e3992015-04-27 12:45:28 -04001507 while (first_cpu->stopped) {
KONRAD Fredericd5f8d612015-08-10 17:27:06 +02001508 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001509
1510 /* process any pending work */
Andreas Färberbdc44642013-06-24 23:50:24 +02001511 CPU_FOREACH(cpu) {
Alex Bennée37257942017-02-23 18:29:14 +00001512 current_cpu = cpu;
Andreas Färber182735e2013-05-29 22:29:20 +02001513 qemu_wait_io_event_common(cpu);
Jan Kiszka8e564b42012-02-17 18:31:15 +01001514 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001515 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001516
Alex Bennée65467062017-02-23 18:29:09 +00001517 start_tcg_kick_timer();
1518
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001519 cpu = first_cpu;
1520
Alex Bennéee5143e32017-02-23 18:29:12 +00001521 /* process any pending work */
1522 cpu->exit_request = 1;
1523
Blue Swirl296af7c2010-03-29 19:23:50 +00001524 while (1) {
Alex Bennéed759c952018-02-27 12:52:48 +03001525 qemu_mutex_unlock_iothread();
1526 replay_mutex_lock();
1527 qemu_mutex_lock_iothread();
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001528 /* Account partial waits to QEMU_CLOCK_VIRTUAL. */
1529 qemu_account_warp_timer();
1530
Paolo Bonzini6b8f0182017-03-02 19:56:40 +01001531 /* Run the timers here. This is much more efficient than
1532 * waking up the I/O thread and waiting for completion.
1533 */
1534 handle_icount_deadline();
1535
Alex Bennéed759c952018-02-27 12:52:48 +03001536 replay_mutex_unlock();
1537
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001538 if (!cpu) {
1539 cpu = first_cpu;
1540 }
1541
Alex Bennéee5143e32017-02-23 18:29:12 +00001542 while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
1543
Alex Bennée791158d2017-02-23 18:29:10 +00001544 atomic_mb_set(&tcg_current_rr_cpu, cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001545 current_cpu = cpu;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001546
1547 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
1548 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
1549
1550 if (cpu_can_run(cpu)) {
1551 int r;
Alex Bennée05248382017-03-29 16:46:59 +01001552
Alex Bennéed759c952018-02-27 12:52:48 +03001553 qemu_mutex_unlock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001554 prepare_icount_for_run(cpu);
1555
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001556 r = tcg_cpu_exec(cpu);
Alex Bennée05248382017-03-29 16:46:59 +01001557
1558 process_icount_data(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001559 qemu_mutex_lock_iothread();
Alex Bennée05248382017-03-29 16:46:59 +01001560
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001561 if (r == EXCP_DEBUG) {
1562 cpu_handle_guest_debug(cpu);
1563 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001564 } else if (r == EXCP_ATOMIC) {
1565 qemu_mutex_unlock_iothread();
1566 cpu_exec_step_atomic(cpu);
1567 qemu_mutex_lock_iothread();
1568 break;
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001569 }
Alex Bennée37257942017-02-23 18:29:14 +00001570 } else if (cpu->stop) {
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001571 if (cpu->unplug) {
1572 cpu = CPU_NEXT(cpu);
1573 }
1574 break;
1575 }
1576
Alex Bennéee5143e32017-02-23 18:29:12 +00001577 cpu = CPU_NEXT(cpu);
1578 } /* while (cpu && !cpu->exit_request).. */
1579
Alex Bennée791158d2017-02-23 18:29:10 +00001580 /* Does not need atomic_mb_set because a spurious wakeup is okay. */
1581 atomic_set(&tcg_current_rr_cpu, NULL);
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001582
Alex Bennéee5143e32017-02-23 18:29:12 +00001583 if (cpu && cpu->exit_request) {
1584 atomic_mb_set(&cpu->exit_request, 0);
1585 }
Alex Blighac70aaf2013-08-21 16:02:57 +01001586
Clement Deschamps013aabd2018-10-21 16:21:03 +02001587 if (use_icount && all_cpu_threads_idle()) {
1588 /*
1589 * When all cpus are sleeping (e.g in WFI), to avoid a deadlock
1590 * in the main_loop, wake it up in order to start the warp timer.
1591 */
1592 qemu_notify_event();
1593 }
1594
Paolo Bonzinia8efa602018-11-14 12:36:57 +01001595 qemu_tcg_rr_wait_io_event();
Alex Bennéec93bbbe2016-10-27 16:10:09 +01001596 deal_with_unplugged_cpus();
Blue Swirl296af7c2010-03-29 19:23:50 +00001597 }
1598
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001599 rcu_unregister_thread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001600 return NULL;
1601}
1602
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001603static void *qemu_hax_cpu_thread_fn(void *arg)
1604{
1605 CPUState *cpu = arg;
1606 int r;
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001607
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001608 rcu_register_thread();
Vincent Palatinb3d3a422017-03-20 11:15:49 +01001609 qemu_mutex_lock_iothread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001610 qemu_thread_get_self(cpu->thread);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001611
1612 cpu->thread_id = qemu_get_thread_id();
1613 cpu->created = true;
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001614 current_cpu = cpu;
1615
1616 hax_init_vcpu(cpu);
1617 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001618 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001619
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001620 do {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001621 if (cpu_can_run(cpu)) {
1622 r = hax_smp_cpu_exec(cpu);
1623 if (r == EXCP_DEBUG) {
1624 cpu_handle_guest_debug(cpu);
1625 }
1626 }
1627
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001628 qemu_wait_io_event(cpu);
Paolo Bonzini9857c2d2018-01-30 16:28:49 +01001629 } while (!cpu->unplug || cpu_can_run(cpu));
1630 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001631 return NULL;
1632}
1633
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001634/* The HVF-specific vCPU thread function. This one should only run when the host
1635 * CPU supports the VMX "unrestricted guest" feature. */
1636static void *qemu_hvf_cpu_thread_fn(void *arg)
1637{
1638 CPUState *cpu = arg;
1639
1640 int r;
1641
1642 assert(hvf_enabled());
1643
1644 rcu_register_thread();
1645
1646 qemu_mutex_lock_iothread();
1647 qemu_thread_get_self(cpu->thread);
1648
1649 cpu->thread_id = qemu_get_thread_id();
1650 cpu->can_do_io = 1;
1651 current_cpu = cpu;
1652
1653 hvf_init_vcpu(cpu);
1654
1655 /* signal CPU creation */
1656 cpu->created = true;
1657 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001658 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001659
1660 do {
1661 if (cpu_can_run(cpu)) {
1662 r = hvf_vcpu_exec(cpu);
1663 if (r == EXCP_DEBUG) {
1664 cpu_handle_guest_debug(cpu);
1665 }
1666 }
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001667 qemu_wait_io_event(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001668 } while (!cpu->unplug || cpu_can_run(cpu));
1669
1670 hvf_vcpu_destroy(cpu);
1671 cpu->created = false;
1672 qemu_cond_signal(&qemu_cpu_cond);
1673 qemu_mutex_unlock_iothread();
Paolo Bonzini8178e632018-01-30 11:05:21 -05001674 rcu_unregister_thread();
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05001675 return NULL;
1676}
1677
Justin Terry (VM)19306802018-01-22 13:07:49 -08001678static void *qemu_whpx_cpu_thread_fn(void *arg)
1679{
1680 CPUState *cpu = arg;
1681 int r;
1682
1683 rcu_register_thread();
1684
1685 qemu_mutex_lock_iothread();
1686 qemu_thread_get_self(cpu->thread);
1687 cpu->thread_id = qemu_get_thread_id();
1688 current_cpu = cpu;
1689
1690 r = whpx_init_vcpu(cpu);
1691 if (r < 0) {
1692 fprintf(stderr, "whpx_init_vcpu failed: %s\n", strerror(-r));
1693 exit(1);
1694 }
1695
1696 /* signal CPU creation */
1697 cpu->created = true;
1698 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001699 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Justin Terry (VM)19306802018-01-22 13:07:49 -08001700
1701 do {
1702 if (cpu_can_run(cpu)) {
1703 r = whpx_vcpu_exec(cpu);
1704 if (r == EXCP_DEBUG) {
1705 cpu_handle_guest_debug(cpu);
1706 }
1707 }
1708 while (cpu_thread_is_idle(cpu)) {
1709 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1710 }
1711 qemu_wait_io_event_common(cpu);
1712 } while (!cpu->unplug || cpu_can_run(cpu));
1713
1714 whpx_destroy_vcpu(cpu);
1715 cpu->created = false;
1716 qemu_cond_signal(&qemu_cpu_cond);
1717 qemu_mutex_unlock_iothread();
1718 rcu_unregister_thread();
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001719 return NULL;
1720}
1721
1722#ifdef _WIN32
1723static void CALLBACK dummy_apc_func(ULONG_PTR unused)
1724{
1725}
1726#endif
1727
Alex Bennée37257942017-02-23 18:29:14 +00001728/* Multi-threaded TCG
1729 *
1730 * In the multi-threaded case each vCPU has its own thread. The TLS
1731 * variable current_cpu can be used deep in the code to find the
1732 * current CPUState for a given thread.
1733 */
1734
1735static void *qemu_tcg_cpu_thread_fn(void *arg)
1736{
1737 CPUState *cpu = arg;
1738
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001739 assert(tcg_enabled());
Alex Bennéebf51c722017-03-30 18:32:29 +01001740 g_assert(!use_icount);
1741
Alex Bennée37257942017-02-23 18:29:14 +00001742 rcu_register_thread();
Emilio G. Cota3468b592017-07-19 18:57:58 -04001743 tcg_register_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001744
1745 qemu_mutex_lock_iothread();
1746 qemu_thread_get_self(cpu->thread);
1747
1748 cpu->thread_id = qemu_get_thread_id();
1749 cpu->created = true;
1750 cpu->can_do_io = 1;
1751 current_cpu = cpu;
1752 qemu_cond_signal(&qemu_cpu_cond);
Richard Henderson9c09a252019-03-14 13:06:29 -07001753 qemu_guest_random_seed_thread_part2(cpu->random_seed);
Alex Bennée37257942017-02-23 18:29:14 +00001754
1755 /* process any pending work */
1756 cpu->exit_request = 1;
1757
Cédric Le Goater54961aa2018-04-25 15:18:28 +02001758 do {
Alex Bennée37257942017-02-23 18:29:14 +00001759 if (cpu_can_run(cpu)) {
1760 int r;
Alex Bennéed759c952018-02-27 12:52:48 +03001761 qemu_mutex_unlock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001762 r = tcg_cpu_exec(cpu);
Alex Bennéed759c952018-02-27 12:52:48 +03001763 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001764 switch (r) {
1765 case EXCP_DEBUG:
1766 cpu_handle_guest_debug(cpu);
1767 break;
1768 case EXCP_HALTED:
1769 /* during start-up the vCPU is reset and the thread is
1770 * kicked several times. If we don't ensure we go back
1771 * to sleep in the halted state we won't cleanly
1772 * start-up when the vCPU is enabled.
1773 *
1774 * cpu->halted should ensure we sleep in wait_io_event
1775 */
1776 g_assert(cpu->halted);
1777 break;
Pranith Kumar08e73c42017-02-23 18:29:15 +00001778 case EXCP_ATOMIC:
1779 qemu_mutex_unlock_iothread();
1780 cpu_exec_step_atomic(cpu);
1781 qemu_mutex_lock_iothread();
Alex Bennée37257942017-02-23 18:29:14 +00001782 default:
1783 /* Ignore everything else? */
1784 break;
1785 }
1786 }
1787
Alex Bennée37257942017-02-23 18:29:14 +00001788 atomic_mb_set(&cpu->exit_request, 0);
Paolo Bonzinidb08b682018-01-11 13:53:12 +01001789 qemu_wait_io_event(cpu);
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001790 } while (!cpu->unplug || cpu_can_run(cpu));
Alex Bennée37257942017-02-23 18:29:14 +00001791
Paolo Bonzini9b0605f2018-01-30 11:05:06 -05001792 qemu_tcg_destroy_vcpu(cpu);
1793 cpu->created = false;
1794 qemu_cond_signal(&qemu_cpu_cond);
1795 qemu_mutex_unlock_iothread();
1796 rcu_unregister_thread();
Alex Bennée37257942017-02-23 18:29:14 +00001797 return NULL;
1798}
1799
Andreas Färber2ff09a42012-05-03 00:23:30 +02001800static void qemu_cpu_kick_thread(CPUState *cpu)
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001801{
1802#ifndef _WIN32
1803 int err;
1804
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001805 if (cpu->thread_kicked) {
1806 return;
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001807 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001808 cpu->thread_kicked = true;
Andreas Färber814e6122012-05-02 17:00:37 +02001809 err = pthread_kill(cpu->thread->thread, SIG_IPI);
Laurent Vivierd455ebc2019-01-02 15:16:03 +01001810 if (err && err != ESRCH) {
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001811 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
1812 exit(1);
1813 }
1814#else /* _WIN32 */
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001815 if (!qemu_cpu_is_self(cpu)) {
Justin Terry (VM)19306802018-01-22 13:07:49 -08001816 if (whpx_enabled()) {
1817 whpx_vcpu_kick(cpu);
1818 } else if (!QueueUserAPC(dummy_apc_func, cpu->hThread, 0)) {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001819 fprintf(stderr, "%s: QueueUserAPC failed with error %lu\n",
1820 __func__, GetLastError());
1821 exit(1);
1822 }
1823 }
Paolo Bonzinicc015e92011-03-12 17:44:08 +01001824#endif
1825}
1826
Andreas Färberc08d7422012-05-03 04:34:15 +02001827void qemu_cpu_kick(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001828{
Andreas Färberf5c121b2012-05-03 01:22:49 +02001829 qemu_cond_broadcast(cpu->halt_cond);
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001830 if (tcg_enabled()) {
Alex Bennée791158d2017-02-23 18:29:10 +00001831 cpu_exit(cpu);
Alex Bennée37257942017-02-23 18:29:14 +00001832 /* NOP unless doing single-thread RR */
Alex Bennée791158d2017-02-23 18:29:10 +00001833 qemu_cpu_kick_rr_cpu();
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001834 } else {
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01001835 if (hax_enabled()) {
1836 /*
1837 * FIXME: race condition with the exit_request check in
1838 * hax_vcpu_hax_exec
1839 */
1840 cpu->exit_request = 1;
1841 }
Paolo Bonzinie0c38212015-08-26 00:19:19 +02001842 qemu_cpu_kick_thread(cpu);
1843 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001844}
1845
Jan Kiszka46d62fa2011-02-01 22:15:59 +01001846void qemu_cpu_kick_self(void)
1847{
Andreas Färber4917cf42013-05-27 05:17:50 +02001848 assert(current_cpu);
Paolo Bonzini9102ded2015-08-18 06:52:09 -07001849 qemu_cpu_kick_thread(current_cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001850}
1851
Andreas Färber60e82572012-05-02 22:23:49 +02001852bool qemu_cpu_is_self(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001853{
Andreas Färber814e6122012-05-02 17:00:37 +02001854 return qemu_thread_is_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +00001855}
1856
Paolo Bonzini79e2b9a2015-01-21 12:09:14 +01001857bool qemu_in_vcpu_thread(void)
Juan Quintelaaa723c22012-09-18 16:30:11 +02001858{
Andreas Färber4917cf42013-05-27 05:17:50 +02001859 return current_cpu && qemu_cpu_is_self(current_cpu);
Juan Quintelaaa723c22012-09-18 16:30:11 +02001860}
1861
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001862static __thread bool iothread_locked = false;
1863
1864bool qemu_mutex_iothread_locked(void)
1865{
1866 return iothread_locked;
1867}
1868
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001869/*
1870 * The BQL is taken from so many places that it is worth profiling the
1871 * callers directly, instead of funneling them all through a single function.
1872 */
1873void qemu_mutex_lock_iothread_impl(const char *file, int line)
Blue Swirl296af7c2010-03-29 19:23:50 +00001874{
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001875 QemuMutexLockFunc bql_lock = atomic_read(&qemu_bql_mutex_lock_func);
1876
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001877 g_assert(!qemu_mutex_iothread_locked());
Emilio G. Cotacb764d02017-10-28 02:16:41 -04001878 bql_lock(&qemu_global_mutex, file, line);
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001879 iothread_locked = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001880}
1881
1882void qemu_mutex_unlock_iothread(void)
1883{
Jan Kiszka8d04fb52017-02-23 18:29:11 +00001884 g_assert(qemu_mutex_iothread_locked());
Paolo Bonziniafbe7052015-06-18 18:47:19 +02001885 iothread_locked = false;
Blue Swirl296af7c2010-03-29 19:23:50 +00001886 qemu_mutex_unlock(&qemu_global_mutex);
1887}
1888
Alex Bennéee8faee02016-10-27 16:09:58 +01001889static bool all_vcpus_paused(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001890{
Andreas Färberbdc44642013-06-24 23:50:24 +02001891 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001892
Andreas Färberbdc44642013-06-24 23:50:24 +02001893 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001894 if (!cpu->stopped) {
Alex Bennéee8faee02016-10-27 16:09:58 +01001895 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001896 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001897 }
1898
Alex Bennéee8faee02016-10-27 16:09:58 +01001899 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +00001900}
1901
1902void pause_all_vcpus(void)
1903{
Andreas Färberbdc44642013-06-24 23:50:24 +02001904 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001905
Alex Bligh40daca52013-08-21 16:03:02 +01001906 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
Andreas Färberbdc44642013-06-24 23:50:24 +02001907 CPU_FOREACH(cpu) {
David Hildenbrandebd05fe2017-11-29 20:12:15 +01001908 if (qemu_cpu_is_self(cpu)) {
1909 qemu_cpu_stop(cpu, true);
1910 } else {
1911 cpu->stop = true;
1912 qemu_cpu_kick(cpu);
1913 }
Jan Kiszkad798e972012-02-17 18:31:16 +01001914 }
1915
Alex Bennéed759c952018-02-27 12:52:48 +03001916 /* We need to drop the replay_lock so any vCPU threads woken up
1917 * can finish their replay tasks
1918 */
1919 replay_mutex_unlock();
1920
Blue Swirl296af7c2010-03-29 19:23:50 +00001921 while (!all_vcpus_paused()) {
Paolo Bonzinibe7d6c52011-03-12 17:44:02 +01001922 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
Andreas Färberbdc44642013-06-24 23:50:24 +02001923 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001924 qemu_cpu_kick(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001925 }
1926 }
Alex Bennéed759c952018-02-27 12:52:48 +03001927
1928 qemu_mutex_unlock_iothread();
1929 replay_mutex_lock();
1930 qemu_mutex_lock_iothread();
Blue Swirl296af7c2010-03-29 19:23:50 +00001931}
1932
Igor Mammedov29936832013-04-23 10:29:37 +02001933void cpu_resume(CPUState *cpu)
1934{
1935 cpu->stop = false;
1936 cpu->stopped = false;
1937 qemu_cpu_kick(cpu);
1938}
1939
Blue Swirl296af7c2010-03-29 19:23:50 +00001940void resume_all_vcpus(void)
1941{
Andreas Färberbdc44642013-06-24 23:50:24 +02001942 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001943
Alex Bligh40daca52013-08-21 16:03:02 +01001944 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
Andreas Färberbdc44642013-06-24 23:50:24 +02001945 CPU_FOREACH(cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001946 cpu_resume(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +00001947 }
1948}
1949
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001950void cpu_remove_sync(CPUState *cpu)
Gu Zheng4c055ab2016-05-12 09:18:13 +05301951{
1952 cpu->stop = true;
1953 cpu->unplug = true;
1954 qemu_cpu_kick(cpu);
Paolo Bonzinidbadee42018-01-30 16:40:12 +01001955 qemu_mutex_unlock_iothread();
1956 qemu_thread_join(cpu->thread);
1957 qemu_mutex_lock_iothread();
Bharata B Rao2c579042016-05-12 09:18:14 +05301958}
1959
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001960/* For temporary buffers for forming a name */
1961#define VCPU_THREAD_NAME_SIZE 16
1962
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001963static void qemu_tcg_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001964{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001965 char thread_name[VCPU_THREAD_NAME_SIZE];
Alex Bennée37257942017-02-23 18:29:14 +00001966 static QemuCond *single_tcg_halt_cond;
1967 static QemuThread *single_tcg_cpu_thread;
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001968 static int tcg_region_inited;
1969
Emilio G. Cotaf28d0df2018-06-22 13:45:31 -04001970 assert(tcg_enabled());
Emilio G. Cotae8feb962017-07-07 19:24:20 -04001971 /*
1972 * Initialize TCG regions--once. Now is a good time, because:
1973 * (1) TCG's init context, prologue and target globals have been set up.
1974 * (2) qemu_tcg_mttcg_enabled() works now (TCG init code runs before the
1975 * -accel flag is processed, so the check doesn't work then).
1976 */
1977 if (!tcg_region_inited) {
1978 tcg_region_inited = 1;
1979 tcg_region_init();
1980 }
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001981
Alex Bennée37257942017-02-23 18:29:14 +00001982 if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
Andreas Färber814e6122012-05-02 17:00:37 +02001983 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001984 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1985 qemu_cond_init(cpu->halt_cond);
Alex Bennée37257942017-02-23 18:29:14 +00001986
1987 if (qemu_tcg_mttcg_enabled()) {
1988 /* create a thread per vCPU with TCG (MTTCG) */
1989 parallel_cpus = true;
1990 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00001991 cpu->cpu_index);
Alex Bennée37257942017-02-23 18:29:14 +00001992
1993 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1994 cpu, QEMU_THREAD_JOINABLE);
1995
1996 } else {
1997 /* share a single thread for all cpus with TCG */
1998 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
1999 qemu_thread_create(cpu->thread, thread_name,
2000 qemu_tcg_rr_cpu_thread_fn,
2001 cpu, QEMU_THREAD_JOINABLE);
2002
2003 single_tcg_halt_cond = cpu->halt_cond;
2004 single_tcg_cpu_thread = cpu->thread;
2005 }
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01002006#ifdef _WIN32
Andreas Färber814e6122012-05-02 17:00:37 +02002007 cpu->hThread = qemu_thread_get_handle(cpu->thread);
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01002008#endif
Blue Swirl296af7c2010-03-29 19:23:50 +00002009 } else {
Alex Bennée37257942017-02-23 18:29:14 +00002010 /* For non-MTTCG cases we share the thread */
2011 cpu->thread = single_tcg_cpu_thread;
2012 cpu->halt_cond = single_tcg_halt_cond;
David Hildenbranda3421732018-02-09 20:52:37 +01002013 cpu->thread_id = first_cpu->thread_id;
2014 cpu->can_do_io = 1;
2015 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +00002016 }
2017}
2018
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002019static void qemu_hax_start_vcpu(CPUState *cpu)
2020{
2021 char thread_name[VCPU_THREAD_NAME_SIZE];
2022
2023 cpu->thread = g_malloc0(sizeof(QemuThread));
2024 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2025 qemu_cond_init(cpu->halt_cond);
2026
2027 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX",
2028 cpu->cpu_index);
2029 qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn,
2030 cpu, QEMU_THREAD_JOINABLE);
2031#ifdef _WIN32
2032 cpu->hThread = qemu_thread_get_handle(cpu->thread);
2033#endif
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002034}
2035
Andreas Färber48a106b2013-05-27 02:20:39 +02002036static void qemu_kvm_start_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00002037{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002038 char thread_name[VCPU_THREAD_NAME_SIZE];
2039
Andreas Färber814e6122012-05-02 17:00:37 +02002040 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02002041 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2042 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002043 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
2044 cpu->cpu_index);
2045 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
2046 cpu, QEMU_THREAD_JOINABLE);
Blue Swirl296af7c2010-03-29 19:23:50 +00002047}
2048
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002049static void qemu_hvf_start_vcpu(CPUState *cpu)
2050{
2051 char thread_name[VCPU_THREAD_NAME_SIZE];
2052
2053 /* HVF currently does not support TCG, and only runs in
2054 * unrestricted-guest mode. */
2055 assert(hvf_enabled());
2056
2057 cpu->thread = g_malloc0(sizeof(QemuThread));
2058 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2059 qemu_cond_init(cpu->halt_cond);
2060
2061 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF",
2062 cpu->cpu_index);
2063 qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn,
2064 cpu, QEMU_THREAD_JOINABLE);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002065}
2066
Justin Terry (VM)19306802018-01-22 13:07:49 -08002067static void qemu_whpx_start_vcpu(CPUState *cpu)
2068{
2069 char thread_name[VCPU_THREAD_NAME_SIZE];
2070
2071 cpu->thread = g_malloc0(sizeof(QemuThread));
2072 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2073 qemu_cond_init(cpu->halt_cond);
2074 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX",
2075 cpu->cpu_index);
2076 qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn,
2077 cpu, QEMU_THREAD_JOINABLE);
2078#ifdef _WIN32
2079 cpu->hThread = qemu_thread_get_handle(cpu->thread);
2080#endif
Justin Terry (VM)19306802018-01-22 13:07:49 -08002081}
2082
Andreas Färber10a90212013-05-27 02:24:35 +02002083static void qemu_dummy_start_vcpu(CPUState *cpu)
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002084{
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002085 char thread_name[VCPU_THREAD_NAME_SIZE];
2086
Andreas Färber814e6122012-05-02 17:00:37 +02002087 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02002088 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2089 qemu_cond_init(cpu->halt_cond);
Dr. David Alan Gilbert49001162014-01-30 10:20:32 +00002090 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
2091 cpu->cpu_index);
2092 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002093 QEMU_THREAD_JOINABLE);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002094}
2095
Andreas Färberc643bed2013-05-27 03:23:24 +02002096void qemu_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00002097{
Like Xu5cc87672019-05-19 04:54:21 +08002098 MachineState *ms = MACHINE(qdev_get_machine());
2099
2100 cpu->nr_cores = ms->smp.cores;
2101 cpu->nr_threads = ms->smp.threads;
Andreas Färberf324e762012-05-02 23:26:21 +02002102 cpu->stopped = true;
Richard Henderson9c09a252019-03-14 13:06:29 -07002103 cpu->random_seed = qemu_guest_random_seed_thread_part1();
Peter Maydell56943e82016-01-21 14:15:04 +00002104
2105 if (!cpu->as) {
2106 /* If the target cpu hasn't set up any address spaces itself,
2107 * give it the default one.
2108 */
Peter Maydell12ebc9a2016-01-21 14:15:04 +00002109 cpu->num_ases = 1;
Peter Xu80ceb072017-11-23 17:23:32 +08002110 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
Peter Maydell56943e82016-01-21 14:15:04 +00002111 }
2112
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002113 if (kvm_enabled()) {
Andreas Färber48a106b2013-05-27 02:20:39 +02002114 qemu_kvm_start_vcpu(cpu);
Vincent Palatinb0cb0a62017-01-10 11:59:57 +01002115 } else if (hax_enabled()) {
2116 qemu_hax_start_vcpu(cpu);
Sergio Andres Gomez Del Realc97d6d22017-09-13 04:05:09 -05002117 } else if (hvf_enabled()) {
2118 qemu_hvf_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002119 } else if (tcg_enabled()) {
Andreas Färbere5ab30a2012-05-03 01:50:44 +02002120 qemu_tcg_init_vcpu(cpu);
Justin Terry (VM)19306802018-01-22 13:07:49 -08002121 } else if (whpx_enabled()) {
2122 qemu_whpx_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02002123 } else {
Andreas Färber10a90212013-05-27 02:24:35 +02002124 qemu_dummy_start_vcpu(cpu);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01002125 }
David Hildenbrand81e96312018-02-09 20:52:38 +01002126
2127 while (!cpu->created) {
2128 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
2129 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002130}
2131
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002132void cpu_stop_current(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00002133{
Andreas Färber4917cf42013-05-27 05:17:50 +02002134 if (current_cpu) {
Peter Maydell0ec7e672019-01-07 15:23:47 +00002135 current_cpu->stop = true;
2136 cpu_exit(current_cpu);
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002137 }
Blue Swirl296af7c2010-03-29 19:23:50 +00002138}
2139
Kevin Wolf56983462013-07-05 13:49:54 +02002140int vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +00002141{
Juan Quintelaaa723c22012-09-18 16:30:11 +02002142 if (qemu_in_vcpu_thread()) {
Paolo Bonzini74892d22014-06-05 14:53:58 +02002143 qemu_system_vmstop_request_prepare();
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03002144 qemu_system_vmstop_request(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00002145 /*
2146 * FIXME: should not return to device code in case
2147 * vm_stop() has been requested.
2148 */
Jan Kiszkab4a3d962011-02-01 22:15:43 +01002149 cpu_stop_current();
Kevin Wolf56983462013-07-05 13:49:54 +02002150 return 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00002151 }
Kevin Wolf56983462013-07-05 13:49:54 +02002152
Stefan Hajnoczi4486e892018-03-07 14:42:05 +00002153 return do_vm_stop(state, true);
Blue Swirl296af7c2010-03-29 19:23:50 +00002154}
2155
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002156/**
2157 * Prepare for (re)starting the VM.
2158 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
2159 * running or in case of an error condition), 0 otherwise.
2160 */
2161int vm_prepare_start(void)
2162{
2163 RunState requested;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002164
2165 qemu_vmstop_requested(&requested);
2166 if (runstate_is_running() && requested == RUN_STATE__MAX) {
2167 return -1;
2168 }
2169
2170 /* Ensure that a STOP/RESUME pair of events is emitted if a
2171 * vmstop request was pending. The BLOCK_IO_ERROR event, for
2172 * example, according to documentation is always followed by
2173 * the STOP event.
2174 */
2175 if (runstate_is_running()) {
Peter Xu3ab72382018-08-15 21:37:37 +08002176 qapi_event_send_stop();
2177 qapi_event_send_resume();
Markus Armbrusterf0561582018-04-23 10:45:18 +02002178 return -1;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002179 }
2180
2181 /* We are sending this now, but the CPUs will be resumed shortly later */
Peter Xu3ab72382018-08-15 21:37:37 +08002182 qapi_event_send_resume();
Markus Armbrusterf0561582018-04-23 10:45:18 +02002183
2184 replay_enable_events();
2185 cpu_enable_ticks();
2186 runstate_set(RUN_STATE_RUNNING);
2187 vm_state_notify(1, RUN_STATE_RUNNING);
2188 return 0;
Claudio Imbrenda2d76e822017-02-14 18:07:47 +01002189}
2190
2191void vm_start(void)
2192{
2193 if (!vm_prepare_start()) {
2194 resume_all_vcpus();
2195 }
2196}
2197
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002198/* does a state transition even if the VM is already stopped,
2199 current state is forgotten forever */
Kevin Wolf56983462013-07-05 13:49:54 +02002200int vm_stop_force_state(RunState state)
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002201{
2202 if (runstate_is_running()) {
Kevin Wolf56983462013-07-05 13:49:54 +02002203 return vm_stop(state);
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002204 } else {
2205 runstate_set(state);
Wen Congyangb2780d32015-11-20 17:34:38 +08002206
2207 bdrv_drain_all();
Kevin Wolf594a45c2013-07-18 14:52:19 +02002208 /* Make sure to return an error if the flush in a previous vm_stop()
2209 * failed. */
John Snow22af08e2016-09-22 21:45:51 -04002210 return bdrv_flush_all();
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03002211 }
2212}
2213
Markus Armbruster04424282019-04-17 21:17:57 +02002214void list_cpus(const char *optarg)
Blue Swirl262353c2010-05-04 19:55:35 +00002215{
2216 /* XXX: implement xxx_cpu_list for targets that still miss it */
Peter Maydelle916cbf2012-09-05 17:41:08 -03002217#if defined(cpu_list)
Markus Armbruster04424282019-04-17 21:17:57 +02002218 cpu_list();
Blue Swirl262353c2010-05-04 19:55:35 +00002219#endif
2220}
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03002221
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002222void qmp_memsave(int64_t addr, int64_t size, const char *filename,
2223 bool has_cpu, int64_t cpu_index, Error **errp)
2224{
2225 FILE *f;
2226 uint32_t l;
Andreas Färber55e5c282012-12-17 06:18:02 +01002227 CPUState *cpu;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002228 uint8_t buf[1024];
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002229 int64_t orig_addr = addr, orig_size = size;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002230
2231 if (!has_cpu) {
2232 cpu_index = 0;
2233 }
2234
Andreas Färber151d1322013-02-15 15:41:49 +01002235 cpu = qemu_get_cpu(cpu_index);
2236 if (cpu == NULL) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002237 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
2238 "a CPU number");
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002239 return;
2240 }
2241
2242 f = fopen(filename, "wb");
2243 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002244 error_setg_file_open(errp, errno, filename);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002245 return;
2246 }
2247
2248 while (size != 0) {
2249 l = sizeof(buf);
2250 if (l > size)
2251 l = size;
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302252 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
Borislav Petkov0dc9daf2015-02-08 13:14:38 +01002253 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
2254 " specified", orig_addr, orig_size);
Aneesh Kumar K.V2f4d0f52013-10-01 21:49:30 +05302255 goto exit;
2256 }
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002257 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002258 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02002259 goto exit;
2260 }
2261 addr += l;
2262 size -= l;
2263 }
2264
2265exit:
2266 fclose(f);
2267}
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002268
2269void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
2270 Error **errp)
2271{
2272 FILE *f;
2273 uint32_t l;
2274 uint8_t buf[1024];
2275
2276 f = fopen(filename, "wb");
2277 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04002278 error_setg_file_open(errp, errno, filename);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002279 return;
2280 }
2281
2282 while (size != 0) {
2283 l = sizeof(buf);
2284 if (l > size)
2285 l = size;
Stefan Weileb6282f2014-04-07 20:28:23 +02002286 cpu_physical_memory_read(addr, buf, l);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002287 if (fwrite(buf, 1, l, f) != l) {
Markus Armbrusterc6bd8c72015-03-17 11:54:50 +01002288 error_setg(errp, QERR_IO_ERROR);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02002289 goto exit;
2290 }
2291 addr += l;
2292 size -= l;
2293 }
2294
2295exit:
2296 fclose(f);
2297}
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002298
2299void qmp_inject_nmi(Error **errp)
2300{
Alexey Kardashevskiy9cb805f2014-08-20 22:16:33 +10002301 nmi_monitor_handle(monitor_get_cpu_index(), errp);
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02002302}
Sebastian Tanase27498be2014-07-25 11:56:33 +02002303
Markus Armbruster76c86612019-04-17 21:17:53 +02002304void dump_drift_info(void)
Sebastian Tanase27498be2014-07-25 11:56:33 +02002305{
2306 if (!use_icount) {
2307 return;
2308 }
2309
Markus Armbruster76c86612019-04-17 21:17:53 +02002310 qemu_printf("Host - Guest clock %"PRIi64" ms\n",
Sebastian Tanase27498be2014-07-25 11:56:33 +02002311 (cpu_get_clock() - cpu_get_icount())/SCALE_MS);
2312 if (icount_align_option) {
Markus Armbruster76c86612019-04-17 21:17:53 +02002313 qemu_printf("Max guest delay %"PRIi64" ms\n",
2314 -max_delay / SCALE_MS);
2315 qemu_printf("Max guest advance %"PRIi64" ms\n",
2316 max_advance / SCALE_MS);
Sebastian Tanase27498be2014-07-25 11:56:33 +02002317 } else {
Markus Armbruster76c86612019-04-17 21:17:53 +02002318 qemu_printf("Max guest delay NA\n");
2319 qemu_printf("Max guest advance NA\n");
Sebastian Tanase27498be2014-07-25 11:56:33 +02002320 }
2321}