mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-20 18:38:17 +02:00
252 lines
5.3 KiB
PHP
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;
|
|
|