Signed-off-by: André Hentschel nerv@dawncrow.de --- dlls/ntdll/signal_arm64.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 5b3e887..50903a9 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -231,10 +231,43 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 8, * * Set the new CPU context. */ -static void set_cpu_context( const CONTEXT *context ) -{ - FIXME( "Not implemented on ARM64\n" ); -} +void set_cpu_context( const CONTEXT *context ); +__ASM_GLOBAL_FUNC( set_cpu_context, + "ldr x1, [x0, #0x10]\n\t" /* context->X1 */ + "ldr x2, [x0, #0x18]\n\t" /* context->X2 */ + "ldr x3, [x0, #0x20]\n\t" /* context->X3 */ + "ldr x4, [x0, #0x28]\n\t" /* context->X4 */ + "ldr x5, [x0, #0x30]\n\t" /* context->X5 */ + "ldr x6, [x0, #0x38]\n\t" /* context->X6 */ + "ldr x7, [x0, #0x40]\n\t" /* context->X7 */ + "ldr x8, [x0, #0x48]\n\t" /* context->X8 */ + "ldr x9, [x0, #0x50]\n\t" /* context->X9 */ + "ldr x10, [x0, #0x58]\n\t" /* context->X10 */ + "ldr x11, [x0, #0x60]\n\t" /* context->X11 */ + "ldr x12, [x0, #0x68]\n\t" /* context->X12 */ + "ldr x13, [x0, #0x70]\n\t" /* context->X13 */ + "ldr x14, [x0, #0x78]\n\t" /* context->X14 */ + "ldr x16, [x0, #0x88]\n\t" /* context->X16 */ + "ldr x17, [x0, #0x90]\n\t" /* context->X17 */ + "ldr x18, [x0, #0x98]\n\t" /* context->X18 */ + "ldr x19, [x0, #0xa0]\n\t" /* context->X19 */ + "ldr x20, [x0, #0xa8]\n\t" /* context->X20 */ + "ldr x21, [x0, #0xb0]\n\t" /* context->X21 */ + "ldr x22, [x0, #0xb8]\n\t" /* context->X22 */ + "ldr x23, [x0, #0xc0]\n\t" /* context->X23 */ + "ldr x24, [x0, #0xc8]\n\t" /* context->X24 */ + "ldr x25, [x0, #0xd0]\n\t" /* context->X25 */ + "ldr x26, [x0, #0xd8]\n\t" /* context->X26 */ + "ldr x27, [x0, #0xe0]\n\t" /* context->X27 */ + "ldr x28, [x0, #0xe8]\n\t" /* context->X28 */ + "ldr x29, [x0, #0xf0]\n\t" /* context->Fp */ + "ldr x30, [x0, #0xf8]\n\t" /* context->Lr */ + "ldr x15, [x0, #0x100]\n\t" /* context->Sp */ + "mov sp, x15\n\t" + "ldr x15, [x0, #0x108]\n\t" /* context->Pc */ + "ldr x0, [x0, #0x8]\n\t" /* context->X0 */ + "br x15\n\t" + )
/*********************************************************************** * copy_context
André Hentschel nerv@dawncrow.de writes:
"mov sp, x15\n\t"
"ldr x15, [x0, #0x108]\n\t" /* context->Pc */
"ldr x0, [x0, #0x8]\n\t" /* context->X0 */
"br x15\n\t"
)
We've been through this before, you need to restore all registers.