On 01/11/2012 08:44 PM, Anthony Liguori wrote:
This is easier said than done. I started down this road and there's a
huge amount of code that assumes that first_cpu != NULL.
That's why I said do not create the CPU _threads_. :) But that wouldn't
be a big step forward from halted = 1; for example, it would prevent
using per-CPU work items. Currently they're only used internally by
KVM, but you never know.
So you can also create a CPU thread that does nothing. Here is how it
could look like, based on the KVM implementation:
static void *qemu_qtest_cpu_thread_fn(void *arg)
{
CPUState *env = arg;
int r;
qemu_mutex_lock(&qemu_global_mutex);
qemu_thread_get_self(env->thread);
env->thread_id = qemu_get_thread_id();
sigset_t waitset;
sigemptyset(&waitset);
sigaddset(&waitset, SIG_IPI);
/* signal CPU creation */
env->created = 1;
qemu_cond_signal(&qemu_cpu_cond);
cpu_single_env = env;
while (1) {
cpu_single_env = NULL;
qemu_mutex_unlock_iothread();
do {
int sig;
r = sigwait(&waitset, &sig);
} while (r == -1 && (errno == EAGAIN || errno == EINTR));
if (r == -1) {
perror("sigtimedwait");
exit(1);
}
qemu_mutex_lock_iothread();
cpu_single_env = env;
qemu_wait_io_event_common(env);
}
return NULL;
}
Paolo