Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*** *setjmp.h - definitions/declarations for setjmp/longjmp routines * * Copyright (c) 1985-1996, Microsoft Corporation. All rights reserved. * *Purpose: * This file defines the machine-dependent buffer used by * setjmp/longjmp to save and restore the program state, and * declarations for those routines. * [ANSI/System V] * * The setjmp() that will be used by those who include this file * is _setjmpex, which is safe for use with try/except/finally, * but is slow. See <crt/setjmpex.h> and <crt/setjmp.h> for more. * ****/
#ifndef _INC_SETJMP
#include <signal.h>
#ifndef __cplusplus
#define _CRTAPI1 __cdecl #define _CRTAPI2 __cdecl
/* * Posix programs use _setjmpex by default. */
/* * Definitions specific to particular setjmp implementations. */ #if defined(_M_IX86) #define longjmp _longjmpex #define setjmp _setjmp
/* * MS C8-32 or older MS C6-386 compilers */ #define _JBLEN 16 #define _JBTYPE int
/* * Define jump buffer layout for x86 setjmp/longjmp */
typedef struct __JUMP_BUFFER { unsigned long Ebp; unsigned long Ebx; unsigned long Edi; unsigned long Esi; unsigned long Esp; unsigned long Eip; unsigned long Registration; unsigned long TryLevel; unsigned long Cookie; unsigned long UnwindFunc; unsigned long UnwindData[6]; } _JUMP_BUFFER;
#elif defined(_ALPHA_)
/* * Alpha implementations need a _JBLEN of 20 quadwords. * A double is used only to obtain quadword size and alignment. */
#define _JBLEN 20 #define _JBTYPE double #define _setjmp setjmp
/* * Define jump buffer layout for Alpha setjmp/longjmp. * A double is used only to obtain quadword size and alignment. */
typedef struct __JUMP_BUFFER { unsigned long Fp; unsigned long Pc; unsigned long Seb; unsigned long Type; double FltF2; double FltF3; double FltF4; double FltF5; double FltF6; double FltF7; double FltF8; double FltF9; double IntS0; double IntS1; double IntS2; double IntS3; double IntS4; double IntS5; double IntS6; double IntSp; double Fir; double Fill; } _JUMP_BUFFER;
#elif defined(_M_IA64)
/* * Length is 528 bytes * Since this is allocated as an array of "__int64", the * number of entries required is 66. * * All IA64 implementations need _JBLEN of 66 */ #define _JBLEN 66 #define _JBTYPE __int64 #ifndef _INC_SETJMPEX #define setjmp _setjmp #endif
/* * Define jump buffer layout for IA64 setjmp/longjmp. */
typedef struct __JUMP_BUFFER {
// // x86 reserved. //
unsigned long iAReserved[6];
// // x86 C9.0 compatibility //
unsigned long Registration; // point to the UnwindData field. unsigned long TryLevel; // ignored by setjmp unsigned long Cookie; // set to "VC20" by setjmp unsigned long UnwindFunc; // set to EM longjmp() by setjmp
// // // First dword is zero to indicate it's an exception registration // record prepared by EM setjmp function. // Second dword is set to 0 for unsafe EM setjmp, and 1 for safe // EM setjmp. // Third dword is set to the setjmp site memory stack frame pointer. // Fourth dword is set to the setjmp site backing store frame pointer. //
unsigned long UnwindData[6];
// // floating point status register, // and preserved floating point registers fs0 - fs19 //
long double FltS0; long double PadS0; long double FltS1; long double PadS1; long double FltS2; long double PadS2; long double FltS3; long double PadS3; long double FltS4; long double PadS4; long double FltS5; long double PadS5; long double FltS6; long double PadS6; long double FltS7; long double PadS7; long double FltS8; long double PadS8; long double FltS9; long double PadS9; long double FltS10; long double PadS10; long double FltS11; long double PadS11; long double FltS12; long double PadS12; long double FltS13; long double PadS13; long double FltS14; long double PadS14; long double FltS15; long double PadS15; long double FltS16; long double PadS16; long double FltS17; long double PadS17; long double FltS18; long double PadS18; long double FltS19; long double PadS19;
__int64 FPSR;
// // return link and preserved branch registers bs0 - bs4 //
__int64 StIIP; // continuation address __int64 BrS0; __int64 BrS1; __int64 BrS2; __int64 BrS3; __int64 BrS4;
// // preserved general registers s0 - s3, sp, nats //
__int64 IntS0; __int64 IntS1; __int64 IntS2; __int64 IntS3;
// // bsp, pfs, unat, lc //
__int64 RsBSP; __int64 RsPFS; // previous frame marker (cfm of setjmp's caller) __int64 ApUNAT; // User Nat collection register (preserved) __int64 ApLC; // loop counter
__int64 IntSp; // memory stack pointer __int64 IntNats; // Nat bits of preserved integer regs s0 - s3 __int64 Preds; // predicates
} _JUMP_BUFFER;
#endif /* MIPS/Alpha/PPC/IA64 */
/* define the buffer type for holding the state information */
#ifndef _JMP_BUF_DEFINED typedef _JBTYPE jmp_buf[_JBLEN]; #define _JMP_BUF_DEFINED #endif
#ifndef _SIGJMP_BUF_DEFINED #define _SIGJMP_BUF_DEFINED /* * sigjmp buf is just a jmp_buf plus an int to say whether the sigmask * is saved or not, and a sigmask_t for the mask if it is saved. */
typedef _JBTYPE sigjmp_buf[_JBLEN + 2]; #endif /* _SIGJMP_BUF_DEFINED */
extern _JBTYPE * __cdecl _sigjmp_store_mask(sigjmp_buf, int);
#define sigsetjmp(_env, _save) \ setjmp(_sigjmp_store_mask((_env), (_save)))
/* function prototypes */
int __cdecl setjmp(jmp_buf); void __cdecl longjmp(jmp_buf, int); void __cdecl siglongjmp(sigjmp_buf, int);
/* function prototypes */
#endif /* __cplusplus */
#define _INC_SETJMP #endif /* _INC_SETJMP */
|