Alexandre Julliard : ntdll: Set all registers in set_cpu_context() on ARM.
Alexandre Julliard
julliard at winehq.org
Thu Dec 14 15:31:53 CST 2017
Module: wine
Branch: master
Commit: 8a07ee48fa96e12474cb6f7c1d365858aaebcdff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a07ee48fa96e12474cb6f7c1d365858aaebcdff
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 14 18:34:19 2017 +0100
ntdll: Set all registers in set_cpu_context() on ARM.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/signal_arm.c | 51 ++++++++++++++-----------------------------------
1 file changed, 14 insertions(+), 37 deletions(-)
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index dcb4564..fc65c87 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -262,24 +262,10 @@ __ASM_GLOBAL_FUNC( __chkstk, "lsl r4, r4, #2\n\t"
/* FIXME: Use the Stack instead of the actual register values */
__ASM_STDCALL_FUNC( RtlCaptureContext, 4,
".arm\n\t"
- "stmfd SP!, {r1}\n\t"
- "mov r1, #0x0200000\n\t"/* CONTEXT_ARM */
- "add r1, r1, #0x3\n\t" /* CONTEXT_FULL */
- "str r1, [r0]\n\t" /* context->ContextFlags */
- "ldmfd SP!, {r1}\n\t"
- "str r0, [r0, #0x4]\n\t" /* context->R0 */
- "str r1, [r0, #0x8]\n\t" /* context->R1 */
- "str r2, [r0, #0xc]\n\t" /* context->R2 */
- "str r3, [r0, #0x10]\n\t" /* context->R3 */
- "str r4, [r0, #0x14]\n\t" /* context->R4 */
- "str r5, [r0, #0x18]\n\t" /* context->R5 */
- "str r6, [r0, #0x1c]\n\t" /* context->R6 */
- "str r7, [r0, #0x20]\n\t" /* context->R7 */
- "str r8, [r0, #0x24]\n\t" /* context->R8 */
- "str r9, [r0, #0x28]\n\t" /* context->R9 */
- "str r10, [r0, #0x2c]\n\t" /* context->R10 */
- "str r11, [r0, #0x30]\n\t" /* context->R11 */
- "str IP, [r0, #0x34]\n\t" /* context->R12 */
+ "stmib r0, {r0-r12}\n\t" /* context->R0..R12 */
+ "mov r1, #0x0200000\n\t" /* CONTEXT_ARM */
+ "add r1, r1, #0x3\n\t" /* CONTEXT_FULL */
+ "str r1, [r0]\n\t" /* context->ContextFlags */
"str SP, [r0, #0x38]\n\t" /* context->Sp */
"str LR, [r0, #0x3c]\n\t" /* context->Lr */
"str PC, [r0, #0x40]\n\t" /* context->Pc */
@@ -294,26 +280,17 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 4,
*
* Set the new CPU context.
*/
-/* FIXME: What about the CPSR? */
-void set_cpu_context( const CONTEXT *context );
+void DECLSPEC_HIDDEN set_cpu_context( const CONTEXT *context );
__ASM_GLOBAL_FUNC( set_cpu_context,
- "mov IP, r0\n\t"
- "ldr r0, [IP, #0x4]\n\t" /* context->R0 */
- "ldr r1, [IP, #0x8]\n\t" /* context->R1 */
- "ldr r2, [IP, #0xc]\n\t" /* context->R2 */
- "ldr r3, [IP, #0x10]\n\t" /* context->R3 */
- "ldr r4, [IP, #0x14]\n\t" /* context->R4 */
- "ldr r5, [IP, #0x18]\n\t" /* context->R5 */
- "ldr r6, [IP, #0x1c]\n\t" /* context->R6 */
- "ldr r7, [IP, #0x20]\n\t" /* context->R7 */
- "ldr r8, [IP, #0x24]\n\t" /* context->R8 */
- "ldr r9, [IP, #0x28]\n\t" /* context->R9 */
- "ldr r10, [IP, #0x2c]\n\t" /* context->R10 */
- "ldr r11, [IP, #0x30]\n\t" /* context->R11 */
- "ldr SP, [IP, #0x38]\n\t" /* context->R12 */
- "ldr LR, [IP, #0x3c]\n\t" /* context->Lr */
- "ldr PC, [IP, #0x40]\n\t" /* context->Pc */
- )
+ ".arm\n\t"
+ "ldr r1, [r0, #0x44]\n\t" /* context->Cpsr */
+ "msr CPSR_f, r1\n\t"
+ "ldr r1, [r0, #0x40]\n\t" /* context->Pc */
+ "ldr lr, [r0, #0x3c]\n\t" /* context->Lr */
+ "ldr sp, [r0, #0x38]\n\t" /* context->Sp */
+ "push {r1}\n\t"
+ "ldmib r0, {r0-r12}\n\t" /* context->R0..R12 */
+ "pop {pc}" )
/***********************************************************************
More information about the wine-cvs
mailing list