windows-nt/Source/XPSP1/NT/base/crts/crtw32/misc/amd64/setjmpex.asm
2020-09-26 16:20:57 +08:00

103 lines
2.5 KiB
NASM

title "Set Jump Buffer"
;++
;
; Copyright (c) 2000 Microsoft Corporation
;
; Module Name:
;
; setjmpex.asm
;
; Abstract:
;
; This module implements the AMD64 specific routine to perform safe set
; jump.
;
; Author:
;
; David N. Cutler (davec) 3-Nov-2000
;
; Environment:
;
; Any mode.
;
;--
include ksamd64.inc
;
; Define variable that will cause setjmp/longjmp to be safe or unsafe with
; respect to structured exception handling.
;
_setjmp_ segment para common 'DATA'
dq _setjmpex ;
_setjmp_ ends
subttl "Safe Set Jump"
;++
;
; int
; _setjmpex (
; IN jmp_buf JumpBuffer,
; IN ULONG64 FrameBase
; )
;
; Routine Description:
;
; This function saves the current nonvolatile register state in the
; specified jump buffer and returns a function vlaue of zero.
;
; Arguments:
;
; JumpBuffer (rcx) - Supplies a pointer to a jump buffer.
;
; FrameBase (rdx) - Supplies the base address of the caller frame.
;
; Return Value:
;
; A value of zero is returned.
;
;--
LEAF_ENTRY _setjmpex, _TEXT$00
;
; Save the nonvolatile register state so these registers to be restored to
; their value at the call to setjmp. If these registers were not saved, then
; they would be restored to their current value in the target function which
; would be incorrect.
;
mov JbFrame[rcx], rdx ; set frame base
mov JbRbx[rcx], rbx ; save nonvolatile integer registers
mov JbRbp[rcx], rbp ;
mov JbRsi[rcx], rsi ;
mov JbRdi[rcx], rdi ;
mov JbR12[rcx], r12 ;
mov JbR13[rcx], r13 ;
mov JbR14[rcx], r14 ;
mov JbR15[rcx], r15 ;
lea r8, 8[rsp] ; save caller stack pointer
mov JbRsp[rcx], r8 ;
mov r8, [rsp] ; save caller return address
mov JbRip[rcx], r8 ;
movdqa JbXmm6[rcx], xmm6 ; save nonvolatile floating registers
movdqa JbXmm7[rcx], xmm7 ;
movdqa JbXmm8[rcx], xmm8 ;
movdqa JbXmm9[rcx], xmm9 ;
movdqa JbXmm10[rcx], xmm10 ;
movdqa JbXmm11[rcx], xmm11 ;
movdqa JbXmm12[rcx], xmm12 ;
movdqa JbXmm13[rcx], xmm13 ;
movdqa JbXmm14[rcx], xmm14 ;
movdqa JbXmm15[rcx], xmm15 ;
xor eax, eax ; set return value
ret ; return
LEAF_END _setjmpex, _TEXT$00
end