1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "qemu/osdep.h"
26#include "qemu-common.h"
27#include "qemu/config-file.h"
28#include "migration/vmstate.h"
29#include "monitor/monitor.h"
30#include "qapi/error.h"
31#include "qapi/qapi-commands-misc.h"
32#include "qapi/qapi-events-run-state.h"
33#include "qapi/qmp/qerror.h"
34#include "qemu/error-report.h"
35#include "qemu/qemu-print.h"
36#include "sysemu/tcg.h"
37#include "sysemu/block-backend.h"
38#include "exec/gdbstub.h"
39#include "sysemu/dma.h"
40#include "sysemu/hw_accel.h"
41#include "sysemu/kvm.h"
42#include "sysemu/hax.h"
43#include "sysemu/hvf.h"
44#include "sysemu/whpx.h"
45#include "exec/exec-all.h"
46
47#include "qemu/thread.h"
48#include "qemu/plugin.h"
49#include "sysemu/cpus.h"
50#include "sysemu/qtest.h"
51#include "qemu/main-loop.h"
52#include "qemu/option.h"
53#include "qemu/bitmap.h"
54#include "qemu/seqlock.h"
55#include "qemu/guest-random.h"
56#include "tcg/tcg.h"
57#include "hw/nmi.h"
58#include "sysemu/replay.h"
59#include "sysemu/runstate.h"
60#include "hw/boards.h"
61#include "hw/hw.h"
62
63#ifdef CONFIG_LINUX
64
65#include <sys/prctl.h>
66
67#ifndef PR_MCE_KILL
68#define PR_MCE_KILL 33
69#endif
70
71#ifndef PR_MCE_KILL_SET
72#define PR_MCE_KILL_SET 1
73#endif
74
75#ifndef PR_MCE_KILL_EARLY
76#define PR_MCE_KILL_EARLY 1
77#endif
78
79#endif
80
81static QemuMutex qemu_global_mutex;
82
83int64_t max_delay;
84int64_t max_advance;
85
86
87static QEMUTimer *throttle_timer;
88static unsigned int throttle_percentage;
89
90#define CPU_THROTTLE_PCT_MIN 1
91#define CPU_THROTTLE_PCT_MAX 99
92#define CPU_THROTTLE_TIMESLICE_NS 10000000
93
94bool cpu_is_stopped(CPUState *cpu)
95{
96 return cpu->stopped || !runstate_is_running();
97}
98
99static bool cpu_thread_is_idle(CPUState *cpu)
100{
101 if (cpu->stop || cpu->queued_work_first) {
102 return false;
103 }
104 if (cpu_is_stopped(cpu)) {
105 return true;
106 }
107 if (!cpu->halted || cpu_has_work(cpu) ||
108 kvm_halt_in_kernel()) {
109 return false;
110 }
111 return true;
112}
113
114static bool all_cpu_threads_idle(void)
115{
116 CPUState *cpu;
117
118 CPU_FOREACH(cpu) {
119 if (!cpu_thread_is_idle(cpu)) {
120 return false;
121 }
122 }
123 return true;
124}
125
126
127
128
129
130
131static bool icount_sleep = true;
132
133#define MAX_ICOUNT_SHIFT 10
134
135typedef struct TimersState {
136
137 int64_t cpu_ticks_prev;
138 int64_t cpu_ticks_offset;
139
140
141
142
143 QemuSeqLock vm_clock_seqlock;
144 QemuSpin vm_clock_lock;
145
146 int16_t cpu_ticks_enabled;
147
148
149 int16_t icount_time_shift;
150
151
152 int64_t qemu_icount_bias;
153
154 int64_t vm_clock_warp_start;
155 int64_t cpu_clock_offset;
156
157
158 int64_t qemu_icount;
159
160
161 QEMUTimer *icount_rt_timer;
162 QEMUTimer *icount_vm_timer;
163 QEMUTimer *icount_warp_timer;
164} TimersState;
165
166static TimersState timers_state;
167bool mttcg_enabled;
168
169
170
171
172
173
174static int64_t cpu_get_icount_executed(CPUState *cpu)
175{
176 return (cpu->icount_budget -
177 (cpu_neg(cpu)->icount_decr.u16.low + cpu->icount_extra));
178}
179
180
181
182
183
184
185static void cpu_update_icount_locked(CPUState *cpu)
186{
187 int64_t executed = cpu_get_icount_executed(cpu);
188 cpu->icount_budget -= executed;
189
190 atomic_set_i64(&timers_state.qemu_icount,
191 timers_state.qemu_icount + executed);
192}
193
194
195
196
197
198
199void cpu_update_icount(CPUState *cpu)
200{
201 seqlock_write_lock(&timers_state.vm_clock_seqlock,
202 &timers_state.vm_clock_lock);
203 cpu_update_icount_locked(cpu);
204 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
205 &timers_state.vm_clock_lock);
206}
207
208static int64_t cpu_get_icount_raw_locked(void)
209{
210 CPUState *cpu = current_cpu;
211
212 if (cpu && cpu->running) {
213 if (!cpu->can_do_io) {
214 error_report("Bad icount read");
215 exit(1);
216 }
217
218 cpu_update_icount_locked(cpu);
219 }
220
221 return atomic_read_i64(&timers_state.qemu_icount);
222}
223
224static int64_t cpu_get_icount_locked(void)
225{
226 int64_t icount = cpu_get_icount_raw_locked();
227 return atomic_read_i64(&timers_state.qemu_icount_bias) +
228 cpu_icount_to_ns(icount);
229}
230
231int64_t cpu_get_icount_raw(void)
232{
233 int64_t icount;
234 unsigned start;
235
236 do {
237 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
238 icount = cpu_get_icount_raw_locked();
239 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
240
241 return icount;
242}
243
244
245int64_t cpu_get_icount(void)
246{
247 int64_t icount;
248 unsigned start;
249
250 do {
251 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
252 icount = cpu_get_icount_locked();
253 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
254
255 return icount;
256}
257
258int64_t cpu_icount_to_ns(int64_t icount)
259{
260 return icount << atomic_read(&timers_state.icount_time_shift);
261}
262
263static int64_t cpu_get_ticks_locked(void)
264{
265 int64_t ticks = timers_state.cpu_ticks_offset;
266 if (timers_state.cpu_ticks_enabled) {
267 ticks += cpu_get_host_ticks();
268 }
269
270 if (timers_state.cpu_ticks_prev > ticks) {
271
272 timers_state.cpu_ticks_offset += timers_state.cpu_ticks_prev - ticks;
273 ticks = timers_state.cpu_ticks_prev;
274 }
275
276 timers_state.cpu_ticks_prev = ticks;
277 return ticks;
278}
279
280
281
282
283
284int64_t cpu_get_ticks(void)
285{
286 int64_t ticks;
287
288 if (use_icount) {
289 return cpu_get_icount();
290 }
291
292 qemu_spin_lock(&timers_state.vm_clock_lock);
293 ticks = cpu_get_ticks_locked();
294 qemu_spin_unlock(&timers_state.vm_clock_lock);
295 return ticks;
296}
297
298static int64_t cpu_get_clock_locked(void)
299{
300 int64_t time;
301
302 time = timers_state.cpu_clock_offset;
303 if (timers_state.cpu_ticks_enabled) {
304 time += get_clock();
305 }
306
307 return time;
308}
309
310
311
312
313int64_t cpu_get_clock(void)
314{
315 int64_t ti;
316 unsigned start;
317
318 do {
319 start = seqlock_read_begin(&timers_state.vm_clock_seqlock);
320 ti = cpu_get_clock_locked();
321 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start));
322
323 return ti;
324}
325
326
327
328
329void cpu_enable_ticks(void)
330{
331 seqlock_write_lock(&timers_state.vm_clock_seqlock,
332 &timers_state.vm_clock_lock);
333 if (!timers_state.cpu_ticks_enabled) {
334 timers_state.cpu_ticks_offset -= cpu_get_host_ticks();
335 timers_state.cpu_clock_offset -= get_clock();
336 timers_state.cpu_ticks_enabled = 1;
337 }
338 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
339 &timers_state.vm_clock_lock);
340}
341
342
343
344
345
346void cpu_disable_ticks(void)
347{
348 seqlock_write_lock(&timers_state.vm_clock_seqlock,
349 &timers_state.vm_clock_lock);
350 if (timers_state.cpu_ticks_enabled) {
351 timers_state.cpu_ticks_offset += cpu_get_host_ticks();
352 timers_state.cpu_clock_offset = cpu_get_clock_locked();
353 timers_state.cpu_ticks_enabled = 0;
354 }
355 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
356 &timers_state.vm_clock_lock);
357}
358
359
360
361
362
363#define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10)
364
365static void icount_adjust(void)
366{
367 int64_t cur_time;
368 int64_t cur_icount;
369 int64_t delta;
370
371
372 static int64_t last_delta;
373
374
375 if (!runstate_is_running()) {
376 return;
377 }
378
379 seqlock_write_lock(&timers_state.vm_clock_seqlock,
380 &timers_state.vm_clock_lock);
381 cur_time = cpu_get_clock_locked();
382 cur_icount = cpu_get_icount_locked();
383
384 delta = cur_icount - cur_time;
385
386 if (delta > 0
387 && last_delta + ICOUNT_WOBBLE < delta * 2
388 && timers_state.icount_time_shift > 0) {
389
390 atomic_set(&timers_state.icount_time_shift,
391 timers_state.icount_time_shift - 1);
392 }
393 if (delta < 0
394 && last_delta - ICOUNT_WOBBLE > delta * 2
395 && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
396
397 atomic_set(&timers_state.icount_time_shift,
398 timers_state.icount_time_shift + 1);
399 }
400 last_delta = delta;
401 atomic_set_i64(&timers_state.qemu_icount_bias,
402 cur_icount - (timers_state.qemu_icount
403 << timers_state.icount_time_shift));
404 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
405 &timers_state.vm_clock_lock);
406}
407
408static void icount_adjust_rt(void *opaque)
409{
410 timer_mod(timers_state.icount_rt_timer,
411 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
412 icount_adjust();
413}
414
415static void icount_adjust_vm(void *opaque)
416{
417 timer_mod(timers_state.icount_vm_timer,
418 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
419 NANOSECONDS_PER_SECOND / 10);
420 icount_adjust();
421}
422
423static int64_t qemu_icount_round(int64_t count)
424{
425 int shift = atomic_read(&timers_state.icount_time_shift);
426 return (count + (1 << shift) - 1) >> shift;
427}
428
429static void icount_warp_rt(void)
430{
431 unsigned seq;
432 int64_t warp_start;
433
434
435
436
437 do {
438 seq = seqlock_read_begin(&timers_state.vm_clock_seqlock);
439 warp_start = timers_state.vm_clock_warp_start;
440 } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq));
441
442 if (warp_start == -1) {
443 return;
444 }
445
446 seqlock_write_lock(&timers_state.vm_clock_seqlock,
447 &timers_state.vm_clock_lock);
448 if (runstate_is_running()) {
449 int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT,
450 cpu_get_clock_locked());
451 int64_t warp_delta;
452
453 warp_delta = clock - timers_state.vm_clock_warp_start;
454 if (use_icount == 2) {
455
456
457
458
459 int64_t cur_icount = cpu_get_icount_locked();
460 int64_t delta = clock - cur_icount;
461 warp_delta = MIN(warp_delta, delta);
462 }
463 atomic_set_i64(&timers_state.qemu_icount_bias,
464 timers_state.qemu_icount_bias + warp_delta);
465 }
466 timers_state.vm_clock_warp_start = -1;
467 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
468 &timers_state.vm_clock_lock);
469
470 if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) {
471 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
472 }
473}
474
475static void icount_timer_cb(void *opaque)
476{
477
478
479
480 icount_warp_rt();
481}
482
483void qtest_clock_warp(int64_t dest)
484{
485 int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
486 AioContext *aio_context;
487 assert(qtest_enabled());
488 aio_context = qemu_get_aio_context();
489 while (clock < dest) {
490 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
491 QEMU_TIMER_ATTR_ALL);
492 int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
493
494 seqlock_write_lock(&timers_state.vm_clock_seqlock,
495 &timers_state.vm_clock_lock);
496 atomic_set_i64(&timers_state.qemu_icount_bias,
497 timers_state.qemu_icount_bias + warp);
498 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
499 &timers_state.vm_clock_lock);
500
501 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
502 timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
503 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
504 }
505 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
506}
507
508void qemu_start_warp_timer(void)
509{
510 int64_t clock;
511 int64_t deadline;
512
513 if (!use_icount) {
514 return;
515 }
516
517
518
519
520 if (!runstate_is_running()) {
521 return;
522 }
523
524 if (replay_mode != REPLAY_MODE_PLAY) {
525 if (!all_cpu_threads_idle()) {
526 return;
527 }
528
529 if (qtest_enabled()) {
530
531 return;
532 }
533
534 replay_checkpoint(CHECKPOINT_CLOCK_WARP_START);
535 } else {
536
537 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) {
538
539
540
541
542 if (replay_has_checkpoint()) {
543 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
544 }
545 return;
546 }
547 }
548
549
550 clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT);
551 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
552 ~QEMU_TIMER_ATTR_EXTERNAL);
553 if (deadline < 0) {
554 static bool notified;
555 if (!icount_sleep && !notified) {
556 warn_report("icount sleep disabled and no active timers");
557 notified = true;
558 }
559 return;
560 }
561
562 if (deadline > 0) {
563
564
565
566
567
568
569
570 if (!icount_sleep) {
571
572
573
574
575
576
577
578 seqlock_write_lock(&timers_state.vm_clock_seqlock,
579 &timers_state.vm_clock_lock);
580 atomic_set_i64(&timers_state.qemu_icount_bias,
581 timers_state.qemu_icount_bias + deadline);
582 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
583 &timers_state.vm_clock_lock);
584 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
585 } else {
586
587
588
589
590
591
592
593
594 seqlock_write_lock(&timers_state.vm_clock_seqlock,
595 &timers_state.vm_clock_lock);
596 if (timers_state.vm_clock_warp_start == -1
597 || timers_state.vm_clock_warp_start > clock) {
598 timers_state.vm_clock_warp_start = clock;
599 }
600 seqlock_write_unlock(&timers_state.vm_clock_seqlock,
601 &timers_state.vm_clock_lock);
602 timer_mod_anticipate(timers_state.icount_warp_timer,
603 clock + deadline);
604 }
605 } else if (deadline == 0) {
606 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
607 }
608}
609
610static void qemu_account_warp_timer(void)
611{
612 if (!use_icount || !icount_sleep) {
613 return;
614 }
615
616
617
618
619 if (!runstate_is_running()) {
620 return;
621 }
622
623
624 if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) {
625 return;
626 }
627
628 timer_del(timers_state.icount_warp_timer);
629 icount_warp_rt();
630}
631
632static bool icount_state_needed(void *opaque)
633{
634 return use_icount;
635}
636
637static bool warp_timer_state_needed(void *opaque)
638{
639 TimersState *s = opaque;
640 return s->icount_warp_timer != NULL;
641}
642
643static bool adjust_timers_state_needed(void *opaque)
644{
645 TimersState *s = opaque;
646 return s->icount_rt_timer != NULL;
647}
648
649
650
651
652static const VMStateDescription icount_vmstate_warp_timer = {
653 .name = "timer/icount/warp_timer",
654 .version_id = 1,
655 .minimum_version_id = 1,
656 .needed = warp_timer_state_needed,
657 .fields = (VMStateField[]) {
658 VMSTATE_INT64(vm_clock_warp_start, TimersState),
659 VMSTATE_TIMER_PTR(icount_warp_timer, TimersState),
660 VMSTATE_END_OF_LIST()
661 }
662};
663
664static const VMStateDescription icount_vmstate_adjust_timers = {
665 .name = "timer/icount/timers",
666 .version_id = 1,
667 .minimum_version_id = 1,
668 .needed = adjust_timers_state_needed,
669 .fields = (VMStateField[]) {
670 VMSTATE_TIMER_PTR(icount_rt_timer, TimersState),
671 VMSTATE_TIMER_PTR(icount_vm_timer, TimersState),
672 VMSTATE_END_OF_LIST()
673 }
674};
675
676
677
678
679static const VMStateDescription icount_vmstate_timers = {
680 .name = "timer/icount",
681 .version_id = 1,
682 .minimum_version_id = 1,
683 .needed = icount_state_needed,
684 .fields = (VMStateField[]) {
685 VMSTATE_INT64(qemu_icount_bias, TimersState),
686 VMSTATE_INT64(qemu_icount, TimersState),
687 VMSTATE_END_OF_LIST()
688 },
689 .subsections = (const VMStateDescription*[]) {
690 &icount_vmstate_warp_timer,
691 &icount_vmstate_adjust_timers,
692 NULL
693 }
694};
695
696static const VMStateDescription vmstate_timers = {
697 .name = "timer",
698 .version_id = 2,
699 .minimum_version_id = 1,
700 .fields = (VMStateField[]) {
701 VMSTATE_INT64(cpu_ticks_offset, TimersState),
702 VMSTATE_UNUSED(8),
703 VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2),
704 VMSTATE_END_OF_LIST()
705 },
706 .subsections = (const VMStateDescription*[]) {
707 &icount_vmstate_timers,
708 NULL
709 }
710};
711
712static void cpu_throttle_thread(CPUState *cpu, run_on_cpu_data opaque)
713{
714 double pct;
715 double throttle_ratio;
716 int64_t sleeptime_ns, endtime_ns;
717
718 if (!cpu_throttle_get_percentage()) {
719 return;
720 }
721
722 pct = (double)cpu_throttle_get_percentage()/100;
723 throttle_ratio = pct / (1 - pct);
724
725 sleeptime_ns = (int64_t)(throttle_ratio * CPU_THROTTLE_TIMESLICE_NS + 1);
726 endtime_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + sleeptime_ns;
727 while (sleeptime_ns > 0 && !cpu->stop) {
728 if (sleeptime_ns > SCALE_MS) {
729 qemu_cond_timedwait(cpu->halt_cond, &qemu_global_mutex,
730 sleeptime_ns / SCALE_MS);
731 } else {
732 qemu_mutex_unlock_iothread();
733 g_usleep(sleeptime_ns / SCALE_US);
734 qemu_mutex_lock_iothread();
735 }
736 sleeptime_ns = endtime_ns - qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
737 }
738 atomic_set(&cpu->throttle_thread_scheduled, 0);
739}
740
741static void cpu_throttle_timer_tick(void *opaque)
742{
743 CPUState *cpu;
744 double pct;
745
746
747 if (!cpu_throttle_get_percentage()) {
748 return;
749 }
750 CPU_FOREACH(cpu) {
751 if (!atomic_xchg(&cpu->throttle_thread_scheduled, 1)) {
752 async_run_on_cpu(cpu, cpu_throttle_thread,
753 RUN_ON_CPU_NULL);
754 }
755 }
756
757 pct = (double)cpu_throttle_get_percentage()/100;
758 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
759 CPU_THROTTLE_TIMESLICE_NS / (1-pct));
760}
761
762void cpu_throttle_set(int new_throttle_pct)
763{
764
765 new_throttle_pct = MIN(new_throttle_pct, CPU_THROTTLE_PCT_MAX);
766 new_throttle_pct = MAX(new_throttle_pct, CPU_THROTTLE_PCT_MIN);
767
768 atomic_set(&throttle_percentage, new_throttle_pct);
769
770 timer_mod(throttle_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT) +
771 CPU_THROTTLE_TIMESLICE_NS);
772}
773
774void cpu_throttle_stop(void)
775{
776 atomic_set(&throttle_percentage, 0);
777}
778
779bool cpu_throttle_active(void)
780{
781 return (cpu_throttle_get_percentage() != 0);
782}
783
784int cpu_throttle_get_percentage(void)
785{
786 return atomic_read(&throttle_percentage);
787}
788
789void cpu_ticks_init(void)
790{
791 seqlock_init(&timers_state.vm_clock_seqlock);
792 qemu_spin_init(&timers_state.vm_clock_lock);
793 vmstate_register(NULL, 0, &vmstate_timers, &timers_state);
794 throttle_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
795 cpu_throttle_timer_tick, NULL);
796}
797
798void configure_icount(QemuOpts *opts, Error **errp)
799{
800 const char *option;
801 char *rem_str = NULL;
802
803 option = qemu_opt_get(opts, "shift");
804 if (!option) {
805 if (qemu_opt_get(opts, "align") != NULL) {
806 error_setg(errp, "Please specify shift option when using align");
807 }
808 return;
809 }
810
811 icount_sleep = qemu_opt_get_bool(opts, "sleep", true);
812 if (icount_sleep) {
813 timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT,
814 icount_timer_cb, NULL);
815 }
816
817 icount_align_option = qemu_opt_get_bool(opts, "align", false);
818
819 if (icount_align_option && !icount_sleep) {
820 error_setg(errp, "align=on and sleep=off are incompatible");
821 }
822 if (strcmp(option, "auto") != 0) {
823 errno = 0;
824 timers_state.icount_time_shift = strtol(option, &rem_str, 0);
825 if (errno != 0 || *rem_str != '\0' || !strlen(option)) {
826 error_setg(errp, "icount: Invalid shift value");
827 }
828 use_icount = 1;
829 return;
830 } else if (icount_align_option) {
831 error_setg(errp, "shift=auto and align=on are incompatible");
832 } else if (!icount_sleep) {
833 error_setg(errp, "shift=auto and sleep=off are incompatible");
834 }
835
836 use_icount = 2;
837
838
839
840 timers_state.icount_time_shift = 3;
841
842
843
844
845
846
847 timers_state.vm_clock_warp_start = -1;
848 timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT,
849 icount_adjust_rt, NULL);
850 timer_mod(timers_state.icount_rt_timer,
851 qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000);
852 timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
853 icount_adjust_vm, NULL);
854 timer_mod(timers_state.icount_vm_timer,
855 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
856 NANOSECONDS_PER_SECOND / 10);
857}
858
859
860
861
862
863
864
865
866
867
868
869
870
871static QEMUTimer *tcg_kick_vcpu_timer;
872static CPUState *tcg_current_rr_cpu;
873
874#define TCG_KICK_PERIOD (NANOSECONDS_PER_SECOND / 10)
875
876static inline int64_t qemu_tcg_next_kick(void)
877{
878 return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
879}
880
881
882static void qemu_cpu_kick_rr_next_cpu(void)
883{
884 CPUState *cpu;
885 do {
886 cpu = atomic_mb_read(&tcg_current_rr_cpu);
887 if (cpu) {
888 cpu_exit(cpu);
889 }
890 } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
891}
892
893
894static void qemu_cpu_kick_rr_cpus(void)
895{
896 CPUState *cpu;
897
898 CPU_FOREACH(cpu) {
899 cpu_exit(cpu);
900 };
901}
902
903static void do_nothing(CPUState *cpu, run_on_cpu_data unused)
904{
905}
906
907void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
908{
909 if (!use_icount || type != QEMU_CLOCK_VIRTUAL) {
910 qemu_notify_event();
911 return;
912 }
913
914 if (qemu_in_vcpu_thread()) {
915
916
917
918
919 qemu_cpu_kick(current_cpu);
920 } else if (first_cpu) {
921
922
923
924
925
926
927
928 async_run_on_cpu(first_cpu, do_nothing, RUN_ON_CPU_NULL);
929 }
930}
931
932static void kick_tcg_thread(void *opaque)
933{
934 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
935 qemu_cpu_kick_rr_next_cpu();
936}
937
938static void start_tcg_kick_timer(void)
939{
940 assert(!mttcg_enabled);
941 if (!tcg_kick_vcpu_timer && CPU_NEXT(first_cpu)) {
942 tcg_kick_vcpu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
943 kick_tcg_thread, NULL);
944 }
945 if (tcg_kick_vcpu_timer && !timer_pending(tcg_kick_vcpu_timer)) {
946 timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
947 }
948}
949
950static void stop_tcg_kick_timer(void)
951{
952 assert(!mttcg_enabled);
953 if (tcg_kick_vcpu_timer && timer_pending(tcg_kick_vcpu_timer)) {
954 timer_del(tcg_kick_vcpu_timer);
955 }
956}
957
958
959void hw_error(const char *fmt, ...)
960{
961 va_list ap;
962 CPUState *cpu;
963
964 va_start(ap, fmt);
965 fprintf(stderr, "qemu: hardware error: ");
966 vfprintf(stderr, fmt, ap);
967 fprintf(stderr, "\n");
968 CPU_FOREACH(cpu) {
969 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index);
970 cpu_dump_state(cpu, stderr, CPU_DUMP_FPU);
971 }
972 va_end(ap);
973 abort();
974}
975
976void cpu_synchronize_all_states(void)
977{
978 CPUState *cpu;
979
980 CPU_FOREACH(cpu) {
981 cpu_synchronize_state(cpu);
982
983 if (hvf_enabled()) {
984 hvf_cpu_synchronize_state(cpu);
985 }
986 }
987}
988
989void cpu_synchronize_all_post_reset(void)
990{
991 CPUState *cpu;
992
993 CPU_FOREACH(cpu) {
994 cpu_synchronize_post_reset(cpu);
995
996 if (hvf_enabled()) {
997 hvf_cpu_synchronize_post_reset(cpu);
998 }
999 }
1000}
1001
1002void cpu_synchronize_all_post_init(void)
1003{
1004 CPUState *cpu;
1005
1006 CPU_FOREACH(cpu) {
1007 cpu_synchronize_post_init(cpu);
1008
1009 if (hvf_enabled()) {
1010 hvf_cpu_synchronize_post_init(cpu);
1011 }
1012 }
1013}
1014
1015void cpu_synchronize_all_pre_loadvm(void)
1016{
1017 CPUState *cpu;
1018
1019 CPU_FOREACH(cpu) {
1020 cpu_synchronize_pre_loadvm(cpu);
1021 }
1022}
1023
1024static int do_vm_stop(RunState state, bool send_stop)
1025{
1026 int ret = 0;
1027
1028 if (runstate_is_running()) {
1029 runstate_set(state);
1030 cpu_disable_ticks();
1031 pause_all_vcpus();
1032 vm_state_notify(0, state);
1033 if (send_stop) {
1034 qapi_event_send_stop();
1035 }
1036 }
1037
1038 bdrv_drain_all();
1039 ret = bdrv_flush_all();
1040
1041 return ret;
1042}
1043
1044
1045
1046
1047int vm_shutdown(void)
1048{
1049 return do_vm_stop(RUN_STATE_SHUTDOWN, false);
1050}
1051
1052static bool cpu_can_run(CPUState *cpu)
1053{
1054 if (cpu->stop) {
1055 return false;
1056 }
1057 if (cpu_is_stopped(cpu)) {
1058 return false;
1059 }
1060 return true;
1061}
1062
1063static void cpu_handle_guest_debug(CPUState *cpu)
1064{
1065 gdb_set_stop_cpu(cpu);
1066 qemu_system_debug_request();
1067 cpu->stopped = true;
1068}
1069
1070#ifdef CONFIG_LINUX
1071static void sigbus_reraise(void)
1072{
1073 sigset_t set;
1074 struct sigaction action;
1075
1076 memset(&action, 0, sizeof(action));
1077 action.sa_handler = SIG_DFL;
1078 if (!sigaction(SIGBUS, &action, NULL)) {
1079 raise(SIGBUS);
1080 sigemptyset(&set);
1081 sigaddset(&set, SIGBUS);
1082 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
1083 }
1084 perror("Failed to re-raise SIGBUS!\n");
1085 abort();
1086}
1087
1088static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx)
1089{
1090 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) {
1091 sigbus_reraise();
1092 }
1093
1094 if (current_cpu) {
1095
1096 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) {
1097 sigbus_reraise();
1098 }
1099 } else {
1100
1101 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) {
1102 sigbus_reraise();
1103 }
1104 }
1105}
1106
1107static void qemu_init_sigbus(void)
1108{
1109 struct sigaction action;
1110
1111 memset(&action, 0, sizeof(action));
1112 action.sa_flags = SA_SIGINFO;
1113 action.sa_sigaction = sigbus_handler;
1114 sigaction(SIGBUS, &action, NULL);
1115
1116 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
1117}
1118#else
1119static void qemu_init_sigbus(void)
1120{
1121}
1122#endif
1123
1124static QemuThread io_thread;
1125
1126
1127static QemuCond qemu_cpu_cond;
1128
1129static QemuCond qemu_pause_cond;
1130
1131void qemu_init_cpu_loop(void)
1132{
1133 qemu_init_sigbus();
1134 qemu_cond_init(&qemu_cpu_cond);
1135 qemu_cond_init(&qemu_pause_cond);
1136 qemu_mutex_init(&qemu_global_mutex);
1137
1138 qemu_thread_get_self(&io_thread);
1139}
1140
1141void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data)
1142{
1143 do_run_on_cpu(cpu, func, data, &qemu_global_mutex);
1144}
1145
1146static void qemu_kvm_destroy_vcpu(CPUState *cpu)
1147{
1148 if (kvm_destroy_vcpu(cpu) < 0) {
1149 error_report("kvm_destroy_vcpu failed");
1150 exit(EXIT_FAILURE);
1151 }
1152}
1153
1154static void qemu_tcg_destroy_vcpu(CPUState *cpu)
1155{
1156}
1157
1158static void qemu_cpu_stop(CPUState *cpu, bool exit)
1159{
1160 g_assert(qemu_cpu_is_self(cpu));
1161 cpu->stop = false;
1162 cpu->stopped = true;
1163 if (exit) {
1164 cpu_exit(cpu);
1165 }
1166 qemu_cond_broadcast(&qemu_pause_cond);
1167}
1168
1169static void qemu_wait_io_event_common(CPUState *cpu)
1170{
1171 atomic_mb_set(&cpu->thread_kicked, false);
1172 if (cpu->stop) {
1173 qemu_cpu_stop(cpu, false);
1174 }
1175 process_queued_cpu_work(cpu);
1176}
1177
1178static void qemu_tcg_rr_wait_io_event(void)
1179{
1180 CPUState *cpu;
1181
1182 while (all_cpu_threads_idle()) {
1183 stop_tcg_kick_timer();
1184 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
1185 }
1186
1187 start_tcg_kick_timer();
1188
1189 CPU_FOREACH(cpu) {
1190 qemu_wait_io_event_common(cpu);
1191 }
1192}
1193
1194static void qemu_wait_io_event(CPUState *cpu)
1195{
1196 bool slept = false;
1197
1198 while (cpu_thread_is_idle(cpu)) {
1199 if (!slept) {
1200 slept = true;
1201 qemu_plugin_vcpu_idle_cb(cpu);
1202 }
1203 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1204 }
1205 if (slept) {
1206 qemu_plugin_vcpu_resume_cb(cpu);
1207 }
1208
1209#ifdef _WIN32
1210
1211 if (!tcg_enabled()) {
1212 SleepEx(0, TRUE);
1213 }
1214#endif
1215 qemu_wait_io_event_common(cpu);
1216}
1217
1218static void *qemu_kvm_cpu_thread_fn(void *arg)
1219{
1220 CPUState *cpu = arg;
1221 int r;
1222
1223 rcu_register_thread();
1224
1225 qemu_mutex_lock_iothread();
1226 qemu_thread_get_self(cpu->thread);
1227 cpu->thread_id = qemu_get_thread_id();
1228 cpu->can_do_io = 1;
1229 current_cpu = cpu;
1230
1231 r = kvm_init_vcpu(cpu);
1232 if (r < 0) {
1233 error_report("kvm_init_vcpu failed: %s", strerror(-r));
1234 exit(1);
1235 }
1236
1237 kvm_init_cpu_signals(cpu);
1238
1239
1240 cpu->created = true;
1241 qemu_cond_signal(&qemu_cpu_cond);
1242 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1243
1244 do {
1245 if (cpu_can_run(cpu)) {
1246 r = kvm_cpu_exec(cpu);
1247 if (r == EXCP_DEBUG) {
1248 cpu_handle_guest_debug(cpu);
1249 }
1250 }
1251 qemu_wait_io_event(cpu);
1252 } while (!cpu->unplug || cpu_can_run(cpu));
1253
1254 qemu_kvm_destroy_vcpu(cpu);
1255 cpu->created = false;
1256 qemu_cond_signal(&qemu_cpu_cond);
1257 qemu_mutex_unlock_iothread();
1258 rcu_unregister_thread();
1259 return NULL;
1260}
1261
1262static void *qemu_dummy_cpu_thread_fn(void *arg)
1263{
1264#ifdef _WIN32
1265 error_report("qtest is not supported under Windows");
1266 exit(1);
1267#else
1268 CPUState *cpu = arg;
1269 sigset_t waitset;
1270 int r;
1271
1272 rcu_register_thread();
1273
1274 qemu_mutex_lock_iothread();
1275 qemu_thread_get_self(cpu->thread);
1276 cpu->thread_id = qemu_get_thread_id();
1277 cpu->can_do_io = 1;
1278 current_cpu = cpu;
1279
1280 sigemptyset(&waitset);
1281 sigaddset(&waitset, SIG_IPI);
1282
1283
1284 cpu->created = true;
1285 qemu_cond_signal(&qemu_cpu_cond);
1286 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1287
1288 do {
1289 qemu_mutex_unlock_iothread();
1290 do {
1291 int sig;
1292 r = sigwait(&waitset, &sig);
1293 } while (r == -1 && (errno == EAGAIN || errno == EINTR));
1294 if (r == -1) {
1295 perror("sigwait");
1296 exit(1);
1297 }
1298 qemu_mutex_lock_iothread();
1299 qemu_wait_io_event(cpu);
1300 } while (!cpu->unplug);
1301
1302 qemu_mutex_unlock_iothread();
1303 rcu_unregister_thread();
1304 return NULL;
1305#endif
1306}
1307
1308static int64_t tcg_get_icount_limit(void)
1309{
1310 int64_t deadline;
1311
1312 if (replay_mode != REPLAY_MODE_PLAY) {
1313
1314
1315
1316
1317 deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
1318 QEMU_TIMER_ATTR_ALL);
1319
1320 deadline = qemu_soonest_timeout(deadline,
1321 qemu_clock_deadline_ns_all(QEMU_CLOCK_REALTIME,
1322 QEMU_TIMER_ATTR_ALL));
1323
1324
1325
1326
1327
1328
1329 if ((deadline < 0) || (deadline > INT32_MAX)) {
1330 deadline = INT32_MAX;
1331 }
1332
1333 return qemu_icount_round(deadline);
1334 } else {
1335 return replay_get_instructions();
1336 }
1337}
1338
1339static void handle_icount_deadline(void)
1340{
1341 assert(qemu_in_vcpu_thread());
1342 if (use_icount) {
1343 int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
1344 QEMU_TIMER_ATTR_ALL);
1345
1346 if (deadline == 0) {
1347
1348 qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
1349 qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
1350 }
1351 }
1352}
1353
1354static void prepare_icount_for_run(CPUState *cpu)
1355{
1356 if (use_icount) {
1357 int insns_left;
1358
1359
1360
1361
1362
1363 g_assert(cpu_neg(cpu)->icount_decr.u16.low == 0);
1364 g_assert(cpu->icount_extra == 0);
1365
1366 cpu->icount_budget = tcg_get_icount_limit();
1367 insns_left = MIN(0xffff, cpu->icount_budget);
1368 cpu_neg(cpu)->icount_decr.u16.low = insns_left;
1369 cpu->icount_extra = cpu->icount_budget - insns_left;
1370
1371 replay_mutex_lock();
1372 }
1373}
1374
1375static void process_icount_data(CPUState *cpu)
1376{
1377 if (use_icount) {
1378
1379 cpu_update_icount(cpu);
1380
1381
1382 cpu_neg(cpu)->icount_decr.u16.low = 0;
1383 cpu->icount_extra = 0;
1384 cpu->icount_budget = 0;
1385
1386 replay_account_executed_instructions();
1387
1388 replay_mutex_unlock();
1389 }
1390}
1391
1392
1393static int tcg_cpu_exec(CPUState *cpu)
1394{
1395 int ret;
1396#ifdef CONFIG_PROFILER
1397 int64_t ti;
1398#endif
1399
1400 assert(tcg_enabled());
1401#ifdef CONFIG_PROFILER
1402 ti = profile_getclock();
1403#endif
1404 cpu_exec_start(cpu);
1405 ret = cpu_exec(cpu);
1406 cpu_exec_end(cpu);
1407#ifdef CONFIG_PROFILER
1408 atomic_set(&tcg_ctx->prof.cpu_exec_time,
1409 tcg_ctx->prof.cpu_exec_time + profile_getclock() - ti);
1410#endif
1411 return ret;
1412}
1413
1414
1415
1416
1417static void deal_with_unplugged_cpus(void)
1418{
1419 CPUState *cpu;
1420
1421 CPU_FOREACH(cpu) {
1422 if (cpu->unplug && !cpu_can_run(cpu)) {
1423 qemu_tcg_destroy_vcpu(cpu);
1424 cpu->created = false;
1425 qemu_cond_signal(&qemu_cpu_cond);
1426 break;
1427 }
1428 }
1429}
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
1441{
1442 CPUState *cpu = arg;
1443
1444 assert(tcg_enabled());
1445 rcu_register_thread();
1446 tcg_register_thread();
1447
1448 qemu_mutex_lock_iothread();
1449 qemu_thread_get_self(cpu->thread);
1450
1451 cpu->thread_id = qemu_get_thread_id();
1452 cpu->created = true;
1453 cpu->can_do_io = 1;
1454 qemu_cond_signal(&qemu_cpu_cond);
1455 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1456
1457
1458 while (first_cpu->stopped) {
1459 qemu_cond_wait(first_cpu->halt_cond, &qemu_global_mutex);
1460
1461
1462 CPU_FOREACH(cpu) {
1463 current_cpu = cpu;
1464 qemu_wait_io_event_common(cpu);
1465 }
1466 }
1467
1468 start_tcg_kick_timer();
1469
1470 cpu = first_cpu;
1471
1472
1473 cpu->exit_request = 1;
1474
1475 while (1) {
1476 qemu_mutex_unlock_iothread();
1477 replay_mutex_lock();
1478 qemu_mutex_lock_iothread();
1479
1480 qemu_account_warp_timer();
1481
1482
1483
1484
1485 handle_icount_deadline();
1486
1487 replay_mutex_unlock();
1488
1489 if (!cpu) {
1490 cpu = first_cpu;
1491 }
1492
1493 while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
1494
1495 atomic_mb_set(&tcg_current_rr_cpu, cpu);
1496 current_cpu = cpu;
1497
1498 qemu_clock_enable(QEMU_CLOCK_VIRTUAL,
1499 (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0);
1500
1501 if (cpu_can_run(cpu)) {
1502 int r;
1503
1504 qemu_mutex_unlock_iothread();
1505 prepare_icount_for_run(cpu);
1506
1507 r = tcg_cpu_exec(cpu);
1508
1509 process_icount_data(cpu);
1510 qemu_mutex_lock_iothread();
1511
1512 if (r == EXCP_DEBUG) {
1513 cpu_handle_guest_debug(cpu);
1514 break;
1515 } else if (r == EXCP_ATOMIC) {
1516 qemu_mutex_unlock_iothread();
1517 cpu_exec_step_atomic(cpu);
1518 qemu_mutex_lock_iothread();
1519 break;
1520 }
1521 } else if (cpu->stop) {
1522 if (cpu->unplug) {
1523 cpu = CPU_NEXT(cpu);
1524 }
1525 break;
1526 }
1527
1528 cpu = CPU_NEXT(cpu);
1529 }
1530
1531
1532 atomic_set(&tcg_current_rr_cpu, NULL);
1533
1534 if (cpu && cpu->exit_request) {
1535 atomic_mb_set(&cpu->exit_request, 0);
1536 }
1537
1538 if (use_icount && all_cpu_threads_idle()) {
1539
1540
1541
1542
1543 qemu_notify_event();
1544 }
1545
1546 qemu_tcg_rr_wait_io_event();
1547 deal_with_unplugged_cpus();
1548 }
1549
1550 rcu_unregister_thread();
1551 return NULL;
1552}
1553
1554static void *qemu_hax_cpu_thread_fn(void *arg)
1555{
1556 CPUState *cpu = arg;
1557 int r;
1558
1559 rcu_register_thread();
1560 qemu_mutex_lock_iothread();
1561 qemu_thread_get_self(cpu->thread);
1562
1563 cpu->thread_id = qemu_get_thread_id();
1564 cpu->created = true;
1565 current_cpu = cpu;
1566
1567 hax_init_vcpu(cpu);
1568 qemu_cond_signal(&qemu_cpu_cond);
1569 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1570
1571 do {
1572 if (cpu_can_run(cpu)) {
1573 r = hax_smp_cpu_exec(cpu);
1574 if (r == EXCP_DEBUG) {
1575 cpu_handle_guest_debug(cpu);
1576 }
1577 }
1578
1579 qemu_wait_io_event(cpu);
1580 } while (!cpu->unplug || cpu_can_run(cpu));
1581 rcu_unregister_thread();
1582 return NULL;
1583}
1584
1585
1586
1587static void *qemu_hvf_cpu_thread_fn(void *arg)
1588{
1589 CPUState *cpu = arg;
1590
1591 int r;
1592
1593 assert(hvf_enabled());
1594
1595 rcu_register_thread();
1596
1597 qemu_mutex_lock_iothread();
1598 qemu_thread_get_self(cpu->thread);
1599
1600 cpu->thread_id = qemu_get_thread_id();
1601 cpu->can_do_io = 1;
1602 current_cpu = cpu;
1603
1604 hvf_init_vcpu(cpu);
1605
1606
1607 cpu->created = true;
1608 qemu_cond_signal(&qemu_cpu_cond);
1609 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1610
1611 do {
1612 if (cpu_can_run(cpu)) {
1613 r = hvf_vcpu_exec(cpu);
1614 if (r == EXCP_DEBUG) {
1615 cpu_handle_guest_debug(cpu);
1616 }
1617 }
1618 qemu_wait_io_event(cpu);
1619 } while (!cpu->unplug || cpu_can_run(cpu));
1620
1621 hvf_vcpu_destroy(cpu);
1622 cpu->created = false;
1623 qemu_cond_signal(&qemu_cpu_cond);
1624 qemu_mutex_unlock_iothread();
1625 rcu_unregister_thread();
1626 return NULL;
1627}
1628
1629static void *qemu_whpx_cpu_thread_fn(void *arg)
1630{
1631 CPUState *cpu = arg;
1632 int r;
1633
1634 rcu_register_thread();
1635
1636 qemu_mutex_lock_iothread();
1637 qemu_thread_get_self(cpu->thread);
1638 cpu->thread_id = qemu_get_thread_id();
1639 current_cpu = cpu;
1640
1641 r = whpx_init_vcpu(cpu);
1642 if (r < 0) {
1643 fprintf(stderr, "whpx_init_vcpu failed: %s\n", strerror(-r));
1644 exit(1);
1645 }
1646
1647
1648 cpu->created = true;
1649 qemu_cond_signal(&qemu_cpu_cond);
1650 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1651
1652 do {
1653 if (cpu_can_run(cpu)) {
1654 r = whpx_vcpu_exec(cpu);
1655 if (r == EXCP_DEBUG) {
1656 cpu_handle_guest_debug(cpu);
1657 }
1658 }
1659 while (cpu_thread_is_idle(cpu)) {
1660 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex);
1661 }
1662 qemu_wait_io_event_common(cpu);
1663 } while (!cpu->unplug || cpu_can_run(cpu));
1664
1665 whpx_destroy_vcpu(cpu);
1666 cpu->created = false;
1667 qemu_cond_signal(&qemu_cpu_cond);
1668 qemu_mutex_unlock_iothread();
1669 rcu_unregister_thread();
1670 return NULL;
1671}
1672
1673#ifdef _WIN32
1674static void CALLBACK dummy_apc_func(ULONG_PTR unused)
1675{
1676}
1677#endif
1678
1679
1680
1681
1682
1683
1684
1685
1686static void *qemu_tcg_cpu_thread_fn(void *arg)
1687{
1688 CPUState *cpu = arg;
1689
1690 assert(tcg_enabled());
1691 g_assert(!use_icount);
1692
1693 rcu_register_thread();
1694 tcg_register_thread();
1695
1696 qemu_mutex_lock_iothread();
1697 qemu_thread_get_self(cpu->thread);
1698
1699 cpu->thread_id = qemu_get_thread_id();
1700 cpu->created = true;
1701 cpu->can_do_io = 1;
1702 current_cpu = cpu;
1703 qemu_cond_signal(&qemu_cpu_cond);
1704 qemu_guest_random_seed_thread_part2(cpu->random_seed);
1705
1706
1707 cpu->exit_request = 1;
1708
1709 do {
1710 if (cpu_can_run(cpu)) {
1711 int r;
1712 qemu_mutex_unlock_iothread();
1713 r = tcg_cpu_exec(cpu);
1714 qemu_mutex_lock_iothread();
1715 switch (r) {
1716 case EXCP_DEBUG:
1717 cpu_handle_guest_debug(cpu);
1718 break;
1719 case EXCP_HALTED:
1720
1721
1722
1723
1724
1725
1726
1727 g_assert(cpu->halted);
1728 break;
1729 case EXCP_ATOMIC:
1730 qemu_mutex_unlock_iothread();
1731 cpu_exec_step_atomic(cpu);
1732 qemu_mutex_lock_iothread();
1733 default:
1734
1735 break;
1736 }
1737 }
1738
1739 atomic_mb_set(&cpu->exit_request, 0);
1740 qemu_wait_io_event(cpu);
1741 } while (!cpu->unplug || cpu_can_run(cpu));
1742
1743 qemu_tcg_destroy_vcpu(cpu);
1744 cpu->created = false;
1745 qemu_cond_signal(&qemu_cpu_cond);
1746 qemu_mutex_unlock_iothread();
1747 rcu_unregister_thread();
1748 return NULL;
1749}
1750
1751static void qemu_cpu_kick_thread(CPUState *cpu)
1752{
1753#ifndef _WIN32
1754 int err;
1755
1756 if (cpu->thread_kicked) {
1757 return;
1758 }
1759 cpu->thread_kicked = true;
1760 err = pthread_kill(cpu->thread->thread, SIG_IPI);
1761 if (err && err != ESRCH) {
1762 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
1763 exit(1);
1764 }
1765#else
1766 if (!qemu_cpu_is_self(cpu)) {
1767 if (whpx_enabled()) {
1768 whpx_vcpu_kick(cpu);
1769 } else if (!QueueUserAPC(dummy_apc_func, cpu->hThread, 0)) {
1770 fprintf(stderr, "%s: QueueUserAPC failed with error %lu\n",
1771 __func__, GetLastError());
1772 exit(1);
1773 }
1774 }
1775#endif
1776}
1777
1778void qemu_cpu_kick(CPUState *cpu)
1779{
1780 qemu_cond_broadcast(cpu->halt_cond);
1781 if (tcg_enabled()) {
1782 if (qemu_tcg_mttcg_enabled()) {
1783 cpu_exit(cpu);
1784 } else {
1785 qemu_cpu_kick_rr_cpus();
1786 }
1787 } else {
1788 if (hax_enabled()) {
1789
1790
1791
1792
1793 cpu->exit_request = 1;
1794 }
1795 qemu_cpu_kick_thread(cpu);
1796 }
1797}
1798
1799void qemu_cpu_kick_self(void)
1800{
1801 assert(current_cpu);
1802 qemu_cpu_kick_thread(current_cpu);
1803}
1804
1805bool qemu_cpu_is_self(CPUState *cpu)
1806{
1807 return qemu_thread_is_self(cpu->thread);
1808}
1809
1810bool qemu_in_vcpu_thread(void)
1811{
1812 return current_cpu && qemu_cpu_is_self(current_cpu);
1813}
1814
1815static __thread bool iothread_locked = false;
1816
1817bool qemu_mutex_iothread_locked(void)
1818{
1819 return iothread_locked;
1820}
1821
1822
1823
1824
1825
1826void qemu_mutex_lock_iothread_impl(const char *file, int line)
1827{
1828 QemuMutexLockFunc bql_lock = atomic_read(&qemu_bql_mutex_lock_func);
1829
1830 g_assert(!qemu_mutex_iothread_locked());
1831 bql_lock(&qemu_global_mutex, file, line);
1832 iothread_locked = true;
1833}
1834
1835void qemu_mutex_unlock_iothread(void)
1836{
1837 g_assert(qemu_mutex_iothread_locked());
1838 iothread_locked = false;
1839 qemu_mutex_unlock(&qemu_global_mutex);
1840}
1841
1842void qemu_cond_wait_iothread(QemuCond *cond)
1843{
1844 qemu_cond_wait(cond, &qemu_global_mutex);
1845}
1846
1847static bool all_vcpus_paused(void)
1848{
1849 CPUState *cpu;
1850
1851 CPU_FOREACH(cpu) {
1852 if (!cpu->stopped) {
1853 return false;
1854 }
1855 }
1856
1857 return true;
1858}
1859
1860void pause_all_vcpus(void)
1861{
1862 CPUState *cpu;
1863
1864 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
1865 CPU_FOREACH(cpu) {
1866 if (qemu_cpu_is_self(cpu)) {
1867 qemu_cpu_stop(cpu, true);
1868 } else {
1869 cpu->stop = true;
1870 qemu_cpu_kick(cpu);
1871 }
1872 }
1873
1874
1875
1876
1877 replay_mutex_unlock();
1878
1879 while (!all_vcpus_paused()) {
1880 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
1881 CPU_FOREACH(cpu) {
1882 qemu_cpu_kick(cpu);
1883 }
1884 }
1885
1886 qemu_mutex_unlock_iothread();
1887 replay_mutex_lock();
1888 qemu_mutex_lock_iothread();
1889}
1890
1891void cpu_resume(CPUState *cpu)
1892{
1893 cpu->stop = false;
1894 cpu->stopped = false;
1895 qemu_cpu_kick(cpu);
1896}
1897
1898void resume_all_vcpus(void)
1899{
1900 CPUState *cpu;
1901
1902 if (!runstate_is_running()) {
1903 return;
1904 }
1905
1906 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
1907 CPU_FOREACH(cpu) {
1908 cpu_resume(cpu);
1909 }
1910}
1911
1912void cpu_remove_sync(CPUState *cpu)
1913{
1914 cpu->stop = true;
1915 cpu->unplug = true;
1916 qemu_cpu_kick(cpu);
1917 qemu_mutex_unlock_iothread();
1918 qemu_thread_join(cpu->thread);
1919 qemu_mutex_lock_iothread();
1920}
1921
1922
1923#define VCPU_THREAD_NAME_SIZE 16
1924
1925static void qemu_tcg_init_vcpu(CPUState *cpu)
1926{
1927 char thread_name[VCPU_THREAD_NAME_SIZE];
1928 static QemuCond *single_tcg_halt_cond;
1929 static QemuThread *single_tcg_cpu_thread;
1930 static int tcg_region_inited;
1931
1932 assert(tcg_enabled());
1933
1934
1935
1936
1937
1938
1939 if (!tcg_region_inited) {
1940 tcg_region_inited = 1;
1941 tcg_region_init();
1942 }
1943
1944 if (qemu_tcg_mttcg_enabled() || !single_tcg_cpu_thread) {
1945 cpu->thread = g_malloc0(sizeof(QemuThread));
1946 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1947 qemu_cond_init(cpu->halt_cond);
1948
1949 if (qemu_tcg_mttcg_enabled()) {
1950
1951 parallel_cpus = true;
1952 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
1953 cpu->cpu_index);
1954
1955 qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
1956 cpu, QEMU_THREAD_JOINABLE);
1957
1958 } else {
1959
1960 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "ALL CPUs/TCG");
1961 qemu_thread_create(cpu->thread, thread_name,
1962 qemu_tcg_rr_cpu_thread_fn,
1963 cpu, QEMU_THREAD_JOINABLE);
1964
1965 single_tcg_halt_cond = cpu->halt_cond;
1966 single_tcg_cpu_thread = cpu->thread;
1967 }
1968#ifdef _WIN32
1969 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1970#endif
1971 } else {
1972
1973 cpu->thread = single_tcg_cpu_thread;
1974 cpu->halt_cond = single_tcg_halt_cond;
1975 cpu->thread_id = first_cpu->thread_id;
1976 cpu->can_do_io = 1;
1977 cpu->created = true;
1978 }
1979}
1980
1981static void qemu_hax_start_vcpu(CPUState *cpu)
1982{
1983 char thread_name[VCPU_THREAD_NAME_SIZE];
1984
1985 cpu->thread = g_malloc0(sizeof(QemuThread));
1986 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
1987 qemu_cond_init(cpu->halt_cond);
1988
1989 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HAX",
1990 cpu->cpu_index);
1991 qemu_thread_create(cpu->thread, thread_name, qemu_hax_cpu_thread_fn,
1992 cpu, QEMU_THREAD_JOINABLE);
1993#ifdef _WIN32
1994 cpu->hThread = qemu_thread_get_handle(cpu->thread);
1995#endif
1996}
1997
1998static void qemu_kvm_start_vcpu(CPUState *cpu)
1999{
2000 char thread_name[VCPU_THREAD_NAME_SIZE];
2001
2002 cpu->thread = g_malloc0(sizeof(QemuThread));
2003 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2004 qemu_cond_init(cpu->halt_cond);
2005 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
2006 cpu->cpu_index);
2007 qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
2008 cpu, QEMU_THREAD_JOINABLE);
2009}
2010
2011static void qemu_hvf_start_vcpu(CPUState *cpu)
2012{
2013 char thread_name[VCPU_THREAD_NAME_SIZE];
2014
2015
2016
2017 assert(hvf_enabled());
2018
2019 cpu->thread = g_malloc0(sizeof(QemuThread));
2020 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2021 qemu_cond_init(cpu->halt_cond);
2022
2023 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/HVF",
2024 cpu->cpu_index);
2025 qemu_thread_create(cpu->thread, thread_name, qemu_hvf_cpu_thread_fn,
2026 cpu, QEMU_THREAD_JOINABLE);
2027}
2028
2029static void qemu_whpx_start_vcpu(CPUState *cpu)
2030{
2031 char thread_name[VCPU_THREAD_NAME_SIZE];
2032
2033 cpu->thread = g_malloc0(sizeof(QemuThread));
2034 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2035 qemu_cond_init(cpu->halt_cond);
2036 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/WHPX",
2037 cpu->cpu_index);
2038 qemu_thread_create(cpu->thread, thread_name, qemu_whpx_cpu_thread_fn,
2039 cpu, QEMU_THREAD_JOINABLE);
2040#ifdef _WIN32
2041 cpu->hThread = qemu_thread_get_handle(cpu->thread);
2042#endif
2043}
2044
2045static void qemu_dummy_start_vcpu(CPUState *cpu)
2046{
2047 char thread_name[VCPU_THREAD_NAME_SIZE];
2048
2049 cpu->thread = g_malloc0(sizeof(QemuThread));
2050 cpu->halt_cond = g_malloc0(sizeof(QemuCond));
2051 qemu_cond_init(cpu->halt_cond);
2052 snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
2053 cpu->cpu_index);
2054 qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
2055 QEMU_THREAD_JOINABLE);
2056}
2057
2058void qemu_init_vcpu(CPUState *cpu)
2059{
2060 MachineState *ms = MACHINE(qdev_get_machine());
2061
2062 cpu->nr_cores = ms->smp.cores;
2063 cpu->nr_threads = ms->smp.threads;
2064 cpu->stopped = true;
2065 cpu->random_seed = qemu_guest_random_seed_thread_part1();
2066
2067 if (!cpu->as) {
2068
2069
2070
2071 cpu->num_ases = 1;
2072 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
2073 }
2074
2075 if (kvm_enabled()) {
2076 qemu_kvm_start_vcpu(cpu);
2077 } else if (hax_enabled()) {
2078 qemu_hax_start_vcpu(cpu);
2079 } else if (hvf_enabled()) {
2080 qemu_hvf_start_vcpu(cpu);
2081 } else if (tcg_enabled()) {
2082 qemu_tcg_init_vcpu(cpu);
2083 } else if (whpx_enabled()) {
2084 qemu_whpx_start_vcpu(cpu);
2085 } else {
2086 qemu_dummy_start_vcpu(cpu);
2087 }
2088
2089 while (!cpu->created) {
2090 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
2091 }
2092}
2093
2094void cpu_stop_current(void)
2095{
2096 if (current_cpu) {
2097 current_cpu->stop = true;
2098 cpu_exit(current_cpu);
2099 }
2100}
2101
2102int vm_stop(RunState state)
2103{
2104 if (qemu_in_vcpu_thread()) {
2105 qemu_system_vmstop_request_prepare();
2106 qemu_system_vmstop_request(state);
2107
2108
2109
2110
2111 cpu_stop_current();
2112 return 0;
2113 }
2114
2115 return do_vm_stop(state, true);
2116}
2117
2118
2119
2120
2121
2122
2123int vm_prepare_start(void)
2124{
2125 RunState requested;
2126
2127 qemu_vmstop_requested(&requested);
2128 if (runstate_is_running() && requested == RUN_STATE__MAX) {
2129 return -1;
2130 }
2131
2132
2133
2134
2135
2136
2137 if (runstate_is_running()) {
2138 qapi_event_send_stop();
2139 qapi_event_send_resume();
2140 return -1;
2141 }
2142
2143
2144 qapi_event_send_resume();
2145
2146 cpu_enable_ticks();
2147 runstate_set(RUN_STATE_RUNNING);
2148 vm_state_notify(1, RUN_STATE_RUNNING);
2149 return 0;
2150}
2151
2152void vm_start(void)
2153{
2154 if (!vm_prepare_start()) {
2155 resume_all_vcpus();
2156 }
2157}
2158
2159
2160
2161int vm_stop_force_state(RunState state)
2162{
2163 if (runstate_is_running()) {
2164 return vm_stop(state);
2165 } else {
2166 runstate_set(state);
2167
2168 bdrv_drain_all();
2169
2170
2171 return bdrv_flush_all();
2172 }
2173}
2174
2175void list_cpus(const char *optarg)
2176{
2177
2178#if defined(cpu_list)
2179 cpu_list();
2180#endif
2181}
2182
2183void qmp_memsave(int64_t addr, int64_t size, const char *filename,
2184 bool has_cpu, int64_t cpu_index, Error **errp)
2185{
2186 FILE *f;
2187 uint32_t l;
2188 CPUState *cpu;
2189 uint8_t buf[1024];
2190 int64_t orig_addr = addr, orig_size = size;
2191
2192 if (!has_cpu) {
2193 cpu_index = 0;
2194 }
2195
2196 cpu = qemu_get_cpu(cpu_index);
2197 if (cpu == NULL) {
2198 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
2199 "a CPU number");
2200 return;
2201 }
2202
2203 f = fopen(filename, "wb");
2204 if (!f) {
2205 error_setg_file_open(errp, errno, filename);
2206 return;
2207 }
2208
2209 while (size != 0) {
2210 l = sizeof(buf);
2211 if (l > size)
2212 l = size;
2213 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
2214 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
2215 " specified", orig_addr, orig_size);
2216 goto exit;
2217 }
2218 if (fwrite(buf, 1, l, f) != l) {
2219 error_setg(errp, QERR_IO_ERROR);
2220 goto exit;
2221 }
2222 addr += l;
2223 size -= l;
2224 }
2225
2226exit:
2227 fclose(f);
2228}
2229
2230void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
2231 Error **errp)
2232{
2233 FILE *f;
2234 uint32_t l;
2235 uint8_t buf[1024];
2236
2237 f = fopen(filename, "wb");
2238 if (!f) {
2239 error_setg_file_open(errp, errno, filename);
2240 return;
2241 }
2242
2243 while (size != 0) {
2244 l = sizeof(buf);
2245 if (l > size)
2246 l = size;
2247 cpu_physical_memory_read(addr, buf, l);
2248 if (fwrite(buf, 1, l, f) != l) {
2249 error_setg(errp, QERR_IO_ERROR);
2250 goto exit;
2251 }
2252 addr += l;
2253 size -= l;
2254 }
2255
2256exit:
2257 fclose(f);
2258}
2259
2260void qmp_inject_nmi(Error **errp)
2261{
2262 nmi_monitor_handle(monitor_get_cpu_index(), errp);
2263}
2264
2265void dump_drift_info(void)
2266{
2267 if (!use_icount) {
2268 return;
2269 }
2270
2271 qemu_printf("Host - Guest clock %"PRIi64" ms\n",
2272 (cpu_get_clock() - cpu_get_icount())/SCALE_MS);
2273 if (icount_align_option) {
2274 qemu_printf("Max guest delay %"PRIi64" ms\n",
2275 -max_delay / SCALE_MS);
2276 qemu_printf("Max guest advance %"PRIi64" ms\n",
2277 max_advance / SCALE_MS);
2278 } else {
2279 qemu_printf("Max guest delay NA\n");
2280 qemu_printf("Max guest advance NA\n");
2281 }
2282}
2283