fpc/rtl/solaris/i386/sighndh.inc
pierre 59204b21d5 * Correct SigContext structures
git-svn-id: trunk@14203 -
2009-11-17 10:27:20 +00:00

252 lines
5.3 KiB
PHP

{
This file is part of the Free Pascal run time library.
Copyright (c) 2009 by Pierre Muller,
member of the Free Pascal development team.
Sigcontext and Sigaction for amd64/i386 CPUs
Adapted from
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/intel/sys/regset.h
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$packrecords C}
{$packrecords C}
const
{ i386/amd64 definition }
{
#if defined(__amd64)
#define _NGREG 28
#else
#define _NGREG 19
#endif
}
{$ifdef x86_64 }
_NGREG = 28;
{$else i386 }
_NGREG = 19;
{$endif i386 }
_NGREG32 = 19;
_NGREG64 = 28;
{$ifdef x86_64}
(* AMD64 layout
#define REG_GSBASE 27
#define REG_FSBASE 26
#define REG_DS 25
#define REG_ES 24
#define REG_GS 23
#define REG_FS 22
#define REG_SS 21
#define REG_RSP 20
#define REG_RFL 19
#define REG_CS 18
#define REG_RIP 17
#define REG_ERR 16
#define REG_TRAPNO 15
#define REG_RAX 14
#define REG_RCX 13
#define REG_RDX 12
#define REG_RBX 11
#define REG_RBP 10
#define REG_RSI 9
#define REG_RDI 8
#define REG_R8 7
#define REG_R9 6
#define REG_R10 5
#define REG_R11 4
#define REG_R12 3
#define REG_R13 2
#define REG_R14 1
#define REG_R15 0
*)
REG_R15 = 0;
REG_R14 = 1;
REG_R13 = 2;
REG_R12 = 3;
REG_R11 = 4;
REG_R10 = 5;
REG_R9 = 6;
REG_R8 = 7;
REG_RDI = 8;
REG_RSI = 9;
REG_RBP = 10;
REG_RBX = 11;
REG_RDX = 12;
REG_RCX = 13;
REG_RAX = 14;
REG_TRAPNO = 15;
REG_ERR = 16;
REG_RIP = 17;
REG_CS = 18;
REG_RFL = 19;
REG_RSP = 20;
REG_SS = 21;
REG_FS = 22;
REG_GS = 23;
REG_ES = 24;
REG_DS = 25;
REG_FSBASE = 26;
REG_GSBASE = 27;
{$else i386}
(* I386 layout
#define SS 18 /* only stored on a privilege transition */
#define UESP 17 /* only stored on a privilege transition */
#define EFL 16
#define CS 15
#define EIP 14
#define ERR 13
#define TRAPNO 12
#define EAX 11
#define ECX 10
#define EDX 9
#define EBX 8
#define ESP 7
#define EBP 6
#define ESI 5
#define EDI 4
#define DS 3
#define ES 2
#define FS 1
#define GS 0
*)
REG_GS = 0;
REG_FS = 1;
REG_ES = 2;
REG_DS = 3;
REG_EDI = 4;
REG_ESI = 5;
REG_EBP = 6;
REG_ESP = 7;
REG_EBX = 8;
REG_EDX = 9;
REG_ECX = 10;
REG_EAX = 11;
REG_TRAPNO = 12;
REG_ERR = 13;
REG_EIP = 14;
REG_CS = 15;
REG_EFL = 16;
REG_UESP = 17; (* only stored on a privilege transition *)
REG_SS = 18; (* only stored on a privilege transition *)
{$endif i386}
{$ifdef x86_64 }
REG_PC = REG_RIP;
REG_FP = REG_RBP;
REG_SP = REG_RSP;
REG_PS = REG_RFL;
REG_R0 = REG_RAX;
REG_R1 = REG_RDX;
{$else /* __i386 */ }
REG_PC = REG_EIP;
REG_FP = REG_EBP;
REG_SP = REG_UESP;
REG_PS = REG_EFL;
REG_R0 = REG_EAX;
REG_R1 = REG_EDX;
{$endif }
type
{$ifdef x86_64}
TGReg = cint64;
{$else}
TGReg = cint32;
{$endif}
TGReg32 = cint32;
TGReg64 = cint64;
TGRegSet = array[0.._NGREG-1] of TGReg;
TGRegSet32 = array[0.._NGREG32-1] of TGReg32;
TGRegSet64 = array[0.._NGREG64-1] of TGReg64;
type
FPU_SAVE_TYPE = (fnsave_type, fxsave_type);
TFPURegs = record
case longint of
0: ( fpuregs: array[0..31] of cardinal);
1: ( fpudregs: array[0..15] of double);
end;
PFQ = ^TFQ;
TFQ = record
fpq_addr : ^cuint;
fpq_instr : cuint;
end;
(* struct fpchip_state {
uint32_t state[27]; /* 287/387 saved state */
uint32_t status; /* saved at exception */
uint32_t mxcsr; /* SSE control and status */
uint32_t xstatus; /* SSE mxcsr at exception */
uint32_t __pad[2]; /* align to 128-bits */
upad128_t xmm[8]; /* %xmm0-%xmm7 */
} fpchip_state;
*)
TUpad128 = record
case longint of
0: (_q : extended;);
1: (_l : array [0..4-1] of cuint32;);
end;
TFPChip_State = record
state : array [0..27-1] of cuint32;
status : cuint32;
mxcsr : cuint32;
xstatus : cuint32;
__pad : array [0..1] of cuint32;
xmm : array [0..8-1] of TUpad128;
end;
TFP_emul_space = record
fp_emul : array [0..248-1] of cuint8;
fp_epad : array [0..1] of cuint8;
end;
TFPU = record
case longint of
0: (fpchip_state : TFPChip_state;);
1: (fp_emul_space : TFP_emul_space;);
2: (f_fpregs : Array[0..130-1] of cuint32;);
end;
TFPRegSet = TFPU;
TMContext = record
gregs : TGRegSet;
fpregs : TFPRegSet;
end;
TStack = record
ss_sp : pointer;
ss_size : size_t;
ss_flags : cint;
end;
PSigContext = ^TSigContext;
TSigContext = record
uc_flags : cuint;
uc_link : PSigContext;
uc_sigmask : sigset_t;
uc_stack : TStack;
uc_mcontext : TMContext;
__uc_filler : array[0..5-1] of clong;
end;