blob: 4549b7a01a616f6c94d66016bb073b35d6fe7667 [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
25/* Needed early for CONFIG_BSD etc. */
26#include "config-host.h"
27
Paolo Bonzini83c90892012-12-17 18:19:49 +010028#include "monitor/monitor.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010029#include "sysemu/sysemu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010030#include "exec/gdbstub.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010031#include "sysemu/dma.h"
32#include "sysemu/kvm.h"
Luiz Capitulinode0b36b2011-09-21 16:38:35 -030033#include "qmp-commands.h"
Blue Swirl296af7c2010-03-29 19:23:50 +000034
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010035#include "qemu/thread.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010036#include "sysemu/cpus.h"
37#include "sysemu/qtest.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010038#include "qemu/main-loop.h"
39#include "qemu/bitmap.h"
Jan Kiszka0ff0fc12011-06-23 10:15:55 +020040
41#ifndef _WIN32
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010042#include "qemu/compatfd.h"
Jan Kiszka0ff0fc12011-06-23 10:15:55 +020043#endif
Blue Swirl296af7c2010-03-29 19:23:50 +000044
Jan Kiszka6d9cb732011-02-01 22:15:58 +010045#ifdef CONFIG_LINUX
46
47#include <sys/prctl.h>
48
Marcelo Tosattic0532a72010-10-11 15:31:21 -030049#ifndef PR_MCE_KILL
50#define PR_MCE_KILL 33
51#endif
52
Jan Kiszka6d9cb732011-02-01 22:15:58 +010053#ifndef PR_MCE_KILL_SET
54#define PR_MCE_KILL_SET 1
55#endif
56
57#ifndef PR_MCE_KILL_EARLY
58#define PR_MCE_KILL_EARLY 1
59#endif
60
61#endif /* CONFIG_LINUX */
62
Andreas Färber182735e2013-05-29 22:29:20 +020063static CPUState *next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +000064
Andreas Färbera98ae1d2013-05-26 23:21:08 +020065static bool cpu_thread_is_idle(CPUState *cpu)
Peter Maydellac873f12012-07-19 16:52:27 +010066{
Andreas Färberc64ca812012-05-03 02:11:45 +020067 if (cpu->stop || cpu->queued_work_first) {
Peter Maydellac873f12012-07-19 16:52:27 +010068 return false;
69 }
Andreas Färberf324e762012-05-02 23:26:21 +020070 if (cpu->stopped || !runstate_is_running()) {
Peter Maydellac873f12012-07-19 16:52:27 +010071 return true;
72 }
Andreas Färber259186a2013-01-17 18:51:17 +010073 if (!cpu->halted || qemu_cpu_has_work(cpu) ||
Alexander Graf215e79c2013-04-24 22:24:12 +020074 kvm_halt_in_kernel()) {
Peter Maydellac873f12012-07-19 16:52:27 +010075 return false;
76 }
77 return true;
78}
79
80static bool all_cpu_threads_idle(void)
81{
Andreas Färber182735e2013-05-29 22:29:20 +020082 CPUState *cpu;
Peter Maydellac873f12012-07-19 16:52:27 +010083
Andreas Färber182735e2013-05-29 22:29:20 +020084 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
85 if (!cpu_thread_is_idle(cpu)) {
Peter Maydellac873f12012-07-19 16:52:27 +010086 return false;
87 }
88 }
89 return true;
90}
91
Blue Swirl296af7c2010-03-29 19:23:50 +000092/***********************************************************/
Paolo Bonzini946fb272011-09-12 13:57:37 +020093/* guest cycle counter */
94
95/* Conversion factor from emulated instructions to virtual clock ticks. */
96static int icount_time_shift;
97/* Arbitrarily pick 1MIPS as the minimum allowable speed. */
98#define MAX_ICOUNT_SHIFT 10
99/* Compensate for varying guest execution speed. */
100static int64_t qemu_icount_bias;
101static QEMUTimer *icount_rt_timer;
102static QEMUTimer *icount_vm_timer;
103static QEMUTimer *icount_warp_timer;
104static int64_t vm_clock_warp_start;
105static int64_t qemu_icount;
106
107typedef struct TimersState {
108 int64_t cpu_ticks_prev;
109 int64_t cpu_ticks_offset;
110 int64_t cpu_clock_offset;
111 int32_t cpu_ticks_enabled;
112 int64_t dummy;
113} TimersState;
114
115TimersState timers_state;
116
117/* Return the virtual CPU time, based on the instruction counter. */
118int64_t cpu_get_icount(void)
119{
120 int64_t icount;
Andreas Färber4917cf42013-05-27 05:17:50 +0200121 CPUState *cpu = current_cpu;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200122
123 icount = qemu_icount;
Andreas Färber4917cf42013-05-27 05:17:50 +0200124 if (cpu) {
125 CPUArchState *env = cpu->env_ptr;
Paolo Bonzini946fb272011-09-12 13:57:37 +0200126 if (!can_do_io(env)) {
127 fprintf(stderr, "Bad clock read\n");
128 }
129 icount -= (env->icount_decr.u16.low + env->icount_extra);
130 }
131 return qemu_icount_bias + (icount << icount_time_shift);
132}
133
134/* return the host CPU cycle counter and handle stop/restart */
135int64_t cpu_get_ticks(void)
136{
137 if (use_icount) {
138 return cpu_get_icount();
139 }
140 if (!timers_state.cpu_ticks_enabled) {
141 return timers_state.cpu_ticks_offset;
142 } else {
143 int64_t ticks;
144 ticks = cpu_get_real_ticks();
145 if (timers_state.cpu_ticks_prev > ticks) {
146 /* Note: non increasing ticks may happen if the host uses
147 software suspend */
148 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
149 }
150 timers_state.cpu_ticks_prev = ticks;
151 return ticks + timers_state.cpu_ticks_offset;
152 }
153}
154
155/* return the host CPU monotonic timer and handle stop/restart */
156int64_t cpu_get_clock(void)
157{
158 int64_t ti;
159 if (!timers_state.cpu_ticks_enabled) {
160 return timers_state.cpu_clock_offset;
161 } else {
162 ti = get_clock();
163 return ti + timers_state.cpu_clock_offset;
164 }
165}
166
167/* enable cpu_get_ticks() */
168void cpu_enable_ticks(void)
169{
170 if (!timers_state.cpu_ticks_enabled) {
171 timers_state.cpu_ticks_offset -= cpu_get_real_ticks();
172 timers_state.cpu_clock_offset -= get_clock();
173 timers_state.cpu_ticks_enabled = 1;
174 }
175}
176
177/* disable cpu_get_ticks() : the clock is stopped. You must not call
178 cpu_get_ticks() after that. */
179void cpu_disable_ticks(void)
180{
181 if (timers_state.cpu_ticks_enabled) {
182 timers_state.cpu_ticks_offset = cpu_get_ticks();
183 timers_state.cpu_clock_offset = cpu_get_clock();
184 timers_state.cpu_ticks_enabled = 0;
185 }
186}
187
188/* Correlation between real and virtual time is always going to be
189 fairly approximate, so ignore small variation.
190 When the guest is idle real and virtual time will be aligned in
191 the IO wait loop. */
192#define ICOUNT_WOBBLE (get_ticks_per_sec() / 10)
193
194static void icount_adjust(void)
195{
196 int64_t cur_time;
197 int64_t cur_icount;
198 int64_t delta;
199 static int64_t last_delta;
200 /* If the VM is not running, then do nothing. */
201 if (!runstate_is_running()) {
202 return;
203 }
204 cur_time = cpu_get_clock();
205 cur_icount = qemu_get_clock_ns(vm_clock);
206 delta = cur_icount - cur_time;
207 /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
208 if (delta > 0
209 && last_delta + ICOUNT_WOBBLE < delta * 2
210 && icount_time_shift > 0) {
211 /* The guest is getting too far ahead. Slow time down. */
212 icount_time_shift--;
213 }
214 if (delta < 0
215 && last_delta - ICOUNT_WOBBLE > delta * 2
216 && icount_time_shift < MAX_ICOUNT_SHIFT) {
217 /* The guest is getting too far behind. Speed time up. */
218 icount_time_shift++;
219 }
220 last_delta = delta;
221 qemu_icount_bias = cur_icount - (qemu_icount << icount_time_shift);
222}
223
224static void icount_adjust_rt(void *opaque)
225{
226 qemu_mod_timer(icount_rt_timer,
227 qemu_get_clock_ms(rt_clock) + 1000);
228 icount_adjust();
229}
230
231static void icount_adjust_vm(void *opaque)
232{
233 qemu_mod_timer(icount_vm_timer,
234 qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
235 icount_adjust();
236}
237
238static int64_t qemu_icount_round(int64_t count)
239{
240 return (count + (1 << icount_time_shift) - 1) >> icount_time_shift;
241}
242
243static void icount_warp_rt(void *opaque)
244{
245 if (vm_clock_warp_start == -1) {
246 return;
247 }
248
249 if (runstate_is_running()) {
250 int64_t clock = qemu_get_clock_ns(rt_clock);
251 int64_t warp_delta = clock - vm_clock_warp_start;
252 if (use_icount == 1) {
253 qemu_icount_bias += warp_delta;
254 } else {
255 /*
256 * In adaptive mode, do not let the vm_clock run too
257 * far ahead of real time.
258 */
259 int64_t cur_time = cpu_get_clock();
260 int64_t cur_icount = qemu_get_clock_ns(vm_clock);
261 int64_t delta = cur_time - cur_icount;
262 qemu_icount_bias += MIN(warp_delta, delta);
263 }
264 if (qemu_clock_expired(vm_clock)) {
265 qemu_notify_event();
266 }
267 }
268 vm_clock_warp_start = -1;
269}
270
Paolo Bonzini8156be52012-03-28 15:42:04 +0200271void qtest_clock_warp(int64_t dest)
272{
273 int64_t clock = qemu_get_clock_ns(vm_clock);
274 assert(qtest_enabled());
275 while (clock < dest) {
276 int64_t deadline = qemu_clock_deadline(vm_clock);
277 int64_t warp = MIN(dest - clock, deadline);
278 qemu_icount_bias += warp;
279 qemu_run_timers(vm_clock);
280 clock = qemu_get_clock_ns(vm_clock);
281 }
282 qemu_notify_event();
283}
284
Paolo Bonzini946fb272011-09-12 13:57:37 +0200285void qemu_clock_warp(QEMUClock *clock)
286{
287 int64_t deadline;
288
289 /*
290 * There are too many global variables to make the "warp" behavior
291 * applicable to other clocks. But a clock argument removes the
292 * need for if statements all over the place.
293 */
294 if (clock != vm_clock || !use_icount) {
295 return;
296 }
297
298 /*
299 * If the CPUs have been sleeping, advance the vm_clock timer now. This
300 * ensures that the deadline for the timer is computed correctly below.
301 * This also makes sure that the insn counter is synchronized before the
302 * CPU starts running, in case the CPU is woken by an event other than
303 * the earliest vm_clock timer.
304 */
305 icount_warp_rt(NULL);
306 if (!all_cpu_threads_idle() || !qemu_clock_has_timers(vm_clock)) {
307 qemu_del_timer(icount_warp_timer);
308 return;
309 }
310
Paolo Bonzini8156be52012-03-28 15:42:04 +0200311 if (qtest_enabled()) {
312 /* When testing, qtest commands advance icount. */
313 return;
314 }
315
Paolo Bonzini946fb272011-09-12 13:57:37 +0200316 vm_clock_warp_start = qemu_get_clock_ns(rt_clock);
317 deadline = qemu_clock_deadline(vm_clock);
318 if (deadline > 0) {
319 /*
320 * Ensure the vm_clock proceeds even when the virtual CPU goes to
321 * sleep. Otherwise, the CPU might be waiting for a future timer
322 * interrupt to wake it up, but the interrupt never comes because
323 * the vCPU isn't running any insns and thus doesn't advance the
324 * vm_clock.
325 *
326 * An extreme solution for this problem would be to never let VCPUs
327 * sleep in icount mode if there is a pending vm_clock timer; rather
328 * time could just advance to the next vm_clock event. Instead, we
329 * do stop VCPUs and only advance vm_clock after some "real" time,
330 * (related to the time left until the next event) has passed. This
331 * rt_clock timer will do this. This avoids that the warps are too
332 * visible externally---for example, you will not be sending network
Dong Xu Wang07f35072011-11-22 18:06:26 +0800333 * packets continuously instead of every 100ms.
Paolo Bonzini946fb272011-09-12 13:57:37 +0200334 */
335 qemu_mod_timer(icount_warp_timer, vm_clock_warp_start + deadline);
336 } else {
337 qemu_notify_event();
338 }
339}
340
341static const VMStateDescription vmstate_timers = {
342 .name = "timer",
343 .version_id = 2,
344 .minimum_version_id = 1,
345 .minimum_version_id_old = 1,
346 .fields = (VMStateField[]) {
347 VMSTATE_INT64(cpu_ticks_offset, TimersState),
348 VMSTATE_INT64(dummy, TimersState),
349 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
350 VMSTATE_END_OF_LIST()
351 }
352};
353
354void configure_icount(const char *option)
355{
356 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
357 if (!option) {
358 return;
359 }
360
361 icount_warp_timer = qemu_new_timer_ns(rt_clock, icount_warp_rt, NULL);
362 if (strcmp(option, "auto") != 0) {
363 icount_time_shift = strtol(option, NULL, 0);
364 use_icount = 1;
365 return;
366 }
367
368 use_icount = 2;
369
370 /* 125MIPS seems a reasonable initial guess at the guest speed.
371 It will be corrected fairly quickly anyway. */
372 icount_time_shift = 3;
373
374 /* Have both realtime and virtual time triggers for speed adjustment.
375 The realtime trigger catches emulated time passing too slowly,
376 the virtual time trigger catches emulated time passing too fast.
377 Realtime triggers occur even when idle, so use them less frequently
378 than VM triggers. */
379 icount_rt_timer = qemu_new_timer_ms(rt_clock, icount_adjust_rt, NULL);
380 qemu_mod_timer(icount_rt_timer,
381 qemu_get_clock_ms(rt_clock) + 1000);
382 icount_vm_timer = qemu_new_timer_ns(vm_clock, icount_adjust_vm, NULL);
383 qemu_mod_timer(icount_vm_timer,
384 qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
385}
386
387/***********************************************************/
Blue Swirl296af7c2010-03-29 19:23:50 +0000388void hw_error(const char *fmt, ...)
389{
390 va_list ap;
Andreas Färber55e5c282012-12-17 06:18:02 +0100391 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000392
393 va_start(ap, fmt);
394 fprintf(stderr, "qemu: hardware error: ");
395 vfprintf(stderr, fmt, ap);
396 fprintf(stderr, "\n");
Andreas Färber182735e2013-05-29 22:29:20 +0200397 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Andreas Färber55e5c282012-12-17 06:18:02 +0100398 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
Andreas Färber878096e2013-05-27 01:33:50 +0200399 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU);
Blue Swirl296af7c2010-03-29 19:23:50 +0000400 }
401 va_end(ap);
402 abort();
403}
404
405void cpu_synchronize_all_states(void)
406{
Andreas Färber182735e2013-05-29 22:29:20 +0200407 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000408
Andreas Färber182735e2013-05-29 22:29:20 +0200409 for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
410 cpu_synchronize_state(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000411 }
412}
413
414void cpu_synchronize_all_post_reset(void)
415{
Andreas Färber182735e2013-05-29 22:29:20 +0200416 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000417
418 for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200419 cpu_synchronize_post_reset(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000420 }
421}
422
423void cpu_synchronize_all_post_init(void)
424{
Andreas Färber182735e2013-05-29 22:29:20 +0200425 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000426
427 for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +0200428 cpu_synchronize_post_init(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000429 }
430}
431
Andreas Färber2fa45342012-05-02 23:38:39 +0200432bool cpu_is_stopped(CPUState *cpu)
Marcelo Tosatti3ae95012010-05-04 09:45:24 -0300433{
Andreas Färberf324e762012-05-02 23:26:21 +0200434 return !runstate_is_running() || cpu->stopped;
Marcelo Tosatti3ae95012010-05-04 09:45:24 -0300435}
436
Kevin Wolf56983462013-07-05 13:49:54 +0200437static int do_vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +0000438{
Kevin Wolf56983462013-07-05 13:49:54 +0200439 int ret = 0;
440
Luiz Capitulino13548692011-07-29 15:36:43 -0300441 if (runstate_is_running()) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000442 cpu_disable_ticks();
Blue Swirl296af7c2010-03-29 19:23:50 +0000443 pause_all_vcpus();
Luiz Capitulinof5bbfba2011-07-29 15:04:45 -0300444 runstate_set(state);
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -0300445 vm_state_notify(0, state);
Blue Swirl296af7c2010-03-29 19:23:50 +0000446 monitor_protocol_event(QEVENT_STOP, NULL);
447 }
Kevin Wolf56983462013-07-05 13:49:54 +0200448
Kevin Wolf594a45c2013-07-18 14:52:19 +0200449 bdrv_drain_all();
450 ret = bdrv_flush_all();
451
Kevin Wolf56983462013-07-05 13:49:54 +0200452 return ret;
Blue Swirl296af7c2010-03-29 19:23:50 +0000453}
454
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200455static bool cpu_can_run(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000456{
Andreas Färber4fdeee72012-05-02 23:10:09 +0200457 if (cpu->stop) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200458 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100459 }
Andreas Färberf324e762012-05-02 23:26:21 +0200460 if (cpu->stopped || !runstate_is_running()) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200461 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100462 }
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200463 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000464}
465
Andreas Färber91325042013-05-27 02:07:49 +0200466static void cpu_handle_guest_debug(CPUState *cpu)
Jan Kiszka3c638d02010-06-25 16:56:56 +0200467{
Andreas Färber64f6b342013-05-27 02:06:09 +0200468 gdb_set_stop_cpu(cpu);
Jan Kiszka8cf71712011-02-07 12:19:16 +0100469 qemu_system_debug_request();
Andreas Färberf324e762012-05-02 23:26:21 +0200470 cpu->stopped = true;
Jan Kiszka3c638d02010-06-25 16:56:56 +0200471}
472
Paolo Bonzini714bd042011-03-12 17:44:06 +0100473static void cpu_signal(int sig)
474{
Andreas Färber4917cf42013-05-27 05:17:50 +0200475 if (current_cpu) {
476 cpu_exit(current_cpu);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100477 }
478 exit_request = 1;
479}
Paolo Bonzini714bd042011-03-12 17:44:06 +0100480
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100481#ifdef CONFIG_LINUX
482static void sigbus_reraise(void)
483{
484 sigset_t set;
485 struct sigaction action;
486
487 memset(&action, 0, sizeof(action));
488 action.sa_handler = SIG_DFL;
489 if (!sigaction(SIGBUS, &action, NULL)) {
490 raise(SIGBUS);
491 sigemptyset(&set);
492 sigaddset(&set, SIGBUS);
493 sigprocmask(SIG_UNBLOCK, &set, NULL);
494 }
495 perror("Failed to re-raise SIGBUS!\n");
496 abort();
497}
498
499static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
500 void *ctx)
501{
502 if (kvm_on_sigbus(siginfo->ssi_code,
503 (void *)(intptr_t)siginfo->ssi_addr)) {
504 sigbus_reraise();
505 }
506}
507
508static void qemu_init_sigbus(void)
509{
510 struct sigaction action;
511
512 memset(&action, 0, sizeof(action));
513 action.sa_flags = SA_SIGINFO;
514 action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
515 sigaction(SIGBUS, &action, NULL);
516
517 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
518}
519
Andreas Färber290adf32013-01-17 09:30:27 +0100520static void qemu_kvm_eat_signals(CPUState *cpu)
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100521{
522 struct timespec ts = { 0, 0 };
523 siginfo_t siginfo;
524 sigset_t waitset;
525 sigset_t chkset;
526 int r;
527
528 sigemptyset(&waitset);
529 sigaddset(&waitset, SIG_IPI);
530 sigaddset(&waitset, SIGBUS);
531
532 do {
533 r = sigtimedwait(&waitset, &siginfo, &ts);
534 if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
535 perror("sigtimedwait");
536 exit(1);
537 }
538
539 switch (r) {
540 case SIGBUS:
Andreas Färber290adf32013-01-17 09:30:27 +0100541 if (kvm_on_sigbus_vcpu(cpu, siginfo.si_code, siginfo.si_addr)) {
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100542 sigbus_reraise();
543 }
544 break;
545 default:
546 break;
547 }
548
549 r = sigpending(&chkset);
550 if (r == -1) {
551 perror("sigpending");
552 exit(1);
553 }
554 } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100555}
556
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100557#else /* !CONFIG_LINUX */
558
559static void qemu_init_sigbus(void)
560{
561}
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100562
Andreas Färber290adf32013-01-17 09:30:27 +0100563static void qemu_kvm_eat_signals(CPUState *cpu)
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100564{
565}
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100566#endif /* !CONFIG_LINUX */
567
Blue Swirl296af7c2010-03-29 19:23:50 +0000568#ifndef _WIN32
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100569static void dummy_signal(int sig)
Blue Swirl296af7c2010-03-29 19:23:50 +0000570{
571}
572
Andreas Färber13618e02013-05-26 23:41:00 +0200573static void qemu_kvm_init_cpu_signals(CPUState *cpu)
Paolo Bonzini714bd042011-03-12 17:44:06 +0100574{
575 int r;
576 sigset_t set;
577 struct sigaction sigact;
578
579 memset(&sigact, 0, sizeof(sigact));
580 sigact.sa_handler = dummy_signal;
581 sigaction(SIG_IPI, &sigact, NULL);
582
Paolo Bonzini714bd042011-03-12 17:44:06 +0100583 pthread_sigmask(SIG_BLOCK, NULL, &set);
584 sigdelset(&set, SIG_IPI);
585 sigdelset(&set, SIGBUS);
Andreas Färber491d6e82013-05-26 23:38:10 +0200586 r = kvm_set_signal_mask(cpu, &set);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100587 if (r) {
588 fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
589 exit(1);
590 }
Paolo Bonzini714bd042011-03-12 17:44:06 +0100591}
592
593static void qemu_tcg_init_cpu_signals(void)
594{
Paolo Bonzini714bd042011-03-12 17:44:06 +0100595 sigset_t set;
596 struct sigaction sigact;
597
598 memset(&sigact, 0, sizeof(sigact));
599 sigact.sa_handler = cpu_signal;
600 sigaction(SIG_IPI, &sigact, NULL);
601
602 sigemptyset(&set);
603 sigaddset(&set, SIG_IPI);
604 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100605}
606
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100607#else /* _WIN32 */
Andreas Färber13618e02013-05-26 23:41:00 +0200608static void qemu_kvm_init_cpu_signals(CPUState *cpu)
Paolo Bonzini714bd042011-03-12 17:44:06 +0100609{
610 abort();
611}
612
613static void qemu_tcg_init_cpu_signals(void)
614{
615}
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100616#endif /* _WIN32 */
Blue Swirl296af7c2010-03-29 19:23:50 +0000617
Stefan Weilb2532d82012-09-27 07:41:42 +0200618static QemuMutex qemu_global_mutex;
Paolo Bonzini46daff12011-06-09 13:10:24 +0200619static QemuCond qemu_io_proceeded_cond;
620static bool iothread_requesting_mutex;
Blue Swirl296af7c2010-03-29 19:23:50 +0000621
622static QemuThread io_thread;
623
624static QemuThread *tcg_cpu_thread;
625static QemuCond *tcg_halt_cond;
626
Blue Swirl296af7c2010-03-29 19:23:50 +0000627/* cpu creation */
628static QemuCond qemu_cpu_cond;
629/* system init */
Blue Swirl296af7c2010-03-29 19:23:50 +0000630static QemuCond qemu_pause_cond;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300631static QemuCond qemu_work_cond;
Blue Swirl296af7c2010-03-29 19:23:50 +0000632
Paolo Bonzinid3b12f52011-09-13 10:30:52 +0200633void qemu_init_cpu_loop(void)
Blue Swirl296af7c2010-03-29 19:23:50 +0000634{
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100635 qemu_init_sigbus();
Anthony Liguoried945922011-02-08 18:18:18 +0100636 qemu_cond_init(&qemu_cpu_cond);
Anthony Liguoried945922011-02-08 18:18:18 +0100637 qemu_cond_init(&qemu_pause_cond);
638 qemu_cond_init(&qemu_work_cond);
Paolo Bonzini46daff12011-06-09 13:10:24 +0200639 qemu_cond_init(&qemu_io_proceeded_cond);
Blue Swirl296af7c2010-03-29 19:23:50 +0000640 qemu_mutex_init(&qemu_global_mutex);
Blue Swirl296af7c2010-03-29 19:23:50 +0000641
Jan Kiszkab7680cb2011-03-12 17:43:51 +0100642 qemu_thread_get_self(&io_thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000643}
644
Andreas Färberf100f0b2012-05-03 14:58:47 +0200645void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300646{
647 struct qemu_work_item wi;
648
Andreas Färber60e82572012-05-02 22:23:49 +0200649 if (qemu_cpu_is_self(cpu)) {
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300650 func(data);
651 return;
652 }
653
654 wi.func = func;
655 wi.data = data;
Chegu Vinod3c022702013-06-24 03:49:41 -0600656 wi.free = false;
Andreas Färberc64ca812012-05-03 02:11:45 +0200657 if (cpu->queued_work_first == NULL) {
658 cpu->queued_work_first = &wi;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100659 } else {
Andreas Färberc64ca812012-05-03 02:11:45 +0200660 cpu->queued_work_last->next = &wi;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100661 }
Andreas Färberc64ca812012-05-03 02:11:45 +0200662 cpu->queued_work_last = &wi;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300663 wi.next = NULL;
664 wi.done = false;
665
Andreas Färberc08d7422012-05-03 04:34:15 +0200666 qemu_cpu_kick(cpu);
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300667 while (!wi.done) {
Andreas Färber4917cf42013-05-27 05:17:50 +0200668 CPUState *self_cpu = current_cpu;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300669
670 qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
Andreas Färber4917cf42013-05-27 05:17:50 +0200671 current_cpu = self_cpu;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300672 }
673}
674
Chegu Vinod3c022702013-06-24 03:49:41 -0600675void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
676{
677 struct qemu_work_item *wi;
678
679 if (qemu_cpu_is_self(cpu)) {
680 func(data);
681 return;
682 }
683
684 wi = g_malloc0(sizeof(struct qemu_work_item));
685 wi->func = func;
686 wi->data = data;
687 wi->free = true;
688 if (cpu->queued_work_first == NULL) {
689 cpu->queued_work_first = wi;
690 } else {
691 cpu->queued_work_last->next = wi;
692 }
693 cpu->queued_work_last = wi;
694 wi->next = NULL;
695 wi->done = false;
696
697 qemu_cpu_kick(cpu);
698}
699
Andreas Färber6d45b102012-05-03 02:13:22 +0200700static void flush_queued_work(CPUState *cpu)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300701{
702 struct qemu_work_item *wi;
703
Andreas Färberc64ca812012-05-03 02:11:45 +0200704 if (cpu->queued_work_first == NULL) {
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300705 return;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100706 }
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300707
Andreas Färberc64ca812012-05-03 02:11:45 +0200708 while ((wi = cpu->queued_work_first)) {
709 cpu->queued_work_first = wi->next;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300710 wi->func(wi->data);
711 wi->done = true;
Chegu Vinod3c022702013-06-24 03:49:41 -0600712 if (wi->free) {
713 g_free(wi);
714 }
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300715 }
Andreas Färberc64ca812012-05-03 02:11:45 +0200716 cpu->queued_work_last = NULL;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300717 qemu_cond_broadcast(&qemu_work_cond);
718}
719
Andreas Färber509a0d72012-05-03 02:18:09 +0200720static void qemu_wait_io_event_common(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000721{
Andreas Färber4fdeee72012-05-02 23:10:09 +0200722 if (cpu->stop) {
723 cpu->stop = false;
Andreas Färberf324e762012-05-02 23:26:21 +0200724 cpu->stopped = true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000725 qemu_cond_signal(&qemu_pause_cond);
726 }
Andreas Färber6d45b102012-05-03 02:13:22 +0200727 flush_queued_work(cpu);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200728 cpu->thread_kicked = false;
Blue Swirl296af7c2010-03-29 19:23:50 +0000729}
730
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200731static void qemu_tcg_wait_io_event(void)
Blue Swirl296af7c2010-03-29 19:23:50 +0000732{
Andreas Färber182735e2013-05-29 22:29:20 +0200733 CPUState *cpu;
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200734
Jan Kiszka16400322011-02-09 16:29:37 +0100735 while (all_cpu_threads_idle()) {
Paolo Bonziniab33fcd2011-04-13 10:03:44 +0200736 /* Start accounting real time to the virtual clock if the CPUs
737 are idle. */
738 qemu_clock_warp(vm_clock);
Paolo Bonzini9705fbb2011-03-12 17:44:00 +0100739 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +0100740 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000741
Paolo Bonzini46daff12011-06-09 13:10:24 +0200742 while (iothread_requesting_mutex) {
743 qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
744 }
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200745
Andreas Färber182735e2013-05-29 22:29:20 +0200746 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
747 qemu_wait_io_event_common(cpu);
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200748 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000749}
750
Andreas Färberfd529e82013-05-26 23:24:55 +0200751static void qemu_kvm_wait_io_event(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000752{
Andreas Färbera98ae1d2013-05-26 23:21:08 +0200753 while (cpu_thread_is_idle(cpu)) {
Andreas Färberf5c121b2012-05-03 01:22:49 +0200754 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +0100755 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000756
Andreas Färber290adf32013-01-17 09:30:27 +0100757 qemu_kvm_eat_signals(cpu);
Andreas Färber509a0d72012-05-03 02:18:09 +0200758 qemu_wait_io_event_common(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000759}
760
Jan Kiszka7e97cd82011-02-07 12:19:12 +0100761static void *qemu_kvm_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +0000762{
Andreas Färber48a106b2013-05-27 02:20:39 +0200763 CPUState *cpu = arg;
Jan Kiszka84b49152011-02-01 22:15:50 +0100764 int r;
Blue Swirl296af7c2010-03-29 19:23:50 +0000765
Marcelo Tosatti6164e6d2010-03-23 13:37:13 -0300766 qemu_mutex_lock(&qemu_global_mutex);
Andreas Färber814e6122012-05-02 17:00:37 +0200767 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +0200768 cpu->thread_id = qemu_get_thread_id();
Andreas Färber4917cf42013-05-27 05:17:50 +0200769 current_cpu = cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000770
Andreas Färber504134d2012-12-17 06:38:45 +0100771 r = kvm_init_vcpu(cpu);
Jan Kiszka84b49152011-02-01 22:15:50 +0100772 if (r < 0) {
773 fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
774 exit(1);
775 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000776
Andreas Färber13618e02013-05-26 23:41:00 +0200777 qemu_kvm_init_cpu_signals(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000778
779 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +0200780 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000781 qemu_cond_signal(&qemu_cpu_cond);
782
Blue Swirl296af7c2010-03-29 19:23:50 +0000783 while (1) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200784 if (cpu_can_run(cpu)) {
Andreas Färber1458c362013-05-26 23:46:55 +0200785 r = kvm_cpu_exec(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +0100786 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +0200787 cpu_handle_guest_debug(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +0100788 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100789 }
Andreas Färberfd529e82013-05-26 23:24:55 +0200790 qemu_kvm_wait_io_event(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000791 }
792
793 return NULL;
794}
795
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200796static void *qemu_dummy_cpu_thread_fn(void *arg)
797{
798#ifdef _WIN32
799 fprintf(stderr, "qtest is not supported under Windows\n");
800 exit(1);
801#else
Andreas Färber10a90212013-05-27 02:24:35 +0200802 CPUState *cpu = arg;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200803 sigset_t waitset;
804 int r;
805
806 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +0200807 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +0200808 cpu->thread_id = qemu_get_thread_id();
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200809
810 sigemptyset(&waitset);
811 sigaddset(&waitset, SIG_IPI);
812
813 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +0200814 cpu->created = true;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200815 qemu_cond_signal(&qemu_cpu_cond);
816
Andreas Färber4917cf42013-05-27 05:17:50 +0200817 current_cpu = cpu;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200818 while (1) {
Andreas Färber4917cf42013-05-27 05:17:50 +0200819 current_cpu = NULL;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200820 qemu_mutex_unlock_iothread();
821 do {
822 int sig;
823 r = sigwait(&waitset, &sig);
824 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
825 if (r == -1) {
826 perror("sigwait");
827 exit(1);
828 }
829 qemu_mutex_lock_iothread();
Andreas Färber4917cf42013-05-27 05:17:50 +0200830 current_cpu = cpu;
Andreas Färber509a0d72012-05-03 02:18:09 +0200831 qemu_wait_io_event_common(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200832 }
833
834 return NULL;
835#endif
836}
837
Jan Kiszkabdb7ca62011-09-26 09:40:39 +0200838static void tcg_exec_all(void);
839
Igor Mammedova37677c32013-04-23 10:29:42 +0200840static void tcg_signal_cpu_creation(CPUState *cpu, void *data)
841{
842 cpu->thread_id = qemu_get_thread_id();
843 cpu->created = true;
844}
845
Jan Kiszka7e97cd82011-02-07 12:19:12 +0100846static void *qemu_tcg_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +0000847{
Andreas Färberc3586ba2012-05-03 01:41:24 +0200848 CPUState *cpu = arg;
Blue Swirl296af7c2010-03-29 19:23:50 +0000849
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100850 qemu_tcg_init_cpu_signals();
Andreas Färber814e6122012-05-02 17:00:37 +0200851 qemu_thread_get_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000852
Blue Swirl296af7c2010-03-29 19:23:50 +0000853 qemu_mutex_lock(&qemu_global_mutex);
Igor Mammedova37677c32013-04-23 10:29:42 +0200854 qemu_for_each_cpu(tcg_signal_cpu_creation, NULL);
Blue Swirl296af7c2010-03-29 19:23:50 +0000855 qemu_cond_signal(&qemu_cpu_cond);
856
Jan Kiszkafa7d1862011-08-22 18:35:25 +0200857 /* wait for initial kick-off after machine start */
Andreas Färber182735e2013-05-29 22:29:20 +0200858 while (first_cpu->stopped) {
Jan Kiszkafa7d1862011-08-22 18:35:25 +0200859 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
Jan Kiszka8e564b42012-02-17 18:31:15 +0100860
861 /* process any pending work */
Andreas Färber182735e2013-05-29 22:29:20 +0200862 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
863 qemu_wait_io_event_common(cpu);
Jan Kiszka8e564b42012-02-17 18:31:15 +0100864 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100865 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000866
867 while (1) {
Jan Kiszkabdb7ca62011-09-26 09:40:39 +0200868 tcg_exec_all();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200869 if (use_icount && qemu_clock_deadline(vm_clock) <= 0) {
Paolo Bonzini3b2319a2011-04-13 10:03:43 +0200870 qemu_notify_event();
871 }
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200872 qemu_tcg_wait_io_event();
Blue Swirl296af7c2010-03-29 19:23:50 +0000873 }
874
875 return NULL;
876}
877
Andreas Färber2ff09a42012-05-03 00:23:30 +0200878static void qemu_cpu_kick_thread(CPUState *cpu)
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100879{
880#ifndef _WIN32
881 int err;
882
Andreas Färber814e6122012-05-02 17:00:37 +0200883 err = pthread_kill(cpu->thread->thread, SIG_IPI);
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100884 if (err) {
885 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
886 exit(1);
887 }
888#else /* _WIN32 */
Andreas Färber60e82572012-05-02 22:23:49 +0200889 if (!qemu_cpu_is_self(cpu)) {
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200890 CONTEXT tcgContext;
891
892 if (SuspendThread(cpu->hThread) == (DWORD)-1) {
Stefan Weil7f1721d2013-04-13 22:45:50 +0200893 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200894 GetLastError());
895 exit(1);
896 }
897
898 /* On multi-core systems, we are not sure that the thread is actually
899 * suspended until we can get the context.
900 */
901 tcgContext.ContextFlags = CONTEXT_CONTROL;
902 while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
903 continue;
904 }
905
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100906 cpu_signal(0);
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200907
908 if (ResumeThread(cpu->hThread) == (DWORD)-1) {
Stefan Weil7f1721d2013-04-13 22:45:50 +0200909 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200910 GetLastError());
911 exit(1);
912 }
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100913 }
914#endif
915}
916
Andreas Färberc08d7422012-05-03 04:34:15 +0200917void qemu_cpu_kick(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000918{
Andreas Färberf5c121b2012-05-03 01:22:49 +0200919 qemu_cond_broadcast(cpu->halt_cond);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200920 if (!tcg_enabled() && !cpu->thread_kicked) {
Andreas Färber2ff09a42012-05-03 00:23:30 +0200921 qemu_cpu_kick_thread(cpu);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200922 cpu->thread_kicked = true;
Jan Kiszkaaa2c3642011-02-01 22:15:42 +0100923 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000924}
925
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100926void qemu_cpu_kick_self(void)
927{
Paolo Bonzinib55c22c2011-03-12 17:44:07 +0100928#ifndef _WIN32
Andreas Färber4917cf42013-05-27 05:17:50 +0200929 assert(current_cpu);
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100930
Andreas Färber4917cf42013-05-27 05:17:50 +0200931 if (!current_cpu->thread_kicked) {
932 qemu_cpu_kick_thread(current_cpu);
933 current_cpu->thread_kicked = true;
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100934 }
Paolo Bonzinib55c22c2011-03-12 17:44:07 +0100935#else
936 abort();
937#endif
Blue Swirl296af7c2010-03-29 19:23:50 +0000938}
939
Andreas Färber60e82572012-05-02 22:23:49 +0200940bool qemu_cpu_is_self(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000941{
Andreas Färber814e6122012-05-02 17:00:37 +0200942 return qemu_thread_is_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000943}
944
Juan Quintelaaa723c22012-09-18 16:30:11 +0200945static bool qemu_in_vcpu_thread(void)
946{
Andreas Färber4917cf42013-05-27 05:17:50 +0200947 return current_cpu && qemu_cpu_is_self(current_cpu);
Juan Quintelaaa723c22012-09-18 16:30:11 +0200948}
949
Blue Swirl296af7c2010-03-29 19:23:50 +0000950void qemu_mutex_lock_iothread(void)
951{
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200952 if (!tcg_enabled()) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000953 qemu_mutex_lock(&qemu_global_mutex);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300954 } else {
Paolo Bonzini46daff12011-06-09 13:10:24 +0200955 iothread_requesting_mutex = true;
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300956 if (qemu_mutex_trylock(&qemu_global_mutex)) {
Andreas Färber182735e2013-05-29 22:29:20 +0200957 qemu_cpu_kick_thread(first_cpu);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300958 qemu_mutex_lock(&qemu_global_mutex);
959 }
Paolo Bonzini46daff12011-06-09 13:10:24 +0200960 iothread_requesting_mutex = false;
961 qemu_cond_broadcast(&qemu_io_proceeded_cond);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300962 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000963}
964
965void qemu_mutex_unlock_iothread(void)
966{
967 qemu_mutex_unlock(&qemu_global_mutex);
968}
969
970static int all_vcpus_paused(void)
971{
Andreas Färber182735e2013-05-29 22:29:20 +0200972 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000973
Andreas Färber182735e2013-05-29 22:29:20 +0200974 while (cpu) {
975 if (!cpu->stopped) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000976 return 0;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100977 }
Andreas Färber182735e2013-05-29 22:29:20 +0200978 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000979 }
980
981 return 1;
982}
983
984void pause_all_vcpus(void)
985{
Andreas Färber182735e2013-05-29 22:29:20 +0200986 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000987
Paolo Bonzinia5c57d62011-09-12 14:40:36 +0200988 qemu_clock_enable(vm_clock, false);
Andreas Färber182735e2013-05-29 22:29:20 +0200989 while (cpu) {
990 cpu->stop = true;
991 qemu_cpu_kick(cpu);
992 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000993 }
994
Juan Quintelaaa723c22012-09-18 16:30:11 +0200995 if (qemu_in_vcpu_thread()) {
Jan Kiszkad798e972012-02-17 18:31:16 +0100996 cpu_stop_current();
997 if (!kvm_enabled()) {
Andreas Färber182735e2013-05-29 22:29:20 +0200998 cpu = first_cpu;
999 while (cpu) {
1000 cpu->stop = false;
1001 cpu->stopped = true;
1002 cpu = cpu->next_cpu;
Jan Kiszkad798e972012-02-17 18:31:16 +01001003 }
1004 return;
1005 }
1006 }
1007
Blue Swirl296af7c2010-03-29 19:23:50 +00001008 while (!all_vcpus_paused()) {
Paolo Bonzinibe7d6c52011-03-12 17:44:02 +01001009 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
Andreas Färber182735e2013-05-29 22:29:20 +02001010 cpu = first_cpu;
1011 while (cpu) {
1012 qemu_cpu_kick(cpu);
1013 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001014 }
1015 }
1016}
1017
Igor Mammedov29936832013-04-23 10:29:37 +02001018void cpu_resume(CPUState *cpu)
1019{
1020 cpu->stop = false;
1021 cpu->stopped = false;
1022 qemu_cpu_kick(cpu);
1023}
1024
Blue Swirl296af7c2010-03-29 19:23:50 +00001025void resume_all_vcpus(void)
1026{
Andreas Färber182735e2013-05-29 22:29:20 +02001027 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001028
Wen Congyang47113ab2011-11-04 10:45:58 +08001029 qemu_clock_enable(vm_clock, true);
Andreas Färber182735e2013-05-29 22:29:20 +02001030 while (cpu) {
1031 cpu_resume(cpu);
1032 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001033 }
1034}
1035
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001036static void qemu_tcg_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001037{
Blue Swirl296af7c2010-03-29 19:23:50 +00001038 /* share a single thread for all cpus with TCG */
1039 if (!tcg_cpu_thread) {
Andreas Färber814e6122012-05-02 17:00:37 +02001040 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001041 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1042 qemu_cond_init(cpu->halt_cond);
1043 tcg_halt_cond = cpu->halt_cond;
Andreas Färberc3586ba2012-05-03 01:41:24 +02001044 qemu_thread_create(cpu->thread, qemu_tcg_cpu_thread_fn, cpu,
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001045 QEMU_THREAD_JOINABLE);
1046#ifdef _WIN32
Andreas Färber814e6122012-05-02 17:00:37 +02001047 cpu->hThread = qemu_thread_get_handle(cpu->thread);
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001048#endif
Andreas Färber61a46212012-05-02 22:49:36 +02001049 while (!cpu->created) {
Paolo Bonzini18a85722011-03-12 17:44:03 +01001050 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001051 }
Andreas Färber814e6122012-05-02 17:00:37 +02001052 tcg_cpu_thread = cpu->thread;
Blue Swirl296af7c2010-03-29 19:23:50 +00001053 } else {
Andreas Färber814e6122012-05-02 17:00:37 +02001054 cpu->thread = tcg_cpu_thread;
Andreas Färberf5c121b2012-05-03 01:22:49 +02001055 cpu->halt_cond = tcg_halt_cond;
Blue Swirl296af7c2010-03-29 19:23:50 +00001056 }
1057}
1058
Andreas Färber48a106b2013-05-27 02:20:39 +02001059static void qemu_kvm_start_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001060{
Andreas Färber814e6122012-05-02 17:00:37 +02001061 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001062 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1063 qemu_cond_init(cpu->halt_cond);
Andreas Färber48a106b2013-05-27 02:20:39 +02001064 qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu,
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001065 QEMU_THREAD_JOINABLE);
Andreas Färber61a46212012-05-02 22:49:36 +02001066 while (!cpu->created) {
Paolo Bonzini18a85722011-03-12 17:44:03 +01001067 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001068 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001069}
1070
Andreas Färber10a90212013-05-27 02:24:35 +02001071static void qemu_dummy_start_vcpu(CPUState *cpu)
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001072{
Andreas Färber814e6122012-05-02 17:00:37 +02001073 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001074 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1075 qemu_cond_init(cpu->halt_cond);
Andreas Färber10a90212013-05-27 02:24:35 +02001076 qemu_thread_create(cpu->thread, qemu_dummy_cpu_thread_fn, cpu,
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001077 QEMU_THREAD_JOINABLE);
Andreas Färber61a46212012-05-02 22:49:36 +02001078 while (!cpu->created) {
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001079 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1080 }
1081}
1082
Andreas Färberc643bed2013-05-27 03:23:24 +02001083void qemu_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001084{
Andreas Färberce3960e2012-12-17 03:27:07 +01001085 cpu->nr_cores = smp_cores;
1086 cpu->nr_threads = smp_threads;
Andreas Färberf324e762012-05-02 23:26:21 +02001087 cpu->stopped = true;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001088 if (kvm_enabled()) {
Andreas Färber48a106b2013-05-27 02:20:39 +02001089 qemu_kvm_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001090 } else if (tcg_enabled()) {
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001091 qemu_tcg_init_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001092 } else {
Andreas Färber10a90212013-05-27 02:24:35 +02001093 qemu_dummy_start_vcpu(cpu);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001094 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001095}
1096
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001097void cpu_stop_current(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001098{
Andreas Färber4917cf42013-05-27 05:17:50 +02001099 if (current_cpu) {
1100 current_cpu->stop = false;
1101 current_cpu->stopped = true;
1102 cpu_exit(current_cpu);
Paolo Bonzini67bb1722011-03-12 17:43:59 +01001103 qemu_cond_signal(&qemu_pause_cond);
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001104 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001105}
1106
Kevin Wolf56983462013-07-05 13:49:54 +02001107int vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +00001108{
Juan Quintelaaa723c22012-09-18 16:30:11 +02001109 if (qemu_in_vcpu_thread()) {
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001110 qemu_system_vmstop_request(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00001111 /*
1112 * FIXME: should not return to device code in case
1113 * vm_stop() has been requested.
1114 */
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001115 cpu_stop_current();
Kevin Wolf56983462013-07-05 13:49:54 +02001116 return 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00001117 }
Kevin Wolf56983462013-07-05 13:49:54 +02001118
1119 return do_vm_stop(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00001120}
1121
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03001122/* does a state transition even if the VM is already stopped,
1123 current state is forgotten forever */
Kevin Wolf56983462013-07-05 13:49:54 +02001124int vm_stop_force_state(RunState state)
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03001125{
1126 if (runstate_is_running()) {
Kevin Wolf56983462013-07-05 13:49:54 +02001127 return vm_stop(state);
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03001128 } else {
1129 runstate_set(state);
Kevin Wolf594a45c2013-07-18 14:52:19 +02001130 /* Make sure to return an error if the flush in a previous vm_stop()
1131 * failed. */
1132 return bdrv_flush_all();
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03001133 }
1134}
1135
Andreas Färber9349b4f2012-03-14 01:38:32 +01001136static int tcg_cpu_exec(CPUArchState *env)
Blue Swirl296af7c2010-03-29 19:23:50 +00001137{
1138 int ret;
1139#ifdef CONFIG_PROFILER
1140 int64_t ti;
1141#endif
1142
1143#ifdef CONFIG_PROFILER
1144 ti = profile_getclock();
1145#endif
1146 if (use_icount) {
1147 int64_t count;
1148 int decr;
1149 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
1150 env->icount_decr.u16.low = 0;
1151 env->icount_extra = 0;
Paolo Bonzini946fb272011-09-12 13:57:37 +02001152 count = qemu_icount_round(qemu_clock_deadline(vm_clock));
Blue Swirl296af7c2010-03-29 19:23:50 +00001153 qemu_icount += count;
1154 decr = (count > 0xffff) ? 0xffff : count;
1155 count -= decr;
1156 env->icount_decr.u16.low = decr;
1157 env->icount_extra = count;
1158 }
1159 ret = cpu_exec(env);
1160#ifdef CONFIG_PROFILER
1161 qemu_time += profile_getclock() - ti;
1162#endif
1163 if (use_icount) {
1164 /* Fold pending instructions back into the
1165 instruction counter, and clear the interrupt flag. */
1166 qemu_icount -= (env->icount_decr.u16.low
1167 + env->icount_extra);
1168 env->icount_decr.u32 = 0;
1169 env->icount_extra = 0;
1170 }
1171 return ret;
1172}
1173
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001174static void tcg_exec_all(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001175{
Jan Kiszka9a360852011-02-01 22:15:55 +01001176 int r;
1177
Paolo Bonziniab33fcd2011-04-13 10:03:44 +02001178 /* Account partial waits to the vm_clock. */
1179 qemu_clock_warp(vm_clock);
1180
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001181 if (next_cpu == NULL) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001182 next_cpu = first_cpu;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001183 }
Jan Kiszkac629a4b2010-06-25 16:56:52 +02001184 for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001185 CPUState *cpu = next_cpu;
1186 CPUArchState *env = cpu->env_ptr;
Blue Swirl296af7c2010-03-29 19:23:50 +00001187
1188 qemu_clock_enable(vm_clock,
Andreas Färbered2803d2013-06-21 20:20:45 +02001189 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
Blue Swirl296af7c2010-03-29 19:23:50 +00001190
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001191 if (cpu_can_run(cpu)) {
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001192 r = tcg_cpu_exec(env);
Jan Kiszka9a360852011-02-01 22:15:55 +01001193 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +02001194 cpu_handle_guest_debug(cpu);
Jan Kiszka3c638d02010-06-25 16:56:56 +02001195 break;
1196 }
Andreas Färberf324e762012-05-02 23:26:21 +02001197 } else if (cpu->stop || cpu->stopped) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001198 break;
1199 }
1200 }
Jan Kiszkac629a4b2010-06-25 16:56:52 +02001201 exit_request = 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00001202}
1203
1204void set_numa_modes(void)
1205{
Andreas Färber1b1ed8d2012-12-17 04:22:03 +01001206 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001207 int i;
1208
Andreas Färber182735e2013-05-29 22:29:20 +02001209 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001210 for (i = 0; i < nb_numa_nodes; i++) {
Andreas Färber55e5c282012-12-17 06:18:02 +01001211 if (test_bit(cpu->cpu_index, node_cpumask[i])) {
Andreas Färber1b1ed8d2012-12-17 04:22:03 +01001212 cpu->numa_node = i;
Blue Swirl296af7c2010-03-29 19:23:50 +00001213 }
1214 }
1215 }
1216}
1217
Stefan Weil9a78eea2010-10-22 23:03:33 +02001218void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
Blue Swirl262353c2010-05-04 19:55:35 +00001219{
1220 /* XXX: implement xxx_cpu_list for targets that still miss it */
Peter Maydelle916cbf2012-09-05 17:41:08 -03001221#if defined(cpu_list)
1222 cpu_list(f, cpu_fprintf);
Blue Swirl262353c2010-05-04 19:55:35 +00001223#endif
1224}
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001225
1226CpuInfoList *qmp_query_cpus(Error **errp)
1227{
1228 CpuInfoList *head = NULL, *cur_item = NULL;
Andreas Färber182735e2013-05-29 22:29:20 +02001229 CPUState *cpu;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001230
Andreas Färber182735e2013-05-29 22:29:20 +02001231 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001232 CpuInfoList *info;
Andreas Färber182735e2013-05-29 22:29:20 +02001233#if defined(TARGET_I386)
1234 X86CPU *x86_cpu = X86_CPU(cpu);
1235 CPUX86State *env = &x86_cpu->env;
1236#elif defined(TARGET_PPC)
1237 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
1238 CPUPPCState *env = &ppc_cpu->env;
1239#elif defined(TARGET_SPARC)
1240 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
1241 CPUSPARCState *env = &sparc_cpu->env;
1242#elif defined(TARGET_MIPS)
1243 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
1244 CPUMIPSState *env = &mips_cpu->env;
1245#endif
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001246
Andreas Färbercb446ec2013-05-01 14:24:52 +02001247 cpu_synchronize_state(cpu);
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001248
1249 info = g_malloc0(sizeof(*info));
1250 info->value = g_malloc0(sizeof(*info->value));
Andreas Färber55e5c282012-12-17 06:18:02 +01001251 info->value->CPU = cpu->cpu_index;
Andreas Färber182735e2013-05-29 22:29:20 +02001252 info->value->current = (cpu == first_cpu);
Andreas Färber259186a2013-01-17 18:51:17 +01001253 info->value->halted = cpu->halted;
Andreas Färber9f09e182012-05-03 06:59:07 +02001254 info->value->thread_id = cpu->thread_id;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001255#if defined(TARGET_I386)
1256 info->value->has_pc = true;
1257 info->value->pc = env->eip + env->segs[R_CS].base;
1258#elif defined(TARGET_PPC)
1259 info->value->has_nip = true;
1260 info->value->nip = env->nip;
1261#elif defined(TARGET_SPARC)
1262 info->value->has_pc = true;
1263 info->value->pc = env->pc;
1264 info->value->has_npc = true;
1265 info->value->npc = env->npc;
1266#elif defined(TARGET_MIPS)
1267 info->value->has_PC = true;
1268 info->value->PC = env->active_tc.PC;
1269#endif
1270
1271 /* XXX: waiting for the qapi to support GSList */
1272 if (!cur_item) {
1273 head = cur_item = info;
1274 } else {
1275 cur_item->next = info;
1276 cur_item = info;
1277 }
1278 }
1279
1280 return head;
1281}
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001282
1283void qmp_memsave(int64_t addr, int64_t size, const char *filename,
1284 bool has_cpu, int64_t cpu_index, Error **errp)
1285{
1286 FILE *f;
1287 uint32_t l;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001288 CPUArchState *env;
Andreas Färber55e5c282012-12-17 06:18:02 +01001289 CPUState *cpu;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001290 uint8_t buf[1024];
1291
1292 if (!has_cpu) {
1293 cpu_index = 0;
1294 }
1295
Andreas Färber151d1322013-02-15 15:41:49 +01001296 cpu = qemu_get_cpu(cpu_index);
1297 if (cpu == NULL) {
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001298 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
1299 "a CPU number");
1300 return;
1301 }
Andreas Färber151d1322013-02-15 15:41:49 +01001302 env = cpu->env_ptr;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001303
1304 f = fopen(filename, "wb");
1305 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04001306 error_setg_file_open(errp, errno, filename);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001307 return;
1308 }
1309
1310 while (size != 0) {
1311 l = sizeof(buf);
1312 if (l > size)
1313 l = size;
1314 cpu_memory_rw_debug(env, addr, buf, l, 0);
1315 if (fwrite(buf, 1, l, f) != l) {
1316 error_set(errp, QERR_IO_ERROR);
1317 goto exit;
1318 }
1319 addr += l;
1320 size -= l;
1321 }
1322
1323exit:
1324 fclose(f);
1325}
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02001326
1327void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
1328 Error **errp)
1329{
1330 FILE *f;
1331 uint32_t l;
1332 uint8_t buf[1024];
1333
1334 f = fopen(filename, "wb");
1335 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04001336 error_setg_file_open(errp, errno, filename);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02001337 return;
1338 }
1339
1340 while (size != 0) {
1341 l = sizeof(buf);
1342 if (l > size)
1343 l = size;
1344 cpu_physical_memory_rw(addr, buf, l, 0);
1345 if (fwrite(buf, 1, l, f) != l) {
1346 error_set(errp, QERR_IO_ERROR);
1347 goto exit;
1348 }
1349 addr += l;
1350 size -= l;
1351 }
1352
1353exit:
1354 fclose(f);
1355}
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001356
1357void qmp_inject_nmi(Error **errp)
1358{
1359#if defined(TARGET_I386)
Andreas Färber182735e2013-05-29 22:29:20 +02001360 CPUState *cs;
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001361
Andreas Färber182735e2013-05-29 22:29:20 +02001362 for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) {
1363 X86CPU *cpu = X86_CPU(cs);
1364 CPUX86State *env = &cpu->env;
1365
Jan Kiszka02c09192011-10-18 00:00:06 +08001366 if (!env->apic_state) {
Andreas Färber182735e2013-05-29 22:29:20 +02001367 cpu_interrupt(cs, CPU_INTERRUPT_NMI);
Jan Kiszka02c09192011-10-18 00:00:06 +08001368 } else {
1369 apic_deliver_nmi(env->apic_state);
1370 }
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001371 }
1372#else
1373 error_set(errp, QERR_UNSUPPORTED);
1374#endif
1375}