Merge 'qemu 1.5.1' into tizen_qemu_1.5.1
[sdk/emulator/qemu.git] / main-loop.c
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
25 #include "qemu-common.h"
26 #include "qemu/timer.h"
27 #include "slirp/slirp.h"
28 #include "qemu/main-loop.h"
29 #include "block/aio.h"
30
31 #ifndef _WIN32
32
33 <<<<<<< HEAD
34 #include "compatfd.h"
35
36 static int io_thread_fd = -1;
37
38 void qemu_notify_event(void)
39 {
40     /* Write 8 bytes to be compatible with eventfd.  */
41     static const uint64_t val = 1;
42     ssize_t ret;
43
44     if (io_thread_fd == -1) {
45         return;
46     }
47
48     qemu_notify_hax_event();
49
50     do {
51         ret = write(io_thread_fd, &val, sizeof(val));
52     } while (ret < 0 && errno == EINTR);
53
54     /* EAGAIN is fine, a read must be pending.  */
55     if (ret < 0 && errno != EAGAIN) {
56         fprintf(stderr, "qemu_notify_event: write() failed: %s\n",
57                 strerror(errno));
58         exit(1);
59     }
60 }
61
62 static void qemu_event_read(void *opaque)
63 {
64     int fd = (intptr_t)opaque;
65     ssize_t len;
66     char buffer[512];
67
68     /* Drain the notify pipe.  For eventfd, only 8 bytes will be read.  */
69     do {
70         len = read(fd, buffer, sizeof(buffer));
71     } while ((len == -1 && errno == EINTR) || len == sizeof(buffer));
72 }
73
74 static int qemu_event_init(void)
75 {
76     int err;
77     int fds[2];
78
79     err = qemu_eventfd(fds);
80     if (err == -1) {
81         return -errno;
82     }
83     err = fcntl_setfl(fds[0], O_NONBLOCK);
84     if (err < 0) {
85         goto fail;
86     }
87     err = fcntl_setfl(fds[1], O_NONBLOCK);
88     if (err < 0) {
89         goto fail;
90     }
91     qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
92                          (void *)(intptr_t)fds[0]);
93
94     io_thread_fd = fds[1];
95     return 0;
96
97 fail:
98     close(fds[0]);
99     close(fds[1]);
100     return err;
101 }
102 =======
103 #include "qemu/compatfd.h"
104 >>>>>>> test1.5
105
106 /* If we have signalfd, we mask out the signals we want to handle and then
107  * use signalfd to listen for them.  We rely on whatever the current signal
108  * handler is to dispatch the signals when we receive them.
109  */
110 static void sigfd_handler(void *opaque)
111 {
112     int fd = (intptr_t)opaque;
113     struct qemu_signalfd_siginfo info;
114     struct sigaction action;
115     ssize_t len;
116
117     while (1) {
118         do {
119             len = read(fd, &info, sizeof(info));
120         } while (len == -1 && errno == EINTR);
121
122         if (len == -1 && errno == EAGAIN) {
123             break;
124         }
125
126         if (len != sizeof(info)) {
127             printf("read from sigfd returned %zd: %m\n", len);
128             return;
129         }
130
131         sigaction(info.ssi_signo, NULL, &action);
132         if ((action.sa_flags & SA_SIGINFO) && action.sa_sigaction) {
133             action.sa_sigaction(info.ssi_signo,
134                                 (siginfo_t *)&info, NULL);
135         } else if (action.sa_handler) {
136             action.sa_handler(info.ssi_signo);
137         }
138     }
139 }
140
141 static int qemu_signal_init(void)
142 {
143     int sigfd;
144     sigset_t set;
145
146     /*
147      * SIG_IPI must be blocked in the main thread and must not be caught
148      * by sigwait() in the signal thread. Otherwise, the cpu thread will
149      * not catch it reliably.
150      */
151     sigemptyset(&set);
152     sigaddset(&set, SIG_IPI);
153     sigaddset(&set, SIGIO);
154     sigaddset(&set, SIGALRM);
155     sigaddset(&set, SIGBUS);
156     pthread_sigmask(SIG_BLOCK, &set, NULL);
157
158     sigdelset(&set, SIG_IPI);
159     sigfd = qemu_signalfd(&set);
160     if (sigfd == -1) {
161         fprintf(stderr, "failed to create signalfd\n");
162         return -errno;
163     }
164
165     fcntl_setfl(sigfd, O_NONBLOCK);
166
167     qemu_set_fd_handler2(sigfd, NULL, sigfd_handler, NULL,
168                          (void *)(intptr_t)sigfd);
169
170     return 0;
171 }
172
173 #else /* _WIN32 */
174
175 static int qemu_signal_init(void)
176 {
177     return 0;
178 }
179 #endif
180
181 static AioContext *qemu_aio_context;
182
183 AioContext *qemu_get_aio_context(void)
184 {
185     return qemu_aio_context;
186 }
187
188 void qemu_notify_event(void)
189 {
190     if (!qemu_aio_context) {
191         return;
192     }
193 <<<<<<< HEAD
194
195     qemu_notify_hax_event();
196
197     if (!SetEvent(qemu_event_handle)) {
198         fprintf(stderr, "qemu_notify_event: SetEvent failed: %ld\n",
199                 GetLastError());
200         exit(1);
201     }
202 =======
203     aio_notify(qemu_aio_context);
204 >>>>>>> test1.5
205 }
206
207 static GArray *gpollfds;
208
209 int qemu_init_main_loop(void)
210 {
211     int ret;
212     GSource *src;
213
214     init_clocks();
215     if (init_timer_alarm() < 0) {
216         fprintf(stderr, "could not initialize alarm timer\n");
217         exit(1);
218     }
219
220     ret = qemu_signal_init();
221     if (ret) {
222         return ret;
223     }
224
225     gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD));
226     qemu_aio_context = aio_context_new();
227     src = aio_get_g_source(qemu_aio_context);
228     g_source_attach(src, NULL);
229     g_source_unref(src);
230     return 0;
231 }
232
233 static int max_priority;
234
235 #ifndef _WIN32
236 static int glib_pollfds_idx;
237 static int glib_n_poll_fds;
238
239 static void glib_pollfds_fill(uint32_t *cur_timeout)
240 {
241     GMainContext *context = g_main_context_default();
242     int timeout = 0;
243     int n;
244
245     g_main_context_prepare(context, &max_priority);
246
247     glib_pollfds_idx = gpollfds->len;
248     n = glib_n_poll_fds;
249     do {
250         GPollFD *pfds;
251         glib_n_poll_fds = n;
252         g_array_set_size(gpollfds, glib_pollfds_idx + glib_n_poll_fds);
253         pfds = &g_array_index(gpollfds, GPollFD, glib_pollfds_idx);
254         n = g_main_context_query(context, max_priority, &timeout, pfds,
255                                  glib_n_poll_fds);
256     } while (n != glib_n_poll_fds);
257
258     if (timeout >= 0 && timeout < *cur_timeout) {
259         *cur_timeout = timeout;
260     }
261 }
262
263 static void glib_pollfds_poll(void)
264 {
265     GMainContext *context = g_main_context_default();
266     GPollFD *pfds = &g_array_index(gpollfds, GPollFD, glib_pollfds_idx);
267
268     if (g_main_context_check(context, max_priority, pfds, glib_n_poll_fds)) {
269         g_main_context_dispatch(context);
270     }
271 }
272
273 #define MAX_MAIN_LOOP_SPIN (1000)
274
275 static int os_host_main_loop_wait(uint32_t timeout)
276 {
277     int ret;
278     static int spin_counter;
279
280     glib_pollfds_fill(&timeout);
281
282     /* If the I/O thread is very busy or we are incorrectly busy waiting in
283      * the I/O thread, this can lead to starvation of the BQL such that the
284      * VCPU threads never run.  To make sure we can detect the later case,
285      * print a message to the screen.  If we run into this condition, create
286      * a fake timeout in order to give the VCPU threads a chance to run.
287      */
288     if (spin_counter > MAX_MAIN_LOOP_SPIN) {
289         static bool notified;
290
291         if (!notified) {
292             fprintf(stderr,
293                     "main-loop: WARNING: I/O thread spun for %d iterations\n",
294                     MAX_MAIN_LOOP_SPIN);
295             notified = true;
296         }
297
298         timeout = 1;
299     }
300
301     if (timeout > 0) {
302         spin_counter = 0;
303         qemu_mutex_unlock_iothread();
304     } else {
305         spin_counter++;
306     }
307
308     ret = g_poll((GPollFD *)gpollfds->data, gpollfds->len, timeout);
309
310     if (timeout > 0) {
311         qemu_mutex_lock_iothread();
312     }
313
314     glib_pollfds_poll();
315     return ret;
316 }
317 #else
318 /***********************************************************/
319 /* Polling handling */
320
321 typedef struct PollingEntry {
322     PollingFunc *func;
323     void *opaque;
324     struct PollingEntry *next;
325 } PollingEntry;
326
327 static PollingEntry *first_polling_entry;
328
329 int qemu_add_polling_cb(PollingFunc *func, void *opaque)
330 {
331     PollingEntry **ppe, *pe;
332     pe = g_malloc0(sizeof(PollingEntry));
333     pe->func = func;
334     pe->opaque = opaque;
335     for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
336     *ppe = pe;
337     return 0;
338 }
339
340 void qemu_del_polling_cb(PollingFunc *func, void *opaque)
341 {
342     PollingEntry **ppe, *pe;
343     for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
344         pe = *ppe;
345         if (pe->func == func && pe->opaque == opaque) {
346             *ppe = pe->next;
347             g_free(pe);
348             break;
349         }
350     }
351 }
352
353 /***********************************************************/
354 /* Wait objects support */
355 typedef struct WaitObjects {
356     int num;
357     int revents[MAXIMUM_WAIT_OBJECTS + 1];
358     HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
359     WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
360     void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
361 } WaitObjects;
362
363 static WaitObjects wait_objects = {0};
364
365 int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
366 {
367     WaitObjects *w = &wait_objects;
368     if (w->num >= MAXIMUM_WAIT_OBJECTS) {
369         return -1;
370     }
371     w->events[w->num] = handle;
372     w->func[w->num] = func;
373     w->opaque[w->num] = opaque;
374     w->revents[w->num] = 0;
375     w->num++;
376     return 0;
377 }
378
379 void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
380 {
381     int i, found;
382     WaitObjects *w = &wait_objects;
383
384     found = 0;
385     for (i = 0; i < w->num; i++) {
386         if (w->events[i] == handle) {
387             found = 1;
388         }
389         if (found) {
390             w->events[i] = w->events[i + 1];
391             w->func[i] = w->func[i + 1];
392             w->opaque[i] = w->opaque[i + 1];
393             w->revents[i] = w->revents[i + 1];
394         }
395     }
396     if (found) {
397         w->num--;
398     }
399 }
400
401 void qemu_fd_register(int fd)
402 {
403     WSAEventSelect(fd, event_notifier_get_handle(&qemu_aio_context->notifier),
404                    FD_READ | FD_ACCEPT | FD_CLOSE |
405                    FD_CONNECT | FD_WRITE | FD_OOB);
406 }
407
408 static int pollfds_fill(GArray *pollfds, fd_set *rfds, fd_set *wfds,
409                         fd_set *xfds)
410 {
411     int nfds = -1;
412     int i;
413
414     for (i = 0; i < pollfds->len; i++) {
415         GPollFD *pfd = &g_array_index(pollfds, GPollFD, i);
416         int fd = pfd->fd;
417         int events = pfd->events;
418         if (events & G_IO_IN) {
419             FD_SET(fd, rfds);
420             nfds = MAX(nfds, fd);
421         }
422         if (events & G_IO_OUT) {
423             FD_SET(fd, wfds);
424             nfds = MAX(nfds, fd);
425         }
426         if (events & G_IO_PRI) {
427             FD_SET(fd, xfds);
428             nfds = MAX(nfds, fd);
429         }
430     }
431     return nfds;
432 }
433
434 static void pollfds_poll(GArray *pollfds, int nfds, fd_set *rfds,
435                          fd_set *wfds, fd_set *xfds)
436 {
437     int i;
438
439     for (i = 0; i < pollfds->len; i++) {
440         GPollFD *pfd = &g_array_index(pollfds, GPollFD, i);
441         int fd = pfd->fd;
442         int revents = 0;
443
444         if (FD_ISSET(fd, rfds)) {
445             revents |= G_IO_IN;
446         }
447         if (FD_ISSET(fd, wfds)) {
448             revents |= G_IO_OUT;
449         }
450         if (FD_ISSET(fd, xfds)) {
451             revents |= G_IO_PRI;
452         }
453         pfd->revents = revents & pfd->events;
454     }
455 }
456
457 static int os_host_main_loop_wait(uint32_t timeout)
458 {
459     GMainContext *context = g_main_context_default();
460     GPollFD poll_fds[1024 * 2]; /* this is probably overkill */
461     int select_ret = 0;
462     int g_poll_ret, ret, i, n_poll_fds;
463     PollingEntry *pe;
464     WaitObjects *w = &wait_objects;
465     gint poll_timeout;
466     static struct timeval tv0;
467     fd_set rfds, wfds, xfds;
468     int nfds;
469
470     /* XXX: need to suppress polling by better using win32 events */
471     ret = 0;
472     for (pe = first_polling_entry; pe != NULL; pe = pe->next) {
473         ret |= pe->func(pe->opaque);
474     }
475     if (ret != 0) {
476         return ret;
477     }
478
479     FD_ZERO(&rfds);
480     FD_ZERO(&wfds);
481     FD_ZERO(&xfds);
482     nfds = pollfds_fill(gpollfds, &rfds, &wfds, &xfds);
483     if (nfds >= 0) {
484         select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
485         if (select_ret != 0) {
486             timeout = 0;
487         }
488         if (select_ret > 0) {
489             pollfds_poll(gpollfds, nfds, &rfds, &wfds, &xfds);
490         }
491     }
492
493     g_main_context_prepare(context, &max_priority);
494     n_poll_fds = g_main_context_query(context, max_priority, &poll_timeout,
495                                       poll_fds, ARRAY_SIZE(poll_fds));
496     g_assert(n_poll_fds <= ARRAY_SIZE(poll_fds));
497
498     for (i = 0; i < w->num; i++) {
499         poll_fds[n_poll_fds + i].fd = (DWORD_PTR)w->events[i];
500         poll_fds[n_poll_fds + i].events = G_IO_IN;
501     }
502
503     if (poll_timeout < 0 || timeout < poll_timeout) {
504         poll_timeout = timeout;
505     }
506
507     qemu_mutex_unlock_iothread();
508     g_poll_ret = g_poll(poll_fds, n_poll_fds + w->num, poll_timeout);
509     qemu_mutex_lock_iothread();
510     if (g_poll_ret > 0) {
511         for (i = 0; i < w->num; i++) {
512             w->revents[i] = poll_fds[n_poll_fds + i].revents;
513         }
514         for (i = 0; i < w->num; i++) {
515             if (w->revents[i] && w->func[i]) {
516                 w->func[i](w->opaque[i]);
517             }
518         }
519     }
520
521     if (g_main_context_check(context, max_priority, poll_fds, n_poll_fds)) {
522         g_main_context_dispatch(context);
523     }
524
525     return select_ret || g_poll_ret;
526 }
527 #endif
528
529 int main_loop_wait(int nonblocking)
530 {
531     int ret;
532     uint32_t timeout = UINT32_MAX;
533
534     if (nonblocking) {
535         timeout = 0;
536     }
537
538     /* poll any events */
539     g_array_set_size(gpollfds, 0); /* reset for new iteration */
540     /* XXX: separate device handlers from system ones */
541 #ifdef CONFIG_SLIRP
542     slirp_update_timeout(&timeout);
543     slirp_pollfds_fill(gpollfds);
544 #endif
545     qemu_iohandler_fill(gpollfds);
546     ret = os_host_main_loop_wait(timeout);
547     qemu_iohandler_poll(gpollfds, ret);
548 #ifdef CONFIG_SLIRP
549     slirp_pollfds_poll(gpollfds, (ret < 0));
550 #endif
551
552     qemu_run_all_timers();
553
554     return ret;
555 }
556
557 /* Functions to operate on the main QEMU AioContext.  */
558
559 QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
560 {
561     return aio_bh_new(qemu_aio_context, cb, opaque);
562 }
563
564 bool qemu_aio_wait(void)
565 {
566     return aio_poll(qemu_aio_context, true);
567 }
568
569 #ifdef CONFIG_POSIX
570 void qemu_aio_set_fd_handler(int fd,
571                              IOHandler *io_read,
572                              IOHandler *io_write,
573                              AioFlushHandler *io_flush,
574                              void *opaque)
575 {
576     aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, io_flush,
577                        opaque);
578 }
579 #endif
580
581 void qemu_aio_set_event_notifier(EventNotifier *notifier,
582                                  EventNotifierHandler *io_read,
583                                  AioFlushEventNotifierHandler *io_flush)
584 {
585     aio_set_event_notifier(qemu_aio_context, notifier, io_read, io_flush);
586 }