xref: /openbmc/qemu/accel/dummy-cpus.c (revision 464dacf6)
19ce84a0dSJason Andryuk /*
29ce84a0dSJason Andryuk  * Dummy cpu thread code
39ce84a0dSJason Andryuk  *
49ce84a0dSJason Andryuk  * Copyright IBM, Corp. 2011
59ce84a0dSJason Andryuk  *
69ce84a0dSJason Andryuk  * Authors:
79ce84a0dSJason Andryuk  *  Anthony Liguori   <aliguori@us.ibm.com>
89ce84a0dSJason Andryuk  *
99ce84a0dSJason Andryuk  * This work is licensed under the terms of the GNU GPL, version 2 or later.
109ce84a0dSJason Andryuk  * See the COPYING file in the top-level directory.
119ce84a0dSJason Andryuk  *
129ce84a0dSJason Andryuk  */
139ce84a0dSJason Andryuk 
149ce84a0dSJason Andryuk #include "qemu/osdep.h"
159ce84a0dSJason Andryuk #include "qemu/rcu.h"
169ce84a0dSJason Andryuk #include "sysemu/cpus.h"
179ce84a0dSJason Andryuk #include "qemu/guest-random.h"
189ce84a0dSJason Andryuk #include "qemu/main-loop.h"
199ce84a0dSJason Andryuk #include "hw/core/cpu.h"
209ce84a0dSJason Andryuk 
dummy_cpu_thread_fn(void * arg)219ce84a0dSJason Andryuk static void *dummy_cpu_thread_fn(void *arg)
229ce84a0dSJason Andryuk {
239ce84a0dSJason Andryuk     CPUState *cpu = arg;
249ce84a0dSJason Andryuk 
259ce84a0dSJason Andryuk     rcu_register_thread();
269ce84a0dSJason Andryuk 
279ce84a0dSJason Andryuk     qemu_mutex_lock_iothread();
289ce84a0dSJason Andryuk     qemu_thread_get_self(cpu->thread);
299ce84a0dSJason Andryuk     cpu->thread_id = qemu_get_thread_id();
30*464dacf6SRichard Henderson     cpu->neg.can_do_io = true;
319ce84a0dSJason Andryuk     current_cpu = cpu;
329ce84a0dSJason Andryuk 
33c9923550SXuzhou Cheng #ifndef _WIN32
34c9923550SXuzhou Cheng     sigset_t waitset;
35c9923550SXuzhou Cheng     int r;
36c9923550SXuzhou Cheng 
379ce84a0dSJason Andryuk     sigemptyset(&waitset);
389ce84a0dSJason Andryuk     sigaddset(&waitset, SIG_IPI);
39c9923550SXuzhou Cheng #endif
409ce84a0dSJason Andryuk 
419ce84a0dSJason Andryuk     /* signal CPU creation */
429ce84a0dSJason Andryuk     cpu_thread_signal_created(cpu);
439ce84a0dSJason Andryuk     qemu_guest_random_seed_thread_part2(cpu->random_seed);
449ce84a0dSJason Andryuk 
459ce84a0dSJason Andryuk     do {
469ce84a0dSJason Andryuk         qemu_mutex_unlock_iothread();
47c9923550SXuzhou Cheng #ifndef _WIN32
489ce84a0dSJason Andryuk         do {
499ce84a0dSJason Andryuk             int sig;
509ce84a0dSJason Andryuk             r = sigwait(&waitset, &sig);
519ce84a0dSJason Andryuk         } while (r == -1 && (errno == EAGAIN || errno == EINTR));
529ce84a0dSJason Andryuk         if (r == -1) {
539ce84a0dSJason Andryuk             perror("sigwait");
549ce84a0dSJason Andryuk             exit(1);
559ce84a0dSJason Andryuk         }
56c9923550SXuzhou Cheng #else
57c9923550SXuzhou Cheng         qemu_sem_wait(&cpu->sem);
58c9923550SXuzhou Cheng #endif
599ce84a0dSJason Andryuk         qemu_mutex_lock_iothread();
609ce84a0dSJason Andryuk         qemu_wait_io_event(cpu);
619ce84a0dSJason Andryuk     } while (!cpu->unplug);
629ce84a0dSJason Andryuk 
639ce84a0dSJason Andryuk     qemu_mutex_unlock_iothread();
649ce84a0dSJason Andryuk     rcu_unregister_thread();
659ce84a0dSJason Andryuk     return NULL;
669ce84a0dSJason Andryuk }
679ce84a0dSJason Andryuk 
dummy_start_vcpu_thread(CPUState * cpu)689ce84a0dSJason Andryuk void dummy_start_vcpu_thread(CPUState *cpu)
699ce84a0dSJason Andryuk {
709ce84a0dSJason Andryuk     char thread_name[VCPU_THREAD_NAME_SIZE];
719ce84a0dSJason Andryuk 
729ce84a0dSJason Andryuk     cpu->thread = g_malloc0(sizeof(QemuThread));
739ce84a0dSJason Andryuk     cpu->halt_cond = g_malloc0(sizeof(QemuCond));
749ce84a0dSJason Andryuk     qemu_cond_init(cpu->halt_cond);
759ce84a0dSJason Andryuk     snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
769ce84a0dSJason Andryuk              cpu->cpu_index);
779ce84a0dSJason Andryuk     qemu_thread_create(cpu->thread, thread_name, dummy_cpu_thread_fn, cpu,
789ce84a0dSJason Andryuk                        QEMU_THREAD_JOINABLE);
79c9923550SXuzhou Cheng #ifdef _WIN32
80c9923550SXuzhou Cheng     qemu_sem_init(&cpu->sem, 0);
81c9923550SXuzhou Cheng #endif
829ce84a0dSJason Andryuk }
83