diff options
-rw-r--r-- | docs/qapi-code-gen.txt | 2 | ||||
-rw-r--r-- | hw/pci-stub.c | 2 | ||||
-rw-r--r-- | iohandler.c | 57 | ||||
-rw-r--r-- | libcacard/vscclient.c | 2 | ||||
-rw-r--r-- | memory.c | 2 | ||||
-rw-r--r-- | qemu-ga.c | 2 | ||||
-rw-r--r-- | rules.mak | 2 | ||||
-rw-r--r-- | tcg/ppc/tcg-target.c | 20 | ||||
-rw-r--r-- | vl.c | 74 |
9 files changed, 146 insertions, 17 deletions
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt index b7befb5e4..f345866f5 100644 --- a/docs/qapi-code-gen.txt +++ b/docs/qapi-code-gen.txt @@ -229,7 +229,7 @@ in the schema. The following files are generated: $(prefix)qmp-marshal.c: command marshal/dispatch functions for each QMP command defined in the schema. Functions generated by qapi-visit.py are used to - convert QObjects recieved from the wire into + convert QObjects received from the wire into function parameters, and uses the same visitor functions to convert native C return values to QObjects from transmission back diff --git a/hw/pci-stub.c b/hw/pci-stub.c index c5a0aa897..1fb105d51 100644 --- a/hw/pci-stub.c +++ b/hw/pci-stub.c @@ -1,5 +1,5 @@ /* - * PCI stubs for plathome that doesn't support pci bus. + * PCI stubs for platforms that don't support pci bus. * * Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp> * VA Linux Systems Japan K.K. diff --git a/iohandler.c b/iohandler.c index 4deae1e6a..5ef66fb6e 100644 --- a/iohandler.c +++ b/iohandler.c @@ -80,12 +80,67 @@ int qemu_set_fd_handler2(int fd, return 0; } +typedef struct IOTrampoline +{ + GIOChannel *chan; + IOHandler *fd_read; + IOHandler *fd_write; + void *opaque; + guint tag; +} IOTrampoline; + +static gboolean fd_trampoline(GIOChannel *chan, GIOCondition cond, gpointer opaque) +{ + IOTrampoline *tramp = opaque; + + if (tramp->opaque == NULL) { + return FALSE; + } + + if ((cond & G_IO_IN) && tramp->fd_read) { + tramp->fd_read(tramp->opaque); + } + + if ((cond & G_IO_OUT) && tramp->fd_write) { + tramp->fd_write(tramp->opaque); + } + + return TRUE; +} + int qemu_set_fd_handler(int fd, IOHandler *fd_read, IOHandler *fd_write, void *opaque) { - return qemu_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque); + static IOTrampoline fd_trampolines[FD_SETSIZE]; + IOTrampoline *tramp = &fd_trampolines[fd]; + + if (tramp->tag != 0) { + g_io_channel_unref(tramp->chan); + g_source_remove(tramp->tag); + } + + if (opaque) { + GIOCondition cond = 0; + + tramp->fd_read = fd_read; + tramp->fd_write = fd_write; + tramp->opaque = opaque; + + if (fd_read) { + cond |= G_IO_IN | G_IO_ERR; + } + + if (fd_write) { + cond |= G_IO_OUT | G_IO_ERR; + } + + tramp->chan = g_io_channel_unix_new(fd); + tramp->tag = g_io_add_watch(tramp->chan, cond, fd_trampoline, tramp); + } + + return 0; } void qemu_iohandler_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds) diff --git a/libcacard/vscclient.c b/libcacard/vscclient.c index a7b38340d..2191f6038 100644 --- a/libcacard/vscclient.c +++ b/libcacard/vscclient.c @@ -585,7 +585,7 @@ main( printf(" recv APDU: "); print_byte_array(pbSendBuffer, mhHeader.length); } - /* Transmit recieved APDU */ + /* Transmit received APDU */ dwSendLength = mhHeader.length; dwRecvLength = sizeof(pbRecvBuffer); reader = vreader_get_reader_by_id(mhHeader.reader_id); @@ -1063,7 +1063,7 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr) assert(mr->terminates); - return qemu_get_ram_ptr(mr->ram_addr); + return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK); } static void memory_region_update_coalesced_range(MemoryRegion *mr) @@ -51,7 +51,7 @@ static struct GAState *ga_state; static void quit_handler(int sig) { - g_debug("recieved signal num %d, quitting", sig); + g_debug("received signal num %d, quitting", sig); if (g_main_loop_is_running(ga_state->main_loop)) { g_main_loop_quit(ga_state->main_loop); @@ -31,7 +31,7 @@ endif %.o: %.m $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," OBJC $(TARGET_DIR)$@") -LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS)," LINK $(TARGET_DIR)$@") +LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(sort $(1)) $(LIBS)," LINK $(TARGET_DIR)$@") %$(EXESUF): %.o $(call LINK,$^) diff --git a/tcg/ppc/tcg-target.c b/tcg/ppc/tcg-target.c index 4462647ef..87cc1177f 100644 --- a/tcg/ppc/tcg-target.c +++ b/tcg/ppc/tcg-target.c @@ -525,14 +525,14 @@ static void *qemu_st_helpers[4] = { static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) { - int addr_reg, data_reg, data_reg2, r0, r1, rbase, mem_index, s_bits, bswap; + int addr_reg, data_reg, data_reg2, r0, r1, rbase, bswap; #ifdef CONFIG_SOFTMMU - int r2; + int mem_index, s_bits, r2; void *label1_ptr, *label2_ptr; -#endif #if TARGET_LONG_BITS == 64 int addr_reg2; #endif +#endif data_reg = *args++; if (opc == 3) @@ -540,13 +540,13 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) else data_reg2 = 0; addr_reg = *args++; + +#ifdef CONFIG_SOFTMMU #if TARGET_LONG_BITS == 64 addr_reg2 = *args++; #endif mem_index = *args; s_bits = opc & 3; - -#ifdef CONFIG_SOFTMMU r0 = 3; r1 = 4; r2 = 0; @@ -722,14 +722,14 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) { - int addr_reg, r0, r1, data_reg, data_reg2, mem_index, bswap, rbase; + int addr_reg, r0, r1, data_reg, data_reg2, bswap, rbase; #ifdef CONFIG_SOFTMMU - int r2, ir; + int mem_index, r2, ir; void *label1_ptr, *label2_ptr; -#endif #if TARGET_LONG_BITS == 64 int addr_reg2; #endif +#endif data_reg = *args++; if (opc == 3) @@ -737,12 +737,12 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc) else data_reg2 = 0; addr_reg = *args++; + +#ifdef CONFIG_SOFTMMU #if TARGET_LONG_BITS == 64 addr_reg2 = *args++; #endif mem_index = *args; - -#ifdef CONFIG_SOFTMMU r0 = 3; r1 = 4; r2 = 0; @@ -111,6 +111,8 @@ int main(int argc, char **argv) #define main qemu_main #endif /* CONFIG_COCOA */ +#include <glib.h> + #include "hw/hw.h" #include "hw/boards.h" #include "hw/usb.h" @@ -1321,6 +1323,75 @@ void qemu_system_vmstop_request(int reason) qemu_notify_event(); } +static GPollFD poll_fds[1024 * 2]; /* this is probably overkill */ +static int n_poll_fds; +static int max_priority; + +static void glib_select_fill(int *max_fd, fd_set *rfds, fd_set *wfds, + fd_set *xfds, struct timeval *tv) +{ + GMainContext *context = g_main_context_default(); + int i; + int timeout = 0, cur_timeout; + + g_main_context_prepare(context, &max_priority); + + n_poll_fds = g_main_context_query(context, max_priority, &timeout, + poll_fds, ARRAY_SIZE(poll_fds)); + g_assert(n_poll_fds <= ARRAY_SIZE(poll_fds)); + + for (i = 0; i < n_poll_fds; i++) { + GPollFD *p = &poll_fds[i]; + + if ((p->events & G_IO_IN)) { + FD_SET(p->fd, rfds); + *max_fd = MAX(*max_fd, p->fd); + } + if ((p->events & G_IO_OUT)) { + FD_SET(p->fd, wfds); + *max_fd = MAX(*max_fd, p->fd); + } + if ((p->events & G_IO_ERR)) { + FD_SET(p->fd, xfds); + *max_fd = MAX(*max_fd, p->fd); + } + } + + cur_timeout = (tv->tv_sec * 1000) + ((tv->tv_usec + 500) / 1000); + if (timeout >= 0 && timeout < cur_timeout) { + tv->tv_sec = timeout / 1000; + tv->tv_usec = (timeout % 1000) * 1000; + } +} + +static void glib_select_poll(fd_set *rfds, fd_set *wfds, fd_set *xfds, + bool err) +{ + GMainContext *context = g_main_context_default(); + + if (!err) { + int i; + + for (i = 0; i < n_poll_fds; i++) { + GPollFD *p = &poll_fds[i]; + + if ((p->events & G_IO_IN) && FD_ISSET(p->fd, rfds)) { + p->revents |= G_IO_IN; + } + if ((p->events & G_IO_OUT) && FD_ISSET(p->fd, wfds)) { + p->revents |= G_IO_OUT; + } + if ((p->events & G_IO_ERR) && FD_ISSET(p->fd, xfds)) { + p->revents |= G_IO_ERR; + } + } + } + + if (g_main_context_check(context, max_priority, poll_fds, n_poll_fds)) { + g_main_context_dispatch(context); + } +} + int main_loop_wait(int nonblocking) { fd_set rfds, wfds, xfds; @@ -1346,8 +1417,10 @@ int main_loop_wait(int nonblocking) FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&xfds); + qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds); slirp_select_fill(&nfds, &rfds, &wfds, &xfds); + glib_select_fill(&nfds, &rfds, &wfds, &xfds, &tv); if (timeout > 0) { qemu_mutex_unlock_iothread(); @@ -1361,6 +1434,7 @@ int main_loop_wait(int nonblocking) qemu_iohandler_poll(&rfds, &wfds, &xfds, ret); slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0)); + glib_select_poll(&rfds, &wfds, &xfds, (ret < 0)); qemu_run_all_timers(); |