226 lines
7.7 KiB
Plaintext
226 lines
7.7 KiB
Plaintext
|
import "..\exdi.idl";
|
||
|
|
||
|
interface IeXdiX86_64Context;
|
||
|
// HRESULT GetContext ([in, out] PCONTEXT_X86_64 pContext);
|
||
|
// HRESULT SetContext ([in] CONTEXT_X86_64 Context);
|
||
|
|
||
|
cpp_quote("// The following constants are bit definitions for the ModeFlags value in CONTEXT_X86_64.")
|
||
|
cpp_quote("// They are provided to allow debuggers to correctly disassemble instructions based on")
|
||
|
cpp_quote("// the current operating mode of the processor.")
|
||
|
|
||
|
cpp_quote("#define X86_64_MODE_D (0x0001) // D bit from the current CS selector")
|
||
|
cpp_quote("#define X86_64_MODE_L (0x0002) // L bit (long mode) from the current CS selector")
|
||
|
cpp_quote("#define X86_64_MODE_LME (0x0004) // LME bit (lomg mode enable) from extended feature MSR")
|
||
|
cpp_quote("#define X86_64_MODE_REX (0x0008) // REX bit (register extension) from extended feature MSR")
|
||
|
|
||
|
typedef
|
||
|
struct _SEG64_DESC_INFO
|
||
|
{
|
||
|
DWORD64 SegBase;
|
||
|
DWORD64 SegLimit;
|
||
|
DWORD SegFlags;
|
||
|
} SEG64_DESC_INFO;
|
||
|
|
||
|
typedef
|
||
|
struct _SSE_REG
|
||
|
{
|
||
|
DWORD Reg0;
|
||
|
DWORD Reg1;
|
||
|
DWORD Reg2;
|
||
|
DWORD Reg3;
|
||
|
} SSE_REG;
|
||
|
|
||
|
#define NUM_SSE_REGS 16
|
||
|
|
||
|
typedef
|
||
|
struct _CONTEXT_X86_64
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
BOOL fSegmentRegs;
|
||
|
BOOL fControlRegs;
|
||
|
BOOL fIntegerRegs;
|
||
|
BOOL fFloatingPointRegs;
|
||
|
BOOL fDebugRegs;
|
||
|
BOOL fSegmentDescriptors;
|
||
|
BOOL fSSERegisters;
|
||
|
BOOL fSystemRegisters;
|
||
|
} RegGroupSelection; // These flags are used to select groups of registers only
|
||
|
// (instead of the totality) for reading or writing.
|
||
|
// both Segment & Control registers (used if either RegGroupSelection.fSegmentRegs or
|
||
|
// RegGroupSelection.fControlRegs is TRUE).
|
||
|
DWORD SegCs;
|
||
|
DWORD SegSs;
|
||
|
// Segment registers (used if RegGroupSelection.fSegmentRegs is TRUE).
|
||
|
// except CS and SS which are in "Segment and Control" - see above
|
||
|
DWORD SegGs;
|
||
|
DWORD SegFs;
|
||
|
DWORD SegEs;
|
||
|
DWORD SegDs;
|
||
|
// Mode flags define the current processor mode (16/32/64 bit)
|
||
|
DWORD64 ModeFlags;
|
||
|
// Control registers (used if RegGroupSelection.fControlRegs is TRUE).
|
||
|
// except CS and SS which are in "Segment and Control" - see above
|
||
|
DWORD64 EFlags;
|
||
|
DWORD64 Rbp;
|
||
|
DWORD64 Rip;
|
||
|
DWORD64 Rsp;
|
||
|
// Integer registers (used if RegGroupSelection.fIntegerRegs is TRUE).
|
||
|
DWORD64 Rax;
|
||
|
DWORD64 Rbx;
|
||
|
DWORD64 Rcx;
|
||
|
DWORD64 Rdx;
|
||
|
DWORD64 Rsi;
|
||
|
DWORD64 Rdi;
|
||
|
DWORD64 R8;
|
||
|
DWORD64 R9;
|
||
|
DWORD64 R10;
|
||
|
DWORD64 R11;
|
||
|
DWORD64 R12;
|
||
|
DWORD64 R13;
|
||
|
DWORD64 R14;
|
||
|
DWORD64 R15;
|
||
|
// Floating point registers (used if RegGroupSelection.fFloatingPointRegs is TRUE).
|
||
|
DWORD ControlWord;
|
||
|
DWORD StatusWord;
|
||
|
DWORD TagWord;
|
||
|
DWORD ErrorOffset;
|
||
|
DWORD ErrorSelector;
|
||
|
DWORD DataOffset;
|
||
|
DWORD DataSelector;
|
||
|
BYTE RegisterArea [SIZE_OF_80387_REGISTERS_IN_BYTES];
|
||
|
// Debug registers (used if RegGroupSelection.fDebugRegs is TRUE)
|
||
|
DWORD64 Dr0;
|
||
|
DWORD64 Dr1;
|
||
|
DWORD64 Dr2;
|
||
|
DWORD64 Dr3;
|
||
|
DWORD64 Dr6;
|
||
|
DWORD64 Dr7;
|
||
|
// Descriptors and base registers (used if RegGroupSelection.fSegmentDescriptors is TRUE)
|
||
|
SEG64_DESC_INFO DescriptorCs;
|
||
|
SEG64_DESC_INFO DescriptorSs;
|
||
|
SEG64_DESC_INFO DescriptorGs;
|
||
|
SEG64_DESC_INFO DescriptorFs;
|
||
|
SEG64_DESC_INFO DescriptorEs;
|
||
|
SEG64_DESC_INFO DescriptorDs;
|
||
|
DWORD64 IDTBase;
|
||
|
DWORD64 IDTLimit;
|
||
|
DWORD64 GDTBase;
|
||
|
DWORD64 GDTLimit;
|
||
|
DWORD SelLDT;
|
||
|
SEG64_DESC_INFO SegLDT;
|
||
|
DWORD SelTSS;
|
||
|
SEG64_DESC_INFO SegTSS;
|
||
|
// System registers (used if RegGroupSelection.fSystemRegisters is TRUE)
|
||
|
DWORD64 RegCr0;
|
||
|
DWORD64 RegCr2;
|
||
|
DWORD64 RegCr3;
|
||
|
DWORD64 RegCr4;
|
||
|
DWORD64 RegCr8; // Cr8 - Task priority register.
|
||
|
// SSE registers (used if RegGroupSelection.fSSERegisters is TRUE)
|
||
|
DWORD RegMXCSR;
|
||
|
SSE_REG RegSSE[NUM_SSE_REGS];
|
||
|
} CONTEXT_X86_64, *PCONTEXT_X86_64;
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// IeXdiX86_64Context
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// X86_64 context access interface
|
||
|
|
||
|
[
|
||
|
object,
|
||
|
uuid(4795B125-6CDE-4e76-B8D3-D5ED69ECE739),
|
||
|
helpstring("IeXdiX86_64Context interface - eXdi Context access for 64 Bit X86 processors 1.0 for Platform Builder 3.0 debugger - Microsoft 1999"),
|
||
|
pointer_default(ref)
|
||
|
]
|
||
|
|
||
|
interface IeXdiX86_64Context : IUnknown
|
||
|
{
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Name:
|
||
|
|
||
|
GetContext
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Read Context - Read a set of CPU / Co-Proc registers that define the state of the target
|
||
|
The CONTEXT.RegGroupSelection bitfield allow to select which group of register need to be read only
|
||
|
|
||
|
Argument(s):
|
||
|
|
||
|
pContext - Return context (CPU dependant structure).
|
||
|
Note: The context is also passed in to indicate only the RegGroupSelection (which reg groups are read)
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Error status:
|
||
|
S_OK: Function successful
|
||
|
EXDI_E_CANNOTWHILETGTRUNNING Cannot proceed while target running. Must halt the target first.
|
||
|
Note: this error is generated only if the probe / target does not support this operation "on the fly".
|
||
|
see DEBUG_ACCESS_CAPABILITIES_STRUCT.fReadRegWhileRunning
|
||
|
EXDI_E_NOTIMPL: Not implemented
|
||
|
EXDI_E_OUTOFMEMORY: Failed to allocate necessary memory
|
||
|
EXDI_E_INVALIDARG: One or more arguments are invalid
|
||
|
EXDI_E_ABORT: Operation aborted
|
||
|
EXDI_E_FAIL: Unspecified failure
|
||
|
EXDI_E_COMMUNICATION: Communication error between host driver and target
|
||
|
EXDI_E_USEDBYCONCURENTTHREAD: Cannot proceed immediately because resource is already used by concurent thread.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HRESULT GetContext
|
||
|
(
|
||
|
[in, out] PCONTEXT_X86_64 pContext
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Name:
|
||
|
|
||
|
SetContext
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Write Context - Write a set of CPU / Co-Proc registers that define the state of the target
|
||
|
The CONTEXT.RegGroupSelection bitfield allow to select which group of register need to be written only
|
||
|
|
||
|
Argument(s):
|
||
|
|
||
|
pContext - Return context (CPU dependant structure).
|
||
|
Note: The context is also passed in to indicate only the RegGroupSelection (which reg groups are read)
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
Error status:
|
||
|
S_OK: Function successful
|
||
|
EXDI_E_CANNOTWHILETGTRUNNING Cannot proceed while target running. Must halt the target first.
|
||
|
Note: this error is generated only if the probe / target does not support this operation "on the fly".
|
||
|
see DEBUG_ACCESS_CAPABILITIES_STRUCT.fWriteRegWhileRunning
|
||
|
EXDI_E_NOTIMPL: Not implemented
|
||
|
EXDI_E_OUTOFMEMORY: Failed to allocate necessary memory
|
||
|
EXDI_E_INVALIDARG: One or more arguments are invalid
|
||
|
EXDI_E_ABORT: Operation aborted
|
||
|
EXDI_E_FAIL: Unspecified failure
|
||
|
EXDI_E_COMMUNICATION: Communication error between host driver and target
|
||
|
EXDI_E_USEDBYCONCURENTTHREAD: Cannot proceed immediately because resource is already used by concurent thread.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HRESULT SetContext
|
||
|
(
|
||
|
[in] CONTEXT_X86_64 Context
|
||
|
);
|
||
|
|
||
|
|
||
|
}; // interface IeXdiX86_64Context
|