2 * QTest accelerator code
4 * Copyright IBM, Corp. 2011
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
14 #include "qemu/osdep.h"
16 #include "qapi/error.h"
17 #include "qemu/module.h"
18 #include "qemu/option.h"
19 #include "qemu/config-file.h"
20 #include "sysemu/accel.h"
21 #include "sysemu/qtest.h"
22 #include "sysemu/cpus.h"
23 #include "sysemu/cpu-timers.h"
24 #include "qemu/guest-random.h"
25 #include "qemu/main-loop.h"
26 #include "hw/core/cpu.h"
28 #include "qtest-cpus.h"
30 static void *qtest_cpu_thread_fn(void *arg
)
33 error_report("qtest is not supported under Windows");
40 rcu_register_thread();
42 qemu_mutex_lock_iothread();
43 qemu_thread_get_self(cpu
->thread
);
44 cpu
->thread_id
= qemu_get_thread_id();
48 sigemptyset(&waitset
);
49 sigaddset(&waitset
, SIG_IPI
);
51 /* signal CPU creation */
52 cpu_thread_signal_created(cpu
);
53 qemu_guest_random_seed_thread_part2(cpu
->random_seed
);
56 qemu_mutex_unlock_iothread();
59 r
= sigwait(&waitset
, &sig
);
60 } while (r
== -1 && (errno
== EAGAIN
|| errno
== EINTR
));
65 qemu_mutex_lock_iothread();
66 qemu_wait_io_event(cpu
);
67 } while (!cpu
->unplug
);
69 qemu_mutex_unlock_iothread();
70 rcu_unregister_thread();
75 static void qtest_start_vcpu_thread(CPUState
*cpu
)
77 char thread_name
[VCPU_THREAD_NAME_SIZE
];
79 cpu
->thread
= g_malloc0(sizeof(QemuThread
));
80 cpu
->halt_cond
= g_malloc0(sizeof(QemuCond
));
81 qemu_cond_init(cpu
->halt_cond
);
82 snprintf(thread_name
, VCPU_THREAD_NAME_SIZE
, "CPU %d/DUMMY",
84 qemu_thread_create(cpu
->thread
, thread_name
, qtest_cpu_thread_fn
, cpu
,
85 QEMU_THREAD_JOINABLE
);
88 const CpusAccel qtest_cpus
= {
89 .create_vcpu_thread
= qtest_start_vcpu_thread
,
90 .get_virtual_clock
= qtest_get_virtual_clock
,