summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhai Edwin <edwin.zhai@intel.com>2011-09-22 13:51:24 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-09-22 08:49:10 +0100
commit0289683798bb3b6d1cfbf7cccb834b4b78d9bdab (patch)
tree6157238ed51fd2230931bef0370ed9b6bde75413
parentf800862555b81dec65f3de09a2f7b1a0c97a09c1 (diff)
downloadpoky-0289683798bb3b6d1cfbf7cccb834b4b78d9bdab.tar.gz
qemugl: Use local variable rather than "push" to save register
New gcc uses "%esp" rather than "%ebp" to index local variable in stack, and push between save-to/restore-from stack decrease "%esp", which leads wrong index. Saving registers via local variables to make gcc aware of this and avoid stack disorder. [YOCTO #1442] got fixed (From OE-Core rev: afc9edc27e77e80fdd24b4c8c538f91672940e75) Signed-off-by: Zhai Edwin <edwin.zhai@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-graphics/mesa/qemugl/call_opengl_fix.patch58
-rw-r--r--meta/recipes-graphics/mesa/qemugl_git.bb5
2 files changed, 61 insertions, 2 deletions
diff --git a/meta/recipes-graphics/mesa/qemugl/call_opengl_fix.patch b/meta/recipes-graphics/mesa/qemugl/call_opengl_fix.patch
new file mode 100644
index 0000000000..c5e3592a74
--- /dev/null
+++ b/meta/recipes-graphics/mesa/qemugl/call_opengl_fix.patch
@@ -0,0 +1,58 @@
1Save registers via local variables instead of simple "push", so that gcc become
2aware of this operation and avoid stack disorder.
3
4opengl calling (in call_opengl_qemu) includes 4 steps:
51. prepare opengl parameters on stack
62. save some "input" register by push
73. load "input" register with parameters on stack via same index as step 1
84. issue "int 0x99" to trap into qemu, who will get parameter in the registers
9
10New gcc uses "%esp" rather than "%ebp" to index local variable in stack, which
11leads wrong index in step 3, as push decrease "%esp" automatically. Saving
12registers via local variables to fix it.
13
14Upstream-Status: Pending
15
16Signed-off-by: Zhai Edwin <edwin.zhai@intel.com>
17Index: git/opengl_client.c
18===================================================================
19--- git.orig/opengl_client.c 2011-09-19 19:44:51.000000000 +0800
20+++ git/opengl_client.c 2011-09-22 10:11:04.000000000 +0800
21@@ -1076,23 +1076,29 @@
22 {
23 #if defined(__i386__)
24 int ret;
25+ int bx, cx, dx, si;
26 #ifdef WIN32
27 __asm__ ("pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;" : : "g" (win32_sigsegv_handler));
28 #endif
29- __asm__ ("push %ebx");
30- __asm__ ("push %ecx");
31- __asm__ ("push %edx");
32- __asm__ ("push %esi");
33+ /* save registers before opengl call */
34+ __asm__ ("mov %%ebx, %0"::"m"(bx));
35+ __asm__ ("mov %%ecx, %0"::"m"(cx));
36+ __asm__ ("mov %%edx, %0"::"m"(dx));
37+ __asm__ ("mov %%esi, %0"::"m"(si));
38+
39 __asm__ ("mov %0, %%eax"::"m"(func_number));
40 __asm__ ("mov %0, %%ebx"::"m"(pid));
41 __asm__ ("mov %0, %%ecx"::"m"(ret_string));
42 __asm__ ("mov %0, %%edx"::"m"(args));
43 __asm__ ("mov %0, %%esi"::"m"(args_size));
44 __asm__ ("int $0x99");
45- __asm__ ("pop %esi");
46- __asm__ ("pop %edx");
47- __asm__ ("pop %ecx");
48- __asm__ ("pop %ebx");
49+
50+ /* restore registers */
51+ __asm__ ("mov %0, %%ebx"::"m"(bx));
52+ __asm__ ("mov %0, %%ecx"::"m"(cx));
53+ __asm__ ("mov %0, %%edx"::"m"(dx));
54+ __asm__ ("mov %0, %%esi"::"m"(si));
55+
56 __asm__ ("mov %%eax, %0"::"m"(ret));
57 #ifdef WIN32
58 __asm__ ("movl (%%esp),%%ecx;movl %%ecx,%%fs:0;addl $8,%%esp;" : : : "%ecx");
diff --git a/meta/recipes-graphics/mesa/qemugl_git.bb b/meta/recipes-graphics/mesa/qemugl_git.bb
index 9d5115f43d..1658759258 100644
--- a/meta/recipes-graphics/mesa/qemugl_git.bb
+++ b/meta/recipes-graphics/mesa/qemugl_git.bb
@@ -11,13 +11,14 @@ COMPATIBLE_HOST = '(x86_64.*|i.86.*)-(linux|freebsd.*)'
11 11
12SRC_URI = "git://git.o-hand.com/qemugl.git;protocol=git \ 12SRC_URI = "git://git.o-hand.com/qemugl.git;protocol=git \
13 file://versionfix.patch \ 13 file://versionfix.patch \
14 file://remove-x11r6-lib-dir.patch" 14 file://remove-x11r6-lib-dir.patch \
15 file://call_opengl_fix.patch"
15S = "${WORKDIR}/git" 16S = "${WORKDIR}/git"
16 17
17SRCREV = "d888bbc723c00d197d34a39b5b7448660ec1b1c0" 18SRCREV = "d888bbc723c00d197d34a39b5b7448660ec1b1c0"
18 19
19PV = "0.0+git${SRCPV}" 20PV = "0.0+git${SRCPV}"
20PR = "r7" 21PR = "r8"
21 22
22DEFAULT_PREFERENCE = "-1" 23DEFAULT_PREFERENCE = "-1"
23 24