+ added AMD64 CONTEXT

git-svn-id: trunk@3303 -
This commit is contained in:
Marc Weustink 2006-04-20 18:26:34 +00:00
parent 638005f9d3
commit b7d30936c2
3 changed files with 269 additions and 16 deletions

View File

@ -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;

View File

@ -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

View File

@ -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