103 lines
2.5 KiB
NASM
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
|