dummy-cpus.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Dummy cpu thread code
  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. #include "qemu/osdep.h"
  14. #include "qemu/rcu.h"
  15. #include "system/cpus.h"
  16. #include "qemu/guest-random.h"
  17. #include "qemu/main-loop.h"
  18. #include "hw/core/cpu.h"
  19. static void *dummy_cpu_thread_fn(void *arg)
  20. {
  21. CPUState *cpu = arg;
  22. rcu_register_thread();
  23. bql_lock();
  24. qemu_thread_get_self(cpu->thread);
  25. cpu->thread_id = qemu_get_thread_id();
  26. current_cpu = cpu;
  27. #ifndef _WIN32
  28. sigset_t waitset;
  29. int r;
  30. sigemptyset(&waitset);
  31. sigaddset(&waitset, SIG_IPI);
  32. #endif
  33. /* signal CPU creation */
  34. cpu_thread_signal_created(cpu);
  35. qemu_guest_random_seed_thread_part2(cpu->random_seed);
  36. do {
  37. bql_unlock();
  38. #ifndef _WIN32
  39. do {
  40. int sig;
  41. r = sigwait(&waitset, &sig);
  42. } while (r == -1 && (errno == EAGAIN || errno == EINTR));
  43. if (r == -1) {
  44. perror("sigwait");
  45. exit(1);
  46. }
  47. #else
  48. qemu_sem_wait(&cpu->sem);
  49. #endif
  50. bql_lock();
  51. qemu_wait_io_event(cpu);
  52. } while (!cpu->unplug);
  53. bql_unlock();
  54. rcu_unregister_thread();
  55. return NULL;
  56. }
  57. void dummy_start_vcpu_thread(CPUState *cpu)
  58. {
  59. char thread_name[VCPU_THREAD_NAME_SIZE];
  60. snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
  61. cpu->cpu_index);
  62. qemu_thread_create(cpu->thread, thread_name, dummy_cpu_thread_fn, cpu,
  63. QEMU_THREAD_JOINABLE);
  64. #ifdef _WIN32
  65. qemu_sem_init(&cpu->sem, 0);
  66. #endif
  67. }