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