From 4e3afe59683350983aa7ffece47e75c828f181d2 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Sat, 23 May 2009 23:25:07 +0100 Subject: qemu: Switch to git and version 0.10.5 Signed-off-by: Richard Purdie --- meta/conf/distro/include/poky-fixed-revisions.inc | 3 +- .../qemu-0.9.1+svnr6477/06_exit_segfault.patch | 45 - .../qemu-0.9.1+svnr6477/11_signal_sigaction.patch | 21 - .../qemu-0.9.1+svnr6477/22_net_tuntap_stall.patch | 18 - .../qemu/qemu-0.9.1+svnr6477/31_syscalls.patch | 27 - .../qemu-0.9.1+svnr6477/52_ne2000_return.patch | 17 - .../qemu/qemu-0.9.1+svnr6477/63_sparc_build.patch | 18 - .../64_ppc_asm_constraints.patch | 18 - .../qemu/qemu-0.9.1+svnr6477/66_tls_ld.patch | 55 - .../qemu-0.9.1+svnr6477/91-oh-sdl-cursor.patch | 18 - .../qemu/qemu-0.9.1+svnr6477/fix-dirent.patch | 12 - .../qemu/qemu-0.9.1+svnr6477/no-strip.patch | 22 - .../qemu-add-gl-host-code.patch | 33916 ------------------- .../qemu-amd64-32b-mapping-0.9.0.patch | 37 - meta/packages/qemu/qemu-0.9.1+svnr6477/series | 13 - .../workaround_bad_futex_headers.patch | 24 - meta/packages/qemu/qemu-git/06_exit_segfault.patch | 45 + .../qemu/qemu-git/11_signal_sigaction.patch | 21 + .../qemu/qemu-git/22_net_tuntap_stall.patch | 18 + meta/packages/qemu/qemu-git/31_syscalls.patch | 27 + meta/packages/qemu/qemu-git/52_ne2000_return.patch | 17 + meta/packages/qemu/qemu-git/63_sparc_build.patch | 18 + .../qemu/qemu-git/64_ppc_asm_constraints.patch | 18 + meta/packages/qemu/qemu-git/66_tls_ld.patch | 55 + meta/packages/qemu/qemu-git/91-oh-sdl-cursor.patch | 18 + meta/packages/qemu/qemu-git/fix-dirent.patch | 12 + meta/packages/qemu/qemu-git/no-strip.patch | 22 + .../qemu/qemu-git/qemu-add-gl-host-code.patch | 33831 ++++++++++++++++++ .../qemu-git/qemu-amd64-32b-mapping-0.9.0.patch | 37 + meta/packages/qemu/qemu-git/series | 13 + .../qemu-git/workaround_bad_futex_headers.patch | 24 + meta/packages/qemu/qemu-native_git.bb | 2 + meta/packages/qemu/qemu-native_svn.bb | 2 - meta/packages/qemu/qemu-sdk_git.bb | 6 + meta/packages/qemu/qemu-sdk_svn.bb | 6 - meta/packages/qemu/qemu_git.bb | 36 + meta/packages/qemu/qemu_svn.bb | 35 - 37 files changed, 34222 insertions(+), 34305 deletions(-) delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/06_exit_segfault.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/11_signal_sigaction.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/22_net_tuntap_stall.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/31_syscalls.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/52_ne2000_return.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/63_sparc_build.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/64_ppc_asm_constraints.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/66_tls_ld.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/91-oh-sdl-cursor.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/fix-dirent.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/no-strip.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/qemu-add-gl-host-code.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/qemu-amd64-32b-mapping-0.9.0.patch delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/series delete mode 100644 meta/packages/qemu/qemu-0.9.1+svnr6477/workaround_bad_futex_headers.patch create mode 100644 meta/packages/qemu/qemu-git/06_exit_segfault.patch create mode 100644 meta/packages/qemu/qemu-git/11_signal_sigaction.patch create mode 100644 meta/packages/qemu/qemu-git/22_net_tuntap_stall.patch create mode 100644 meta/packages/qemu/qemu-git/31_syscalls.patch create mode 100644 meta/packages/qemu/qemu-git/52_ne2000_return.patch create mode 100644 meta/packages/qemu/qemu-git/63_sparc_build.patch create mode 100644 meta/packages/qemu/qemu-git/64_ppc_asm_constraints.patch create mode 100644 meta/packages/qemu/qemu-git/66_tls_ld.patch create mode 100644 meta/packages/qemu/qemu-git/91-oh-sdl-cursor.patch create mode 100644 meta/packages/qemu/qemu-git/fix-dirent.patch create mode 100644 meta/packages/qemu/qemu-git/no-strip.patch create mode 100644 meta/packages/qemu/qemu-git/qemu-add-gl-host-code.patch create mode 100644 meta/packages/qemu/qemu-git/qemu-amd64-32b-mapping-0.9.0.patch create mode 100644 meta/packages/qemu/qemu-git/series create mode 100644 meta/packages/qemu/qemu-git/workaround_bad_futex_headers.patch create mode 100644 meta/packages/qemu/qemu-native_git.bb delete mode 100644 meta/packages/qemu/qemu-native_svn.bb create mode 100644 meta/packages/qemu/qemu-sdk_git.bb delete mode 100644 meta/packages/qemu/qemu-sdk_svn.bb create mode 100644 meta/packages/qemu/qemu_git.bb delete mode 100644 meta/packages/qemu/qemu_svn.bb diff --git a/meta/conf/distro/include/poky-fixed-revisions.inc b/meta/conf/distro/include/poky-fixed-revisions.inc index a1f0029673..63895234f7 100644 --- a/meta/conf/distro/include/poky-fixed-revisions.inc +++ b/meta/conf/distro/include/poky-fixed-revisions.inc @@ -84,7 +84,8 @@ SRCREV_pn-oprofileui ?= "194" SRCREV_pn-libowl-av = "398" SRCREV_pn-owl-video = "394" SRCREV_pn-psplash ?= "420" -QEMUSRCREV = "6477" +#QEMUSRCREV = "6477" +QEMUSRCREV = "9e3a7df77c6c456ff58ab9931cb86e3d5983404d" SRCREV_pn-qemu-native ?= "${QEMUSRCREV}" SRCREV_pn-qemu-sdk ?= "${QEMUSRCREV}" SRCREV_pn-qemu ?= "${QEMUSRCREV}" diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/06_exit_segfault.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/06_exit_segfault.patch deleted file mode 100644 index 06123d0626..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/06_exit_segfault.patch +++ /dev/null @@ -1,45 +0,0 @@ -#DPATCHLEVEL=0 ---- -# linux-user/main.c | 8 ++++---- -# 1 file changed, 4 insertions(+), 4 deletions(-) -# -Index: linux-user/main.c -=================================================================== ---- linux-user/main.c.orig 2007-12-03 23:47:25.000000000 +0000 -+++ linux-user/main.c 2007-12-03 23:47:41.000000000 +0000 -@@ -714,7 +714,7 @@ void cpu_loop (CPUSPARCState *env) - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); -- exit (1); -+ _exit (1); - } - process_pending_signals (env); - } -@@ -1634,7 +1634,7 @@ void cpu_loop (CPUState *env) - default: - printf ("Unhandled trap: 0x%x\n", trapnr); - cpu_dump_state(env, stderr, fprintf, 0); -- exit (1); -+ _exit (1); - } - process_pending_signals (env); - } -@@ -1954,7 +1954,7 @@ int main(int argc, char **argv) - for(item = cpu_log_items; item->mask != 0; item++) { - printf("%-10s %s\n", item->name, item->help); - } -- exit(1); -+ _exit(1); - } - cpu_set_log(mask); - } else if (!strcmp(r, "s")) { -@@ -1973,7 +1973,7 @@ int main(int argc, char **argv) - if (qemu_host_page_size == 0 || - (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) { - fprintf(stderr, "page size must be a power of two\n"); -- exit(1); -+ _exit(1); - } - } else if (!strcmp(r, "g")) { - gdbstub_port = atoi(argv[optind++]); diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/11_signal_sigaction.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/11_signal_sigaction.patch deleted file mode 100644 index 33c5e8b12d..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/11_signal_sigaction.patch +++ /dev/null @@ -1,21 +0,0 @@ -#DPATCHLEVEL=0 ---- -# linux-user/signal.c | 5 +++++ -# 1 file changed, 5 insertions(+) -# -Index: linux-user/signal.c -=================================================================== ---- linux-user/signal.c.orig 2007-12-03 23:47:44.000000000 +0000 -+++ linux-user/signal.c 2007-12-03 23:47:46.000000000 +0000 -@@ -512,6 +512,11 @@ int do_sigaction(int sig, const struct t - - if (sig < 1 || sig > TARGET_NSIG || sig == SIGKILL || sig == SIGSTOP) - return -EINVAL; -+ -+ /* no point doing the stuff as those are not allowed for sigaction */ -+ if ((sig == TARGET_SIGKILL) || (sig == TARGET_SIGSTOP)) -+ return -EINVAL; -+ - k = &sigact_table[sig - 1]; - #if defined(DEBUG_SIGNAL) - fprintf(stderr, "sigaction sig=%d act=0x%08x, oact=0x%08x\n", diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/22_net_tuntap_stall.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/22_net_tuntap_stall.patch deleted file mode 100644 index f2bfbc9102..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/22_net_tuntap_stall.patch +++ /dev/null @@ -1,18 +0,0 @@ -#DPATCHLEVEL=0 ---- -# vl.c | 2 +- -# 1 file changed, 1 insertion(+), 1 deletion(-) -# -Index: net.c -=================================================================== ---- net.c.orig 2009-01-05 11:27:29.000000000 +0000 -+++ net.c 2009-01-05 11:27:40.000000000 +0000 -@@ -852,7 +852,7 @@ - return -1; - } - memset(&ifr, 0, sizeof(ifr)); -- ifr.ifr_flags = IFF_TAP | IFF_NO_PI; -+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_ONE_QUEUE;; - if (ifname[0] != '\0') - pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname); - else diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/31_syscalls.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/31_syscalls.patch deleted file mode 100644 index df2aa84bb1..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/31_syscalls.patch +++ /dev/null @@ -1,27 +0,0 @@ -#DPATCHLEVEL=0 ---- -# linux-user/syscall.c | 11 ++++++++--- -# 1 file changed, 8 insertions(+), 3 deletions(-) -# -Index: linux-user/syscall.c -=================================================================== ---- linux-user/syscall.c.orig 2009-01-05 12:32:37.000000000 +0000 -+++ linux-user/syscall.c 2009-01-05 12:32:37.000000000 +0000 -@@ -298,6 +298,7 @@ - extern int setfsuid(int); - extern int setfsgid(int); - extern int setgroups(int, gid_t *); -+extern int uselib(const char*); - - #define ERRNO_TABLE_SIZE 1200 - -@@ -4397,7 +4398,8 @@ - #endif - #ifdef TARGET_NR_uselib - case TARGET_NR_uselib: -- goto unimplemented; -+ ret = get_errno(uselib(path((const char*)arg1))); -+ break; - #endif - #ifdef TARGET_NR_swapon - case TARGET_NR_swapon: diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/52_ne2000_return.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/52_ne2000_return.patch deleted file mode 100644 index e4ea33f2c6..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/52_ne2000_return.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- - hw/ne2000.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: qemu/hw/ne2000.c -=================================================================== ---- qemu.orig/hw/ne2000.c 2007-12-03 19:32:52.000000000 +0000 -+++ qemu/hw/ne2000.c 2007-12-03 19:33:55.000000000 +0000 -@@ -217,7 +217,7 @@ static int ne2000_can_receive(void *opaq - NE2000State *s = opaque; - - if (s->cmd & E8390_STOP) -- return 1; -+ return 0; - return !ne2000_buffer_full(s); - } - diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/63_sparc_build.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/63_sparc_build.patch deleted file mode 100644 index 37b38f641b..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/63_sparc_build.patch +++ /dev/null @@ -1,18 +0,0 @@ -#DPATCHLEVEL=0 ---- -# sparc.ld | 2 +- -# 1 file changed, 1 insertion(+), 1 deletion(-) -# -Index: sparc.ld -=================================================================== ---- sparc.ld.orig 2007-12-03 15:40:26.000000000 +0000 -+++ sparc.ld 2007-12-03 16:05:06.000000000 +0000 -@@ -6,7 +6,7 @@ ENTRY(_start) - SECTIONS - { - /* Read-only sections, merged into text segment: */ -- . = 0x60000000 + SIZEOF_HEADERS; -+ . = 0x60000000 + 0x400; - .interp : { *(.interp) } - .hash : { *(.hash) } - .dynsym : { *(.dynsym) } diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/64_ppc_asm_constraints.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/64_ppc_asm_constraints.patch deleted file mode 100644 index e4858b79d7..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/64_ppc_asm_constraints.patch +++ /dev/null @@ -1,18 +0,0 @@ -#DPATCHLEVEL=1 ---- -# cpu-all.h | 2 +- -# 1 file changed, 1 insertion(+), 1 deletion(-) -# -Index: qemu/cpu-all.h -=================================================================== ---- qemu.orig/cpu-all.h 2007-06-13 11:48:22.000000000 +0100 -+++ qemu/cpu-all.h 2007-06-13 11:51:56.000000000 +0100 -@@ -250,7 +250,7 @@ static inline void stw_le_p(void *ptr, i - static inline void stl_le_p(void *ptr, int v) - { - #ifdef __powerpc__ -- __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr)); -+ __asm__ __volatile__ ("stwbrx %0,0,%1" : : "r" (v), "r" (ptr) : "memory"); - #else - uint8_t *p = ptr; - p[0] = v; diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/66_tls_ld.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/66_tls_ld.patch deleted file mode 100644 index 54e02eff8b..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/66_tls_ld.patch +++ /dev/null @@ -1,55 +0,0 @@ ---- - arm.ld | 7 +++++++ - i386.ld | 7 +++++++ - 2 files changed, 14 insertions(+) - -Index: arm.ld -=================================================================== ---- arm.ld.orig 2007-06-13 11:48:22.000000000 +0100 -+++ arm.ld 2007-06-13 11:51:56.000000000 +0100 -@@ -26,6 +26,10 @@ SECTIONS - { *(.rel.rodata) *(.rel.gnu.linkonce.r*) } - .rela.rodata : - { *(.rela.rodata) *(.rela.gnu.linkonce.r*) } -+ .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } -+ .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } -+ .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } -+ .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.ctors : { *(.rel.ctors) } -@@ -58,6 +62,9 @@ SECTIONS - .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } - __exidx_end = .; - .reginfo : { *(.reginfo) } -+ /* Thread Local Storage sections */ -+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } -+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } - /* Adjust the address for the data segment. We want to adjust up to - the same address within the page on the next page up. */ - . = ALIGN(0x100000) + (. & (0x100000 - 1)); -Index: i386.ld -=================================================================== ---- i386.ld.orig 2007-06-13 11:48:22.000000000 +0100 -+++ i386.ld 2007-06-13 11:51:56.000000000 +0100 -@@ -28,6 +28,10 @@ SECTIONS - { *(.rel.rodata) *(.rel.gnu.linkonce.r*) } - .rela.rodata : - { *(.rela.rodata) *(.rela.gnu.linkonce.r*) } -+ .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } -+ .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } -+ .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } -+ .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } - .rel.got : { *(.rel.got) } - .rela.got : { *(.rela.got) } - .rel.ctors : { *(.rel.ctors) } -@@ -53,6 +57,9 @@ SECTIONS - _etext = .; - PROVIDE (etext = .); - .fini : { *(.fini) } =0x47ff041f -+ /* Thread Local Storage sections */ -+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } -+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } - . = ALIGN(32 / 8); - PROVIDE (__preinit_array_start = .); - .preinit_array : { *(.preinit_array) } diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/91-oh-sdl-cursor.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/91-oh-sdl-cursor.patch deleted file mode 100644 index 0d60c1c306..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/91-oh-sdl-cursor.patch +++ /dev/null @@ -1,18 +0,0 @@ -=== modified file 'sdl.c' ---- - sdl.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: sdl.c -=================================================================== ---- sdl.c.orig 2007-12-03 19:32:15.000000000 +0000 -+++ sdl.c 2007-12-03 19:34:04.000000000 +0000 -@@ -247,7 +247,7 @@ static void sdl_hide_cursor(void) - - if (kbd_mouse_is_absolute()) { - SDL_ShowCursor(1); -- SDL_SetCursor(sdl_cursor_hidden); -+ /* SDL_SetCursor(sdl_cursor_hidden); */ - } else { - SDL_ShowCursor(0); - } diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/fix-dirent.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/fix-dirent.patch deleted file mode 100644 index 575dbfa0c9..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/fix-dirent.patch +++ /dev/null @@ -1,12 +0,0 @@ -Index: trunk/linux-user/syscall.c -=================================================================== ---- trunk.orig/linux-user/syscall.c 2009-01-05 12:51:52.000000000 +0000 -+++ trunk/linux-user/syscall.c 2009-01-05 12:51:52.000000000 +0000 -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/no-strip.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/no-strip.patch deleted file mode 100644 index fc69b37e16..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/no-strip.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- qemu.orig/Makefile 2008-01-29 23:16:27.000000000 -0800 -+++ qemu-0.9.1/Makefile 2008-01-29 23:16:38.000000000 -0800 -@@ -174,7 +174,7 @@ - install: all $(if $(BUILD_DOCS),install-doc) - mkdir -p "$(DESTDIR)$(bindir)" - ifneq ($(TOOLS),) -- $(INSTALL) -m 755 -s $(TOOLS) "$(DESTDIR)$(bindir)" -+ $(INSTALL) -m 755 $(TOOLS) "$(DESTDIR)$(bindir)" - endif - mkdir -p "$(DESTDIR)$(datadir)" - for x in bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \ ---- qemu.orig/Makefile.target 2008-01-29 23:16:27.000000000 -0800 -+++ qemu-0.9.1/Makefile.target 2008-01-29 23:17:33.000000000 -0800 -@@ -632,7 +632,7 @@ - - install: all - ifneq ($(PROGS),) -- $(INSTALL) -m 755 -s $(PROGS) "$(DESTDIR)$(bindir)" -+ $(INSTALL) -m 755 $(PROGS) "$(DESTDIR)$(bindir)" - endif - - ifneq ($(wildcard .depend),) diff --git a/meta/packages/qemu/qemu-0.9.1+svnr6477/qemu-add-gl-host-code.patch b/meta/packages/qemu/qemu-0.9.1+svnr6477/qemu-add-gl-host-code.patch deleted file mode 100644 index bffd8a62db..0000000000 --- a/meta/packages/qemu/qemu-0.9.1+svnr6477/qemu-add-gl-host-code.patch +++ /dev/null @@ -1,33916 +0,0 @@ -Index: trunk/Makefile.target -=================================================================== ---- trunk.orig/Makefile.target 2009-01-30 11:37:38.000000000 +0000 -+++ trunk/Makefile.target 2009-01-30 11:46:55.000000000 +0000 -@@ -153,6 +153,12 @@ - CPPFLAGS+=-I$(SRC_PATH)/fpu - LIBOBJS+= op_helper.o helper.o - -+ifeq ($(TARGET_BASE_ARCH), i386) -+LIBOBJS+=helper_opengl.o opengl_exec.o -+else -+LIBOBJS+=opengl_dummy.o -+endif -+ - ifeq ($(TARGET_BASE_ARCH), arm) - LIBOBJS+= neon_helper.o iwmmxt_helper.o - endif -@@ -224,6 +230,21 @@ - - cpu-exec.o: CFLAGS += $(HELPER_CFLAGS) - -+parse_gl_h: parse_gl_h.c -+ $(CC) -g -o $@ $< -+server_stub.c: parse_gl_h -+ ./parse_gl_h -+gl_func.h: parse_gl_h -+ ./parse_gl_h -+GL_CFLAGS := -Wall -g -O2 -fno-strict-aliasing -+opengl_func.h: gl_func.h -+helper_opengl.o: helper_opengl.c opengl_func.h server_stub.c -+ $(CC) $(GL_CFLAGS) $(DEFINES) -c -o $@ $< -I.. -I. -I../fpu -I../target-i386 -DNEED_CPU_H -+gl_beginend.h: ../target-i386/beginend_funcs.sh -+ $< > $@ -+opengl_exec.o : opengl_exec.c server_stub.c gl_func.h opengl_func.h gl_beginend.h -+ $(CC) $(GL_CFLAGS) $(DEFINES) -c -o $@ $< -I. -I../target-i386 -+ - ######################################################### - # Linux user emulator target - -@@ -580,7 +601,7 @@ - OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pcspk.o pc.o - OBJS+= cirrus_vga.o apic.o parallel.o acpi.o piix_pci.o - OBJS+= usb-uhci.o vmmouse.o vmport.o vmware_vga.o hpet.o --CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE -+CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE -DTARGET_OPENGL_OK - endif - ifeq ($(TARGET_BASE_ARCH), ppc) - CPPFLAGS += -DHAS_AUDIO -DHAS_AUDIO_CHOICE -@@ -717,7 +738,7 @@ - main.o: CFLAGS+=-p - endif - --$(QEMU_PROG): LIBS += $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS) -+$(QEMU_PROG): LIBS += $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS) -lGL -lGLU - - $(QEMU_PROG): $(OBJS) ../libqemu_common.a libqemu.a - $(LINK) -Index: trunk/hw/vmware_vga.c -=================================================================== ---- trunk.orig/hw/vmware_vga.c 2009-01-30 11:37:36.000000000 +0000 -+++ trunk/hw/vmware_vga.c 2009-01-30 11:39:42.000000000 +0000 -@@ -484,6 +484,8 @@ - - #define CMD(f) le32_to_cpu(s->cmd->f) - -+static uint32_t last_cmd; -+ - static inline int vmsvga_fifo_empty(struct vmsvga_state_s *s) - { - if (!s->config || !s->enable) -@@ -493,11 +495,18 @@ - - static inline uint32_t vmsvga_fifo_read_raw(struct vmsvga_state_s *s) - { -- uint32_t cmd = s->fifo[CMD(stop) >> 2]; -- s->cmd->stop = cpu_to_le32(CMD(stop) + 4); -- if (CMD(stop) >= CMD(max)) -+ int offset = CMD(stop); -+ -+ if (unlikely(s->cmd->next_cmd == s->cmd->stop)) { -+ fprintf(stderr, "%s: FIFO empty during CMD %i\n", -+ __FUNCTION__, last_cmd); -+ return 0x00000000; -+ } -+ -+ s->cmd->stop = cpu_to_le32(offset + 4); -+ if (offset + 4 >= CMD(max)) - s->cmd->stop = s->cmd->min; -- return cmd; -+ return s->fifo[offset >> 2]; - } - - static inline uint32_t vmsvga_fifo_read(struct vmsvga_state_s *s) -@@ -507,12 +516,12 @@ - - static void vmsvga_fifo_run(struct vmsvga_state_s *s) - { -- uint32_t cmd, colour; -+ uint32_t colour; - int args = 0; - int x, y, dx, dy, width, height; - struct vmsvga_cursor_definition_s cursor; - while (!vmsvga_fifo_empty(s)) -- switch (cmd = vmsvga_fifo_read(s)) { -+ switch (last_cmd = vmsvga_fifo_read(s)) { - case SVGA_CMD_UPDATE: - case SVGA_CMD_UPDATE_VERBOSE: - x = vmsvga_fifo_read(s); -@@ -612,7 +621,7 @@ - while (args --) - vmsvga_fifo_read(s); - printf("%s: Unknown command 0x%02x in SVGA command FIFO\n", -- __FUNCTION__, cmd); -+ __FUNCTION__, last_cmd); - break; - } - -Index: trunk/kqemu.c -=================================================================== ---- trunk.orig/kqemu.c 2009-01-21 11:45:11.000000000 +0000 -+++ trunk/kqemu.c 2009-01-30 11:39:42.000000000 +0000 -@@ -93,6 +93,8 @@ - int qpi_io_memory; - uint32_t kqemu_comm_base; /* physical address of the QPI communication page */ - -+extern int enable_gl; -+ - #define cpuid(index, eax, ebx, ecx, edx) \ - asm volatile ("cpuid" \ - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) \ -@@ -860,6 +862,22 @@ - else - env->hflags &= ~HF_OSFXSR_MASK; - -+ /* OPENGL Stuff */ -+ if (enable_gl && ((env->hflags & HF_CPL_MASK) == 3)) { -+ int index = (env->eip >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); -+ if (env->segs[R_CS].base != 0) -+ fprintf(stderr, "env->segs[R_CS].base != 0 !\n"); -+ else if (__builtin_expect(env->tlb_table[1][index].addr_code != -+ (env->eip & TARGET_PAGE_MASK), 0)) -+ ldub_code(env->eip); -+ -+ if (env->tlb_table[1][index].addend) { -+ unsigned char *ptr = env->eip + env->tlb_table[1][index].addend; -+ if (ptr[0] == 0xCD && ptr[1] == 0x99) -+ helper_opengl(); -+ } -+ } -+ - LOG_INT("kqemu: kqemu_cpu_exec: ret=0x%x\n", ret); - if (ret == KQEMU_RET_SYSCALL) { - /* syscall instruction */ -Index: trunk/sdl.c -=================================================================== ---- trunk.orig/sdl.c 2009-01-30 11:39:42.000000000 +0000 -+++ trunk/sdl.c 2009-01-30 11:45:37.000000000 +0000 -@@ -26,6 +26,7 @@ - #include "sysemu.h" - - #include -+#include - - #ifndef _WIN32 - #include -@@ -52,6 +53,8 @@ - static int guest_x, guest_y; - static SDL_Cursor *guest_sprite = 0; - -+extern void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window); -+ - static void sdl_update(DisplayState *ds, int x, int y, int w, int h) - { - SDL_Rect rec; -@@ -83,6 +86,7 @@ - - static void sdl_resize(DisplayState *ds) - { -+ SDL_SysWMinfo info; - int flags; - - // printf("resizing to %d %d\n", w, h); -@@ -93,6 +97,15 @@ - if (gui_noframe) - flags |= SDL_NOFRAME; - -+ if (ds_get_data(ds) != NULL) { -+ SDL_VERSION(&info.version); -+ SDL_GetWMInfo(&info); -+ if (info.subsystem == SDL_SYSWM_X11 && info.info.x11.display) -+ opengl_exec_set_parent_window(info.info.x11.display, -+ RootWindow(info.info.x11.display, -+ DefaultScreen(info.info.x11.display))); -+ } -+ - width = ds_get_width(ds); - height = ds_get_height(ds); - real_screen = SDL_SetVideoMode(width, height, 0, flags); -@@ -101,6 +114,11 @@ - exit(1); - } - -+ SDL_VERSION(&info.version); -+ SDL_GetWMInfo(&info); -+ -+ opengl_exec_set_parent_window(info.info.x11.display, info.info.x11.window); -+ - sdl_setdata(ds); - } - -@@ -574,6 +592,10 @@ - line = image; - for (x = 0; x < width; x ++, dst ++) { - switch (bpp) { -+ case 32: -+ src = *(line ++); src |= *(line ++); -+ src = *(line ++); src |= *(line ++); -+ break; - case 24: - src = *(line ++); src |= *(line ++); src |= *(line ++); - break; -@@ -647,6 +669,7 @@ - dcl->dpy_fill = sdl_fill; - ds->mouse_set = sdl_mouse_warp; - ds->cursor_define = sdl_mouse_define; -+ ds->surface->data = NULL; - register_displaychangelistener(ds, dcl); - - sdl_update_caption(); -Index: trunk/target-i386/beginend_funcs.sh -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ trunk/target-i386/beginend_funcs.sh 2009-01-30 11:39:42.000000000 +0000 -@@ -0,0 +1,23 @@ -+#! /bin/sh -+# Copyright 2008 (C) Intel Corporation -+# -+# echo names of functions that are legal between a glBegin and glEnd pair. -+echo -e MAGIC_MACRO\(glVertex{2,3,4}{s,i,f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glTexCoord{1,2,3,4}{s,i,f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glMultiTexCoord{1,2,3,4}{s,i,f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glNormal3{b,s,i,f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glFogCoord{f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glColor{3,4}{b,s,i,f,d,ub,us,ui}{,v}\)\\n -+echo -e MAGIC_MACRO\(glSecondaryColor3{b,s,i,f,d,ub,us,ui}{,v}\)\\n -+echo -e MAGIC_MACRO\(glIndex{s,i,f,d,ub}{,v}\)\\n -+echo -e MAGIC_MACRO\(glVertexAttrib{1,2,3,4}{s,f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glVertexAttrib4{b,i,ub,us,ui}v\)\\n -+echo -e MAGIC_MACRO\(glVertexAttrib4Nub\)\\n -+echo -e MAGIC_MACRO\(glVertexAttrib4N{b,s,i,ub,us,ui}v\)\\n -+echo -e MAGIC_MACRO\(glArrayElement\)\\n -+echo -e MAGIC_MACRO\(glEvalCoord{1,2}{f,d}{,v}\)\\n -+echo -e MAGIC_MACRO\(glEvalPoint{1,2}\)\\n -+echo -e MAGIC_MACRO\(glMaterial{i,f}{,v}\)\\n -+echo -e MAGIC_MACRO\(glCallList\)\\n -+echo -e MAGIC_MACRO\(glCallLists\)\\n -+echo -e MAGIC_MACRO\(glEdgeFlag{,v}\)\\n -Index: trunk/target-i386/ghash.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ trunk/target-i386/ghash.c 2009-01-30 11:39:42.000000000 +0000 -@@ -0,0 +1,347 @@ -+/* This is a modified and simplified version of original ghash.c */ -+ -+/* GLIB - Library of useful routines for C programming -+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald -+ * -+ * This library is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2 of the License, or (at your option) any later version. -+ * -+ * This library is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with this library; if not, write to the -+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, -+ * Boston, MA 02111-1307, USA. -+ */ -+ -+/* -+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS -+ * file for a list of people on the GLib Team. See the ChangeLog -+ * files for a list of changes. These files are distributed with -+ * GLib at ftp://ftp.gtk.org/pub/gtk/. -+ */ -+ -+ -+#include -+ -+#include "ghash.h" -+ -+#define HASH_TABLE_MIN_SIZE 11 -+#define HASH_TABLE_MAX_SIZE 13845163 -+ -+#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) -+ -+ -+typedef struct _SimpleHashNode SimpleHashNode; -+ -+struct _SimpleHashNode -+{ -+ int key; -+ void* value; -+ SimpleHashNode *next; -+}; -+ -+struct _SimpleHashTable -+{ -+ int size; -+ int nnodes; -+ SimpleHashNode **nodes; -+ SimpleDestroyNotify value_destroy_func; -+}; -+ -+static const unsigned int simple_primes[] = -+{ -+ 11, -+ 19, -+ 37, -+ 73, -+ 109, -+ 163, -+ 251, -+ 367, -+ 557, -+ 823, -+ 1237, -+ 1861, -+ 2777, -+ 4177, -+ 6247, -+ 9371, -+ 14057, -+ 21089, -+ 31627, -+ 47431, -+ 71143, -+ 106721, -+ 160073, -+ 240101, -+ 360163, -+ 540217, -+ 810343, -+ 1215497, -+ 1823231, -+ 2734867, -+ 4102283, -+ 6153409, -+ 9230113, -+ 13845163, -+}; -+ -+static const unsigned int simple_nprimes = sizeof (simple_primes) / sizeof (simple_primes[0]); -+ -+unsigned int simple_spaced_primes_closest (unsigned int num) -+{ -+ int i; -+ -+ for (i = 0; i < simple_nprimes; i++) -+ if (simple_primes[i] > num) -+ return simple_primes[i]; -+ -+ return simple_primes[simple_nprimes - 1]; -+} -+ -+#define HASH_TABLE_RESIZE(hash_table) \ -+ do { \ -+ if ((hash_table->size >= 3 * hash_table->nnodes && \ -+ hash_table->size > HASH_TABLE_MIN_SIZE) || \ -+ (3 * hash_table->size <= hash_table->nnodes && \ -+ hash_table->size < HASH_TABLE_MAX_SIZE)) \ -+ simple_hash_table_resize (hash_table); \ -+ } while(0) -+ -+static void simple_hash_table_resize (SimpleHashTable *hash_table); -+static SimpleHashNode** simple_hash_table_lookup_node (SimpleHashTable *hash_table, -+ int key); -+static SimpleHashNode* simple_hash_node_new (int key, -+ void* value); -+static void simple_hash_nodes_destroy (SimpleHashNode *hash_node, -+ SimpleDestroyNotify value_destroy_func); -+ -+ -+#define alloc0(type, n) (type*)calloc(n, sizeof(type)) -+ -+SimpleHashTable* -+simple_hash_table_new (SimpleDestroyNotify value_destroy_func) -+{ -+ SimpleHashTable *hash_table; -+ -+ hash_table = alloc0(SimpleHashTable, 1); -+ hash_table->size = HASH_TABLE_MIN_SIZE; -+ hash_table->nnodes = 0; -+ hash_table->value_destroy_func = value_destroy_func; -+ hash_table->nodes = alloc0 (SimpleHashNode*, hash_table->size); -+ -+ return hash_table; -+} -+ -+SimpleHashTable* simple_hash_table_clone(SimpleHashTable *hash_table, -+ SimpleCloneValue clone_value_func) -+{ -+ SimpleHashTable *hash_table_new; -+ SimpleHashNode *new_node; -+ SimpleHashNode *node; -+ int i; -+ -+ hash_table_new = alloc0 (SimpleHashTable, 1); -+ hash_table_new->size = hash_table->size; -+ hash_table_new->nnodes = hash_table->nnodes; -+ hash_table_new->value_destroy_func = hash_table->value_destroy_func; -+ hash_table_new->nodes = alloc0 (SimpleHashNode*, hash_table_new->size); -+ for (i = 0; i < hash_table->size; i++) -+ { -+ node = hash_table->nodes[i]; -+ while(node) -+ { -+ SimpleHashNode *next = hash_table_new->nodes[i]; -+ new_node = simple_hash_node_new(node->key, -+ (clone_value_func)? clone_value_func(node->value) : node->value); -+ new_node->next = next; -+ hash_table_new->nodes[i] = new_node; -+ node = node->next; -+ } -+ } -+ return hash_table_new; -+} -+ -+void -+simple_hash_table_destroy (SimpleHashTable *hash_table) -+{ -+ int i; -+ -+ for (i = 0; i < hash_table->size; i++) -+ { -+ simple_hash_nodes_destroy (hash_table->nodes[i], -+ hash_table->value_destroy_func); -+ hash_table->nodes[i] = NULL; -+ } -+ free (hash_table->nodes); -+ free (hash_table); -+} -+ -+static inline SimpleHashNode** -+simple_hash_table_lookup_node (SimpleHashTable *hash_table, -+ int key) -+{ -+ SimpleHashNode **node; -+ -+ node = &hash_table->nodes[(unsigned int)key % hash_table->size]; -+ while (*node && (*node)->key != key) -+ node = &(*node)->next; -+ -+ return node; -+} -+ -+void* -+simple_hash_table_lookup (SimpleHashTable *hash_table, int key) -+{ -+ SimpleHashNode *node; -+ -+ node = *simple_hash_table_lookup_node (hash_table, key); -+ -+ return node ? node->value : NULL; -+} -+ -+void** -+simple_hash_table_lookup_pointer (SimpleHashTable *hash_table, int key) -+{ -+ SimpleHashNode *node; -+ -+ node = *simple_hash_table_lookup_node (hash_table, key); -+ -+ return node ? &node->value : NULL; -+} -+ -+ -+void -+simple_hash_table_insert (SimpleHashTable *hash_table, -+ int key, -+ void* value) -+{ -+ SimpleHashNode **node; -+ -+ node = simple_hash_table_lookup_node (hash_table, key); -+ -+ if (*node) -+ { -+ /* do not reset node->key in this place, keeping -+ * the old key is the intended behaviour. -+ * simple_hash_table_replace() can be used instead. -+ */ -+ if (hash_table->value_destroy_func) -+ hash_table->value_destroy_func ((*node)->value); -+ -+ (*node)->value = value; -+ } -+ else -+ { -+ *node = simple_hash_node_new (key, value); -+ hash_table->nnodes++; -+ HASH_TABLE_RESIZE (hash_table); -+ } -+} -+int -+simple_hash_table_remove (SimpleHashTable *hash_table, -+ int key) -+{ -+ SimpleHashNode **node, *dest; -+ -+ node = simple_hash_table_lookup_node (hash_table, key); -+ if (*node) -+ { -+ dest = *node; -+ (*node) = dest->next; -+ if (hash_table->value_destroy_func) -+ hash_table->value_destroy_func (dest->value); -+ free (dest); -+ hash_table->nnodes--; -+ -+ HASH_TABLE_RESIZE (hash_table); -+ -+ return 1; -+ } -+ -+ return 0; -+} -+ -+ -+void -+simple_hash_table_foreach (SimpleHashTable *hash_table, -+ SimpleHFunc func, -+ void* user_data) -+{ -+ SimpleHashNode *node; -+ int i; -+ -+ for (i = 0; i < hash_table->size; i++) -+ for (node = hash_table->nodes[i]; node; node = node->next) -+ (* func) (node->key, node->value, user_data); -+} -+ -+unsigned int -+simple_hash_table_size (SimpleHashTable *hash_table) -+{ -+ return hash_table->nnodes; -+} -+ -+static void -+simple_hash_table_resize (SimpleHashTable *hash_table) -+{ -+ SimpleHashNode **new_nodes; -+ SimpleHashNode *node; -+ SimpleHashNode *next; -+ unsigned int hash_val; -+ int new_size; -+ int i; -+ -+ new_size = simple_spaced_primes_closest (hash_table->nnodes); -+ new_size = CLAMP (new_size, HASH_TABLE_MIN_SIZE, HASH_TABLE_MAX_SIZE); -+ -+ new_nodes = alloc0 (SimpleHashNode*, new_size); -+ -+ for (i = 0; i < hash_table->size; i++) -+ for (node = hash_table->nodes[i]; node; node = next) -+ { -+ next = node->next; -+ -+ hash_val = (unsigned int)(node->key) % new_size; -+ -+ node->next = new_nodes[hash_val]; -+ new_nodes[hash_val] = node; -+ } -+ -+ free (hash_table->nodes); -+ hash_table->nodes = new_nodes; -+ hash_table->size = new_size; -+} -+ -+static SimpleHashNode* -+simple_hash_node_new (int key, -+ void* value) -+{ -+ SimpleHashNode *hash_node = alloc0 (SimpleHashNode, 1); -+ -+ hash_node->key = key; -+ hash_node->value = value; -+ hash_node->next = NULL; -+ -+ return hash_node; -+} -+ -+static void -+simple_hash_nodes_destroy (SimpleHashNode *hash_node, -+ SimpleDestroyNotify value_destroy_func) -+{ -+ while (hash_node) -+ { -+ SimpleHashNode *next = hash_node->next; -+ if (value_destroy_func) -+ value_destroy_func (hash_node->value); -+ free (hash_node); -+ hash_node = next; -+ } -+} -Index: trunk/target-i386/ghash.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ trunk/target-i386/ghash.h 2009-01-30 11:39:42.000000000 +0000 -@@ -0,0 +1,59 @@ -+/* This is a modified and simplified version of original ghash.h */ -+ -+ -+/* GLIB - Library of useful routines for C programming -+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald -+ * -+ * This library is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2 of the License, or (at your option) any later version. -+ * -+ * This library is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with this library; if not, write to the -+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, -+ * Boston, MA 02111-1307, USA. -+ */ -+ -+/* -+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS -+ * file for a list of people on the GLib Team. See the ChangeLog -+ * files for a list of changes. These files are distributed with -+ * GLib at ftp://ftp.gtk.org/pub/gtk/. -+ */ -+ -+#ifndef __SIMPLE_HASH_H__ -+#define __SIMPLE_HASH_H__ -+ -+typedef struct _SimpleHashTable SimpleHashTable; -+ -+typedef void (*SimpleDestroyNotify)(void*); -+typedef void (*SimpleHFunc)(int key, void* value, void* user_data); -+typedef void* (*SimpleCloneValue)(void* value); -+ -+/* Hash tables -+ */ -+SimpleHashTable* simple_hash_table_new (SimpleDestroyNotify value_destroy_func); -+SimpleHashTable* simple_hash_table_clone(SimpleHashTable *hash_table, -+ SimpleCloneValue clone_value_func); -+void simple_hash_table_destroy (SimpleHashTable *hash_table); -+void simple_hash_table_insert (SimpleHashTable *hash_table, -+ int key, -+ void* value); -+int simple_hash_table_remove (SimpleHashTable *hash_table, -+ int key); -+void* simple_hash_table_lookup (SimpleHashTable *hash_table, -+ int key); -+void** simple_hash_table_lookup_pointer (SimpleHashTable *hash_table, int key); -+void simple_hash_table_foreach (SimpleHashTable *hash_table, -+ SimpleHFunc func, -+ void* user_data); -+unsigned int simple_hash_table_size (SimpleHashTable *hash_table); -+ -+#endif /* __SIMPLE_HASH_H__ */ -+ -Index: trunk/target-i386/gl_func_perso.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ trunk/target-i386/gl_func_perso.h 2009-01-30 11:39:42.000000000 +0000 -@@ -0,0 +1,135 @@ -+/* -+ * Hand-implemented GL/GLX API -+ * -+ * Copyright (c) 2006,2007 Even Rouault -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a copy -+ * of this software and associated documentation files (the "Software"), to deal -+ * in the Software without restriction, including without limitation the rights -+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -+ * copies of the Software, and to permit persons to whom the Software is -+ * furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included in -+ * all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -+ * THE SOFTWARE. -+ */ -+ -+MAGIC_MACRO(_init32), -+MAGIC_MACRO(_init64), -+MAGIC_MACRO(_synchronize), -+MAGIC_MACRO(_serialized_calls), -+MAGIC_MACRO(_exit_process), -+MAGIC_MACRO(_moveResizeWindow), -+MAGIC_MACRO(_changeWindowState), -+MAGIC_MACRO(_send_cursor), -+ -+/* When you add a glX call here, you HAVE TO update IS_GLX_CALL */ -+MAGIC_MACRO(glXChooseVisual), -+MAGIC_MACRO(glXQueryExtensionsString), -+MAGIC_MACRO(glXQueryServerString), -+MAGIC_MACRO(glXCreateContext), -+MAGIC_MACRO(glXCopyContext), -+MAGIC_MACRO(glXDestroyContext), -+MAGIC_MACRO(glXGetClientString), -+MAGIC_MACRO(glXQueryVersion), -+MAGIC_MACRO(glXMakeCurrent), -+MAGIC_MACRO(glXGetConfig), -+MAGIC_MACRO(glXGetConfig_extended), -+MAGIC_MACRO(glXWaitGL), -+MAGIC_MACRO(glXWaitX), -+MAGIC_MACRO(glXGetFBConfigAttrib_extended), -+MAGIC_MACRO(glXChooseFBConfig), -+MAGIC_MACRO(glXChooseFBConfigSGIX), -+MAGIC_MACRO(glXGetFBConfigs), -+MAGIC_MACRO(glXCreatePbuffer), -+MAGIC_MACRO(glXCreateGLXPbufferSGIX), -+MAGIC_MACRO(glXDestroyPbuffer), -+MAGIC_MACRO(glXDestroyGLXPbufferSGIX), -+MAGIC_MACRO(glXCreateNewContext), -+MAGIC_MACRO(glXCreateContextWithConfigSGIX), -+MAGIC_MACRO(glXGetVisualFromFBConfig), -+MAGIC_MACRO(glXGetFBConfigAttrib), -+MAGIC_MACRO(glXGetFBConfigAttribSGIX), -+MAGIC_MACRO(glXQueryContext), -+MAGIC_MACRO(glXQueryDrawable), -+MAGIC_MACRO(glXQueryGLXPbufferSGIX), -+MAGIC_MACRO(glXUseXFont), -+MAGIC_MACRO(glXIsDirect), -+MAGIC_MACRO(glXGetProcAddress_fake), -+MAGIC_MACRO(glXGetProcAddress_global_fake), -+MAGIC_MACRO(glXSwapBuffers), -+MAGIC_MACRO(glXQueryExtension), -+MAGIC_MACRO(glXGetScreenDriver), -+MAGIC_MACRO(glXGetDriverConfig), -+MAGIC_MACRO(glXSwapIntervalSGI), -+MAGIC_MACRO(glXBindTexImageATI), -+MAGIC_MACRO(glXReleaseTexImageATI), -+MAGIC_MACRO(glXBindTexImageARB), -+MAGIC_MACRO(glXReleaseTexImageARB), -+ -+MAGIC_MACRO(glGetString), -+ -+MAGIC_MACRO(glShaderSourceARB_fake), -+MAGIC_MACRO(glShaderSource_fake), -+MAGIC_MACRO(glVertexPointer_fake), -+MAGIC_MACRO(glNormalPointer_fake), -+MAGIC_MACRO(glColorPointer_fake), -+MAGIC_MACRO(glSecondaryColorPointer_fake), -+MAGIC_MACRO(glIndexPointer_fake), -+MAGIC_MACRO(glTexCoordPointer_fake), -+MAGIC_MACRO(glEdgeFlagPointer_fake), -+MAGIC_MACRO(glVertexAttribPointerARB_fake), -+MAGIC_MACRO(glVertexAttribPointerNV_fake), -+MAGIC_MACRO(glWeightPointerARB_fake), -+MAGIC_MACRO(glMatrixIndexPointerARB_fake), -+MAGIC_MACRO(glFogCoordPointer_fake), -+MAGIC_MACRO(glVariantPointerEXT_fake), -+MAGIC_MACRO(glInterleavedArrays_fake), -+MAGIC_MACRO(glElementPointerATI_fake), -+MAGIC_MACRO(glTuxRacerDrawElements_fake), -+MAGIC_MACRO(glVertexAndNormalPointer_fake), -+MAGIC_MACRO(glTexCoordPointer01_fake), -+MAGIC_MACRO(glTexCoordPointer012_fake), -+MAGIC_MACRO(glVertexNormalPointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalColorPointerInterlaced_fake), -+MAGIC_MACRO(glVertexColorTexCoord0PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalTexCoord0PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalTexCoord01PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalTexCoord012PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalColorTexCoord0PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalColorTexCoord01PointerInterlaced_fake), -+MAGIC_MACRO(glVertexNormalColorTexCoord012PointerInterlaced_fake), -+MAGIC_MACRO(glGenTextures_fake), -+MAGIC_MACRO(glGenBuffersARB_fake), -+MAGIC_MACRO(glGenLists_fake), -+MAGIC_MACRO(_glDrawElements_buffer), -+MAGIC_MACRO(_glDrawRangeElements_buffer), -+MAGIC_MACRO(_glMultiDrawElements_buffer), -+MAGIC_MACRO(_glVertexPointer_buffer), -+MAGIC_MACRO(_glNormalPointer_buffer), -+MAGIC_MACRO(_glColorPointer_buffer), -+MAGIC_MACRO(_glSecondaryColorPointer_buffer), -+MAGIC_MACRO(_glIndexPointer_buffer), -+MAGIC_MACRO(_glTexCoordPointer_buffer), -+MAGIC_MACRO(_glEdgeFlagPointer_buffer), -+MAGIC_MACRO(_glVertexAttribPointerARB_buffer), -+MAGIC_MACRO(_glWeightPointerARB_buffer), -+MAGIC_MACRO(_glMatrixIndexPointerARB_buffer), -+MAGIC_MACRO(_glFogCoordPointer_buffer), -+MAGIC_MACRO(_glVariantPointerEXT_buffer), -+MAGIC_MACRO(_glGetError_fake), -+MAGIC_MACRO(_glReadPixels_pbo), -+MAGIC_MACRO(_glDrawPixels_pbo), -+MAGIC_MACRO(_glMapBufferARB_fake), -+MAGIC_MACRO(_glSelectBuffer_fake), -+MAGIC_MACRO(_glGetSelectBuffer_fake), -+MAGIC_MACRO(_glFeedbackBuffer_fake), -+MAGIC_MACRO(_glGetFeedbackBuffer_fake), -Index: trunk/target-i386/helper.h -=================================================================== ---- trunk.orig/target-i386/helper.h 2009-01-05 11:10:06.000000000 +0000 -+++ trunk/target-i386/helper.h 2009-01-30 11:39:42.000000000 +0000 -@@ -214,4 +214,6 @@ - DEF_HELPER_2(rcrq, tl, tl, tl) - #endif - -+DEF_HELPER_0(opengl, void) -+ - #include "def-helper.h" -Index: trunk/target-i386/helper_opengl.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ trunk/target-i386/helper_opengl.c 2009-01-30 11:39:42.000000000 +0000 -@@ -0,0 +1,979 @@ -+/* -+ * Host-side implementation of GL/GLX API -+ * -+ * Copyright (c) 2006,2007 Even Rouault -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a copy -+ * of this software and associated documentation files (the "Software"), to deal -+ * in the Software without restriction, including without limitation the rights -+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -+ * copies of the Software, and to permit persons to whom the Software is -+ * furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included in -+ * all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -+ * THE SOFTWARE. -+ */ -+#define _XOPEN_SOURCE 600 -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "exec.h" -+ -+#if defined(CONFIG_USER_ONLY) -+void helper_opengl(void) -+{ -+ /* TODO */ -+} -+#else -+ -+#include "opengl_func.h" -+ -+#define ENABLE_GL_LOG -+ -+extern FILE *stderr; -+ -+extern void init_process_tab(void); -+extern int do_function_call(int func_number, arg_t *args, char *ret_string); -+ -+extern void sdl_set_opengl_window(int x, int y, int width, int height); -+ -+static int last_process_id = 0; -+static int must_save = 0; -+ -+static inline void *get_phys_mem_addr(const CPUState *env, target_ulong addr) -+{ -+ int is_user, index; -+ -+ index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); -+ is_user = ((env->hflags & HF_CPL_MASK) == 3); -+ if (is_user == 0) { -+ fprintf(stderr, "not in userland !!!\n"); -+ return NULL; -+ } -+ if (__builtin_expect -+ (env->tlb_table[is_user][index].addr_code != -+ (addr & TARGET_PAGE_MASK), 0)) { -+ target_ulong ret = cpu_get_phys_page_debug((CPUState *) env, addr); -+ -+ if (ret == -1) { -+ fprintf(stderr, -+ "cpu_get_phys_page_debug(env, " TARGET_FMT_lx ") == " -+ TARGET_FMT_lx "\n", addr, ret); -+ fprintf(stderr, -+ "not in phys mem " TARGET_FMT_lx "(" TARGET_FMT_lx " " -+ TARGET_FMT_lx ")\n", addr, -+ env->tlb_table[is_user][index].addr_code, -+ addr & TARGET_PAGE_MASK); -+ fprintf(stderr, "cpu_x86_handle_mmu_fault = %d\n", -+ cpu_x86_handle_mmu_fault((CPUState *) env, addr, 0, 1, 1)); -+ return NULL; -+ } else { -+ if (ret + TARGET_PAGE_SIZE <= phys_ram_size) { -+ return phys_ram_base + ret + -+ (((target_ulong) addr) & (TARGET_PAGE_SIZE - 1)); -+ } else { -+ fprintf(stderr, -+ "cpu_get_phys_page_debug(env, " TARGET_FMT_lx ") == " -+ TARGET_FMT_lx "p\n", addr, ret); -+ fprintf(stderr, -+ "ret=" TARGET_FMT_lx " phys_ram_size= " TARGET_FMT_lx -+ "\n", ret, (target_ulong) phys_ram_size); -+ return NULL; -+ } -+ } -+ } else -+ return (void *) (addr + env->tlb_table[is_user][index].addend); -+} -+ -+#ifndef MIN -+#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -+#endif -+ -+enum { -+ NOT_MAPPED, -+ MAPPED_CONTIGUOUS, -+ MAPPED_NOT_CONTIGUOUS -+}; -+ -+#define TARGET_ADDR_LOW_ALIGN(x) ((target_ulong)(x) & ~(TARGET_PAGE_SIZE - 1)) -+ -+/* Return NOT_MAPPED if a page is not mapped into target physical memory */ -+/* MAPPED_CONTIGUOUS if all pages are mapped into target physical memory and contiguous */ -+/* MAPPED_NOT_CONTIGUOUS if all pages are mapped into target physical memory but not contiguous */ -+static int get_target_mem_state(const CPUState *env, -+ target_ulong target_addr, int len) -+{ -+ target_ulong aligned_target_addr = TARGET_ADDR_LOW_ALIGN(target_addr); -+ int to_end_page = -+ (long) aligned_target_addr + TARGET_PAGE_SIZE - (long) target_addr; -+ int ret = MAPPED_CONTIGUOUS; -+ -+ if (aligned_target_addr != target_addr) { -+ void *phys_addr = get_phys_mem_addr(env, aligned_target_addr); -+ void *last_phys_addr = phys_addr; -+ -+ if (phys_addr == 0) { -+ return NOT_MAPPED; -+ } -+ if (len > to_end_page) { -+ len -= to_end_page; -+ aligned_target_addr += TARGET_PAGE_SIZE; -+ int i; -+ -+ for (i = 0; i < len; i += TARGET_PAGE_SIZE) { -+ void *phys_addr = -+ get_phys_mem_addr(env, aligned_target_addr + i); -+ if (phys_addr == 0) { -+ return NOT_MAPPED; -+ } -+ if (phys_addr != last_phys_addr + TARGET_PAGE_SIZE) -+ ret = MAPPED_NOT_CONTIGUOUS; -+ last_phys_addr = phys_addr; -+ } -+ } -+ } else { -+ void *last_phys_addr = NULL; -+ int i; -+ -+ for (i = 0; i < len; i += TARGET_PAGE_SIZE) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr + i); -+ -+ if (phys_addr == 0) { -+ return NOT_MAPPED; -+ } -+ if (i != 0 && phys_addr != last_phys_addr + TARGET_PAGE_SIZE) -+ ret = MAPPED_NOT_CONTIGUOUS; -+ last_phys_addr = phys_addr; -+ } -+ } -+ return ret; -+} -+ -+/* copy len bytes from host memory at addr host_addr to target memory at logical addr target_addr */ -+/* Returns 1 if successfull, 0 if some target pages are not mapped into target physical memory */ -+static int memcpy_host_to_target(const CPUState *env, -+ target_ulong target_addr, -+ const void *host_addr, int len) -+{ -+ int i; -+ target_ulong aligned_target_addr = TARGET_ADDR_LOW_ALIGN(target_addr); -+ int to_end_page = -+ (long) aligned_target_addr + TARGET_PAGE_SIZE - (long) target_addr; -+ int ret = get_target_mem_state(env, target_addr, len); -+ -+ if (ret == NOT_MAPPED) { -+ return 0; -+ } -+ -+ if (ret == MAPPED_CONTIGUOUS) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr); -+ -+ memcpy(phys_addr, host_addr, len); -+ } else { -+ if (aligned_target_addr != target_addr) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr); -+ -+ memcpy(phys_addr, host_addr, MIN(len, to_end_page)); -+ if (len <= to_end_page) { -+ return 1; -+ } -+ len -= to_end_page; -+ host_addr += to_end_page; -+ target_addr = aligned_target_addr + TARGET_PAGE_SIZE; -+ } -+ for (i = 0; i < len; i += TARGET_PAGE_SIZE) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr + i); -+ -+ memcpy(phys_addr, host_addr + i, -+ (i + TARGET_PAGE_SIZE <= -+ len) ? TARGET_PAGE_SIZE : len & (TARGET_PAGE_SIZE - 1)); -+ } -+ } -+ -+ return 1; -+} -+ -+static int memcpy_target_to_host(const CPUState *env, void *host_addr, -+ target_ulong target_addr, int len) -+{ -+ int i; -+ target_ulong aligned_target_addr = TARGET_ADDR_LOW_ALIGN(target_addr); -+ int to_end_page = -+ (long) aligned_target_addr + TARGET_PAGE_SIZE - (long) target_addr; -+ int ret = get_target_mem_state(env, target_addr, len); -+ -+ if (ret == NOT_MAPPED) { -+ return 0; -+ } -+ -+ if (ret == MAPPED_CONTIGUOUS) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr); -+ -+ memcpy(host_addr, phys_addr, len); -+ } else { -+ if (aligned_target_addr != target_addr) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr); -+ -+ memcpy(host_addr, phys_addr, MIN(len, to_end_page)); -+ if (len <= to_end_page) -+ return 1; -+ -+ len -= to_end_page; -+ host_addr += to_end_page; -+ target_addr = aligned_target_addr + TARGET_PAGE_SIZE; -+ } -+ for (i = 0; i < len; i += TARGET_PAGE_SIZE) { -+ void *phys_addr = get_phys_mem_addr(env, target_addr + i); -+ -+ memcpy(host_addr + i, phys_addr, -+ (i + TARGET_PAGE_SIZE <= -+ len) ? TARGET_PAGE_SIZE : len & (TARGET_PAGE_SIZE - 1)); -+ } -+ } -+ -+ return 1; -+} -+ -+static int memcpy_target_to_host_1_1(const CPUState *env, void *host_addr, -+ target_ulong target_addr, int nb_args) -+{ -+ return memcpy_target_to_host(env, host_addr, target_addr, nb_args * 8); -+} -+ -+static int wordsize = 0; -+static int (*argcpy_target_to_host) (const CPUState *env, void *host_addr, -+ target_ulong target_addr, int nb_args) = -+ memcpy_target_to_host_1_1; -+ -+void do_disconnect_current(void); -+void do_context_switch(Display *dpy, pid_t pid, int call); -+ -+static void disconnect_current(void) -+{ -+ last_process_id = 0; -+ -+ return do_disconnect_current(); -+} -+ -+static int memcpy_target32_to_host(const CPUState *env, void *host_addr, -+ target_ulong target_addr, int nb_args) -+{ -+ int ret; -+ uint32_t args_temp[nb_args], *src = args_temp; -+ arg_t *dest = host_addr; -+ -+ ret = memcpy_target_to_host(env, args_temp, target_addr, nb_args * 4); -+ if (!ret) -+ return ret; -+ -+ while (nb_args) { -+ /* TODO: endianness */ -+ *dest = 0; -+ *(uint32_t *) (dest++) = *src++; -+ nb_args--; -+ } -+ -+ return ret; -+} -+ -+static int memcpy_target64_to_host(const CPUState *env, void *host_addr, -+ target_ulong target_addr, int nb_args) -+{ -+ int ret; -+ uint64_t args_temp[nb_args], *src = args_temp; -+ arg_t *dest = host_addr; -+ -+ ret = memcpy_target_to_host(env, args_temp, target_addr, nb_args * 8); -+ if (!ret) -+ return ret; -+ -+ while (nb_args) { -+ /* TODO: endianness */ -+ *dest = 0; -+ *(uint64_t *) (dest++) = *src++; -+ nb_args--; -+ } -+ -+ return ret; -+} -+ -+static int host_offset = 0; -+static void reset_host_offset() -+{ -+ host_offset = 0; -+} -+ -+/* Return a host pointer with the content of [target_addr, target_addr + len bytes[ */ -+/* Do not free or modify */ -+static const void *get_host_read_pointer(const CPUState *env, -+ const target_ulong target_addr, int len) -+{ -+ int ret = get_target_mem_state(env, target_addr, len); -+ -+ if (ret == NOT_MAPPED) { -+ return NULL; -+ } else if (ret == MAPPED_CONTIGUOUS) { -+ return get_phys_mem_addr(env, target_addr); -+ } else { -+ static int host_mem_size = 0; -+ static void *host_mem = NULL; -+ static void *ret; -+ -+ if (host_mem_size < host_offset + len) { -+ host_mem_size = 2 * host_mem_size + host_offset + len; -+ host_mem = realloc(host_mem, host_mem_size); -+ } -+ ret = host_mem + host_offset; -+ assert(memcpy_target_to_host(env, ret, target_addr, len)); -+ host_offset += len; -+ return ret; -+ } -+} -+ -+int doing_opengl = 0; -+static int last_func_number = -1; -+static size_t(*my_strlen) (const char *) = NULL; -+ -+#ifdef ENABLE_GL_LOG -+static FILE *f = NULL; -+static int logger_pid = 0; -+ -+#define write_gl_debug_init() do { if (f == NULL) f = fopen("/tmp/debug_gl.bin", "wb"); } while(0) -+ -+void write_gl_debug_cmd_int(int my_int) -+{ -+ write_gl_debug_init(); -+ fwrite(&my_int, sizeof(int), 1, f); -+ fflush(f); -+} -+ -+void write_gl_debug_cmd_short(short my_int) -+{ -+ write_gl_debug_init(); -+ fwrite(&my_int, sizeof(short), 1, f); -+ fflush(f); -+} -+ -+static void inline write_gl_debug_cmd_buffer_with_size(int size, void *buffer) -+{ -+ write_gl_debug_init(); -+ fwrite(&size, sizeof(int), 1, f); -+ if (size) -+ fwrite(buffer, size, 1, f); -+} -+ -+static void inline write_gl_debug_cmd_buffer_without_size( -+ int size, void *buffer) -+{ -+ write_gl_debug_init(); -+ if (size) -+ fwrite(buffer, size, 1, f); -+} -+ -+void write_gl_debug_end(void) -+{ -+ write_gl_debug_init(); -+ fclose(f); -+ f = NULL; -+ logger_pid = 0; -+ must_save = 0; -+} -+ -+static inline int is_logging(int pid) -+{ -+ return must_save && pid == logger_pid; -+} -+#endif -+ -+#include -+#include -+ -+static void (*anticrash_handler) (void *) = NULL; -+static void (*show_stack_from_signal_handler) (int, int, int) = NULL; -+ -+void my_anticrash_sigsegv_handler(int signum, siginfo_t *info, void *ptr) -+{ -+ static int counter = 0; -+ -+ counter++; -+ -+ printf("oops\n"); -+ -+ /* if (show_stack_from_signal_handler && counter == 1) { struct ucontext* -+ * ctxt = (struct ucontext*)ptr; show_stack_from_signal_handler(10, -+ * ctxt->uc_mcontext.gregs[REG_EBP], ctxt->uc_mcontext.gregs[REG_ESP]); } */ -+ anticrash_handler(ptr); -+ -+ counter--; -+} -+ -+static int decode_call_int(CPUState *env, int func_number, int pid, -+ target_ulong target_ret_string, -+ target_ulong in_args, target_ulong in_args_size) -+{ -+ Signature *signature = (Signature *) tab_opengl_calls[func_number]; -+ int ret_type = signature->ret_type; -+ /* int has_out_parameters = signature->has_out_parameters; */ -+ int nb_args = signature->nb_args; -+ int *args_type = signature->args_type; -+ int i; -+ int ret; -+ int *args_size = NULL; -+ target_ulong saved_out_ptr[50]; -+ static char *ret_string = NULL; -+ static arg_t args[50]; -+ static Display *dpy = NULL; -+ -+ if (dpy == NULL) { -+ void *handle = dlopen("libanticrash.so", RTLD_LAZY); -+ -+ if (handle) { -+ anticrash_handler = dlsym(handle, "anticrash_handler"); -+ if (anticrash_handler) { -+ fprintf(stderr, "anticrash handler enabled\n"); -+ struct sigaction sigsegv_action; -+ struct sigaction old_sigsegv_action; -+ -+ sigsegv_action.sa_sigaction = my_anticrash_sigsegv_handler; -+ sigemptyset(&(sigsegv_action.sa_mask)); -+ sigsegv_action.sa_flags = SA_SIGINFO | SA_NODEFER; -+ sigaction(SIGSEGV, &sigsegv_action, &old_sigsegv_action); -+ } -+ } -+ handle = dlopen("libgetstack.so", RTLD_LAZY); -+ if (handle) { -+ show_stack_from_signal_handler = -+ dlsym(handle, "show_stack_from_signal_handler"); -+ } -+ -+ dpy = XOpenDisplay(NULL); -+ init_process_tab(); -+ ret_string = malloc(32768); -+ my_strlen = strlen; -+ } -+ -+ if (unlikely(last_func_number == _exit_process_func && -+ func_number == _exit_process_func)) { -+ last_func_number = -1; -+ return 0; -+ } -+ -+ if (last_process_id != pid) { -+ do_context_switch(dpy, pid, func_number); -+ last_process_id = pid; -+ } -+ -+ if (unlikely(func_number == _exit_process_func)) -+ last_process_id = 0; -+ -+ argcpy: -+ reset_host_offset(); -+ -+ if (nb_args) { -+ -+ if (argcpy_target_to_host(env, args, in_args, nb_args) == 0) { -+ fprintf(stderr, "call %s pid=%d\n", -+ tab_opengl_calls_name[func_number], pid); -+ fprintf(stderr, "cannot get call parameters\n"); -+ disconnect_current(); -+ return 0; -+ } -+ -+ args_size = -+ (int *) get_host_read_pointer(env, in_args_size, -+ sizeof(int) * nb_args); -+ if (args_size == NULL) { -+ fprintf(stderr, "call %s pid=%d\n", -+ tab_opengl_calls_name[func_number], pid); -+ fprintf(stderr, "cannot get call parameters size\n"); -+ disconnect_current(); -+ return 0; -+ } -+ } -+ -+ if (func_number == _serialized_calls_func) { -+ int command_buffer_size = args_size[0]; -+ const void *command_buffer = -+ get_host_read_pointer(env, args[0], command_buffer_size); -+ int commmand_buffer_offset = 0; -+ -+ args_size = NULL; -+#ifdef ENABLE_GL_LOG -+ if (is_logging(pid)) -+ write_gl_debug_cmd_short(_serialized_calls_func); -+#endif -+ -+ while (commmand_buffer_offset < command_buffer_size) { -+ func_number = -+ *(short *) (command_buffer + commmand_buffer_offset); -+ if (!(func_number >= 0 && func_number < GL_N_CALLS)) { -+ fprintf(stderr, -+ "func_number >= 0 && func_number < GL_N_CALLS failed at " -+ "commmand_buffer_offset=%d (command_buffer_size=%d)\n", -+ commmand_buffer_offset, command_buffer_size); -+ return 0; -+ } -+ commmand_buffer_offset += sizeof(short); -+#ifdef ENABLE_GL_LOG -+ if (is_logging(pid)) -+ write_gl_debug_cmd_short(func_number); -+#endif -+ -+ signature = (Signature *) tab_opengl_calls[func_number]; -+ ret_type = signature->ret_type; -+ assert(ret_type == TYPE_NONE); -+ nb_args = signature->nb_args; -+ args_type = signature->args_type; -+ -+ for (i =