thread/src/WIN32/ThreadContext.i3


Copyright (C) 1994, Digital Equipment Corp.

INTERFACE ThreadContext;

IMPORT WinDef, Word;

CONST SIZE_OF_80387_REGISTERS = 80;

CONST CONTEXT_i386 = 16_00010000;    (* this assumes that i386 and *)
CONST CONTEXT_i486 = 16_00010000;    (* i486 have identical context records *)

CONST CONTEXT_CONTROL = Word.Or(CONTEXT_i386, 16_0001);
                          (* SS:SP, CS:IP, FLAGS, BP *)
CONST CONTEXT_INTEGER = Word.Or(CONTEXT_i386, 16_0002);
                          (* AX, BX, CX, DX, SI, DI *)
CONST CONTEXT_SEGMENTS= Word.Or(CONTEXT_i386, 16_0004);
                          (* DS, ES, FS, GS *)
CONST CONTEXT_FLOATING_POINT = Word.Or(CONTEXT_i386, 16_0008);
                          (* 387 state *)
CONST CONTEXT_DEBUG_REGISTERS = Word.Or(CONTEXT_i386, 16_0010);
                          (* DB 0-3,6,7 *)

CONST CONTEXT_FULL = Word.Or(CONTEXT_CONTROL, Word.Or(CONTEXT_INTEGER,
                                                      CONTEXT_SEGMENTS));

TYPE
  FLOATING_SAVE_AREA = RECORD
    ControlWord:   WinDef.DWORD;
    StatusWord:    WinDef.DWORD;
    TagWord:       WinDef.DWORD;
    ErrorOffset:   WinDef.DWORD;
    ErrorSelector: WinDef.DWORD;
    DataOffset:    WinDef.DWORD;
    DataSelector:  WinDef.DWORD;
    RegisterArea:  ARRAY[0 .. SIZE_OF_80387_REGISTERS-1] OF WinDef.BYTE;
    Cr0NpxState:   WinDef.DWORD;
  END;

TYPE PFLOATING_SAVE_AREA = ADDRESS;
  (* ptr to FLOATING_SAVE_AREA *)

TYPE
  CONTEXT = RECORD
    ContextFlags: WinDef.DWORD;

    Dr0: WinDef.DWORD;
    Dr1: WinDef.DWORD;
    Dr2: WinDef.DWORD;
    Dr3: WinDef.DWORD;
    Dr6: WinDef.DWORD;
    Dr7: WinDef.DWORD;

    FloatSave: FLOATING_SAVE_AREA;

    SegGs: WinDef.DWORD;
    SegFs: WinDef.DWORD;
    SegEs: WinDef.DWORD;
    SegDs: WinDef.DWORD;

    Edi: WinDef.DWORD;
    Esi: WinDef.DWORD;
    Ebx: WinDef.DWORD;
    Edx: WinDef.DWORD;
    Ecx: WinDef.DWORD;
    Eax: WinDef.DWORD;

    Ebp:    WinDef.DWORD;
    Eip:    WinDef.DWORD;
    SegCs:  WinDef.DWORD;
    EFlags: WinDef.DWORD;
    Esp:    WinDef.DWORD;
    SegSs:  WinDef.DWORD;
  END;

TYPE PCONTEXT = UNTRACED REF CONTEXT;

END ThreadContext.