From 0711c75539a5c65706e14c747441fd5baf833d75 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Jul 2010 00:26:51 +0000 Subject: [PATCH] [CRT] - Add amd64 versions of setjmp / longjmp - Add amd64 versions of chkstk_asm.s, seh.s to libcntpr svn path=/trunk/; revision=48151 --- reactos/lib/sdk/crt/crt.rbuild | 5 + reactos/lib/sdk/crt/libcntpr.rbuild | 11 ++ reactos/lib/sdk/crt/setjmp/amd64/setjmp.s | 158 ++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 reactos/lib/sdk/crt/setjmp/amd64/setjmp.s diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild index 9821329f510..51006122366 100644 --- a/reactos/lib/sdk/crt/crt.rbuild +++ b/reactos/lib/sdk/crt/crt.rbuild @@ -292,6 +292,11 @@ setjmp.s + + + setjmp.s + + signal.c diff --git a/reactos/lib/sdk/crt/libcntpr.rbuild b/reactos/lib/sdk/crt/libcntpr.rbuild index 6156fe08242..198bdf56bad 100644 --- a/reactos/lib/sdk/crt/libcntpr.rbuild +++ b/reactos/lib/sdk/crt/libcntpr.rbuild @@ -19,6 +19,12 @@ seh.s + + + chkstk_asm.s + seh.s + + chkstk_asm.s @@ -90,6 +96,11 @@ setjmp.s + + + setjmp.s + + diff --git a/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s new file mode 100644 index 00000000000..56459ae7665 --- /dev/null +++ b/reactos/lib/sdk/crt/setjmp/amd64/setjmp.s @@ -0,0 +1,158 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Implementation of _setjmp/longjmp + * FILE: lib/sdk/crt/setjmp/amd64/setjmp.s + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +#define JUMP_BUFFER_Frame 0x00 +#define JUMP_BUFFER_Rbx 0x08 +#define JUMP_BUFFER_Rsp 0x10 +#define JUMP_BUFFER_Rbp 0x18 +#define JUMP_BUFFER_Rsi 0x20 +#define JUMP_BUFFER_Rdi 0x28 +#define JUMP_BUFFER_R12 0x30 +#define JUMP_BUFFER_R13 0x38 +#define JUMP_BUFFER_R14 0x40 +#define JUMP_BUFFER_R15 0x48 +#define JUMP_BUFFER_Rip 0x50 +#define JUMP_BUFFER_Spare 0x58 +#define JUMP_BUFFER_Xmm6 0x60 +#define JUMP_BUFFER_Xmm7 0x70 +#define JUMP_BUFFER_Xmm8 0x80 +#define JUMP_BUFFER_Xmm9 0x90 +#define JUMP_BUFFER_Xmm10 0xa0 +#define JUMP_BUFFER_Xmm11 0xb0 +#define JUMP_BUFFER_Xmm12 0xc0 +#define JUMP_BUFFER_Xmm13 0xd0 +#define JUMP_BUFFER_Xmm14 0xe0 +#define JUMP_BUFFER_Xmm15 0xf0 + + +/* FUNCTIONS ******************************************************************/ + +/* + * int _setjmp(jmp_buf env); + * + * Parameters: - jmp_buf env + * Returns: 0 + * Notes: Sets up the jmp_buf + */ +PUBLIC _setjmp +.proc _setjmp + /* Load rsp as it was before the call into rax */ + lea rax, [rsp + 8] + /* Load return address into r8 */ + mov r8, [rsp] + mov qword ptr [rcx + JUMP_BUFFER_Frame], 0 + mov [rcx + JUMP_BUFFER_Rbx], rbx + mov [rcx + JUMP_BUFFER_Rbp], rbp + mov [rcx + JUMP_BUFFER_Rsi], rsi + mov [rcx + JUMP_BUFFER_Rdi], rdi + mov [rcx + JUMP_BUFFER_R12], r12 + mov [rcx + JUMP_BUFFER_R13], r13 + mov [rcx + JUMP_BUFFER_R14], r14 + mov [rcx + JUMP_BUFFER_R15], r15 + mov [rcx + JUMP_BUFFER_Rsp], rax + mov [rcx + JUMP_BUFFER_Rip], r8 + movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6 + movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7 + movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8 + movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9 + movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10 + movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11 + movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12 + movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13 + movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14 + movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 + xor rax, rax + ret +.endp setjmp + +/* + * int _setjmpex(jmp_buf _Buf,void *_Ctx); + * + * Parameters: - jmp_buf env + * - frame + * Returns: 0 + * Notes: Sets up the jmp_buf + */ +PUBLIC _setjmpex +.proc _setjmpex + /* Load rsp as it was before the call into rax */ + lea rax, [rsp + 8] + /* Load return address into r8 */ + mov r8, [rsp] + mov [rcx + JUMP_BUFFER_Frame], rdx + mov [rcx + JUMP_BUFFER_Rbx], rbx + mov [rcx + JUMP_BUFFER_Rbp], rbp + mov [rcx + JUMP_BUFFER_Rsi], rsi + mov [rcx + JUMP_BUFFER_Rdi], rdi + mov [rcx + JUMP_BUFFER_R12], r12 + mov [rcx + JUMP_BUFFER_R13], r13 + mov [rcx + JUMP_BUFFER_R14], r14 + mov [rcx + JUMP_BUFFER_R15], r15 + mov [rcx + JUMP_BUFFER_Rsp], rax + mov [rcx + JUMP_BUFFER_Rip], r8 + movdqa [rcx + JUMP_BUFFER_Xmm6], xmm6 + movdqa [rcx + JUMP_BUFFER_Xmm7], xmm7 + movdqa [rcx + JUMP_BUFFER_Xmm8], xmm8 + movdqa [rcx + JUMP_BUFFER_Xmm9], xmm9 + movdqa [rcx + JUMP_BUFFER_Xmm10], xmm10 + movdqa [rcx + JUMP_BUFFER_Xmm11], xmm11 + movdqa [rcx + JUMP_BUFFER_Xmm12], xmm12 + movdqa [rcx + JUMP_BUFFER_Xmm13], xmm13 + movdqa [rcx + JUMP_BUFFER_Xmm14], xmm14 + movdqa [rcx + JUMP_BUFFER_Xmm15], xmm15 + xor rax, rax + ret +.endp setjmpex + + +/* + * void longjmp(jmp_buf env, int value); + * + * Parameters: - jmp_buf setup by _setjmp + * - int value to return + * Returns: Doesn't return + * Notes: Non-local goto + */ +PUBLIC longjmp +.proc longjmp + + // FIXME: handle frame + + mov rbx, [rcx + JUMP_BUFFER_Rbx] + mov rbp, [rcx + JUMP_BUFFER_Rbp] + mov rsi, [rcx + JUMP_BUFFER_Rsi] + mov rdi, [rcx + JUMP_BUFFER_Rdi] + mov r12, [rcx + JUMP_BUFFER_R12] + mov r13, [rcx + JUMP_BUFFER_R13] + mov r14, [rcx + JUMP_BUFFER_R14] + mov r15, [rcx + JUMP_BUFFER_R15] + mov rsp, [rcx + JUMP_BUFFER_Rsp] + mov r8, [rcx + JUMP_BUFFER_Rip] + movdqa xmm6, [rcx + JUMP_BUFFER_Xmm6] + movdqa xmm7, [rcx + JUMP_BUFFER_Xmm7] + movdqa xmm8, [rcx + JUMP_BUFFER_Xmm8] + movdqa xmm9, [rcx + JUMP_BUFFER_Xmm9] + movdqa xmm10, [rcx + JUMP_BUFFER_Xmm10] + movdqa xmm11, [rcx + JUMP_BUFFER_Xmm11] + movdqa xmm12, [rcx + JUMP_BUFFER_Xmm12] + movdqa xmm13, [rcx + JUMP_BUFFER_Xmm13] + movdqa xmm14, [rcx + JUMP_BUFFER_Xmm14] + movdqa xmm15, [rcx + JUMP_BUFFER_Xmm15] + + /* return param2 or 1 if it was 0 */ + mov rax, rdx + test rax, rax + jnz 2f + inc rax +2: jmp r8 +.endp longjmp -- 2.17.1