[1/8] libs/wine: Fix ARM support
André Hentschel
webmaster at dawncrow.de
Sat Sep 18 11:01:06 CDT 2010
---
libs/wine/port.c | 22 +++++++++-------------
1 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/libs/wine/port.c b/libs/wine/port.c
index f4ad2e9..7cbe5b4 100644
--- a/libs/wine/port.c
+++ b/libs/wine/port.c
@@ -171,20 +171,16 @@ __ASM_GLOBAL_FUNC( wine_call_on_stack,
"lwz 0, 4(1)\n\t" /* fetch return address */
"mtlr 0\n\t" /* return address -> lr */
"blr") /* return */
-#elif defined(__arm__)
+#elif defined(__arm__) && defined(__GNUC__)
__ASM_GLOBAL_FUNC( wine_call_on_stack,
- "str r14, [r13, #4]\n\t" /* save return address on stack */
- "sub r2, r2, #16\n\t" /* reserve space on new stack */
- "str r13, [r2, #12]\n\t" /* store old sp */
- "mov r3, r0\n\t" /* func */
- "mov r0, r1\n\t" /* arg */
- "mov r13, r2\n\t" /* stack */
- "mov r2, #0\n\t" /* zero */
- "str r2, [r13]\n\t" /* bottom of stack */
- "sub r13, r13, #16\n\t" /* create a frame for this function */
- "blx r3\n\t" /* call func */
- "ldr r13, [r13, #28]\n\t" /* fetch old sp */
- "ldr r15, [r13, #4]") /* fetch return address and return */
+ "push {r4,LR}\n\t" /* save return address on stack */
+ "mov r4, sp\n\t" /* store old sp in local var */
+ "mov sp, r2\n\t" /* stack */
+ "mov r2, r0\n\t" /* func -> scratch register */
+ "mov r0, r1\n\t" /* arg */
+ "blx r2\n\t" /* call func */
+ "mov sp, r4\n\t" /* restore old sp from local var */
+ "pop {r4,PC}") /* fetch return address into pc */
#else
#error You must implement wine_switch_to_stack for your platform
#endif
--
1.7.2.1.95.g3d045
More information about the wine-patches
mailing list