Home | History | Annotate | Download | only in qemu
      1 /*
      2  * QEMU System Emulator
      3  *
      4  * Copyright (c) 2003-2008 Fabrice Bellard
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a copy
      7  * of this software and associated documentation files (the "Software"), to deal
      8  * in the Software without restriction, including without limitation the rights
      9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10  * copies of the Software, and to permit persons to whom the Software is
     11  * furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22  * THE SOFTWARE.
     23  */
     24 #include "config-host.h"
     25 
     26 #include "monitor.h"
     27 #include "sysemu.h"
     28 #include "gdbstub.h"
     29 #include "dma.h"
     30 #include "kvm.h"
     31 #include "hax.h"
     32 
     33 #include "cpus.h"
     34 
     35 static CPUState *cur_cpu;
     36 static CPUState *next_cpu;
     37 
     38 /***********************************************************/
     39 void hw_error(const char *fmt, ...)
     40 {
     41     va_list ap;
     42     CPUState *env;
     43 
     44     va_start(ap, fmt);
     45     fprintf(stderr, "qemu: hardware error: ");
     46     vfprintf(stderr, fmt, ap);
     47     fprintf(stderr, "\n");
     48     for(env = first_cpu; env != NULL; env = env->next_cpu) {
     49         fprintf(stderr, "CPU #%d:\n", env->cpu_index);
     50 #ifdef TARGET_I386
     51         cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
     52 #else
     53         cpu_dump_state(env, stderr, fprintf, 0);
     54 #endif
     55     }
     56     va_end(ap);
     57     abort();
     58 }
     59 
     60 static void do_vm_stop(int reason)
     61 {
     62     if (vm_running) {
     63         cpu_disable_ticks();
     64         vm_running = 0;
     65         pause_all_vcpus();
     66         vm_state_notify(0, reason);
     67     }
     68 }
     69 
     70 static int cpu_can_run(CPUState *env)
     71 {
     72     if (env->stop)
     73         return 0;
     74     if (env->stopped)
     75         return 0;
     76     return 1;
     77 }
     78 
     79 static int cpu_has_work(CPUState *env)
     80 {
     81     if (env->stop)
     82         return 1;
     83     if (env->stopped)
     84         return 0;
     85     if (!env->halted)
     86         return 1;
     87     if (qemu_cpu_has_work(env))
     88         return 1;
     89     return 0;
     90 }
     91 
     92 int tcg_has_work(void)
     93 {
     94     CPUState *env;
     95 
     96     for (env = first_cpu; env != NULL; env = env->next_cpu)
     97         if (cpu_has_work(env))
     98             return 1;
     99     return 0;
    100 }
    101 
    102 #ifndef _WIN32
    103 static int io_thread_fd = -1;
    104 
    105 #if 0
    106 static void qemu_event_increment(void)
    107 {
    108     static const char byte = 0;
    109 
    110     if (io_thread_fd == -1)
    111         return;
    112 
    113     write(io_thread_fd, &byte, sizeof(byte));
    114 }
    115 #endif
    116 
    117 static void qemu_event_read(void *opaque)
    118 {
    119     int fd = (unsigned long)opaque;
    120     ssize_t len;
    121 
    122     /* Drain the notify pipe */
    123     do {
    124         char buffer[512];
    125         len = read(fd, buffer, sizeof(buffer));
    126     } while ((len == -1 && errno == EINTR) || len > 0);
    127 }
    128 
    129 static int qemu_event_init(void)
    130 {
    131     int err;
    132     int fds[2];
    133 
    134     err = pipe(fds);
    135     if (err == -1)
    136         return -errno;
    137 
    138     err = fcntl_setfl(fds[0], O_NONBLOCK);
    139     if (err < 0)
    140         goto fail;
    141 
    142     err = fcntl_setfl(fds[1], O_NONBLOCK);
    143     if (err < 0)
    144         goto fail;
    145 
    146     qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
    147                          (void *)(unsigned long)fds[0]);
    148 
    149     io_thread_fd = fds[1];
    150     return 0;
    151 
    152 fail:
    153     close(fds[0]);
    154     close(fds[1]);
    155     return err;
    156 }
    157 #else
    158 HANDLE qemu_event_handle;
    159 
    160 static void dummy_event_handler(void *opaque)
    161 {
    162 }
    163 
    164 static int qemu_event_init(void)
    165 {
    166     qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
    167     if (!qemu_event_handle) {
    168         perror("Failed CreateEvent");
    169         return -1;
    170     }
    171     qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL);
    172     return 0;
    173 }
    174 
    175 #if 0
    176 static void qemu_event_increment(void)
    177 {
    178     SetEvent(qemu_event_handle);
    179 }
    180 #endif
    181 #endif
    182 
    183 #ifndef CONFIG_IOTHREAD
    184 int qemu_init_main_loop(void)
    185 {
    186     return qemu_event_init();
    187 }
    188 
    189 void qemu_init_vcpu(void *_env)
    190 {
    191     CPUState *env = _env;
    192 
    193     if (kvm_enabled())
    194         kvm_init_vcpu(env);
    195 #ifdef CONFIG_HAX
    196     if (hax_enabled())
    197         hax_init_vcpu(env);
    198 #endif
    199     return;
    200 }
    201 
    202 int qemu_cpu_self(void *env)
    203 {
    204     return 1;
    205 }
    206 
    207 void resume_all_vcpus(void)
    208 {
    209 }
    210 
    211 void pause_all_vcpus(void)
    212 {
    213 }
    214 
    215 void qemu_cpu_kick(void *env)
    216 {
    217     return;
    218 }
    219 
    220 void qemu_notify_event(void)
    221 {
    222     CPUState *env = cpu_single_env;
    223 
    224     if (env) {
    225         cpu_exit(env);
    226 #ifdef USE_KQEMU
    227         if (env->kqemu_enabled)
    228             kqemu_cpu_interrupt(env);
    229 #endif
    230     /*
    231      * This is mainly for the Windows host, where the timer may be in
    232      * a different thread with vcpu. Thus the timer function needs to
    233      * notify the vcpu thread of more than simply cpu_exit.  If env is
    234      * not NULL, it means that the vcpu is in execute state, we need
    235      * only to set the flags.  If the guest is in execute state, the
    236      * HAX kernel module will exit to qemu.  If env is NULL, vcpu is
    237      * in main_loop_wait, and we need a event to notify it.
    238      */
    239 #ifdef CONFIG_HAX
    240         if (hax_enabled())
    241             hax_raise_event(env);
    242      } else {
    243 #ifdef _WIN32
    244          if(hax_enabled())
    245              SetEvent(qemu_event_handle);
    246 #endif
    247      }
    248 #else
    249      }
    250 #endif
    251 }
    252 
    253 void qemu_mutex_lock_iothread(void)
    254 {
    255 }
    256 
    257 void qemu_mutex_unlock_iothread(void)
    258 {
    259 }
    260 
    261 void vm_stop(int reason)
    262 {
    263     do_vm_stop(reason);
    264 }
    265 
    266 #else /* CONFIG_IOTHREAD */
    267 
    268 #include "qemu-thread.h"
    269 
    270 QemuMutex qemu_global_mutex;
    271 static QemuMutex qemu_fair_mutex;
    272 
    273 static QemuThread io_thread;
    274 
    275 static QemuThread *tcg_cpu_thread;
    276 static QemuCond *tcg_halt_cond;
    277 
    278 static int qemu_system_ready;
    279 /* cpu creation */
    280 static QemuCond qemu_cpu_cond;
    281 /* system init */
    282 static QemuCond qemu_system_cond;
    283 static QemuCond qemu_pause_cond;
    284 
    285 static void block_io_signals(void);
    286 static void unblock_io_signals(void);
    287 static int tcg_has_work(void);
    288 
    289 int qemu_init_main_loop(void)
    290 {
    291     int ret;
    292 
    293     ret = qemu_event_init();
    294     if (ret)
    295         return ret;
    296 
    297     qemu_cond_init(&qemu_pause_cond);
    298     qemu_mutex_init(&qemu_fair_mutex);
    299     qemu_mutex_init(&qemu_global_mutex);
    300     qemu_mutex_lock(&qemu_global_mutex);
    301 
    302     unblock_io_signals();
    303     qemu_thread_self(&io_thread);
    304 
    305     return 0;
    306 }
    307 
    308 static void qemu_wait_io_event(CPUState *env)
    309 {
    310     while (!tcg_has_work())
    311         qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000);
    312 
    313     qemu_mutex_unlock(&qemu_global_mutex);
    314 
    315     /*
    316      * Users of qemu_global_mutex can be starved, having no chance
    317      * to acquire it since this path will get to it first.
    318      * So use another lock to provide fairness.
    319      */
    320     qemu_mutex_lock(&qemu_fair_mutex);
    321     qemu_mutex_unlock(&qemu_fair_mutex);
    322 
    323     qemu_mutex_lock(&qemu_global_mutex);
    324     if (env->stop) {
    325         env->stop = 0;
    326         env->stopped = 1;
    327         qemu_cond_signal(&qemu_pause_cond);
    328     }
    329 }
    330 
    331 static int qemu_cpu_exec(CPUState *env);
    332 
    333 static void *kvm_cpu_thread_fn(void *arg)
    334 {
    335     CPUState *env = arg;
    336 
    337     block_io_signals();
    338     qemu_thread_self(env->thread);
    339 
    340     /* signal CPU creation */
    341     qemu_mutex_lock(&qemu_global_mutex);
    342     env->created = 1;
    343     qemu_cond_signal(&qemu_cpu_cond);
    344 
    345     /* and wait for machine initialization */
    346     while (!qemu_system_ready)
    347         qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
    348 
    349     while (1) {
    350         if (cpu_can_run(env))
    351             qemu_cpu_exec(env);
    352         qemu_wait_io_event(env);
    353     }
    354 
    355     return NULL;
    356 }
    357 
    358 static void tcg_cpu_exec(void);
    359 
    360 static void *tcg_cpu_thread_fn(void *arg)
    361 {
    362     CPUState *env = arg;
    363 
    364     block_io_signals();
    365     qemu_thread_self(env->thread);
    366 
    367     /* signal CPU creation */
    368     qemu_mutex_lock(&qemu_global_mutex);
    369     for (env = first_cpu; env != NULL; env = env->next_cpu)
    370         env->created = 1;
    371     qemu_cond_signal(&qemu_cpu_cond);
    372 
    373     /* and wait for machine initialization */
    374     while (!qemu_system_ready)
    375         qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100);
    376 
    377     while (1) {
    378         tcg_cpu_exec();
    379         qemu_wait_io_event(cur_cpu);
    380     }
    381 
    382     return NULL;
    383 }
    384 
    385 void qemu_cpu_kick(void *_env)
    386 {
    387     CPUState *env = _env;
    388     qemu_cond_broadcast(env->halt_cond);
    389     if (kvm_enabled() || hax_enabled())
    390         qemu_thread_signal(env->thread, SIGUSR1);
    391 }
    392 
    393 int qemu_cpu_self(void *env)
    394 {
    395     return (cpu_single_env != NULL);
    396 }
    397 
    398 static void cpu_signal(int sig)
    399 {
    400     if (cpu_single_env)
    401         cpu_exit(cpu_single_env);
    402 }
    403 
    404 static void block_io_signals(void)
    405 {
    406     sigset_t set;
    407     struct sigaction sigact;
    408 
    409     sigemptyset(&set);
    410     sigaddset(&set, SIGUSR2);
    411     sigaddset(&set, SIGIO);
    412     sigaddset(&set, SIGALRM);
    413     pthread_sigmask(SIG_BLOCK, &set, NULL);
    414 
    415     sigemptyset(&set);
    416     sigaddset(&set, SIGUSR1);
    417     pthread_sigmask(SIG_UNBLOCK, &set, NULL);
    418 
    419     memset(&sigact, 0, sizeof(sigact));
    420     sigact.sa_handler = cpu_signal;
    421     sigaction(SIGUSR1, &sigact, NULL);
    422 }
    423 
    424 static void unblock_io_signals(void)
    425 {
    426     sigset_t set;
    427 
    428     sigemptyset(&set);
    429     sigaddset(&set, SIGUSR2);
    430     sigaddset(&set, SIGIO);
    431     sigaddset(&set, SIGALRM);
    432     pthread_sigmask(SIG_UNBLOCK, &set, NULL);
    433 
    434     sigemptyset(&set);
    435     sigaddset(&set, SIGUSR1);
    436     pthread_sigmask(SIG_BLOCK, &set, NULL);
    437 }
    438 
    439 static void qemu_signal_lock(unsigned int msecs)
    440 {
    441     qemu_mutex_lock(&qemu_fair_mutex);
    442 
    443     while (qemu_mutex_trylock(&qemu_global_mutex)) {
    444         qemu_thread_signal(tcg_cpu_thread, SIGUSR1);
    445         if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
    446             break;
    447     }
    448     qemu_mutex_unlock(&qemu_fair_mutex);
    449 }
    450 
    451 void qemu_mutex_lock_iothread(void)
    452 {
    453     if (kvm_enabled() || hax_enabled()) {
    454         qemu_mutex_lock(&qemu_fair_mutex);
    455         qemu_mutex_lock(&qemu_global_mutex);
    456         qemu_mutex_unlock(&qemu_fair_mutex);
    457     } else
    458         qemu_signal_lock(100);
    459 }
    460 
    461 void qemu_mutex_unlock_iothread(void)
    462 {
    463     qemu_mutex_unlock(&qemu_global_mutex);
    464 }
    465 
    466 static int all_vcpus_paused(void)
    467 {
    468     CPUState *penv = first_cpu;
    469 
    470     while (penv) {
    471         if (!penv->stopped)
    472             return 0;
    473         penv = (CPUState *)penv->next_cpu;
    474     }
    475 
    476     return 1;
    477 }
    478 
    479 void pause_all_vcpus(void)
    480 {
    481     CPUState *penv = first_cpu;
    482 
    483     while (penv) {
    484         penv->stop = 1;
    485         qemu_thread_signal(penv->thread, SIGUSR1);
    486         qemu_cpu_kick(penv);
    487         penv = (CPUState *)penv->next_cpu;
    488     }
    489 
    490     while (!all_vcpus_paused()) {
    491         qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
    492         penv = first_cpu;
    493         while (penv) {
    494             qemu_thread_signal(penv->thread, SIGUSR1);
    495             penv = (CPUState *)penv->next_cpu;
    496         }
    497     }
    498 }
    499 
    500 void resume_all_vcpus(void)
    501 {
    502     CPUState *penv = first_cpu;
    503 
    504     while (penv) {
    505         penv->stop = 0;
    506         penv->stopped = 0;
    507         qemu_thread_signal(penv->thread, SIGUSR1);
    508         qemu_cpu_kick(penv);
    509         penv = (CPUState *)penv->next_cpu;
    510     }
    511 }
    512 
    513 static void tcg_init_vcpu(void *_env)
    514 {
    515     CPUState *env = _env;
    516     /* share a single thread for all cpus with TCG */
    517     if (!tcg_cpu_thread) {
    518         env->thread = qemu_mallocz(sizeof(QemuThread));
    519         env->halt_cond = qemu_mallocz(sizeof(QemuCond));
    520         qemu_cond_init(env->halt_cond);
    521         qemu_thread_create(env->thread, tcg_cpu_thread_fn, env);
    522         while (env->created == 0)
    523             qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
    524         tcg_cpu_thread = env->thread;
    525         tcg_halt_cond = env->halt_cond;
    526     } else {
    527         env->thread = tcg_cpu_thread;
    528         env->halt_cond = tcg_halt_cond;
    529     }
    530 }
    531 
    532 static void kvm_start_vcpu(CPUState *env)
    533 {
    534 #if 0
    535     kvm_init_vcpu(env);
    536     env->thread = qemu_mallocz(sizeof(QemuThread));
    537     env->halt_cond = qemu_mallocz(sizeof(QemuCond));
    538     qemu_cond_init(env->halt_cond);
    539     qemu_thread_create(env->thread, kvm_cpu_thread_fn, env);
    540     while (env->created == 0)
    541         qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100);
    542 #endif
    543 }
    544 
    545 void qemu_init_vcpu(void *_env)
    546 {
    547     CPUState *env = _env;
    548 
    549     if (kvm_enabled())
    550         kvm_start_vcpu(env);
    551     else
    552         tcg_init_vcpu(env);
    553 }
    554 
    555 void qemu_notify_event(void)
    556 {
    557     qemu_event_increment();
    558 }
    559 
    560 void vm_stop(int reason)
    561 {
    562     QemuThread me;
    563     qemu_thread_self(&me);
    564 
    565     if (!qemu_thread_equal(&me, &io_thread)) {
    566         qemu_system_vmstop_request(reason);
    567         /*
    568          * FIXME: should not return to device code in case
    569          * vm_stop() has been requested.
    570          */
    571         if (cpu_single_env) {
    572             cpu_exit(cpu_single_env);
    573             cpu_single_env->stop = 1;
    574         }
    575         return;
    576     }
    577     do_vm_stop(reason);
    578 }
    579 
    580 #endif
    581 
    582 static int qemu_cpu_exec(CPUState *env)
    583 {
    584     int ret;
    585 #ifdef CONFIG_PROFILER
    586     int64_t ti;
    587 #endif
    588 
    589 #ifdef CONFIG_PROFILER
    590     ti = profile_getclock();
    591 #endif
    592     if (use_icount) {
    593         int64_t count;
    594         int decr;
    595         qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
    596         env->icount_decr.u16.low = 0;
    597         env->icount_extra = 0;
    598         count = qemu_next_icount_deadline();
    599         count = (count + (1 << icount_time_shift) - 1)
    600                 >> icount_time_shift;
    601         qemu_icount += count;
    602         decr = (count > 0xffff) ? 0xffff : count;
    603         count -= decr;
    604         env->icount_decr.u16.low = decr;
    605         env->icount_extra = count;
    606     }
    607 #ifdef CONFIG_TRACE
    608     if (tbflush_requested) {
    609         tbflush_requested = 0;
    610         tb_flush(env);
    611         return EXCP_INTERRUPT;
    612     }
    613 #endif
    614 
    615 
    616     ret = cpu_exec(env);
    617 #ifdef CONFIG_PROFILER
    618     qemu_time += profile_getclock() - ti;
    619 #endif
    620     if (use_icount) {
    621         /* Fold pending instructions back into the
    622            instruction counter, and clear the interrupt flag.  */
    623         qemu_icount -= (env->icount_decr.u16.low
    624                         + env->icount_extra);
    625         env->icount_decr.u32 = 0;
    626         env->icount_extra = 0;
    627     }
    628     return ret;
    629 }
    630 
    631 void tcg_cpu_exec(void)
    632 {
    633     int ret = 0;
    634 
    635     if (next_cpu == NULL)
    636         next_cpu = first_cpu;
    637     for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) {
    638         CPUState *env = cur_cpu = next_cpu;
    639 
    640         if (!vm_running)
    641             break;
    642         if (qemu_timer_alarm_pending()) {
    643             break;
    644         }
    645         if (cpu_can_run(env))
    646             ret = qemu_cpu_exec(env);
    647         if (ret == EXCP_DEBUG) {
    648             gdb_set_stop_cpu(env);
    649             debug_requested = 1;
    650             break;
    651         }
    652     }
    653 }
    654 
    655