]>
Commit | Line | Data |
---|---|---|
1583a389 | 1 | /* |
9ce84a0d | 2 | * Dummy cpu thread code |
1583a389 CF |
3 | * |
4 | * Copyright IBM, Corp. 2011 | |
5 | * | |
6 | * Authors: | |
7 | * Anthony Liguori <aliguori@us.ibm.com> | |
8 | * | |
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. | |
11 | * | |
12 | */ | |
13 | ||
14 | #include "qemu/osdep.h" | |
15 | #include "qemu/rcu.h" | |
1583a389 | 16 | #include "sysemu/cpus.h" |
1583a389 CF |
17 | #include "qemu/guest-random.h" |
18 | #include "qemu/main-loop.h" | |
19 | #include "hw/core/cpu.h" | |
20 | ||
9ce84a0d | 21 | static void *dummy_cpu_thread_fn(void *arg) |
1583a389 | 22 | { |
1583a389 | 23 | CPUState *cpu = arg; |
1583a389 CF |
24 | |
25 | rcu_register_thread(); | |
26 | ||
195801d7 | 27 | bql_lock(); |
1583a389 CF |
28 | qemu_thread_get_self(cpu->thread); |
29 | cpu->thread_id = qemu_get_thread_id(); | |
1583a389 CF |
30 | current_cpu = cpu; |
31 | ||
c9923550 XC |
32 | #ifndef _WIN32 |
33 | sigset_t waitset; | |
34 | int r; | |
35 | ||
1583a389 CF |
36 | sigemptyset(&waitset); |
37 | sigaddset(&waitset, SIG_IPI); | |
c9923550 | 38 | #endif |
1583a389 CF |
39 | |
40 | /* signal CPU creation */ | |
41 | cpu_thread_signal_created(cpu); | |
42 | qemu_guest_random_seed_thread_part2(cpu->random_seed); | |
43 | ||
44 | do { | |
195801d7 | 45 | bql_unlock(); |
c9923550 | 46 | #ifndef _WIN32 |
1583a389 CF |
47 | do { |
48 | int sig; | |
49 | r = sigwait(&waitset, &sig); | |
50 | } while (r == -1 && (errno == EAGAIN || errno == EINTR)); | |
51 | if (r == -1) { | |
52 | perror("sigwait"); | |
53 | exit(1); | |
54 | } | |
c9923550 XC |
55 | #else |
56 | qemu_sem_wait(&cpu->sem); | |
57 | #endif | |
195801d7 | 58 | bql_lock(); |
1583a389 CF |
59 | qemu_wait_io_event(cpu); |
60 | } while (!cpu->unplug); | |
61 | ||
195801d7 | 62 | bql_unlock(); |
1583a389 CF |
63 | rcu_unregister_thread(); |
64 | return NULL; | |
1583a389 CF |
65 | } |
66 | ||
9ce84a0d | 67 | void dummy_start_vcpu_thread(CPUState *cpu) |
1583a389 CF |
68 | { |
69 | char thread_name[VCPU_THREAD_NAME_SIZE]; | |
70 | ||
71 | cpu->thread = g_malloc0(sizeof(QemuThread)); | |
72 | cpu->halt_cond = g_malloc0(sizeof(QemuCond)); | |
73 | qemu_cond_init(cpu->halt_cond); | |
74 | snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY", | |
75 | cpu->cpu_index); | |
9ce84a0d | 76 | qemu_thread_create(cpu->thread, thread_name, dummy_cpu_thread_fn, cpu, |
1583a389 | 77 | QEMU_THREAD_JOINABLE); |
c9923550 XC |
78 | #ifdef _WIN32 |
79 | qemu_sem_init(&cpu->sem, 0); | |
80 | #endif | |
1583a389 | 81 | } |