mirror of
https://github.com/reactos/reactos.git
synced 2026-05-30 14:34:57 +08:00
[CRT] Cleanup old setjmp
This commit is contained in:
@@ -23,7 +23,6 @@ list(APPEND CRT_SOURCE
|
||||
|
||||
list(APPEND CRT_ASM_SOURCE
|
||||
${CRT_EXCEPT_ASM_SOURCE}
|
||||
${CRT_SETJMP_ASM_SOURCE}
|
||||
${CRT_STDLIB_ASM_SOURCE}
|
||||
${CRT_STRING_ASM_SOURCE}
|
||||
${CRT_WINE_ASM_SOURCE}
|
||||
|
||||
@@ -18,7 +18,6 @@ list(APPEND LIBCNTPR_ASM_SOURCE
|
||||
${LIBCNTPR_FLOAT_ASM_SOURCE}
|
||||
${LIBCNTPR_MATH_ASM_SOURCE}
|
||||
${LIBCNTPR_MEM_ASM_SOURCE}
|
||||
${LIBCNTPR_SETJMP_ASM_SOURCE}
|
||||
${LIBCNTPR_STRING_ASM_SOURCE}
|
||||
)
|
||||
|
||||
|
||||
@@ -1,169 +0,0 @@
|
||||
/*
|
||||
* 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 <asm.inc>
|
||||
#include <ksamd64.inc>
|
||||
|
||||
#define JUMP_BUFFER_Frame 0 /* 0x00 */
|
||||
#define JUMP_BUFFER_Rbx 8 /* 0x08 */
|
||||
#define JUMP_BUFFER_Rsp 16 /* 0x10 */
|
||||
#define JUMP_BUFFER_Rbp 24 /* 0x18 */
|
||||
#define JUMP_BUFFER_Rsi 32 /* 0x20 */
|
||||
#define JUMP_BUFFER_Rdi 40 /* 0x28 */
|
||||
#define JUMP_BUFFER_R12 48 /* 0x30 */
|
||||
#define JUMP_BUFFER_R13 56 /* 0x38 */
|
||||
#define JUMP_BUFFER_R14 64 /* 0x40 */
|
||||
#define JUMP_BUFFER_R15 72 /* 0x48 */
|
||||
#define JUMP_BUFFER_Rip 80 /* 0x50 */
|
||||
#define JUMP_BUFFER_Spare 88 /* 0x58 */
|
||||
#define JUMP_BUFFER_Xmm6 96 /* 0x60 */
|
||||
#define JUMP_BUFFER_Xmm7 112 /* 0x70 */
|
||||
#define JUMP_BUFFER_Xmm8 128 /* 0x80 */
|
||||
#define JUMP_BUFFER_Xmm9 144 /* 0x90 */
|
||||
#define JUMP_BUFFER_Xmm10 160 /* 0xa0 */
|
||||
#define JUMP_BUFFER_Xmm11 176 /* 0xb0 */
|
||||
#define JUMP_BUFFER_Xmm12 192 /* 0xc0 */
|
||||
#define JUMP_BUFFER_Xmm13 208 /* 0xd0 */
|
||||
#define JUMP_BUFFER_Xmm14 224 /* 0xe0 */
|
||||
#define JUMP_BUFFER_Xmm15 240 /* 0xf0 */
|
||||
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
.code64
|
||||
|
||||
/*!
|
||||
* int _setjmp(jmp_buf env);
|
||||
*
|
||||
* \param <rcx> - jmp_buf env
|
||||
* \return 0
|
||||
* \note Sets up the jmp_buf
|
||||
*/
|
||||
PUBLIC _setjmp
|
||||
FUNC _setjmp
|
||||
|
||||
.endprolog
|
||||
|
||||
/* 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
|
||||
ENDFUNC
|
||||
|
||||
/*!
|
||||
* int _setjmpex(jmp_buf _Buf,void *_Ctx);
|
||||
*
|
||||
* \param <rcx> - jmp_buf env
|
||||
* \param <rdx> - frame
|
||||
* \return 0
|
||||
* \note Sets up the jmp_buf
|
||||
*/
|
||||
PUBLIC _setjmpex
|
||||
FUNC _setjmpex
|
||||
|
||||
.endprolog
|
||||
|
||||
/* 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
|
||||
ENDFUNC
|
||||
|
||||
|
||||
/*!
|
||||
* void longjmp(jmp_buf env, int value);
|
||||
*
|
||||
* \param <rcx> - jmp_buf setup by _setjmp
|
||||
* \param <rdx> - int value to return
|
||||
* \return Doesn't return
|
||||
* \note Non-local goto
|
||||
*/
|
||||
PUBLIC longjmp
|
||||
FUNC longjmp
|
||||
|
||||
.endprolog
|
||||
|
||||
// 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 l2
|
||||
inc rax
|
||||
l2: jmp r8
|
||||
ENDFUNC
|
||||
|
||||
END
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* COPYRIGHT: BSD - See COPYING.ARM in the top level directory
|
||||
* PROJECT: ReactOS CRT library
|
||||
* PURPOSE: Implementation of _setjmp / longjmp
|
||||
* PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <kxarm.h>
|
||||
|
||||
/* CODE **********************************************************************/
|
||||
TEXTAREA
|
||||
|
||||
LEAF_ENTRY _setjmpex
|
||||
|
||||
/* Store r1 (->Frame) and r4 - r11 */
|
||||
stmia r0!, {r1,r4-r11}
|
||||
|
||||
/* Store sp (->Sp), lr (->Pc), fp (->Fpscr) */
|
||||
mov r1, sp
|
||||
stmia r0!, {r1,lr,fp}
|
||||
|
||||
/* Store NEON registers */
|
||||
vst1.64 {d0}, [r0]!
|
||||
vst1.64 {d1}, [r0]!
|
||||
vst1.64 {d2}, [r0]!
|
||||
vst1.64 {d3}, [r0]!
|
||||
vst1.64 {d4}, [r0]!
|
||||
vst1.64 {d5}, [r0]!
|
||||
vst1.64 {d6}, [r0]!
|
||||
vst1.64 {d7}, [r0]!
|
||||
|
||||
/* Return 0 */
|
||||
mov r0, #0
|
||||
bx lr
|
||||
LEAF_END _setjmpex
|
||||
|
||||
IMPORT _setjmp, WEAK _setjmpex
|
||||
IMPORT setjmp, WEAK _setjmpex
|
||||
|
||||
LEAF_ENTRY longjmp
|
||||
|
||||
ldmia r0!, {r1,r4-r11}
|
||||
ldmia r0!, {r1,lr,fp}
|
||||
mov sp, r1
|
||||
|
||||
/* Load NEON registers */
|
||||
vld1.64 {d0}, [r0]!
|
||||
vld1.64 {d1}, [r0]!
|
||||
vld1.64 {d2}, [r0]!
|
||||
vld1.64 {d3}, [r0]!
|
||||
vld1.64 {d4}, [r0]!
|
||||
vld1.64 {d5}, [r0]!
|
||||
vld1.64 {d6}, [r0]!
|
||||
vld1.64 {d7}, [r0]!
|
||||
|
||||
/* Return 1 */
|
||||
mov r0, #1
|
||||
bx lr
|
||||
LEAF_END longjmp
|
||||
|
||||
END
|
||||
/* EOF */
|
||||
@@ -1,113 +0,0 @@
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
* PURPOSE: Implementation of _setjmp/longjmp
|
||||
* FILE: lib/sdk/crt/setjmp/i386/setjmp.s
|
||||
* PROGRAMMER: Ge van Geldorp (ge@gse.nl)
|
||||
* NOTES: Implementation is not complete, see Wine source for a more
|
||||
* complete implementation
|
||||
*/
|
||||
|
||||
#include <asm.inc>
|
||||
|
||||
#define JB_BP 0
|
||||
#define JB_BX 1
|
||||
#define JB_DI 2
|
||||
#define JB_SI 3
|
||||
#define JB_SP 4
|
||||
#define JB_IP 5
|
||||
|
||||
#define PCOFF 0
|
||||
|
||||
#define JMPBUF 4
|
||||
|
||||
.code
|
||||
/*
|
||||
* int
|
||||
* _setjmp(jmp_buf env);
|
||||
*
|
||||
* Parameters:
|
||||
* [ESP+04h] - jmp_buf env
|
||||
* Registers:
|
||||
* None
|
||||
* Returns:
|
||||
* 0
|
||||
* Notes:
|
||||
* Sets up the jmp_buf
|
||||
*/
|
||||
PUBLIC __setjmp
|
||||
__setjmp:
|
||||
xor eax, eax
|
||||
mov edx, JMPBUF[esp]
|
||||
|
||||
/* Save registers. */
|
||||
mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
|
||||
mov [edx + JB_BX*4], ebx
|
||||
mov [edx + JB_DI*4], edi
|
||||
mov [edx + JB_SI*4], esi
|
||||
lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
|
||||
mov [edx + JB_SP*4], ecx
|
||||
mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
|
||||
mov [edx + JB_IP*4], ecx
|
||||
ret
|
||||
|
||||
/*
|
||||
* int
|
||||
* _setjmp3(jmp_buf env, int nb_args, ...);
|
||||
*
|
||||
* Parameters:
|
||||
* [ESP+04h] - jmp_buf env
|
||||
* Registers:
|
||||
* None
|
||||
* Returns:
|
||||
* 0
|
||||
* Notes:
|
||||
* Sets up the jmp_buf
|
||||
*/
|
||||
PUBLIC __setjmp3
|
||||
__setjmp3:
|
||||
xor eax, eax
|
||||
mov edx, JMPBUF[esp]
|
||||
|
||||
/* Save registers. */
|
||||
mov [edx + JB_BP*4], ebp /* Save caller's frame pointer. */
|
||||
mov [edx + JB_BX*4], ebx
|
||||
mov [edx + JB_DI*4], edi
|
||||
mov [edx + JB_SI*4], esi
|
||||
lea ecx, JMPBUF[esp] /* Save SP as it will be after we return. */
|
||||
mov [edx + JB_SP*4], ecx
|
||||
mov ecx, PCOFF[esp] /* Save PC we are returning to now. */
|
||||
mov [edx + JB_IP*4], ecx
|
||||
ret
|
||||
|
||||
/*
|
||||
* void
|
||||
* longjmp(jmp_buf env, int value);
|
||||
*
|
||||
* Parameters:
|
||||
* [ESP+04h] - jmp_buf setup by _setjmp
|
||||
* [ESP+08h] - int value to return
|
||||
* Registers:
|
||||
* None
|
||||
* Returns:
|
||||
* Doesn't return
|
||||
* Notes:
|
||||
* Non-local goto
|
||||
*/
|
||||
PUBLIC _longjmp
|
||||
_longjmp:
|
||||
mov ecx, JMPBUF[esp] /* User's jmp_buf in %ecx. */
|
||||
|
||||
mov eax, [esp + 8] /* Second argument is return value. */
|
||||
/* Save the return address now. */
|
||||
mov edx, [ecx + JB_IP*4]
|
||||
/* Restore registers. */
|
||||
mov ebp, [ecx + JB_BP*4]
|
||||
mov ebx, [ecx + JB_BX*4]
|
||||
mov edi, [ecx + JB_DI*4]
|
||||
mov esi, [ecx + JB_SI*4]
|
||||
mov esp, [ecx + JB_SP*4]
|
||||
/* Jump to saved PC. */
|
||||
jmp edx
|
||||
|
||||
END
|
||||
@@ -1,18 +0,0 @@
|
||||
|
||||
if(ARCH STREQUAL "i386")
|
||||
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
|
||||
setjmp/i386/setjmp.s
|
||||
)
|
||||
elseif(ARCH STREQUAL "amd64")
|
||||
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
|
||||
setjmp/amd64/setjmp.s
|
||||
)
|
||||
elseif(ARCH STREQUAL "arm")
|
||||
list(APPEND LIBCNTPR_SETJMP_ASM_SOURCE
|
||||
setjmp/arm/setjmp.s
|
||||
)
|
||||
endif()
|
||||
|
||||
list(APPEND CRT_SETJMP_ASM_SOURCE
|
||||
${LIBCNTPR_SETJMP_ASM_SOURCE}
|
||||
)
|
||||
Reference in New Issue
Block a user