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>
This commit is contained in:
parent
e9f8b99215
commit
d513e5f92c
|
@ -0,0 +1,58 @@
|
||||||
|
Save registers via local variables instead of simple "push", so that gcc become
|
||||||
|
aware of this operation and avoid stack disorder.
|
||||||
|
|
||||||
|
opengl calling (in call_opengl_qemu) includes 4 steps:
|
||||||
|
1. prepare opengl parameters on stack
|
||||||
|
2. save some "input" register by push
|
||||||
|
3. load "input" register with parameters on stack via same index as step 1
|
||||||
|
4. issue "int 0x99" to trap into qemu, who will get parameter in the registers
|
||||||
|
|
||||||
|
New gcc uses "%esp" rather than "%ebp" to index local variable in stack, which
|
||||||
|
leads wrong index in step 3, as push decrease "%esp" automatically. Saving
|
||||||
|
registers via local variables to fix it.
|
||||||
|
|
||||||
|
Upstream-Status: Pending
|
||||||
|
|
||||||
|
Signed-off-by: Zhai Edwin <edwin.zhai@intel.com>
|
||||||
|
Index: git/opengl_client.c
|
||||||
|
===================================================================
|
||||||
|
--- git.orig/opengl_client.c 2011-09-19 19:44:51.000000000 +0800
|
||||||
|
+++ git/opengl_client.c 2011-09-22 10:11:04.000000000 +0800
|
||||||
|
@@ -1076,23 +1076,29 @@
|
||||||
|
{
|
||||||
|
#if defined(__i386__)
|
||||||
|
int ret;
|
||||||
|
+ int bx, cx, dx, si;
|
||||||
|
#ifdef WIN32
|
||||||
|
__asm__ ("pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;" : : "g" (win32_sigsegv_handler));
|
||||||
|
#endif
|
||||||
|
- __asm__ ("push %ebx");
|
||||||
|
- __asm__ ("push %ecx");
|
||||||
|
- __asm__ ("push %edx");
|
||||||
|
- __asm__ ("push %esi");
|
||||||
|
+ /* save registers before opengl call */
|
||||||
|
+ __asm__ ("mov %%ebx, %0"::"m"(bx));
|
||||||
|
+ __asm__ ("mov %%ecx, %0"::"m"(cx));
|
||||||
|
+ __asm__ ("mov %%edx, %0"::"m"(dx));
|
||||||
|
+ __asm__ ("mov %%esi, %0"::"m"(si));
|
||||||
|
+
|
||||||
|
__asm__ ("mov %0, %%eax"::"m"(func_number));
|
||||||
|
__asm__ ("mov %0, %%ebx"::"m"(pid));
|
||||||
|
__asm__ ("mov %0, %%ecx"::"m"(ret_string));
|
||||||
|
__asm__ ("mov %0, %%edx"::"m"(args));
|
||||||
|
__asm__ ("mov %0, %%esi"::"m"(args_size));
|
||||||
|
__asm__ ("int $0x99");
|
||||||
|
- __asm__ ("pop %esi");
|
||||||
|
- __asm__ ("pop %edx");
|
||||||
|
- __asm__ ("pop %ecx");
|
||||||
|
- __asm__ ("pop %ebx");
|
||||||
|
+
|
||||||
|
+ /* restore registers */
|
||||||
|
+ __asm__ ("mov %0, %%ebx"::"m"(bx));
|
||||||
|
+ __asm__ ("mov %0, %%ecx"::"m"(cx));
|
||||||
|
+ __asm__ ("mov %0, %%edx"::"m"(dx));
|
||||||
|
+ __asm__ ("mov %0, %%esi"::"m"(si));
|
||||||
|
+
|
||||||
|
__asm__ ("mov %%eax, %0"::"m"(ret));
|
||||||
|
#ifdef WIN32
|
||||||
|
__asm__ ("movl (%%esp),%%ecx;movl %%ecx,%%fs:0;addl $8,%%esp;" : : : "%ecx");
|
|
@ -11,13 +11,14 @@ COMPATIBLE_HOST = '(x86_64.*|i.86.*)-(linux|freebsd.*)'
|
||||||
|
|
||||||
SRC_URI = "git://git.o-hand.com/qemugl.git;protocol=git \
|
SRC_URI = "git://git.o-hand.com/qemugl.git;protocol=git \
|
||||||
file://versionfix.patch \
|
file://versionfix.patch \
|
||||||
file://remove-x11r6-lib-dir.patch"
|
file://remove-x11r6-lib-dir.patch \
|
||||||
|
file://call_opengl_fix.patch"
|
||||||
S = "${WORKDIR}/git"
|
S = "${WORKDIR}/git"
|
||||||
|
|
||||||
SRCREV = "d888bbc723c00d197d34a39b5b7448660ec1b1c0"
|
SRCREV = "d888bbc723c00d197d34a39b5b7448660ec1b1c0"
|
||||||
|
|
||||||
PV = "0.0+git${SRCPV}"
|
PV = "0.0+git${SRCPV}"
|
||||||
PR = "r7"
|
PR = "r8"
|
||||||
|
|
||||||
DEFAULT_PREFERENCE = "-1"
|
DEFAULT_PREFERENCE = "-1"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue