We need a scratch register to set PC at the end, this version uses LR
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..e3fcf92 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 x15, [x0, #0x80]\n\t" /* context->X15 */ + "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, #0x100]\n\t" /* context->Sp -> tmp */ + "mov sp, x30\n\t" + "ldr x30, [x0, #0x108]\n\t" /* context->Pc -> LR */ + "ldr x0, [x0, #0x8]\n\t" /* context->X0 */ + "ret\n\t" + )
/*********************************************************************** * copy_context
André Hentschel nerv@dawncrow.de writes:
We need a scratch register to set PC at the end, this version uses LR
If it's not possible to restore all registers from user space then it doesn't make sense to implement this function. It will have to be done through NtSetContextThread and the server.