mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-11 10:10:40 +01:00
+ added AMD64 CONTEXT
git-svn-id: trunk@3303 -
This commit is contained in:
parent
638005f9d3
commit
b7d30936c2
@ -69,9 +69,14 @@
|
||||
|
||||
PINTEGER = ^longint;
|
||||
PBOOL = ^BOOL;
|
||||
|
||||
|
||||
LONGLONG = int64;
|
||||
PLONGLONG = ^LONGLONG;
|
||||
ULONGLONG = qword; // used in AMD64 CONTEXT
|
||||
PULONGLONG = ^ULONGLONG; //
|
||||
DWORD64 = qword; //
|
||||
PDWORD64 = ^DWORD64; //
|
||||
|
||||
INT_PTR = PtrInt;
|
||||
UINT_PTR = PtrUInt;
|
||||
LONG_PTR = PtrInt;
|
||||
|
||||
@ -5258,8 +5258,9 @@ Const
|
||||
DECLARE_HANDLE(HANDLE);
|
||||
#endif
|
||||
*)
|
||||
{$ifdef __PPC__}
|
||||
|
||||
{$ifdef cpupowerpc32}
|
||||
{ ppc }
|
||||
const
|
||||
CONTEXT_CONTROL = 1;
|
||||
CONTEXT_FLOATING_POINT = 2;
|
||||
@ -5267,23 +5268,54 @@ Const
|
||||
CONTEXT_DEBUG_REGISTERS = 8;
|
||||
CONTEXT_FULL = (CONTEXT_CONTROL or CONTEXT_FLOATING_POINT) or CONTEXT_INTEGER;
|
||||
CONTEXT_DEBUGGER = CONTEXT_FULL;
|
||||
{$else}
|
||||
{$endif}
|
||||
|
||||
{$ifdef cpui386}
|
||||
{ x86 }
|
||||
{ The doc refered me to winnt.h, so I had to look... }
|
||||
|
||||
const
|
||||
SIZE_OF_80387_REGISTERS = 80;
|
||||
{ Values for contextflags }
|
||||
CONTEXT_i386 = $10000;
|
||||
CONTEXT_CONTROL = CONTEXT_i386 or 1;
|
||||
CONTEXT_INTEGER = CONTEXT_i386 or 2;
|
||||
CONTEXT_SEGMENTS = CONTEXT_i386 or 4;
|
||||
CONTEXT_FLOATING_POINT = CONTEXT_i386 or 8;
|
||||
CONTEXT_DEBUG_REGISTERS = CONTEXT_i386 or $10;
|
||||
CONTEXT_i386 = $10000; // this assumes that i386 and
|
||||
CONTEXT_i486 = $10000; // i486 have identical context records
|
||||
|
||||
CONTEXT_CONTROL = CONTEXT_i386 or 1; // SS:SP, CS:IP, FLAGS, BP
|
||||
CONTEXT_INTEGER = CONTEXT_i386 or 2; // AX, BX, CX, DX, SI, DI
|
||||
CONTEXT_SEGMENTS = CONTEXT_i386 or 4; // DS, ES, FS, GS
|
||||
CONTEXT_FLOATING_POINT = CONTEXT_i386 or 8; // 387 state
|
||||
CONTEXT_DEBUG_REGISTERS = CONTEXT_i386 or $10; // DB 0-3,6,7
|
||||
CONTEXT_EXTENDED_REGISTERS = CONTEXT_i386 or $20; // cpu specific extensions
|
||||
CONTEXT_FULL = (CONTEXT_CONTROL or CONTEXT_INTEGER) or CONTEXT_SEGMENTS;
|
||||
CONTEXT_ALL = CONTEXT_FULL or CONTEXT_FLOATING_POINT or CONTEXT_DEBUG_REGISTERS or CONTEXT_EXTENDED_REGISTERS;
|
||||
{ our own invention }
|
||||
FLAG_TRACE_BIT = $100;
|
||||
CONTEXT_DEBUGGER = CONTEXT_FULL or CONTEXT_FLOATING_POINT;
|
||||
{$endif}
|
||||
|
||||
{$ifdef cpux86_64}
|
||||
const
|
||||
INITIAL_MXCSR = $1f80; // initial MXCSR value
|
||||
INITIAL_FPCSR = $027f; // initial FPCSR value
|
||||
|
||||
CONTEXT_AMD64 = $100000;
|
||||
|
||||
CONTEXT_CONTROL = (CONTEXT_AMD64 or $00000001);
|
||||
CONTEXT_INTEGER = (CONTEXT_AMD64 or $00000002);
|
||||
CONTEXT_SEGMENTS = (CONTEXT_AMD64 or $00000004);
|
||||
CONTEXT_FLOATING_POINT = (CONTEXT_AMD64 or $00000008);
|
||||
CONTEXT_DEBUG_REGISTERS = (CONTEXT_AMD64 or $00000010);
|
||||
|
||||
CONTEXT_FULL = (CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_FLOATING_POINT);
|
||||
CONTEXT_ALL = (CONTEXT_CONTROL or CONTEXT_INTEGER or CONTEXT_SEGMENTS or CONTEXT_FLOATING_POINT or CONTEXT_DEBUG_REGISTERS);
|
||||
|
||||
CONTEXT_EXCEPTION_ACTIVE = $08000000;
|
||||
CONTEXT_SERVICE_ACTIVE = $10000000;
|
||||
CONTEXT_EXCEPTION_REQUEST = $40000000;
|
||||
CONTEXT_EXCEPTION_REPORTING = $80000000;
|
||||
|
||||
const
|
||||
LEGACY_SAVE_AREA_LENGTH = sizeof(XMM_SAVE_AREA32);
|
||||
{$endif}
|
||||
|
||||
const
|
||||
|
||||
@ -1018,6 +1018,7 @@
|
||||
PCONSOLESCREENBUFFERINFO = ^CONSOLE_SCREEN_BUFFER_INFO;
|
||||
|
||||
{$ifdef cpui386}
|
||||
{$define __HASCONTEXT__}
|
||||
type
|
||||
|
||||
FLOATING_SAVE_AREA = record
|
||||
@ -1061,12 +1062,217 @@
|
||||
Esp : DWORD;
|
||||
SegSs : DWORD;
|
||||
end;
|
||||
LPCONTEXT = ^CONTEXT;
|
||||
_CONTEXT = CONTEXT;
|
||||
TCONTEXT = CONTEXT;
|
||||
PCONTEXT = ^CONTEXT;
|
||||
{$endif}
|
||||
|
||||
{$else}
|
||||
{$ifdef cpux86_64}
|
||||
{$define __HASCONTEXT__}
|
||||
//
|
||||
// Define 128-bit 16-byte aligned xmm register type.
|
||||
//
|
||||
|
||||
//typedef struct DECLSPEC_ALIGN(16) _M128A {
|
||||
{$note todo, fix alignment }
|
||||
type
|
||||
M128A = record
|
||||
Low: ULONGLONG;
|
||||
High: LONGLONG;
|
||||
end;
|
||||
_M128A = M128A
|
||||
TM128A = M128A;
|
||||
PM128A = TM128A;
|
||||
|
||||
//
|
||||
// Format of data for 32-bit fxsave/fxrstor instructions.
|
||||
//
|
||||
|
||||
//typedef struct _XMM_SAVE_AREA32 {
|
||||
type
|
||||
XMM_SAVE_AREA32 = record
|
||||
ControlWord: WORD;
|
||||
StatusWord: WORD;
|
||||
TagWord: BYTE;
|
||||
Reserved1: BYTE;
|
||||
ErrorOpcode: WORD;
|
||||
ErrorOffset: DWORD;
|
||||
ErrorSelector: WORD;
|
||||
Reserved2: WORD;
|
||||
DataOffset: DWORD;
|
||||
DataSelector: WORD;
|
||||
Reserved3: WORD;
|
||||
MxCsr: DWORD;
|
||||
MxCsr_Mask: DWORD;
|
||||
FloatRegisters: array[0..7] of M128A;
|
||||
XmmRegisters: array[0..16] of M128A;
|
||||
Reserved4: array[0..95] of BYTE;
|
||||
end;
|
||||
_XMM_SAVE_AREA32 = XMM_SAVE_AREA32;
|
||||
TXmmSaveArea = XMM_SAVE_AREA32;
|
||||
PXmmSaveArea = ^TXmmSaveArea;
|
||||
|
||||
const
|
||||
LEGACY_SAVE_AREA_LENGTH = sizeof(XMM_SAVE_AREA32);
|
||||
|
||||
//
|
||||
// Context Frame
|
||||
//
|
||||
// This frame has a several purposes: 1) it is used as an argument to
|
||||
// NtContinue, 2) is is used to constuct a call frame for APC delivery,
|
||||
// and 3) it is used in the user level thread creation routines.
|
||||
//
|
||||
//
|
||||
// The flags field within this record controls the contents of a CONTEXT
|
||||
// record.
|
||||
//
|
||||
// If the context record is used as an input parameter, then for each
|
||||
// portion of the context record controlled by a flag whose value is
|
||||
// set, it is assumed that that portion of the context record contains
|
||||
// valid context. If the context record is being used to modify a threads
|
||||
// context, then only that portion of the threads context is modified.
|
||||
//
|
||||
// If the context record is used as an output parameter to capture the
|
||||
// context of a thread, then only those portions of the thread's context
|
||||
// corresponding to set flags will be returned.
|
||||
//
|
||||
// CONTEXT_CONTROL specifies SegSs, Rsp, SegCs, Rip, and EFlags.
|
||||
//
|
||||
// CONTEXT_INTEGER specifies Rax, Rcx, Rdx, Rbx, Rbp, Rsi, Rdi, and R8-R15.
|
||||
//
|
||||
// CONTEXT_SEGMENTS specifies SegDs, SegEs, SegFs, and SegGs.
|
||||
//
|
||||
// CONTEXT_DEBUG_REGISTERS specifies Dr0-Dr3 and Dr6-Dr7.
|
||||
//
|
||||
// CONTEXT_MMX_REGISTERS specifies the floating point and extended registers
|
||||
// Mm0/St0-Mm7/St7 and Xmm0-Xmm15).
|
||||
//
|
||||
|
||||
//typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
|
||||
{$note todo, fix alignment }
|
||||
type
|
||||
CONTEXT = record
|
||||
|
||||
//
|
||||
// Register parameter home addresses.
|
||||
//
|
||||
// N.B. These fields are for convience - they could be used to extend the
|
||||
// context record in the future.
|
||||
//
|
||||
|
||||
P1Home: DWORD64;
|
||||
P2Home: DWORD64;
|
||||
P3Home: DWORD64;
|
||||
P4Home: DWORD64;
|
||||
P5Home: DWORD64;
|
||||
P6Home: DWORD64;
|
||||
|
||||
//
|
||||
// Control flags.
|
||||
//
|
||||
|
||||
ContextFlags: DWORD;
|
||||
MxCsr: DWORD;
|
||||
|
||||
//
|
||||
// Segment Registers and processor flags.
|
||||
//
|
||||
|
||||
SegCs: WORD;
|
||||
SegDs: WORD;
|
||||
SegEs: WORD;
|
||||
SegFs: WORD;
|
||||
SegGs: WORD;
|
||||
SegSs: WORD;
|
||||
EFlags: DWORD;
|
||||
|
||||
//
|
||||
// Debug registers
|
||||
//
|
||||
|
||||
Dr0: DWORD64;
|
||||
Dr1: DWORD64;
|
||||
Dr2: DWORD64;
|
||||
Dr3: DWORD64;
|
||||
Dr6: DWORD64;
|
||||
Dr7: DWORD64;
|
||||
|
||||
//
|
||||
// Integer registers.
|
||||
//
|
||||
|
||||
Rax: DWORD64;
|
||||
Rcx: DWORD64;
|
||||
Rdx: DWORD64;
|
||||
Rbx: DWORD64;
|
||||
Rsp: DWORD64;
|
||||
Rbp: DWORD64;
|
||||
Rsi: DWORD64;
|
||||
Rdi: DWORD64;
|
||||
R8: DWORD64;
|
||||
R9: DWORD64;
|
||||
R10: DWORD64;
|
||||
R11: DWORD64;
|
||||
R12: DWORD64;
|
||||
R13: DWORD64;
|
||||
R14: DWORD64;
|
||||
R15: DWORD64;
|
||||
|
||||
//
|
||||
// Program counter.
|
||||
//
|
||||
|
||||
Rip: DWORD64;
|
||||
|
||||
//
|
||||
// Floating point state.
|
||||
//
|
||||
|
||||
FltSave: XMM_SAVE_AREA32; // MWE: only translated the FltSave part of the union
|
||||
(*
|
||||
union {
|
||||
XMM_SAVE_AREA32 FltSave;
|
||||
struct {
|
||||
M128A Header[2];
|
||||
M128A Legacy[8];
|
||||
M128A Xmm0;
|
||||
M128A Xmm1;
|
||||
M128A Xmm2;
|
||||
M128A Xmm3;
|
||||
M128A Xmm4;
|
||||
M128A Xmm5;
|
||||
M128A Xmm6;
|
||||
M128A Xmm7;
|
||||
M128A Xmm8;
|
||||
M128A Xmm9;
|
||||
M128A Xmm10;
|
||||
M128A Xmm11;
|
||||
M128A Xmm12;
|
||||
M128A Xmm13;
|
||||
M128A Xmm14;
|
||||
M128A Xmm15;
|
||||
};
|
||||
};
|
||||
*)
|
||||
|
||||
//
|
||||
// Vector registers.
|
||||
//
|
||||
|
||||
VectorRegister: array[0..25] of M128A;
|
||||
VectorControl: DWORD64;
|
||||
|
||||
//
|
||||
// Special debug control registers.
|
||||
//
|
||||
|
||||
DebugControl: DWORD64;
|
||||
LastBranchToRip: DWORD64;
|
||||
LastBranchFromRip: DWORD64;
|
||||
LastExceptionToRip: DWORD64;
|
||||
LastExceptionFromRip: DWORD64;
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
{$ifdef cpupowerpc32}
|
||||
{$define __HASCONTEXT__}
|
||||
{ __ppc__ }
|
||||
{ Floating point registers returned when CONTEXT_FLOATING_POINT is set }
|
||||
{ Integer registers returned when CONTEXT_INTEGER is set. }
|
||||
@ -1173,12 +1379,22 @@
|
||||
Dr6 : DWORD;
|
||||
Dr7 : DWORD;
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
{$ifndef __HASCONTEXT__}
|
||||
{ MWE: placeholder so it won't break compilation on others (CPUARM ?) }
|
||||
type
|
||||
CONTEXT = record
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
{$undef __HASCONTEXT__}
|
||||
|
||||
LPCONTEXT = ^CONTEXT;
|
||||
_CONTEXT = CONTEXT;
|
||||
TCONTEXT = CONTEXT;
|
||||
PCONTEXT = ^CONTEXT;
|
||||
|
||||
{$endif}
|
||||
|
||||
type
|
||||
|
||||
LIST_ENTRY = record
|
||||
|
||||
Loading…
Reference in New Issue
Block a user