Browse Source

+ added AMD64 CONTEXT

git-svn-id: trunk@3303 -
Marc Weustink 19 years ago
parent
commit
b7d30936c2
3 changed files with 269 additions and 16 deletions
  1. 6 1
      rtl/win/wininc/base.inc
  2. 40 8
      rtl/win/wininc/defines.inc
  3. 223 7
      rtl/win/wininc/struct.inc

+ 6 - 1
rtl/win/wininc/base.inc

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

+ 40 - 8
rtl/win/wininc/defines.inc

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

+ 223 - 7
rtl/win/wininc/struct.inc

@@ -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}          
+
+{$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}
 
-{$else}
+{$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