blob: 51239723fb2393491936c656d04034b0e8e6a0cc [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
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -0300437static void do_vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +0000438{
Luiz Capitulino13548692011-07-29 15:36:43 -0300439 if (runstate_is_running()) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000440 cpu_disable_ticks();
Blue Swirl296af7c2010-03-29 19:23:50 +0000441 pause_all_vcpus();
Luiz Capitulinof5bbfba2011-07-29 15:04:45 -0300442 runstate_set(state);
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -0300443 vm_state_notify(0, state);
Stefan Hajnoczi922453b2011-11-30 12:23:43 +0000444 bdrv_drain_all();
Michael S. Tsirkin55df6f32010-11-22 19:52:22 +0200445 bdrv_flush_all();
Blue Swirl296af7c2010-03-29 19:23:50 +0000446 monitor_protocol_event(QEVENT_STOP, NULL);
447 }
448}
449
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200450static bool cpu_can_run(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000451{
Andreas Färber4fdeee72012-05-02 23:10:09 +0200452 if (cpu->stop) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200453 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100454 }
Andreas Färberf324e762012-05-02 23:26:21 +0200455 if (cpu->stopped || !runstate_is_running()) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200456 return false;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100457 }
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200458 return true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000459}
460
Andreas Färber91325042013-05-27 02:07:49 +0200461static void cpu_handle_guest_debug(CPUState *cpu)
Jan Kiszka3c638d02010-06-25 16:56:56 +0200462{
Andreas Färber64f6b342013-05-27 02:06:09 +0200463 gdb_set_stop_cpu(cpu);
Jan Kiszka8cf71712011-02-07 12:19:16 +0100464 qemu_system_debug_request();
Andreas Färberf324e762012-05-02 23:26:21 +0200465 cpu->stopped = true;
Jan Kiszka3c638d02010-06-25 16:56:56 +0200466}
467
Paolo Bonzini714bd042011-03-12 17:44:06 +0100468static void cpu_signal(int sig)
469{
Andreas Färber4917cf42013-05-27 05:17:50 +0200470 if (current_cpu) {
471 cpu_exit(current_cpu);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100472 }
473 exit_request = 1;
474}
Paolo Bonzini714bd042011-03-12 17:44:06 +0100475
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100476#ifdef CONFIG_LINUX
477static void sigbus_reraise(void)
478{
479 sigset_t set;
480 struct sigaction action;
481
482 memset(&action, 0, sizeof(action));
483 action.sa_handler = SIG_DFL;
484 if (!sigaction(SIGBUS, &action, NULL)) {
485 raise(SIGBUS);
486 sigemptyset(&set);
487 sigaddset(&set, SIGBUS);
488 sigprocmask(SIG_UNBLOCK, &set, NULL);
489 }
490 perror("Failed to re-raise SIGBUS!\n");
491 abort();
492}
493
494static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
495 void *ctx)
496{
497 if (kvm_on_sigbus(siginfo->ssi_code,
498 (void *)(intptr_t)siginfo->ssi_addr)) {
499 sigbus_reraise();
500 }
501}
502
503static void qemu_init_sigbus(void)
504{
505 struct sigaction action;
506
507 memset(&action, 0, sizeof(action));
508 action.sa_flags = SA_SIGINFO;
509 action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
510 sigaction(SIGBUS, &action, NULL);
511
512 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
513}
514
Andreas Färber290adf32013-01-17 09:30:27 +0100515static void qemu_kvm_eat_signals(CPUState *cpu)
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100516{
517 struct timespec ts = { 0, 0 };
518 siginfo_t siginfo;
519 sigset_t waitset;
520 sigset_t chkset;
521 int r;
522
523 sigemptyset(&waitset);
524 sigaddset(&waitset, SIG_IPI);
525 sigaddset(&waitset, SIGBUS);
526
527 do {
528 r = sigtimedwait(&waitset, &siginfo, &ts);
529 if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
530 perror("sigtimedwait");
531 exit(1);
532 }
533
534 switch (r) {
535 case SIGBUS:
Andreas Färber290adf32013-01-17 09:30:27 +0100536 if (kvm_on_sigbus_vcpu(cpu, siginfo.si_code, siginfo.si_addr)) {
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100537 sigbus_reraise();
538 }
539 break;
540 default:
541 break;
542 }
543
544 r = sigpending(&chkset);
545 if (r == -1) {
546 perror("sigpending");
547 exit(1);
548 }
549 } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100550}
551
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100552#else /* !CONFIG_LINUX */
553
554static void qemu_init_sigbus(void)
555{
556}
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100557
Andreas Färber290adf32013-01-17 09:30:27 +0100558static void qemu_kvm_eat_signals(CPUState *cpu)
Jan Kiszka1ab3c6c2011-03-15 12:26:12 +0100559{
560}
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100561#endif /* !CONFIG_LINUX */
562
Blue Swirl296af7c2010-03-29 19:23:50 +0000563#ifndef _WIN32
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100564static void dummy_signal(int sig)
Blue Swirl296af7c2010-03-29 19:23:50 +0000565{
566}
567
Andreas Färber13618e02013-05-26 23:41:00 +0200568static void qemu_kvm_init_cpu_signals(CPUState *cpu)
Paolo Bonzini714bd042011-03-12 17:44:06 +0100569{
570 int r;
571 sigset_t set;
572 struct sigaction sigact;
573
574 memset(&sigact, 0, sizeof(sigact));
575 sigact.sa_handler = dummy_signal;
576 sigaction(SIG_IPI, &sigact, NULL);
577
Paolo Bonzini714bd042011-03-12 17:44:06 +0100578 pthread_sigmask(SIG_BLOCK, NULL, &set);
579 sigdelset(&set, SIG_IPI);
580 sigdelset(&set, SIGBUS);
Andreas Färber491d6e82013-05-26 23:38:10 +0200581 r = kvm_set_signal_mask(cpu, &set);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100582 if (r) {
583 fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
584 exit(1);
585 }
Paolo Bonzini714bd042011-03-12 17:44:06 +0100586}
587
588static void qemu_tcg_init_cpu_signals(void)
589{
Paolo Bonzini714bd042011-03-12 17:44:06 +0100590 sigset_t set;
591 struct sigaction sigact;
592
593 memset(&sigact, 0, sizeof(sigact));
594 sigact.sa_handler = cpu_signal;
595 sigaction(SIG_IPI, &sigact, NULL);
596
597 sigemptyset(&set);
598 sigaddset(&set, SIG_IPI);
599 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
Paolo Bonzini714bd042011-03-12 17:44:06 +0100600}
601
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100602#else /* _WIN32 */
Andreas Färber13618e02013-05-26 23:41:00 +0200603static void qemu_kvm_init_cpu_signals(CPUState *cpu)
Paolo Bonzini714bd042011-03-12 17:44:06 +0100604{
605 abort();
606}
607
608static void qemu_tcg_init_cpu_signals(void)
609{
610}
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100611#endif /* _WIN32 */
Blue Swirl296af7c2010-03-29 19:23:50 +0000612
Stefan Weilb2532d82012-09-27 07:41:42 +0200613static QemuMutex qemu_global_mutex;
Paolo Bonzini46daff12011-06-09 13:10:24 +0200614static QemuCond qemu_io_proceeded_cond;
615static bool iothread_requesting_mutex;
Blue Swirl296af7c2010-03-29 19:23:50 +0000616
617static QemuThread io_thread;
618
619static QemuThread *tcg_cpu_thread;
620static QemuCond *tcg_halt_cond;
621
Blue Swirl296af7c2010-03-29 19:23:50 +0000622/* cpu creation */
623static QemuCond qemu_cpu_cond;
624/* system init */
Blue Swirl296af7c2010-03-29 19:23:50 +0000625static QemuCond qemu_pause_cond;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300626static QemuCond qemu_work_cond;
Blue Swirl296af7c2010-03-29 19:23:50 +0000627
Paolo Bonzinid3b12f52011-09-13 10:30:52 +0200628void qemu_init_cpu_loop(void)
Blue Swirl296af7c2010-03-29 19:23:50 +0000629{
Jan Kiszka6d9cb732011-02-01 22:15:58 +0100630 qemu_init_sigbus();
Anthony Liguoried945922011-02-08 18:18:18 +0100631 qemu_cond_init(&qemu_cpu_cond);
Anthony Liguoried945922011-02-08 18:18:18 +0100632 qemu_cond_init(&qemu_pause_cond);
633 qemu_cond_init(&qemu_work_cond);
Paolo Bonzini46daff12011-06-09 13:10:24 +0200634 qemu_cond_init(&qemu_io_proceeded_cond);
Blue Swirl296af7c2010-03-29 19:23:50 +0000635 qemu_mutex_init(&qemu_global_mutex);
Blue Swirl296af7c2010-03-29 19:23:50 +0000636
Jan Kiszkab7680cb2011-03-12 17:43:51 +0100637 qemu_thread_get_self(&io_thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000638}
639
Andreas Färberf100f0b2012-05-03 14:58:47 +0200640void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300641{
642 struct qemu_work_item wi;
643
Andreas Färber60e82572012-05-02 22:23:49 +0200644 if (qemu_cpu_is_self(cpu)) {
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300645 func(data);
646 return;
647 }
648
649 wi.func = func;
650 wi.data = data;
Chegu Vinod3c022702013-06-24 03:49:41 -0600651 wi.free = false;
Andreas Färberc64ca812012-05-03 02:11:45 +0200652 if (cpu->queued_work_first == NULL) {
653 cpu->queued_work_first = &wi;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100654 } else {
Andreas Färberc64ca812012-05-03 02:11:45 +0200655 cpu->queued_work_last->next = &wi;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100656 }
Andreas Färberc64ca812012-05-03 02:11:45 +0200657 cpu->queued_work_last = &wi;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300658 wi.next = NULL;
659 wi.done = false;
660
Andreas Färberc08d7422012-05-03 04:34:15 +0200661 qemu_cpu_kick(cpu);
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300662 while (!wi.done) {
Andreas Färber4917cf42013-05-27 05:17:50 +0200663 CPUState *self_cpu = current_cpu;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300664
665 qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
Andreas Färber4917cf42013-05-27 05:17:50 +0200666 current_cpu = self_cpu;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300667 }
668}
669
Chegu Vinod3c022702013-06-24 03:49:41 -0600670void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data)
671{
672 struct qemu_work_item *wi;
673
674 if (qemu_cpu_is_self(cpu)) {
675 func(data);
676 return;
677 }
678
679 wi = g_malloc0(sizeof(struct qemu_work_item));
680 wi->func = func;
681 wi->data = data;
682 wi->free = true;
683 if (cpu->queued_work_first == NULL) {
684 cpu->queued_work_first = wi;
685 } else {
686 cpu->queued_work_last->next = wi;
687 }
688 cpu->queued_work_last = wi;
689 wi->next = NULL;
690 wi->done = false;
691
692 qemu_cpu_kick(cpu);
693}
694
Andreas Färber6d45b102012-05-03 02:13:22 +0200695static void flush_queued_work(CPUState *cpu)
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300696{
697 struct qemu_work_item *wi;
698
Andreas Färberc64ca812012-05-03 02:11:45 +0200699 if (cpu->queued_work_first == NULL) {
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300700 return;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100701 }
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300702
Andreas Färberc64ca812012-05-03 02:11:45 +0200703 while ((wi = cpu->queued_work_first)) {
704 cpu->queued_work_first = wi->next;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300705 wi->func(wi->data);
706 wi->done = true;
Chegu Vinod3c022702013-06-24 03:49:41 -0600707 if (wi->free) {
708 g_free(wi);
709 }
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300710 }
Andreas Färberc64ca812012-05-03 02:11:45 +0200711 cpu->queued_work_last = NULL;
Marcelo Tosattie82bcec2010-05-04 09:45:22 -0300712 qemu_cond_broadcast(&qemu_work_cond);
713}
714
Andreas Färber509a0d72012-05-03 02:18:09 +0200715static void qemu_wait_io_event_common(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000716{
Andreas Färber4fdeee72012-05-02 23:10:09 +0200717 if (cpu->stop) {
718 cpu->stop = false;
Andreas Färberf324e762012-05-02 23:26:21 +0200719 cpu->stopped = true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000720 qemu_cond_signal(&qemu_pause_cond);
721 }
Andreas Färber6d45b102012-05-03 02:13:22 +0200722 flush_queued_work(cpu);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200723 cpu->thread_kicked = false;
Blue Swirl296af7c2010-03-29 19:23:50 +0000724}
725
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200726static void qemu_tcg_wait_io_event(void)
Blue Swirl296af7c2010-03-29 19:23:50 +0000727{
Andreas Färber182735e2013-05-29 22:29:20 +0200728 CPUState *cpu;
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200729
Jan Kiszka16400322011-02-09 16:29:37 +0100730 while (all_cpu_threads_idle()) {
Paolo Bonziniab33fcd2011-04-13 10:03:44 +0200731 /* Start accounting real time to the virtual clock if the CPUs
732 are idle. */
733 qemu_clock_warp(vm_clock);
Paolo Bonzini9705fbb2011-03-12 17:44:00 +0100734 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +0100735 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000736
Paolo Bonzini46daff12011-06-09 13:10:24 +0200737 while (iothread_requesting_mutex) {
738 qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
739 }
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200740
Andreas Färber182735e2013-05-29 22:29:20 +0200741 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
742 qemu_wait_io_event_common(cpu);
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200743 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000744}
745
Andreas Färberfd529e82013-05-26 23:24:55 +0200746static void qemu_kvm_wait_io_event(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000747{
Andreas Färbera98ae1d2013-05-26 23:21:08 +0200748 while (cpu_thread_is_idle(cpu)) {
Andreas Färberf5c121b2012-05-03 01:22:49 +0200749 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
Jan Kiszka16400322011-02-09 16:29:37 +0100750 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000751
Andreas Färber290adf32013-01-17 09:30:27 +0100752 qemu_kvm_eat_signals(cpu);
Andreas Färber509a0d72012-05-03 02:18:09 +0200753 qemu_wait_io_event_common(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000754}
755
Jan Kiszka7e97cd82011-02-07 12:19:12 +0100756static void *qemu_kvm_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +0000757{
Andreas Färber48a106b2013-05-27 02:20:39 +0200758 CPUState *cpu = arg;
Jan Kiszka84b49152011-02-01 22:15:50 +0100759 int r;
Blue Swirl296af7c2010-03-29 19:23:50 +0000760
Marcelo Tosatti6164e6d2010-03-23 13:37:13 -0300761 qemu_mutex_lock(&qemu_global_mutex);
Andreas Färber814e6122012-05-02 17:00:37 +0200762 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +0200763 cpu->thread_id = qemu_get_thread_id();
Andreas Färber4917cf42013-05-27 05:17:50 +0200764 current_cpu = cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000765
Andreas Färber504134d2012-12-17 06:38:45 +0100766 r = kvm_init_vcpu(cpu);
Jan Kiszka84b49152011-02-01 22:15:50 +0100767 if (r < 0) {
768 fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
769 exit(1);
770 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000771
Andreas Färber13618e02013-05-26 23:41:00 +0200772 qemu_kvm_init_cpu_signals(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000773
774 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +0200775 cpu->created = true;
Blue Swirl296af7c2010-03-29 19:23:50 +0000776 qemu_cond_signal(&qemu_cpu_cond);
777
Blue Swirl296af7c2010-03-29 19:23:50 +0000778 while (1) {
Andreas Färbera1fcaa72012-05-02 23:42:26 +0200779 if (cpu_can_run(cpu)) {
Andreas Färber1458c362013-05-26 23:46:55 +0200780 r = kvm_cpu_exec(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +0100781 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +0200782 cpu_handle_guest_debug(cpu);
Jan Kiszka83f338f2011-02-07 12:19:17 +0100783 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100784 }
Andreas Färberfd529e82013-05-26 23:24:55 +0200785 qemu_kvm_wait_io_event(cpu);
Blue Swirl296af7c2010-03-29 19:23:50 +0000786 }
787
788 return NULL;
789}
790
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200791static void *qemu_dummy_cpu_thread_fn(void *arg)
792{
793#ifdef _WIN32
794 fprintf(stderr, "qtest is not supported under Windows\n");
795 exit(1);
796#else
Andreas Färber10a90212013-05-27 02:24:35 +0200797 CPUState *cpu = arg;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200798 sigset_t waitset;
799 int r;
800
801 qemu_mutex_lock_iothread();
Andreas Färber814e6122012-05-02 17:00:37 +0200802 qemu_thread_get_self(cpu->thread);
Andreas Färber9f09e182012-05-03 06:59:07 +0200803 cpu->thread_id = qemu_get_thread_id();
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200804
805 sigemptyset(&waitset);
806 sigaddset(&waitset, SIG_IPI);
807
808 /* signal CPU creation */
Andreas Färber61a46212012-05-02 22:49:36 +0200809 cpu->created = true;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200810 qemu_cond_signal(&qemu_cpu_cond);
811
Andreas Färber4917cf42013-05-27 05:17:50 +0200812 current_cpu = cpu;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200813 while (1) {
Andreas Färber4917cf42013-05-27 05:17:50 +0200814 current_cpu = NULL;
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200815 qemu_mutex_unlock_iothread();
816 do {
817 int sig;
818 r = sigwait(&waitset, &sig);
819 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
820 if (r == -1) {
821 perror("sigwait");
822 exit(1);
823 }
824 qemu_mutex_lock_iothread();
Andreas Färber4917cf42013-05-27 05:17:50 +0200825 current_cpu = cpu;
Andreas Färber509a0d72012-05-03 02:18:09 +0200826 qemu_wait_io_event_common(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200827 }
828
829 return NULL;
830#endif
831}
832
Jan Kiszkabdb7ca62011-09-26 09:40:39 +0200833static void tcg_exec_all(void);
834
Igor Mammedova37677c32013-04-23 10:29:42 +0200835static void tcg_signal_cpu_creation(CPUState *cpu, void *data)
836{
837 cpu->thread_id = qemu_get_thread_id();
838 cpu->created = true;
839}
840
Jan Kiszka7e97cd82011-02-07 12:19:12 +0100841static void *qemu_tcg_cpu_thread_fn(void *arg)
Blue Swirl296af7c2010-03-29 19:23:50 +0000842{
Andreas Färberc3586ba2012-05-03 01:41:24 +0200843 CPUState *cpu = arg;
Blue Swirl296af7c2010-03-29 19:23:50 +0000844
Jan Kiszka55f8d6a2011-02-01 22:15:52 +0100845 qemu_tcg_init_cpu_signals();
Andreas Färber814e6122012-05-02 17:00:37 +0200846 qemu_thread_get_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000847
Blue Swirl296af7c2010-03-29 19:23:50 +0000848 qemu_mutex_lock(&qemu_global_mutex);
Igor Mammedova37677c32013-04-23 10:29:42 +0200849 qemu_for_each_cpu(tcg_signal_cpu_creation, NULL);
Blue Swirl296af7c2010-03-29 19:23:50 +0000850 qemu_cond_signal(&qemu_cpu_cond);
851
Jan Kiszkafa7d1862011-08-22 18:35:25 +0200852 /* wait for initial kick-off after machine start */
Andreas Färber182735e2013-05-29 22:29:20 +0200853 while (first_cpu->stopped) {
Jan Kiszkafa7d1862011-08-22 18:35:25 +0200854 qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
Jan Kiszka8e564b42012-02-17 18:31:15 +0100855
856 /* process any pending work */
Andreas Färber182735e2013-05-29 22:29:20 +0200857 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
858 qemu_wait_io_event_common(cpu);
Jan Kiszka8e564b42012-02-17 18:31:15 +0100859 }
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100860 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000861
862 while (1) {
Jan Kiszkabdb7ca62011-09-26 09:40:39 +0200863 tcg_exec_all();
Paolo Bonzini946fb272011-09-12 13:57:37 +0200864 if (use_icount && qemu_clock_deadline(vm_clock) <= 0) {
Paolo Bonzini3b2319a2011-04-13 10:03:43 +0200865 qemu_notify_event();
866 }
Jan Kiszka6cabe1f2010-06-25 16:56:53 +0200867 qemu_tcg_wait_io_event();
Blue Swirl296af7c2010-03-29 19:23:50 +0000868 }
869
870 return NULL;
871}
872
Andreas Färber2ff09a42012-05-03 00:23:30 +0200873static void qemu_cpu_kick_thread(CPUState *cpu)
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100874{
875#ifndef _WIN32
876 int err;
877
Andreas Färber814e6122012-05-02 17:00:37 +0200878 err = pthread_kill(cpu->thread->thread, SIG_IPI);
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100879 if (err) {
880 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
881 exit(1);
882 }
883#else /* _WIN32 */
Andreas Färber60e82572012-05-02 22:23:49 +0200884 if (!qemu_cpu_is_self(cpu)) {
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200885 CONTEXT tcgContext;
886
887 if (SuspendThread(cpu->hThread) == (DWORD)-1) {
Stefan Weil7f1721d2013-04-13 22:45:50 +0200888 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200889 GetLastError());
890 exit(1);
891 }
892
893 /* On multi-core systems, we are not sure that the thread is actually
894 * suspended until we can get the context.
895 */
896 tcgContext.ContextFlags = CONTEXT_CONTROL;
897 while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
898 continue;
899 }
900
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100901 cpu_signal(0);
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200902
903 if (ResumeThread(cpu->hThread) == (DWORD)-1) {
Stefan Weil7f1721d2013-04-13 22:45:50 +0200904 fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__,
Olivier Hainqueed9164a2013-04-09 18:06:53 +0200905 GetLastError());
906 exit(1);
907 }
Paolo Bonzinicc015e92011-03-12 17:44:08 +0100908 }
909#endif
910}
911
Andreas Färberc08d7422012-05-03 04:34:15 +0200912void qemu_cpu_kick(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000913{
Andreas Färberf5c121b2012-05-03 01:22:49 +0200914 qemu_cond_broadcast(cpu->halt_cond);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200915 if (!tcg_enabled() && !cpu->thread_kicked) {
Andreas Färber2ff09a42012-05-03 00:23:30 +0200916 qemu_cpu_kick_thread(cpu);
Andreas Färber216fc9a2012-05-02 17:49:49 +0200917 cpu->thread_kicked = true;
Jan Kiszkaaa2c3642011-02-01 22:15:42 +0100918 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000919}
920
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100921void qemu_cpu_kick_self(void)
922{
Paolo Bonzinib55c22c2011-03-12 17:44:07 +0100923#ifndef _WIN32
Andreas Färber4917cf42013-05-27 05:17:50 +0200924 assert(current_cpu);
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100925
Andreas Färber4917cf42013-05-27 05:17:50 +0200926 if (!current_cpu->thread_kicked) {
927 qemu_cpu_kick_thread(current_cpu);
928 current_cpu->thread_kicked = true;
Jan Kiszka46d62fa2011-02-01 22:15:59 +0100929 }
Paolo Bonzinib55c22c2011-03-12 17:44:07 +0100930#else
931 abort();
932#endif
Blue Swirl296af7c2010-03-29 19:23:50 +0000933}
934
Andreas Färber60e82572012-05-02 22:23:49 +0200935bool qemu_cpu_is_self(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +0000936{
Andreas Färber814e6122012-05-02 17:00:37 +0200937 return qemu_thread_is_self(cpu->thread);
Blue Swirl296af7c2010-03-29 19:23:50 +0000938}
939
Juan Quintelaaa723c22012-09-18 16:30:11 +0200940static bool qemu_in_vcpu_thread(void)
941{
Andreas Färber4917cf42013-05-27 05:17:50 +0200942 return current_cpu && qemu_cpu_is_self(current_cpu);
Juan Quintelaaa723c22012-09-18 16:30:11 +0200943}
944
Blue Swirl296af7c2010-03-29 19:23:50 +0000945void qemu_mutex_lock_iothread(void)
946{
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +0200947 if (!tcg_enabled()) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000948 qemu_mutex_lock(&qemu_global_mutex);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300949 } else {
Paolo Bonzini46daff12011-06-09 13:10:24 +0200950 iothread_requesting_mutex = true;
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300951 if (qemu_mutex_trylock(&qemu_global_mutex)) {
Andreas Färber182735e2013-05-29 22:29:20 +0200952 qemu_cpu_kick_thread(first_cpu);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300953 qemu_mutex_lock(&qemu_global_mutex);
954 }
Paolo Bonzini46daff12011-06-09 13:10:24 +0200955 iothread_requesting_mutex = false;
956 qemu_cond_broadcast(&qemu_io_proceeded_cond);
Marcelo Tosatti1a28cac2010-05-04 09:45:20 -0300957 }
Blue Swirl296af7c2010-03-29 19:23:50 +0000958}
959
960void qemu_mutex_unlock_iothread(void)
961{
962 qemu_mutex_unlock(&qemu_global_mutex);
963}
964
965static int all_vcpus_paused(void)
966{
Andreas Färber182735e2013-05-29 22:29:20 +0200967 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000968
Andreas Färber182735e2013-05-29 22:29:20 +0200969 while (cpu) {
970 if (!cpu->stopped) {
Blue Swirl296af7c2010-03-29 19:23:50 +0000971 return 0;
Jan Kiszka0ab07c62011-02-07 12:19:14 +0100972 }
Andreas Färber182735e2013-05-29 22:29:20 +0200973 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000974 }
975
976 return 1;
977}
978
979void pause_all_vcpus(void)
980{
Andreas Färber182735e2013-05-29 22:29:20 +0200981 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000982
Paolo Bonzinia5c57d62011-09-12 14:40:36 +0200983 qemu_clock_enable(vm_clock, false);
Andreas Färber182735e2013-05-29 22:29:20 +0200984 while (cpu) {
985 cpu->stop = true;
986 qemu_cpu_kick(cpu);
987 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +0000988 }
989
Juan Quintelaaa723c22012-09-18 16:30:11 +0200990 if (qemu_in_vcpu_thread()) {
Jan Kiszkad798e972012-02-17 18:31:16 +0100991 cpu_stop_current();
992 if (!kvm_enabled()) {
Andreas Färber182735e2013-05-29 22:29:20 +0200993 cpu = first_cpu;
994 while (cpu) {
995 cpu->stop = false;
996 cpu->stopped = true;
997 cpu = cpu->next_cpu;
Jan Kiszkad798e972012-02-17 18:31:16 +0100998 }
999 return;
1000 }
1001 }
1002
Blue Swirl296af7c2010-03-29 19:23:50 +00001003 while (!all_vcpus_paused()) {
Paolo Bonzinibe7d6c52011-03-12 17:44:02 +01001004 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
Andreas Färber182735e2013-05-29 22:29:20 +02001005 cpu = first_cpu;
1006 while (cpu) {
1007 qemu_cpu_kick(cpu);
1008 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001009 }
1010 }
1011}
1012
Igor Mammedov29936832013-04-23 10:29:37 +02001013void cpu_resume(CPUState *cpu)
1014{
1015 cpu->stop = false;
1016 cpu->stopped = false;
1017 qemu_cpu_kick(cpu);
1018}
1019
Blue Swirl296af7c2010-03-29 19:23:50 +00001020void resume_all_vcpus(void)
1021{
Andreas Färber182735e2013-05-29 22:29:20 +02001022 CPUState *cpu = first_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001023
Wen Congyang47113ab2011-11-04 10:45:58 +08001024 qemu_clock_enable(vm_clock, true);
Andreas Färber182735e2013-05-29 22:29:20 +02001025 while (cpu) {
1026 cpu_resume(cpu);
1027 cpu = cpu->next_cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001028 }
1029}
1030
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001031static void qemu_tcg_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001032{
Blue Swirl296af7c2010-03-29 19:23:50 +00001033 /* share a single thread for all cpus with TCG */
1034 if (!tcg_cpu_thread) {
Andreas Färber814e6122012-05-02 17:00:37 +02001035 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001036 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1037 qemu_cond_init(cpu->halt_cond);
1038 tcg_halt_cond = cpu->halt_cond;
Andreas Färberc3586ba2012-05-03 01:41:24 +02001039 qemu_thread_create(cpu->thread, qemu_tcg_cpu_thread_fn, cpu,
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001040 QEMU_THREAD_JOINABLE);
1041#ifdef _WIN32
Andreas Färber814e6122012-05-02 17:00:37 +02001042 cpu->hThread = qemu_thread_get_handle(cpu->thread);
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001043#endif
Andreas Färber61a46212012-05-02 22:49:36 +02001044 while (!cpu->created) {
Paolo Bonzini18a85722011-03-12 17:44:03 +01001045 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001046 }
Andreas Färber814e6122012-05-02 17:00:37 +02001047 tcg_cpu_thread = cpu->thread;
Blue Swirl296af7c2010-03-29 19:23:50 +00001048 } else {
Andreas Färber814e6122012-05-02 17:00:37 +02001049 cpu->thread = tcg_cpu_thread;
Andreas Färberf5c121b2012-05-03 01:22:49 +02001050 cpu->halt_cond = tcg_halt_cond;
Blue Swirl296af7c2010-03-29 19:23:50 +00001051 }
1052}
1053
Andreas Färber48a106b2013-05-27 02:20:39 +02001054static void qemu_kvm_start_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001055{
Andreas Färber814e6122012-05-02 17:00:37 +02001056 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001057 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1058 qemu_cond_init(cpu->halt_cond);
Andreas Färber48a106b2013-05-27 02:20:39 +02001059 qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu,
Paolo Bonzini1ecf47b2011-12-13 13:43:52 +01001060 QEMU_THREAD_JOINABLE);
Andreas Färber61a46212012-05-02 22:49:36 +02001061 while (!cpu->created) {
Paolo Bonzini18a85722011-03-12 17:44:03 +01001062 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001063 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001064}
1065
Andreas Färber10a90212013-05-27 02:24:35 +02001066static void qemu_dummy_start_vcpu(CPUState *cpu)
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001067{
Andreas Färber814e6122012-05-02 17:00:37 +02001068 cpu->thread = g_malloc0(sizeof(QemuThread));
Andreas Färberf5c121b2012-05-03 01:22:49 +02001069 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1070 qemu_cond_init(cpu->halt_cond);
Andreas Färber10a90212013-05-27 02:24:35 +02001071 qemu_thread_create(cpu->thread, qemu_dummy_cpu_thread_fn, cpu,
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001072 QEMU_THREAD_JOINABLE);
Andreas Färber61a46212012-05-02 22:49:36 +02001073 while (!cpu->created) {
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001074 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
1075 }
1076}
1077
Andreas Färberc643bed2013-05-27 03:23:24 +02001078void qemu_init_vcpu(CPUState *cpu)
Blue Swirl296af7c2010-03-29 19:23:50 +00001079{
Andreas Färberce3960e2012-12-17 03:27:07 +01001080 cpu->nr_cores = smp_cores;
1081 cpu->nr_threads = smp_threads;
Andreas Färberf324e762012-05-02 23:26:21 +02001082 cpu->stopped = true;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001083 if (kvm_enabled()) {
Andreas Färber48a106b2013-05-27 02:20:39 +02001084 qemu_kvm_start_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001085 } else if (tcg_enabled()) {
Andreas Färbere5ab30a2012-05-03 01:50:44 +02001086 qemu_tcg_init_vcpu(cpu);
Anthony Liguoric7f0f3b2012-03-28 15:42:02 +02001087 } else {
Andreas Färber10a90212013-05-27 02:24:35 +02001088 qemu_dummy_start_vcpu(cpu);
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001089 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001090}
1091
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001092void cpu_stop_current(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001093{
Andreas Färber4917cf42013-05-27 05:17:50 +02001094 if (current_cpu) {
1095 current_cpu->stop = false;
1096 current_cpu->stopped = true;
1097 cpu_exit(current_cpu);
Paolo Bonzini67bb1722011-03-12 17:43:59 +01001098 qemu_cond_signal(&qemu_pause_cond);
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001099 }
Blue Swirl296af7c2010-03-29 19:23:50 +00001100}
1101
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001102void vm_stop(RunState state)
Blue Swirl296af7c2010-03-29 19:23:50 +00001103{
Juan Quintelaaa723c22012-09-18 16:30:11 +02001104 if (qemu_in_vcpu_thread()) {
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001105 qemu_system_vmstop_request(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00001106 /*
1107 * FIXME: should not return to device code in case
1108 * vm_stop() has been requested.
1109 */
Jan Kiszkab4a3d962011-02-01 22:15:43 +01001110 cpu_stop_current();
Blue Swirl296af7c2010-03-29 19:23:50 +00001111 return;
1112 }
Luiz Capitulino1dfb4dd2011-07-29 14:26:33 -03001113 do_vm_stop(state);
Blue Swirl296af7c2010-03-29 19:23:50 +00001114}
1115
Luiz Capitulino8a9236f2011-10-14 11:18:09 -03001116/* does a state transition even if the VM is already stopped,
1117 current state is forgotten forever */
1118void vm_stop_force_state(RunState state)
1119{
1120 if (runstate_is_running()) {
1121 vm_stop(state);
1122 } else {
1123 runstate_set(state);
1124 }
1125}
1126
Andreas Färber9349b4f2012-03-14 01:38:32 +01001127static int tcg_cpu_exec(CPUArchState *env)
Blue Swirl296af7c2010-03-29 19:23:50 +00001128{
1129 int ret;
1130#ifdef CONFIG_PROFILER
1131 int64_t ti;
1132#endif
1133
1134#ifdef CONFIG_PROFILER
1135 ti = profile_getclock();
1136#endif
1137 if (use_icount) {
1138 int64_t count;
1139 int decr;
1140 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
1141 env->icount_decr.u16.low = 0;
1142 env->icount_extra = 0;
Paolo Bonzini946fb272011-09-12 13:57:37 +02001143 count = qemu_icount_round(qemu_clock_deadline(vm_clock));
Blue Swirl296af7c2010-03-29 19:23:50 +00001144 qemu_icount += count;
1145 decr = (count > 0xffff) ? 0xffff : count;
1146 count -= decr;
1147 env->icount_decr.u16.low = decr;
1148 env->icount_extra = count;
1149 }
1150 ret = cpu_exec(env);
1151#ifdef CONFIG_PROFILER
1152 qemu_time += profile_getclock() - ti;
1153#endif
1154 if (use_icount) {
1155 /* Fold pending instructions back into the
1156 instruction counter, and clear the interrupt flag. */
1157 qemu_icount -= (env->icount_decr.u16.low
1158 + env->icount_extra);
1159 env->icount_decr.u32 = 0;
1160 env->icount_extra = 0;
1161 }
1162 return ret;
1163}
1164
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001165static void tcg_exec_all(void)
Blue Swirl296af7c2010-03-29 19:23:50 +00001166{
Jan Kiszka9a360852011-02-01 22:15:55 +01001167 int r;
1168
Paolo Bonziniab33fcd2011-04-13 10:03:44 +02001169 /* Account partial waits to the vm_clock. */
1170 qemu_clock_warp(vm_clock);
1171
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001172 if (next_cpu == NULL) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001173 next_cpu = first_cpu;
Jan Kiszka0ab07c62011-02-07 12:19:14 +01001174 }
Jan Kiszkac629a4b2010-06-25 16:56:52 +02001175 for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) {
Andreas Färber182735e2013-05-29 22:29:20 +02001176 CPUState *cpu = next_cpu;
1177 CPUArchState *env = cpu->env_ptr;
Blue Swirl296af7c2010-03-29 19:23:50 +00001178
1179 qemu_clock_enable(vm_clock,
Jan Kiszka345f4422010-06-25 16:56:54 +02001180 (env->singlestep_enabled & SSTEP_NOTIMER) == 0);
Blue Swirl296af7c2010-03-29 19:23:50 +00001181
Andreas Färbera1fcaa72012-05-02 23:42:26 +02001182 if (cpu_can_run(cpu)) {
Jan Kiszkabdb7ca62011-09-26 09:40:39 +02001183 r = tcg_cpu_exec(env);
Jan Kiszka9a360852011-02-01 22:15:55 +01001184 if (r == EXCP_DEBUG) {
Andreas Färber91325042013-05-27 02:07:49 +02001185 cpu_handle_guest_debug(cpu);
Jan Kiszka3c638d02010-06-25 16:56:56 +02001186 break;
1187 }
Andreas Färberf324e762012-05-02 23:26:21 +02001188 } else if (cpu->stop || cpu->stopped) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001189 break;
1190 }
1191 }
Jan Kiszkac629a4b2010-06-25 16:56:52 +02001192 exit_request = 0;
Blue Swirl296af7c2010-03-29 19:23:50 +00001193}
1194
1195void set_numa_modes(void)
1196{
Andreas Färber1b1ed8d2012-12-17 04:22:03 +01001197 CPUState *cpu;
Blue Swirl296af7c2010-03-29 19:23:50 +00001198 int i;
1199
Andreas Färber182735e2013-05-29 22:29:20 +02001200 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Blue Swirl296af7c2010-03-29 19:23:50 +00001201 for (i = 0; i < nb_numa_nodes; i++) {
Andreas Färber55e5c282012-12-17 06:18:02 +01001202 if (test_bit(cpu->cpu_index, node_cpumask[i])) {
Andreas Färber1b1ed8d2012-12-17 04:22:03 +01001203 cpu->numa_node = i;
Blue Swirl296af7c2010-03-29 19:23:50 +00001204 }
1205 }
1206 }
1207}
1208
Stefan Weil9a78eea2010-10-22 23:03:33 +02001209void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
Blue Swirl262353c2010-05-04 19:55:35 +00001210{
1211 /* XXX: implement xxx_cpu_list for targets that still miss it */
Peter Maydelle916cbf2012-09-05 17:41:08 -03001212#if defined(cpu_list)
1213 cpu_list(f, cpu_fprintf);
Blue Swirl262353c2010-05-04 19:55:35 +00001214#endif
1215}
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001216
1217CpuInfoList *qmp_query_cpus(Error **errp)
1218{
1219 CpuInfoList *head = NULL, *cur_item = NULL;
Andreas Färber182735e2013-05-29 22:29:20 +02001220 CPUState *cpu;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001221
Andreas Färber182735e2013-05-29 22:29:20 +02001222 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001223 CpuInfoList *info;
Andreas Färber182735e2013-05-29 22:29:20 +02001224#if defined(TARGET_I386)
1225 X86CPU *x86_cpu = X86_CPU(cpu);
1226 CPUX86State *env = &x86_cpu->env;
1227#elif defined(TARGET_PPC)
1228 PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
1229 CPUPPCState *env = &ppc_cpu->env;
1230#elif defined(TARGET_SPARC)
1231 SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
1232 CPUSPARCState *env = &sparc_cpu->env;
1233#elif defined(TARGET_MIPS)
1234 MIPSCPU *mips_cpu = MIPS_CPU(cpu);
1235 CPUMIPSState *env = &mips_cpu->env;
1236#endif
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001237
Andreas Färbercb446ec2013-05-01 14:24:52 +02001238 cpu_synchronize_state(cpu);
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001239
1240 info = g_malloc0(sizeof(*info));
1241 info->value = g_malloc0(sizeof(*info->value));
Andreas Färber55e5c282012-12-17 06:18:02 +01001242 info->value->CPU = cpu->cpu_index;
Andreas Färber182735e2013-05-29 22:29:20 +02001243 info->value->current = (cpu == first_cpu);
Andreas Färber259186a2013-01-17 18:51:17 +01001244 info->value->halted = cpu->halted;
Andreas Färber9f09e182012-05-03 06:59:07 +02001245 info->value->thread_id = cpu->thread_id;
Luiz Capitulinode0b36b2011-09-21 16:38:35 -03001246#if defined(TARGET_I386)
1247 info->value->has_pc = true;
1248 info->value->pc = env->eip + env->segs[R_CS].base;
1249#elif defined(TARGET_PPC)
1250 info->value->has_nip = true;
1251 info->value->nip = env->nip;
1252#elif defined(TARGET_SPARC)
1253 info->value->has_pc = true;
1254 info->value->pc = env->pc;
1255 info->value->has_npc = true;
1256 info->value->npc = env->npc;
1257#elif defined(TARGET_MIPS)
1258 info->value->has_PC = true;
1259 info->value->PC = env->active_tc.PC;
1260#endif
1261
1262 /* XXX: waiting for the qapi to support GSList */
1263 if (!cur_item) {
1264 head = cur_item = info;
1265 } else {
1266 cur_item->next = info;
1267 cur_item = info;
1268 }
1269 }
1270
1271 return head;
1272}
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001273
1274void qmp_memsave(int64_t addr, int64_t size, const char *filename,
1275 bool has_cpu, int64_t cpu_index, Error **errp)
1276{
1277 FILE *f;
1278 uint32_t l;
Andreas Färber9349b4f2012-03-14 01:38:32 +01001279 CPUArchState *env;
Andreas Färber55e5c282012-12-17 06:18:02 +01001280 CPUState *cpu;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001281 uint8_t buf[1024];
1282
1283 if (!has_cpu) {
1284 cpu_index = 0;
1285 }
1286
Andreas Färber151d1322013-02-15 15:41:49 +01001287 cpu = qemu_get_cpu(cpu_index);
1288 if (cpu == NULL) {
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001289 error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
1290 "a CPU number");
1291 return;
1292 }
Andreas Färber151d1322013-02-15 15:41:49 +01001293 env = cpu->env_ptr;
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001294
1295 f = fopen(filename, "wb");
1296 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04001297 error_setg_file_open(errp, errno, filename);
Luiz Capitulino0cfd6a92011-11-22 16:32:37 -02001298 return;
1299 }
1300
1301 while (size != 0) {
1302 l = sizeof(buf);
1303 if (l > size)
1304 l = size;
1305 cpu_memory_rw_debug(env, addr, buf, l, 0);
1306 if (fwrite(buf, 1, l, f) != l) {
1307 error_set(errp, QERR_IO_ERROR);
1308 goto exit;
1309 }
1310 addr += l;
1311 size -= l;
1312 }
1313
1314exit:
1315 fclose(f);
1316}
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02001317
1318void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
1319 Error **errp)
1320{
1321 FILE *f;
1322 uint32_t l;
1323 uint8_t buf[1024];
1324
1325 f = fopen(filename, "wb");
1326 if (!f) {
Luiz Capitulino618da852013-06-07 14:35:06 -04001327 error_setg_file_open(errp, errno, filename);
Luiz Capitulino6d3962b2011-11-22 17:26:46 -02001328 return;
1329 }
1330
1331 while (size != 0) {
1332 l = sizeof(buf);
1333 if (l > size)
1334 l = size;
1335 cpu_physical_memory_rw(addr, buf, l, 0);
1336 if (fwrite(buf, 1, l, f) != l) {
1337 error_set(errp, QERR_IO_ERROR);
1338 goto exit;
1339 }
1340 addr += l;
1341 size -= l;
1342 }
1343
1344exit:
1345 fclose(f);
1346}
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001347
1348void qmp_inject_nmi(Error **errp)
1349{
1350#if defined(TARGET_I386)
Andreas Färber182735e2013-05-29 22:29:20 +02001351 CPUState *cs;
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001352
Andreas Färber182735e2013-05-29 22:29:20 +02001353 for (cs = first_cpu; cs != NULL; cs = cs->next_cpu) {
1354 X86CPU *cpu = X86_CPU(cs);
1355 CPUX86State *env = &cpu->env;
1356
Jan Kiszka02c09192011-10-18 00:00:06 +08001357 if (!env->apic_state) {
Andreas Färber182735e2013-05-29 22:29:20 +02001358 cpu_interrupt(cs, CPU_INTERRUPT_NMI);
Jan Kiszka02c09192011-10-18 00:00:06 +08001359 } else {
1360 apic_deliver_nmi(env->apic_state);
1361 }
Luiz Capitulinoab49ab52011-11-23 12:55:53 -02001362 }
1363#else
1364 error_set(errp, QERR_UNSUPPORTED);
1365#endif
1366}