ntdll/signal_arm.c: Implemantation of set_cpu_context and RtlCaptureContext

chris.nousco at gmail.com chris.nousco at gmail.com
Thu Feb 17 02:29:23 CST 2011


From: JinSung Kang <chris.nousco at gmail.com>

Implement the function of set_cpu_context and RtlCaptureContext
---
 dlls/ntdll/signal_arm.c |   37 +++++++++++++++++++++++++------------
 1 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index ae6ff5a..bd80cbf 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -59,6 +59,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(seh);
 
+void DECLSPEC_NORETURN __wine_restore_regs( const CONTEXT *context );
+
 static pthread_key_t teb_key;
 
 /***********************************************************************
@@ -195,12 +197,15 @@ static inline void restore_fpu( CONTEXT *context, const ucontext_t *sigcontext )
 /***********************************************************************
  *		RtlCaptureContext (NTDLL.@)
  */
-void WINAPI RtlCaptureContext( CONTEXT *context )
-{
-    FIXME("not implemented\n");
-    memset( context, 0, sizeof(*context) );
-}
-
+__ASM_STDCALL_FUNC(RtlCaptureContext, 4,
+		"stmfd SP!, {r1}\n\t"
+		"mov r1, #0x1000\n\t"
+		"add r1, r1, #0x7\n\t"
+		"str r1, [r0]\n\t" 		/*context->ContextFlags*/
+		"add r0, r0, #4\n\t"
+		"ldmfd SP!, {r1}\n\t"	
+		"stmia r0, {r0-pc}\n"   /*make CONTEXT data from register files*/
+		)
 
 /***********************************************************************
  *           set_cpu_context
@@ -209,8 +214,8 @@ void WINAPI RtlCaptureContext( CONTEXT *context )
  */
 void set_cpu_context( const CONTEXT *context )
 {
-    FIXME("not implemented\n");
-    return;
+	CONTEXT newcontext = *context;
+	__wine_restore_regs(&newcontext);
 }
 
 
@@ -657,7 +662,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
     }
     rec.ExceptionFlags   = EXCEPTION_CONTINUABLE;
     rec.ExceptionRecord  = NULL;
-    /*rec.ExceptionAddress = (LPVOID)context.Iar;*/
+    rec.ExceptionAddress = (LPVOID)context.Pc;
     rec.NumberParameters = 0;
     status = raise_exception( &rec, &context, TRUE );
     if (status) raise_status( status, &rec );
@@ -683,7 +688,7 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
         rec.ExceptionCode    = CONTROL_C_EXIT;
         rec.ExceptionFlags   = EXCEPTION_CONTINUABLE;
         rec.ExceptionRecord  = NULL;
-        /*rec.ExceptionAddress = (LPVOID)context.Iar;*/
+        rec.ExceptionAddress = (LPVOID)context.Pc;
         rec.NumberParameters = 0;
         status = raise_exception( &rec, &context, TRUE );
         if (status) raise_status( status, &rec );
@@ -707,7 +712,7 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
     rec.ExceptionCode    = EXCEPTION_WINE_ASSERTION;
     rec.ExceptionFlags   = EH_NONCONTINUABLE;
     rec.ExceptionRecord  = NULL;
-    /*rec.ExceptionAddress = (LPVOID)context.Iar;*/
+    rec.ExceptionAddress = (LPVOID)context.Pc;
     rec.NumberParameters = 0;
     status = raise_exception( &rec, &context, TRUE );
     if (status) raise_status( status, &rec );
@@ -890,7 +895,7 @@ void WINAPI RtlRaiseException( EXCEPTION_RECORD *rec )
     NTSTATUS status;
 
     RtlCaptureContext( &context );
-    /*rec->ExceptionAddress = (void *)context.Iar;*/
+    rec->ExceptionAddress = (void *)context.Pc;
     status = raise_exception( rec, &context, TRUE );
     if (status) raise_status( status, rec );
 }
@@ -961,4 +966,12 @@ TEB * WINAPI NtCurrentTeb(void)
     return pthread_getspecific( teb_key );
 }
 
+/**********************************************************************
+ *           __wine_restore_regs
+ * This routine restore register files from the CONTEXT.
+ */
+__ASM_GLOBAL_FUNC(__wine_restore_regs,
+		"add r0, r0, #4\n\t"
+		"ldmia r0, {r0-pc}\n\t"
+		)
 #endif  /* __arm__ */
-- 
1.5.6.1




More information about the wine-patches mailing list