summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/qemu
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2011-10-05 12:38:27 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-10-14 12:53:22 +0100
commitfc63229d9cd2e5061cab0686aba4d18bc3fb4e4f (patch)
tree188d17db4bd30ed6049f68d98ce56b888facd08e /meta/recipes-devtools/qemu
parent38a394e7ffedccfabda085c97add8944718943c2 (diff)
downloadopenembedded-core-fc63229d9cd2e5061cab0686aba4d18bc3fb4e4f.tar.gz
openembedded-core-fc63229d9cd2e5061cab0686aba4d18bc3fb4e4f.tar.bz2
openembedded-core-fc63229d9cd2e5061cab0686aba4d18bc3fb4e4f.zip
qemu-0.15: Add recipe and forward port patches from 0.14
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'meta/recipes-devtools/qemu')
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/arm-bgr.patch30
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/enable-i386-linux-user.patch55
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/fallback-to-safe-mmap_min_addr.patch39
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/fix-configure-checks.patch22
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/fix-nogl.patch127
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/glflags.patch15
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/init-info.patch18
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/larger_default_ram_size.patch22
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/linker-flags.patch25
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/no-strip.patch15
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/opengl-sdl-fix.patch43
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/powerpc_rom.binbin0 -> 4096 bytes
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/qemu-git-qemugl-host.patch34368
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/qemu-vmware-vga-depth.patch118
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/qemugl-allow-glxcontext-release.patch65
-rw-r--r--meta/recipes-devtools/qemu/qemu-0.15.0/qemugl-fix.patch74
-rw-r--r--meta/recipes-devtools/qemu/qemu_0.15.0.bb45
17 files changed, 35081 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/arm-bgr.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/arm-bgr.patch
new file mode 100644
index 0000000000..3b460d04ce
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/arm-bgr.patch
@@ -0,0 +1,30 @@
+After kernel commit:
+
+http://git.yoctoproject.org/cgit/cgit.cgi/linux-yocto-3.0/commit/?h=meta&id=9728c1b6a724daefc413b44e10253cdbb5e06d08
+
+It appears that the emulated colours in qemu are incorrect and that
+the red and blue channels are reversed. This patch reverses that logic
+so the colours are correctly displayed on the versatile platform which
+doesn't support the BGR bit.
+
+RP 16/9/2011
+
+Upstream-status: Pending
+
+Index: qemu-0.14.0/hw/pl110.c
+===================================================================
+--- qemu-0.14.0.orig/hw/pl110.c 2011-09-16 14:45:34.228668514 +0100
++++ qemu-0.14.0/hw/pl110.c 2011-09-16 15:17:22.458671206 +0100
+@@ -141,7 +141,11 @@
+ fprintf(stderr, "pl110: Bad color depth\n");
+ exit(1);
+ }
+- if (s->cr & PL110_CR_BGR)
++
++ if (s->versatile && s->bpp == BPP_16)
++ /* Code assumes BPP_16 == 565 and BGR is never set on the versatile in 565 mode */
++ bpp_offset = 0;
++ else if (s->cr & PL110_CR_BGR)
+ bpp_offset = 0;
+ else
+ bpp_offset = 18;
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/enable-i386-linux-user.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/enable-i386-linux-user.patch
new file mode 100644
index 0000000000..bb0d6a3848
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/enable-i386-linux-user.patch
@@ -0,0 +1,55 @@
+Enable i386-linux-user
+
+Signed-off-by: Zhai Edwin <edwin.zhai@intel.com>
+
+Upstream-Status: Inappropriate [configuration]
+
+Index: qemu-0.14.0/Makefile.target
+===================================================================
+--- qemu-0.14.0.orig/Makefile.target
++++ qemu-0.14.0/Makefile.target
+@@ -78,8 +78,13 @@ ifeq ($(TARGET_BASE_ARCH), i386)
+ libobj-y += cpuid.o
+ endif
+ libobj-$(CONFIG_NEED_MMU) += mmu.o
++ifndef CONFIG_LINUX_USER
+ libobj-$(TARGET_I386) += helper_opengl.o opengl_exec.o
+ libobj-$(TARGET_X86_64) += helper_opengl.o opengl_exec.o
++else
++libobj-$(TARGET_I386) += dummygl.o
++libobj-$(TARGET_X86_64) += dummygl.o
++endif #CONFIG_LINUX_USER
+ libobj-$(TARGET_ARM) += dummygl.o
+ libobj-$(TARGET_MIPS) += dummygl.o
+ libobj-$(TARGET_PPC) += dummygl.o
+Index: qemu-0.14.0/target-i386/dummygl.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-i386/dummygl.c
+@@ -0,0 +1,26 @@
++#include <string.h>
++#include <stdlib.h>
++#include <assert.h>
++#include <stdint.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window)
++{
++
++}
++
++void opengl_process_enable(void)
++{
++
++}
++
++
++void mem_opengl(uint64_t ptr)
++{
++
++}
++
++void helper_opengl(void)
++{
++}
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/fallback-to-safe-mmap_min_addr.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/fallback-to-safe-mmap_min_addr.patch
new file mode 100644
index 0000000000..2075386b9f
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/fallback-to-safe-mmap_min_addr.patch
@@ -0,0 +1,39 @@
+From c313f89c33217ac0e471554dace2144718f86669 Mon Sep 17 00:00:00 2001
+From: Martin Jansa <Martin.Jansa@gmail.com>
+Date: Thu, 13 May 2010 12:23:40 +0200
+Subject: [PATCH] linux-user: use default mmap_min_addr 65536 when /proc/sys/vm/mmap_min_addr cannot be read
+
+* 65536 is default at least for ubuntu and fedora.
+---
+ linux-user/main.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+Upstream-Status: Pending
+
+Index: qemu-0.14.0/linux-user/main.c
+===================================================================
+--- qemu-0.14.0.orig/linux-user/main.c
++++ qemu-0.14.0/linux-user/main.c
+@@ -36,6 +36,7 @@
+ #include "envlist.h"
+
+ #define DEBUG_LOGFILE "/tmp/qemu.log"
++#define MMAP_MIN_ADDR_DEFAULT 65536
+
+ char *exec_path;
+
+@@ -3010,8 +3011,14 @@ int main(int argc, char **argv, char **e
+ if (fscanf(fp, "%lu", &tmp) == 1) {
+ mmap_min_addr = tmp;
+ qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
++ } else {
++ qemu_log("cannot read value from /proc/sys/vm/mmap_min_addr, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
++ mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
+ }
+ fclose(fp);
++ } else {
++ qemu_log("cannot open /proc/sys/vm/mmap_min_addr for reading, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
++ mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
+ }
+ }
+
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/fix-configure-checks.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/fix-configure-checks.patch
new file mode 100644
index 0000000000..96881bb91b
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/fix-configure-checks.patch
@@ -0,0 +1,22 @@
+In native builds, qemu can fail to find zlib development files in the native
+sysroot and the build machine might not have zlib-dev packages installed.
+
+Add CFLAGS to qemu's CFLAGS which in the native case means BUILD_CFLAGS are
+added and files in the sysroot can be found.
+
+Patch from Paul Eggleton, Comments by RP 28/11/10
+
+Upstream-Status: Inappropriate [embedded specific]
+
+Index: qemu-0.14.0/configure
+===================================================================
+--- qemu-0.14.0.orig/configure
++++ qemu-0.14.0/configure
+@@ -229,6 +229,7 @@ QEMU_CFLAGS="-Wstrict-prototypes -Wredun
+ QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
+ QEMU_CFLAGS="-D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
+ QEMU_INCLUDES="-I. -I\$(SRC_PATH)"
++QEMU_CFLAGS="$QEMU_CFLAGS $CFLAGS"
+ LDFLAGS="-g $LDFLAGS"
+
+ # make source path absolute
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/fix-nogl.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/fix-nogl.patch
new file mode 100644
index 0000000000..83b2752589
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/fix-nogl.patch
@@ -0,0 +1,127 @@
+Upstream-Status: Inappropriate [configuration]
+
+Index: qemu-0.14.0/Makefile.target
+===================================================================
+--- qemu-0.14.0.orig/Makefile.target
++++ qemu-0.14.0/Makefile.target
+@@ -79,6 +79,12 @@ libobj-y += cpuid.o
+ endif
+ libobj-$(CONFIG_NEED_MMU) += mmu.o
+ libobj-$(TARGET_I386) += helper_opengl.o opengl_exec.o
++libobj-$(TARGET_X86_64) += helper_opengl.o opengl_exec.o
++libobj-$(TARGET_ARM) += dummygl.o
++libobj-$(TARGET_MIPS) += dummygl.o
++libobj-$(TARGET_MIPS64) += dummygl.o
++libobj-$(TARGET_PPC) += dummygl.o
++libobj-$(TARGET_SH4) += dummygl.o
+ libobj-$(TARGET_ARM) += neon_helper.o iwmmxt_helper.o
+
+ libobj-y += disas.o
+Index: qemu-0.14.0/target-arm/dummygl.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-arm/dummygl.c
+@@ -0,0 +1,22 @@
++#include <string.h>
++#include <stdlib.h>
++#include <assert.h>
++#include <stdint.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window)
++{
++
++}
++
++void opengl_process_enable(void)
++{
++
++}
++
++
++void mem_opengl(uint64_t ptr)
++{
++
++}
+Index: qemu-0.14.0/target-mips/dummygl.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-mips/dummygl.c
+@@ -0,0 +1,22 @@
++#include <string.h>
++#include <stdlib.h>
++#include <assert.h>
++#include <stdint.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window)
++{
++
++}
++
++void opengl_process_enable(void)
++{
++
++}
++
++
++void mem_opengl(uint64_t ptr)
++{
++
++}
+Index: qemu-0.14.0/target-ppc/dummygl.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-ppc/dummygl.c
+@@ -0,0 +1,22 @@
++#include <string.h>
++#include <stdlib.h>
++#include <assert.h>
++#include <stdint.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window)
++{
++
++}
++
++void opengl_process_enable(void)
++{
++
++}
++
++
++void mem_opengl(uint64_t ptr)
++{
++
++}
+Index: qemu-0.14.0/target-sh4/dummygl.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-sh4/dummygl.c
+@@ -0,0 +1,22 @@
++#include <string.h>
++#include <stdlib.h>
++#include <assert.h>
++#include <stdint.h>
++#include <X11/Xlib.h>
++#include <X11/Xutil.h>
++
++void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window)
++{
++
++}
++
++void opengl_process_enable(void)
++{
++
++}
++
++
++void mem_opengl(uint64_t ptr)
++{
++
++}
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/glflags.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/glflags.patch
new file mode 100644
index 0000000000..0ad5551d47
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/glflags.patch
@@ -0,0 +1,15 @@
+Upstream-Status: Inappropriate [configuration]
+
+Index: qemu-0.14.0/Makefile.target
+===================================================================
+--- qemu-0.14.0.orig/Makefile.target 2011-04-04 12:12:19.142871742 +0100
++++ qemu-0.14.0/Makefile.target 2011-04-04 12:12:21.772871742 +0100
+@@ -362,7 +362,7 @@
+
+ monitor.o: hmp-commands.h qmp-commands.h
+
+-LIBS += -lGL -lGLU
++LIBS += -lGL
+
+ $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/init-info.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/init-info.patch
new file mode 100644
index 0000000000..2250444a2b
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/init-info.patch
@@ -0,0 +1,18 @@
+# This is a workaround to the crashes seen on Ubuntu. Setting info to zero
+# makes info.info.x11.display zero and avoids the calls to
+# opengl_exec_set_parent_window, one of which is crashing.
+
+Upstream-Status: Pending
+
+Index: qemu-0.14.0/ui/sdl.c
+===================================================================
+--- qemu-0.14.0.orig/ui/sdl.c
++++ qemu-0.14.0/ui/sdl.c
+@@ -863,6 +863,7 @@ void sdl_display_init(DisplayState *ds,
+ vi = SDL_GetVideoInfo();
+ host_format = *(vi->vfmt);
+
++ bzero(&info, sizeof(info));
+ SDL_GetWMInfo(&info);
+ if (info.subsystem == SDL_SYSWM_X11 && info.info.x11.display)
+ opengl_exec_set_parent_window(info.info.x11.display,
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/larger_default_ram_size.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/larger_default_ram_size.patch
new file mode 100644
index 0000000000..711c36071d
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/larger_default_ram_size.patch
@@ -0,0 +1,22 @@
+This patch is taken from debian. 128M is too less sometimes if distro
+with lot of packages is booted so this patch raises the default to 384M
+
+It has not been applied to upstream qemu
+
+Khem Raj <raj.khem@gmail.com>
+
+Upstream-Status: Pending
+
+Index: qemu-0.14.0/vl.c
+===================================================================
+--- qemu-0.14.0.orig/vl.c
++++ qemu-0.14.0/vl.c
+@@ -168,7 +168,7 @@ int main(int argc, char **argv)
+ //#define DEBUG_NET
+ //#define DEBUG_SLIRP
+
+-#define DEFAULT_RAM_SIZE 128
++#define DEFAULT_RAM_SIZE 384
+
+ #define MAX_VIRTIO_CONSOLES 1
+
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/linker-flags.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/linker-flags.patch
new file mode 100644
index 0000000000..c0d1e5541d
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/linker-flags.patch
@@ -0,0 +1,25 @@
+Fedora 13 switched the default behaviour of the linker to no longer
+indirectly link to required libraries (i.e. dependencies of a library
+already linked to). Therefore we need to explicitly pass the depended on
+libraries into the linker for building to work on Fedora 13.
+
+More information is available on the Fedora Wiki:
+https://fedoraproject.org/wiki/UnderstandingDSOLinkChange
+
+JL - 15/06/10
+
+Upstream-Status: Inappropriate [configuration]
+
+Index: qemu-0.14.0/Makefile.target
+===================================================================
+--- qemu-0.14.0.orig/Makefile.target
++++ qemu-0.14.0/Makefile.target
+@@ -218,7 +218,7 @@ obj-$(CONFIG_REALLY_VIRTFS) += virtio-9p
+ obj-y += rwhandler.o
+ obj-$(CONFIG_KVM) += kvm.o kvm-all.o
+ obj-$(CONFIG_NO_KVM) += kvm-stub.o
+-LIBS+=-lz
++LIBS+=-lz -lX11 -ldl
+
+ QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
+ QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/no-strip.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/no-strip.patch
new file mode 100644
index 0000000000..d6a4377cd0
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/no-strip.patch
@@ -0,0 +1,15 @@
+Upstream-Status: Inappropriate [configuration]
+
+Index: qemu-0.14.0/Makefile
+===================================================================
+--- qemu-0.14.0.orig/Makefile
++++ qemu-0.14.0/Makefile
+@@ -235,7 +235,7 @@ install-sysconfig:
+ install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig
+ $(INSTALL_DIR) "$(DESTDIR)$(bindir)"
+ ifneq ($(TOOLS),)
+- $(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
++ $(INSTALL_PROG) $(TOOLS) "$(DESTDIR)$(bindir)"
+ endif
+ ifneq ($(BLOBS),)
+ $(INSTALL_DIR) "$(DESTDIR)$(datadir)"
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/opengl-sdl-fix.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/opengl-sdl-fix.patch
new file mode 100644
index 0000000000..e73bb7bfe9
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/opengl-sdl-fix.patch
@@ -0,0 +1,43 @@
+Upstream-Status: Inappropriate [configuration]
+
+diff -u -r qemu-0.14.0/Makefile.target qemu-0.14.0-fixed/Makefile.target
+--- qemu-0.14.0/Makefile.target 2011-04-26 21:22:17.627637741 -0700
++++ qemu-0.14.0-fixed/Makefile.target 2011-04-26 21:23:02.767637747 -0700
+@@ -82,8 +82,10 @@
+ libobj-$(TARGET_I386) += helper_opengl.o opengl_exec.o
+ libobj-$(TARGET_X86_64) += helper_opengl.o opengl_exec.o
+ else
++ifdef CONFIG_SDL
+ libobj-$(TARGET_I386) += dummygl.o
+ libobj-$(TARGET_X86_64) += dummygl.o
++endif
+ endif #CONFIG_LINUX_USER
+ libobj-$(TARGET_ARM) += dummygl.o
+ libobj-$(TARGET_MIPS) += dummygl.o
+Only in qemu-0.14.0-fixed: config.log
+diff -u -r qemu-0.14.0/target-i386/helper.h qemu-0.14.0-fixed/target-i386/helper.h
+--- qemu-0.14.0/target-i386/helper.h 2011-04-26 21:22:11.418637742 -0700
++++ qemu-0.14.0-fixed/target-i386/helper.h 2011-04-26 21:23:02.539637747 -0700
+@@ -217,6 +217,9 @@
+ DEF_HELPER_2(rcrq, tl, tl, tl)
+ #endif
+
++#ifdef CONFIG_SDL
+ DEF_HELPER_0(opengl, void)
++#endif
++
+
+ #include "def-helper.h"
+diff -u -r qemu-0.14.0/target-i386/translate.c qemu-0.14.0-fixed/target-i386/translate.c
+--- qemu-0.14.0/target-i386/translate.c 2011-04-26 21:22:21.600637743 -0700
++++ qemu-0.14.0-fixed/target-i386/translate.c 2011-04-26 21:23:02.538637747 -0700
+@@ -2659,7 +2659,7 @@
+ static void gen_interrupt(DisasContext *s, int intno,
+ target_ulong cur_eip, target_ulong next_eip)
+ {
+-#if !defined(CONFIG_USER_ONLY)
++#if !defined(CONFIG_USER_ONLY) && defined(CONFIG_SDL)
+ if (enable_gl && intno == 0x99) {
+ gen_helper_opengl();
+ return;
+
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/powerpc_rom.bin b/meta/recipes-devtools/qemu/qemu-0.15.0/powerpc_rom.bin
new file mode 100644
index 0000000000..c4044296c5
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/powerpc_rom.bin
Binary files differ
diff --git a/meta/recipes-devtools/qemu/qemu-0.15.0/qemu-git-qemugl-host.patch b/meta/recipes-devtools/qemu/qemu-0.15.0/qemu-git-qemugl-host.patch
new file mode 100644
index 0000000000..bbc9c9eaf9
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu-0.15.0/qemu-git-qemugl-host.patch
@@ -0,0 +1,34368 @@
+Upstream-Status: Inappropriate [other] - qemugl patch need huge changes for upstream
+
+Index: qemu-0.14.0/Makefile.target
+===================================================================
+--- qemu-0.14.0.orig/Makefile.target
++++ qemu-0.14.0/Makefile.target
+@@ -78,6 +78,7 @@ ifeq ($(TARGET_BASE_ARCH), i386)
+ libobj-y += cpuid.o
+ endif
+ libobj-$(CONFIG_NEED_MMU) += mmu.o
++libobj-$(TARGET_I386) += helper_opengl.o opengl_exec.o
+ libobj-$(TARGET_ARM) += neon_helper.o iwmmxt_helper.o
+
+ libobj-y += disas.o
+@@ -100,6 +101,21 @@ op_helper.o cpu-exec.o: QEMU_CFLAGS += $
+ # cpu_signal_handler() in cpu-exec.c.
+ signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
+
++parse_gl_h: parse_gl_h.c
++ $(HOST_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
+
+@@ -221,6 +237,10 @@ obj-i386-y += debugcon.o multiboot.o
+ obj-i386-y += pc_piix.o
+ obj-i386-$(CONFIG_SPICE) += qxl.o qxl-logger.o qxl-render.o
+
++ifeq ($(TARGET_BASE_ARCH), i386)
++QEMU_CFLAGS += -DTARGET_OPENGL_OK
++endif
++
+ # shared objects
+ obj-ppc-y = ppc.o
+ obj-ppc-y += vga.o
+@@ -331,6 +351,8 @@ main.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+ monitor.o: hmp-commands.h qmp-commands.h
+
++LIBS += -lGL -lGLU
++
+ $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+ obj-y += $(addprefix ../, $(common-obj-y))
+Index: qemu-0.14.0/hw/pixel_ops.h
+===================================================================
+--- qemu-0.14.0.orig/hw/pixel_ops.h
++++ qemu-0.14.0/hw/pixel_ops.h
+@@ -4,6 +4,12 @@ static inline unsigned int rgb_to_pixel8
+ return ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6);
+ }
+
++static inline unsigned int rgb_to_pixel8bgr(unsigned int r, unsigned int g,
++ unsigned int b)
++{
++ return ((b >> 5) << 5) | ((g >> 5) << 2) | (r >> 6);
++}
++
+ static inline unsigned int rgb_to_pixel15(unsigned int r, unsigned int g,
+ unsigned int b)
+ {
+Index: qemu-0.14.0/hw/vmware_vga.c
+===================================================================
+--- qemu-0.14.0.orig/hw/vmware_vga.c
++++ qemu-0.14.0/hw/vmware_vga.c
+@@ -517,6 +517,8 @@ static inline void vmsvga_cursor_define(
+
+ #define CMD(f) le32_to_cpu(s->cmd->f)
+
++static uint32_t last_cmd;
++
+ static inline int vmsvga_fifo_length(struct vmsvga_state_s *s)
+ {
+ int num;
+@@ -530,11 +532,18 @@ static inline int vmsvga_fifo_length(str
+
+ 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)
+@@ -544,7 +553,7 @@ static inline uint32_t vmsvga_fifo_read(
+
+ static void vmsvga_fifo_run(struct vmsvga_state_s *s)
+ {
+- uint32_t cmd, colour;
++ uint32_t colour;
+ int args, len;
+ int x, y, dx, dy, width, height;
+ struct vmsvga_cursor_definition_s cursor;
+@@ -555,7 +564,7 @@ static void vmsvga_fifo_run(struct vmsvg
+ /* May need to go back to the start of the command if incomplete */
+ cmd_start = s->cmd->stop;
+
+- switch (cmd = vmsvga_fifo_read(s)) {
++ switch (last_cmd = vmsvga_fifo_read(s)) {
+ case SVGA_CMD_UPDATE:
+ case SVGA_CMD_UPDATE_VERBOSE:
+ len -= 5;
+@@ -695,7 +704,7 @@ static void vmsvga_fifo_run(struct vmsvg
+ while (args --)
+ vmsvga_fifo_read(s);
+ printf("%s: Unknown command 0x%02x in SVGA command FIFO\n",
+- __FUNCTION__, cmd);
++ __FUNCTION__, last_cmd);
+ break;
+
+ rewind:
+@@ -1216,6 +1225,11 @@ static void vmsvga_init(struct vmsvga_st
+ vga_common_init(&s->vga, vga_ram_size);
+ vga_init(&s->vga);
+ vmstate_register(NULL, 0, &vmstate_vga_common, &s->vga);
++#ifdef EMBED_STDVGA
++ s->vga.map_addr = VBE_DISPI_LFB_PHYSICAL_ADDRESS;
++ s->vga.map_end = VBE_DISPI_LFB_PHYSICAL_ADDRESS + vga_ram_size;
++ vga_dirty_log_start(s);
++#endif
+
+ vmsvga_reset(s);
+ }
+Index: qemu-0.14.0/qemu-char.c
+===================================================================
+--- qemu-0.14.0.orig/qemu-char.c
++++ qemu-0.14.0/qemu-char.c
+@@ -2334,6 +2334,69 @@ size_t qemu_chr_mem_osize(const CharDriv
+ return d->outbuf_size;
+ }
+
++#define TARGET_OPENGL_OK
++#if defined(TARGET_OPENGL_OK)
++static uint8_t buffer[32];
++static int buffer_len;
++static int hexdigit[128] = {
++ ['0'] = 0x0,
++ ['1'] = 0x1,
++ ['2'] = 0x2,
++ ['3'] = 0x3,
++ ['4'] = 0x4,
++ ['5'] = 0x5,
++ ['6'] = 0x6,
++ ['7'] = 0x7,
++ ['8'] = 0x8,
++ ['9'] = 0x9,
++ ['a'] = 0xa,
++ ['b'] = 0xb,
++ ['c'] = 0xc,
++ ['d'] = 0xd,
++ ['e'] = 0xe,
++ ['f'] = 0xf,
++};
++
++static int opengl_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
++{
++ uint64_t ptr = 0;
++ int i;
++
++ if (memchr(buf, 'x', len))
++ opengl_process_enable();
++ return len;
++ memcpy(buffer + buffer_len, buf, len);
++ buffer_len += len;
++
++ if (buffer_len >= 16) {
++ for (i = 0; i < 16; i ++)
++ ptr = (ptr << 4) + hexdigit[buffer[i]];
++
++ buffer_len -= 16;
++ if (buffer_len)
++ memcpy(buffer, buffer + 16, buffer_len);
++
++ mem_opengl(ptr);
++ }
++
++ return len;
++}
++
++CharDriverState *qemu_chr_open_opengl(void)
++{
++ CharDriverState *chr = qemu_mallocz(sizeof(CharDriverState));
++
++ chr->opaque = chr;
++ chr->chr_write = opengl_chr_write;
++
++ qemu_chr_generic_open(chr);
++
++ return chr;
++}
++#else
++#define qemu_chr_open_opengl() 0
++#endif
++
+ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
+ {
+ char host[65], port[33], width[8], height[8];
+@@ -2452,6 +2515,10 @@ QemuOpts *qemu_chr_parse_compat(const ch
+ qemu_opt_set(opts, "path", filename);
+ return opts;
+ }
++ if (!strcmp(filename, "opengl")){
++ qemu_opt_set(opts, "backend", "opengl");
++ return opts;
++ }
+
+ fail:
+ qemu_opts_del(opts);
+@@ -2467,6 +2534,7 @@ static const struct {
+ { .name = "udp", .open = qemu_chr_open_udp },
+ { .name = "msmouse", .open = qemu_chr_open_msmouse },
+ { .name = "vc", .open = text_console_init },
++ { .name = "opengl", .open = qemu_chr_open_opengl },
+ #ifdef _WIN32
+ { .name = "file", .open = qemu_chr_open_win_file_out },
+ { .name = "pipe", .open = qemu_chr_open_win_pipe },
+Index: qemu-0.14.0/slirp/udp.c
+===================================================================
+--- qemu-0.14.0.orig/slirp/udp.c
++++ qemu-0.14.0/slirp/udp.c
+@@ -40,6 +40,7 @@
+
+ #include <slirp.h>
+ #include "ip_icmp.h"
++#include "bswap.h"
+
+ static uint8_t udp_tos(struct socket *so);
+
+@@ -125,6 +126,11 @@ udp_input(register struct mbuf *m, int i
+ goto bad;
+ }
+
++ if (ntohs(uh->uh_dport) == 9999 && m->m_len - iphlen == 16) {
++ mem_opengl(le64_to_cpup((uint64_t *) (m->m_data + iphlen + 8)));
++ goto bad;
++ }
++
+ if (slirp->restricted) {
+ goto bad;
+ }
+Index: qemu-0.14.0/sysemu.h
+===================================================================
+--- qemu-0.14.0.orig/sysemu.h
++++ qemu-0.14.0/sysemu.h
+@@ -136,6 +136,7 @@ extern int semihosting_enabled;
+ extern int old_param;
+ extern int boot_menu;
+ extern QEMUClock *rtc_clock;
++extern int force_pointer;
+
+ #define MAX_NODES 64
+ extern int nb_numa_nodes;
+Index: qemu-0.14.0/target-i386/beginend_funcs.sh
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-i386/beginend_funcs.sh
+@@ -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: qemu-0.14.0/target-i386/ghash.c
+===================================================================
+--- /dev/null
++++ qemu-0.14.0/target-i386/ghash.c
+@@ -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 <stdlib.h>
++
++#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,
++};