925 lines
32 KiB
C
925 lines
32 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: halkd.h
|
|
//
|
|
|
|
#define IN
|
|
#define OUT
|
|
#define OPTIONAL
|
|
#define CONST const
|
|
|
|
#if PTR_SIZE_32
|
|
#define SIGN_EXTEND(x) ((UINT64)(INT64)(INT32)(x))
|
|
#elif PTR_SIZE_64
|
|
#define SIGN_EXTEND(x) ((UINT64)(x))
|
|
#endif
|
|
|
|
// NT Compat types
|
|
typedef BOOL BOOLEAN;
|
|
typedef char *PCHAR;
|
|
typedef char CHAR;
|
|
typedef UCHAR *PUCHAR;
|
|
typedef UINT32 NTSTATUS;
|
|
|
|
typedef struct _STRING {
|
|
UINT16 Length;
|
|
UINT16 MaximumLength;
|
|
CHAR * Buffer;
|
|
} STRING, *PSTRING;
|
|
|
|
typedef struct _UNICODE_STRING {
|
|
UINT16 Length;
|
|
UINT16 MaximumLength;
|
|
WCHAR * Buffer;
|
|
} UNICODE_STRING;
|
|
|
|
typedef struct _LIST_ENTRY {
|
|
struct _LIST_ENTRY *Flink;
|
|
struct _LIST_ENTRY *Blink;
|
|
} LIST_ENTRY, *PLIST_ENTRY;
|
|
|
|
//======================================================================
|
|
// Selected structs and defines used by the kernel debugger
|
|
//
|
|
typedef struct _KLDR_DATA_TABLE_ENTRY {
|
|
LIST_ENTRY InLoadOrderLinks;
|
|
PVOID __Unused1;
|
|
PVOID __Unused2;
|
|
PVOID __Unused3;
|
|
PVOID NonPagedDebugInfo;
|
|
PVOID DllBase;
|
|
PVOID EntryPoint;
|
|
UINT32 SizeOfImage;
|
|
UNICODE_STRING FullDllName;
|
|
UNICODE_STRING BaseDllName;
|
|
UINT32 Flags;
|
|
UINT16 LoadCount;
|
|
UINT16 __Unused5;
|
|
PVOID SectionPointer;
|
|
UINT32 CheckSum;
|
|
// UINT32 padding on IA64
|
|
UINT32 TimeDateStamp;
|
|
// PVOID LoadedImports;
|
|
PVOID __Unused6;
|
|
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
|
|
|
|
//======================================================================
|
|
// Selected structs and defines used by the KD protocol
|
|
//
|
|
|
|
///////////////////////////////////////////////////////////////////////// X86.
|
|
//
|
|
#define X86_REPORT_INCLUDES_SEGS 0x0001
|
|
// Indicates the current CS is a standard 32-bit flat segment.
|
|
// This allows the debugger to avoid retrieving the
|
|
// CS descriptor to see if it's 16-bit code or not.
|
|
// Note that the V86 flag in EFlags must also be checked
|
|
// when determining the code type.
|
|
#define X86_REPORT_STANDARD_CS 0x0002
|
|
|
|
#define X86_DEBUG_CONTROL_SPACE_KSPECIAL 716
|
|
|
|
//////////////////////////////////////////////////////////////////////// IA64.
|
|
//
|
|
#define IA64_DBGKD_CONTROL_SET_CONTINUE_NONE 0x0000
|
|
#define IA64_DBGKD_CONTROL_SET_CONTINUE_TRACE_INSTRUCTION 0x0001
|
|
#define IA64_DBGKD_CONTROL_SET_CONTINUE_TRACE_TAKEN_BRANCH 0x0002
|
|
|
|
//
|
|
// Aliases to keep old-timers comfortable with new-fangled code.
|
|
//
|
|
#define ALPHA_DBGKD_CONTROL_REPORT Struct_Microsoft_Singularity_Kd_AlphaKdControlReport
|
|
#define ALPHA_DBGKD_CONTROL_SET Struct_Microsoft_Singularity_Kd_AlphaKdControlSet
|
|
#define ARM_CONTEXT Struct_Microsoft_Singularity_Kd_ArmContext
|
|
#define ARM_DBGKD_CONTROL_REPORT Struct_Microsoft_Singularity_Kd_ArmKdControlReport
|
|
#define ARM_DBGKD_CONTROL_SET Struct_Microsoft_Singularity_Kd_ArmKdControlSet
|
|
#define ARM_KPROCESSOR_STATE Struct_Microsoft_Singularity_Kd_ArmKProcessorState
|
|
#define ARM_KSPECIAL_REGISTERS Struct_Microsoft_Singularity_Kd_ArmKSpecialRegisters
|
|
#define ARM_RUNTIME_FUNCTION Struct_Microsoft_Singularity_Kd_ArmRuntimeFunction
|
|
#define ARM_RUNTIME_FUNCTION_EXCEPTION Struct_Microsoft_Singularity_Kd_ArmRuntimeFunctionException
|
|
#define IA64_DBGKD_CONTROL_REPORT Struct_Microsoft_Singularity_Kd_Ia64KdControlReport
|
|
#define IA64_DBGKD_CONTROL_SET Struct_Microsoft_Singularity_Kd_Ia64KdControlSet
|
|
#define X64_CONTEXT Struct_Microsoft_Singularity_Kd_X64Context
|
|
#define X64_DBGKD_CONTROL_REPORT Struct_Microsoft_Singularity_Kd_X64KdControlReport
|
|
#define X64_DBGKD_CONTROL_SET Struct_Microsoft_Singularity_Kd_X64KdControlSet
|
|
#define X64_DESCRIPTOR Struct_Microsoft_Singularity_Kd_X64Descriptor
|
|
#define X64_KPROCESSOR_STATE Struct_Microsoft_Singularity_Kd_X64KProcessorState
|
|
#define X64_KSPECIAL_REGISTERS Struct_Microsoft_Singularity_Kd_X64KSpecialRegisters
|
|
#define X64_VECTOR_REGISTERS Struct_Microsoft_Singularity_Kd_X64VectorRegisters
|
|
#define X86_387_REGISTER Struct_Microsoft_Singularity_Kd_X86Fp387Register
|
|
#define X86_387_SAVE_AREA Struct_Microsoft_Singularity_Kd_X86Fp387SaveArea
|
|
#define X86_CONTEXT Struct_Microsoft_Singularity_Kd_X86Context
|
|
#define X86_DBGKD_CONTROL_REPORT Struct_Microsoft_Singularity_Kd_X86KdControlReport
|
|
#define X86_DBGKD_CONTROL_SET Struct_Microsoft_Singularity_Kd_X86KdControlSet
|
|
#define X86_DESCRIPTOR Struct_Microsoft_Singularity_Kd_X86Descriptor
|
|
#define X86_KPROCESSOR_STATE Struct_Microsoft_Singularity_Kd_X86KProcessorState
|
|
#define X86_KSPECIAL_REGISTERS Struct_Microsoft_Singularity_Kd_X86KSpecialRegisters
|
|
#define X86_SEGMENT_REGISTERS Struct_Microsoft_Singularity_Kd_X86SegmentRegisters
|
|
#define X86_UNALIGNED_128 Struct_Microsoft_Singularity_Kd_X86Unaligned128
|
|
#define X86_XMM_SAVE_AREA32 Struct_Microsoft_Singularity_Kd_X86XmmSaveArea32
|
|
#define EXCEPTION_RECORD64 Struct_Microsoft_Singularity_Kd_ExceptionRecord64
|
|
|
|
//////////////////////////////////////////////////////////////////// All ISAs.
|
|
//
|
|
|
|
#define CONTEXT_X86 0x00010000 // i386, etc.
|
|
#define CONTEXT_X64 0x00100000 // x64 context record is quite different
|
|
#define CONTEXT_ARM 0x00100000
|
|
|
|
#define CONTEXT_EXCEPTION_ACTIVE 0x08000000
|
|
#define CONTEXT_SERVICE_ACTIVE 0x10000000
|
|
#define CONTEXT_EXCEPTION_REQUEST 0x40000000
|
|
#define CONTEXT_EXCEPTION_REPORTING 0x80000000
|
|
|
|
#if ISA_IX86
|
|
|
|
#define CONTEXT_CONTROL (CONTEXT_X86 | 0x1L) // SS:SP, CS:IP, FLAGS, BP
|
|
#define CONTEXT_INTEGER (CONTEXT_X86 | 0x2L) // AX, BX, CX, DX, SI, DI
|
|
#define CONTEXT_SEGMENTS (CONTEXT_X86 | 0x4L) // DS, ES, FS, GS
|
|
#define CONTEXT_FLOATING_POINT (CONTEXT_X86 | 0x8L) // 387 state
|
|
#define CONTEXT_DEBUG_REGISTERS (CONTEXT_X86 | 0x10L) // DB 0-3,6,7
|
|
#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_X86 | 0x20L) // cpu specific extensions
|
|
|
|
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
|
|
|
|
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
|
|
|
|
typedef X86_CONTEXT CONTEXT, *PCONTEXT;
|
|
typedef X86_KSPECIAL_REGISTERS KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
|
typedef X86_KPROCESSOR_STATE KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
|
typedef X86_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
|
|
typedef X86_DBGKD_CONTROL_SET DBGKD_CONTROL_SET;
|
|
|
|
#define KDP_BREAKPOINT_TYPE uint8
|
|
#define KDP_BREAKPOINT_BUFFER sizeof(uint8)
|
|
#define KDP_BREAKPOINT_ALIGN 0
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 0
|
|
#define KDP_BREAKPOINT_VALUE 0xcc // int 3
|
|
|
|
#elif ISA_IX64
|
|
|
|
#define CONTEXT_CONTROL (CONTEXT_X64 | 0x1L)
|
|
#define CONTEXT_INTEGER (CONTEXT_X64 | 0x2L)
|
|
#define CONTEXT_SEGMENTS (CONTEXT_X64 | 0x4L)
|
|
#define CONTEXT_FLOATING_POINT (CONTEXT_X64 | 0x8L)
|
|
#define CONTEXT_DEBUG_REGISTERS (CONTEXT_X64 | 0x10L)
|
|
|
|
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
|
|
|
|
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
|
|
|
|
typedef X64_CONTEXT CONTEXT, *PCONTEXT;
|
|
typedef X64_KSPECIAL_REGISTERS KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
|
typedef X64_KPROCESSOR_STATE KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
|
typedef X64_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
|
|
typedef X64_DBGKD_CONTROL_SET DBGKD_CONTROL_SET;
|
|
|
|
#define KDP_BREAKPOINT_TYPE uint8
|
|
#define KDP_BREAKPOINT_BUFFER sizeof(uint8)
|
|
#define KDP_BREAKPOINT_ALIGN 0
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 0
|
|
#define KDP_BREAKPOINT_VALUE 0xcc // int 3
|
|
|
|
#elif ISA_ARM
|
|
|
|
#define CONTEXT_CONTROL (CONTEXT_ARM | 0x1L)
|
|
#define CONTEXT_INTEGER (CONTEXT_ARM | 0x2L)
|
|
#define CONTEXT_FLOATING_POINT (CONTEXT_ARM | 0x4L)
|
|
#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x8L)
|
|
|
|
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
|
|
|
|
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
|
|
|
|
typedef ARM_CONTEXT CONTEXT, *PCONTEXT;
|
|
typedef ARM_KSPECIAL_REGISTERS KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
|
typedef ARM_KPROCESSOR_STATE KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
|
typedef ARM_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
|
|
typedef ARM_DBGKD_CONTROL_SET DBGKD_CONTROL_SET;
|
|
|
|
#define KDP_BREAKPOINT_TYPE UINT32
|
|
#define KDP_BREAKPOINT_BUFFER sizeof(UINT32)
|
|
#define KDP_BREAKPOINT_ALIGN 4
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 4
|
|
#define KDP_BREAKPOINT_VALUE 0xefffff01 // swi 0xffff01
|
|
|
|
#endif
|
|
|
|
//-----> From winnt.h#3566
|
|
|
|
//#pragma pack(pop)
|
|
|
|
//
|
|
// Values put in ExceptionRecord.ExceptionInformation[0]
|
|
// First parameter is always in ExceptionInformation[1],
|
|
// Second parameter is always in ExceptionInformation[2]
|
|
//
|
|
|
|
#define BREAKPOINT_BREAK 0
|
|
#define BREAKPOINT_PRINT 1
|
|
#define BREAKPOINT_PROMPT 2
|
|
#define BREAKPOINT_LOAD_SYMBOLS 3
|
|
#define BREAKPOINT_UNLOAD_SYMBOLS 4
|
|
#define BREAKPOINT_COMMAND_STRING 5
|
|
|
|
// Don't care what these point to!
|
|
typedef void *PKTRAP_FRAME;
|
|
typedef void *PKEXCEPTION_FRAME;
|
|
|
|
//
|
|
// Processor modes.
|
|
//
|
|
typedef CHAR KPROCESSOR_MODE;
|
|
typedef enum _MODE {
|
|
KernelMode,
|
|
UserMode,
|
|
MaximumMode
|
|
} MODE;
|
|
|
|
|
|
typedef struct _DBGKM_EXCEPTION64 {
|
|
EXCEPTION_RECORD64 ExceptionRecord;
|
|
UINT32 FirstChance;
|
|
} DBGKM_EXCEPTION64, *PDBGKM_EXCEPTION64;
|
|
|
|
typedef struct _DBGKD_ANY_CONTROL_REPORT {
|
|
union {
|
|
X86_DBGKD_CONTROL_REPORT X86ControlReport;
|
|
ALPHA_DBGKD_CONTROL_REPORT AlphaControlReport;
|
|
IA64_DBGKD_CONTROL_REPORT IA64ControlReport;
|
|
X64_DBGKD_CONTROL_REPORT X64ControlReport;
|
|
ARM_DBGKD_CONTROL_REPORT ARMControlReport;
|
|
};
|
|
} DBGKD_ANY_CONTROL_REPORT, *PDBGKD_ANY_CONTROL_REPORT;
|
|
|
|
typedef struct _DBGKD_LOAD_SYMBOLS64 {
|
|
UINT32 PathNameLength;
|
|
UINT64 BaseOfDll;
|
|
UINT64 ProcessId;
|
|
UINT32 CheckSum;
|
|
UINT32 SizeOfImage;
|
|
BOOLEAN UnloadSymbols;
|
|
} DBGKD_LOAD_SYMBOLS64, *PDBGKD_LOAD_SYMBOLS64;
|
|
|
|
typedef struct _DBGKD_COMMAND_STRING {
|
|
UINT32 Flags;
|
|
UINT32 Reserved1;
|
|
UINT64 Reserved2[7];
|
|
} DBGKD_COMMAND_STRING, *PDBGKD_COMMAND_STRING;
|
|
|
|
// Protocol version 6 state change.
|
|
typedef struct _DBGKD_ANY_WAIT_STATE_CHANGE {
|
|
UINT32 NewState;
|
|
UINT16 ProcessorLevel;
|
|
UINT16 Processor;
|
|
UINT32 NumberProcessors;
|
|
UINT64 Thread;
|
|
UINT64 ProgramCounter;
|
|
union {
|
|
DBGKM_EXCEPTION64 Exception;
|
|
DBGKD_LOAD_SYMBOLS64 LoadSymbols;
|
|
DBGKD_COMMAND_STRING CommandString;
|
|
};
|
|
// The ANY control report is unioned here to
|
|
// ensure that this structure is always large
|
|
// enough to hold any possible state change.
|
|
union {
|
|
DBGKD_CONTROL_REPORT ControlReport;
|
|
DBGKD_ANY_CONTROL_REPORT AnyControlReport;
|
|
};
|
|
} DBGKD_ANY_WAIT_STATE_CHANGE, *PDBGKD_ANY_WAIT_STATE_CHANGE;
|
|
|
|
#define DEBUG_CONTROL_SPACE_KSPECIAL 2
|
|
|
|
typedef struct _DBGKD_READ_MEMORY64 {
|
|
UINT64 TargetBaseAddress;
|
|
UINT32 TransferCount;
|
|
UINT32 ActualBytesRead;
|
|
} DBGKD_READ_MEMORY64, *PDBGKD_READ_MEMORY64;
|
|
|
|
typedef struct _DBGKD_WRITE_MEMORY64 {
|
|
UINT64 TargetBaseAddress;
|
|
UINT32 TransferCount;
|
|
UINT32 ActualBytesWritten;
|
|
} DBGKD_WRITE_MEMORY64, *PDBGKD_WRITE_MEMORY64;
|
|
|
|
typedef struct _DBGKD_READ_WRITE_IO64 {
|
|
UINT64 IoAddress;
|
|
UINT32 DataSize; // 1, 2, 4
|
|
UINT32 DataValue;
|
|
} DBGKD_READ_WRITE_IO64, *PDBGKD_READ_WRITE_IO64;
|
|
|
|
//
|
|
// Response is a get context message with a full context record following
|
|
//
|
|
|
|
typedef struct _DBGKD_GET_CONTEXT {
|
|
UINT32 Unused;
|
|
} DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT;
|
|
|
|
//
|
|
// Full Context record follows
|
|
//
|
|
|
|
typedef struct _DBGKD_SET_CONTEXT {
|
|
UINT32 ContextFlags;
|
|
} DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT;
|
|
|
|
//
|
|
// Define breakpoint table entry structure.
|
|
//
|
|
|
|
#define KD_BREAKPOINT_IN_USE 0x00000001
|
|
#define KD_BREAKPOINT_NEEDS_WRITE 0x00000002
|
|
#define KD_BREAKPOINT_SUSPENDED 0x00000004
|
|
#define KD_BREAKPOINT_NEEDS_REPLACE 0x00000008
|
|
|
|
typedef struct _BREAKPOINT_ENTRY {
|
|
UINT32 Flags;
|
|
ULONG_PTR DirectoryTableBase;
|
|
PVOID Address;
|
|
KDP_BREAKPOINT_TYPE Content;
|
|
} BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
|
|
|
|
#define BREAKPOINT_TABLE_SIZE 32 // max number supported by kernel
|
|
|
|
|
|
typedef struct _DBGKD_WRITE_BREAKPOINT32 {
|
|
UINT32 BreakPointAddress;
|
|
UINT32 BreakPointHandle;
|
|
} DBGKD_WRITE_BREAKPOINT32, *PDBGKD_WRITE_BREAKPOINT32;
|
|
|
|
typedef struct _DBGKD_WRITE_BREAKPOINT64 {
|
|
UINT64 BreakPointAddress;
|
|
UINT32 BreakPointHandle;
|
|
} DBGKD_WRITE_BREAKPOINT64, *PDBGKD_WRITE_BREAKPOINT64;
|
|
|
|
typedef struct _DBGKD_RESTORE_BREAKPOINT {
|
|
UINT32 BreakPointHandle;
|
|
} DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT;
|
|
|
|
typedef struct _DBGKD_CONTINUE {
|
|
NTSTATUS ContinueStatus;
|
|
} DBGKD_CONTINUE, *PDBGKD_CONTINUE;
|
|
|
|
typedef struct _DBGKD_ANY_CONTROL_SET {
|
|
union {
|
|
X86_DBGKD_CONTROL_SET X86ControlSet;
|
|
ALPHA_DBGKD_CONTROL_SET AlphaControlSet;
|
|
IA64_DBGKD_CONTROL_SET IA64ControlSet;
|
|
X64_DBGKD_CONTROL_SET X64ControlSet;
|
|
ARM_DBGKD_CONTROL_SET ARMControlSet;
|
|
};
|
|
} DBGKD_ANY_CONTROL_SET, *PDBGKD_ANY_CONTROL_SET;
|
|
|
|
// This structure must be 32-bit packed for
|
|
// for compatibility with older, processor-specific
|
|
// versions of this structure.
|
|
|
|
typedef struct _DBGKD_CONTINUE2 {
|
|
// The ANY control set is unioned here to
|
|
// ensure that this structure is always large
|
|
// enough to hold any possible continue.
|
|
union {
|
|
NTSTATUS ContinueStatus;
|
|
DBGKD_CONTROL_SET ControlSet;
|
|
DBGKD_ANY_CONTROL_SET AnyControlSet;
|
|
};
|
|
} DBGKD_CONTINUE2, *PDBGKD_CONTINUE2;
|
|
|
|
//
|
|
// MSR support
|
|
//
|
|
|
|
typedef struct _DBGKD_READ_WRITE_MSR {
|
|
UINT32 Msr;
|
|
UINT32 DataValueLow;
|
|
UINT32 DataValueHigh;
|
|
} DBGKD_READ_WRITE_MSR, *PDBGKD_READ_WRITE_MSR;
|
|
|
|
|
|
typedef struct _DBGKD_GET_VERSION64 {
|
|
UINT16 MajorVersion;
|
|
UINT16 MinorVersion;
|
|
UINT16 ProtocolVersion;
|
|
UINT16 Flags;
|
|
UINT16 MachineType;
|
|
|
|
//
|
|
// Protocol command support descriptions.
|
|
// These allow the debugger to automatically
|
|
// adapt to different levels of command support
|
|
// in different kernels.
|
|
//
|
|
|
|
// One beyond highest packet type understood, zero based.
|
|
UCHAR MaxPacketType;
|
|
// One beyond highest state change understood, zero based.
|
|
UCHAR MaxStateChange;
|
|
// One beyond highest state manipulate message understood, zero based.
|
|
UCHAR MaxManipulate;
|
|
|
|
// Kind of execution environment the kernel is running in,
|
|
// such as a real machine or a simulator. Written back
|
|
// by the simulation if one exists.
|
|
UCHAR Simulation;
|
|
|
|
UINT16 Unused[1];
|
|
|
|
UINT64 KernBase;
|
|
UINT64 PsLoadedModuleList;
|
|
|
|
//
|
|
// Components may register a debug data block for use by
|
|
// debugger extensions. This is the address of the list head.
|
|
//
|
|
// There will always be an entry for the debugger.
|
|
//
|
|
|
|
UINT64 DebuggerDataList;
|
|
|
|
} DBGKD_GET_VERSION64, *PDBGKD_GET_VERSION64;
|
|
|
|
|
|
typedef struct _DBGKD_MANIPULATE_STATE64 {
|
|
UINT32 ApiNumber;
|
|
UINT16 ProcessorLevel;
|
|
UINT16 Processor;
|
|
NTSTATUS ReturnStatus;
|
|
union {
|
|
DBGKD_READ_MEMORY64 ReadMemory;
|
|
DBGKD_WRITE_MEMORY64 WriteMemory;
|
|
DBGKD_GET_VERSION64 GetVersion64;
|
|
DBGKD_GET_CONTEXT GetContext;
|
|
DBGKD_SET_CONTEXT SetContext;
|
|
DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint;
|
|
DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;
|
|
DBGKD_CONTINUE Continue;
|
|
DBGKD_CONTINUE2 Continue2;
|
|
DBGKD_READ_WRITE_MSR ReadWriteMsr;
|
|
DBGKD_READ_WRITE_IO64 ReadWriteIo;
|
|
#if 0
|
|
DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended;
|
|
DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;
|
|
DBGKD_SET_SPECIAL_CALL64 SetSpecialCall;
|
|
DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint;
|
|
DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint;
|
|
DBGKD_BREAKPOINTEX BreakPointEx;
|
|
DBGKD_SEARCH_MEMORY SearchMemory;
|
|
DBGKD_GET_SET_BUS_DATA GetSetBusData;
|
|
DBGKD_FILL_MEMORY FillMemory;
|
|
DBGKD_QUERY_MEMORY QueryMemory;
|
|
DBGKD_SWITCH_PARTITION SwitchPartition;
|
|
#endif
|
|
|
|
};
|
|
} DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64;
|
|
|
|
//
|
|
// If the packet type is PACKET_TYPE_KD_DEBUG_IO, then
|
|
// the format of the packet data is as follows:
|
|
//
|
|
|
|
#define DbgKdPrintStringApi 0x00003230L
|
|
#define DbgKdGetStringApi 0x00003231L
|
|
|
|
//
|
|
// For print string, the Null terminated string to print
|
|
// immediately follows the message
|
|
//
|
|
typedef struct _DBGKD_PRINT_STRING {
|
|
UINT32 LengthOfString;
|
|
} DBGKD_PRINT_STRING, *PDBGKD_PRINT_STRING;
|
|
|
|
//
|
|
// For get string, the Null terminated prompt string
|
|
// immediately follows the message. The LengthOfStringRead
|
|
// field initially contains the maximum number of characters
|
|
// to read. Upon reply, this contains the number of bytes actually
|
|
// read. The data read immediately follows the message.
|
|
//
|
|
//
|
|
typedef struct _DBGKD_GET_STRING {
|
|
UINT32 LengthOfPromptString;
|
|
UINT32 LengthOfStringRead;
|
|
} DBGKD_GET_STRING, *PDBGKD_GET_STRING;
|
|
|
|
typedef struct _DBGKD_DEBUG_IO {
|
|
UINT32 ApiNumber;
|
|
UINT16 ProcessorLevel;
|
|
UINT16 Processor;
|
|
union {
|
|
DBGKD_PRINT_STRING PrintString;
|
|
DBGKD_GET_STRING GetString;
|
|
};
|
|
} DBGKD_DEBUG_IO, *PDBGKD_DEBUG_IO;
|
|
|
|
//
|
|
// DbgKd APIs are for the portable kernel debugger
|
|
//
|
|
|
|
//
|
|
// KD_PACKETS are the low level data format used in KD. All packets
|
|
// begin with a packet leader, byte count, packet type. The sequence
|
|
// for accepting a packet is:
|
|
//
|
|
// - read 4 bytes to get packet leader. If read times out (10 seconds)
|
|
// with a short read, or if packet leader is incorrect, then retry
|
|
// the read.
|
|
//
|
|
// - next read 2 byte packet type. If read times out (10 seconds) with
|
|
// a short read, or if packet type is bad, then start again looking
|
|
// for a packet leader.
|
|
//
|
|
// - next read 4 byte packet Id. If read times out (10 seconds)
|
|
// with a short read, or if packet Id is not what we expect, then
|
|
// ask for resend and restart again looking for a packet leader.
|
|
//
|
|
// - next read 2 byte count. If read times out (10 seconds) with
|
|
// a short read, or if byte count is greater than PACKET_MAX_SIZE,
|
|
// then start again looking for a packet leader.
|
|
//
|
|
// - next read 4 byte packet data checksum.
|
|
//
|
|
// - The packet data immediately follows the packet. There should be
|
|
// ByteCount bytes following the packet header. Read the packet
|
|
// data, if read times out (10 seconds) then start again looking for
|
|
// a packet leader.
|
|
//
|
|
|
|
|
|
typedef struct _KD_PACKET {
|
|
UINT32 PacketLeader;
|
|
UINT16 PacketType;
|
|
UINT16 ByteCount;
|
|
UINT32 PacketId;
|
|
UINT32 Checksum;
|
|
} KD_PACKET, *PKD_PACKET;
|
|
|
|
#define PACKET_MAX_SIZE 4000
|
|
#define INITIAL_PACKET_ID 0x80800000 // Don't use 0
|
|
#define SYNC_PACKET_ID 0x00000800 // Or in with INITIAL_PACKET_ID
|
|
// to force a packet ID reset.
|
|
|
|
//
|
|
// BreakIn packet
|
|
//
|
|
|
|
#define BREAKIN_PACKET 0x62626262
|
|
#define BREAKIN_PACKET_BYTE 0x62
|
|
|
|
//
|
|
// Packet lead in sequence
|
|
//
|
|
|
|
#define PACKET_LEADER 0x30303030 //0x77000077
|
|
#define PACKET_LEADER_BYTE 0x30
|
|
|
|
#define CONTROL_PACKET_LEADER 0x69696969
|
|
#define CONTROL_PACKET_LEADER_BYTE 0x69
|
|
|
|
//
|
|
// Packet Trailing Byte
|
|
//
|
|
|
|
#define PACKET_TRAILING_BYTE 0xAA
|
|
|
|
//
|
|
// Packet Types
|
|
//
|
|
|
|
#define PACKET_TYPE_UNUSED 0
|
|
#define PACKET_TYPE_KD_STATE_CHANGE32 1
|
|
#define PACKET_TYPE_KD_STATE_MANIPULATE 2
|
|
#define PACKET_TYPE_KD_DEBUG_IO 3
|
|
#define PACKET_TYPE_KD_ACKNOWLEDGE 4 // Packet-control type
|
|
#define PACKET_TYPE_KD_RESEND 5 // Packet-control type
|
|
#define PACKET_TYPE_KD_RESET 6 // Packet-control type
|
|
#define PACKET_TYPE_KD_STATE_CHANGE64 7
|
|
#define PACKET_TYPE_KD_POLL_BREAKIN 8
|
|
#define PACKET_TYPE_KD_TRACE_IO 9
|
|
#define PACKET_TYPE_KD_CONTROL_REQUEST 10
|
|
#define PACKET_TYPE_KD_FILE_IO 11
|
|
#define PACKET_TYPE_MAX 12
|
|
|
|
|
|
// State change constants
|
|
#define DbgKdMinimumStateChange 0x00003030L
|
|
#define DbgKdExceptionStateChange 0x00003030L
|
|
#define DbgKdLoadSymbolsStateChange 0x00003031L
|
|
#define DbgKdCommandStringStateChange 0x00003032L
|
|
#define DbgKdMaximumStateChange 0x00003033L
|
|
|
|
|
|
//
|
|
// If the packet type is PACKET_TYPE_KD_STATE_MANIPULATE, then
|
|
// the format of the packet data is as follows:
|
|
//
|
|
// Api Numbers for state manipulation
|
|
//
|
|
|
|
#define DbgKdMinimumManipulate 0x00003130L
|
|
|
|
#define DbgKdReadVirtualMemoryApi 0x00003130L
|
|
#define DbgKdWriteVirtualMemoryApi 0x00003131L
|
|
#define DbgKdGetContextApi 0x00003132L
|
|
#define DbgKdSetContextApi 0x00003133L
|
|
#define DbgKdWriteBreakPointApi 0x00003134L
|
|
#define DbgKdRestoreBreakPointApi 0x00003135L
|
|
#define DbgKdContinueApi 0x00003136L
|
|
#define DbgKdReadControlSpaceApi 0x00003137L
|
|
#define DbgKdWriteControlSpaceApi 0x00003138L
|
|
#define DbgKdReadIoSpaceApi 0x00003139L
|
|
#define DbgKdWriteIoSpaceApi 0x0000313AL
|
|
#define DbgKdRebootApi 0x0000313BL
|
|
#define DbgKdContinueApi2 0x0000313CL
|
|
#define DbgKdReadPhysicalMemoryApi 0x0000313DL
|
|
#define DbgKdWritePhysicalMemoryApi 0x0000313EL
|
|
//#define DbgKdQuerySpecialCallsApi 0x0000313FL
|
|
#define DbgKdSetSpecialCallApi 0x00003140L
|
|
#define DbgKdClearSpecialCallsApi 0x00003141L
|
|
#define DbgKdSetInternalBreakPointApi 0x00003142L
|
|
#define DbgKdGetInternalBreakPointApi 0x00003143L
|
|
#define DbgKdReadIoSpaceExtendedApi 0x00003144L
|
|
#define DbgKdWriteIoSpaceExtendedApi 0x00003145L
|
|
#define DbgKdGetVersionApi 0x00003146L
|
|
#define DbgKdWriteBreakPointExApi 0x00003147L
|
|
#define DbgKdRestoreBreakPointExApi 0x00003148L
|
|
#define DbgKdCauseBugCheckApi 0x00003149L
|
|
#define DbgKdSwitchProcessor 0x00003150L
|
|
#define DbgKdPageInApi 0x00003151L // obsolete
|
|
#define DbgKdReadMachineSpecificRegister 0x00003152L
|
|
#define DbgKdWriteMachineSpecificRegister 0x00003153L
|
|
#define OldVlm1 0x00003154L
|
|
#define OldVlm2 0x00003155L
|
|
#define DbgKdSearchMemoryApi 0x00003156L
|
|
#define DbgKdGetBusDataApi 0x00003157L
|
|
#define DbgKdSetBusDataApi 0x00003158L
|
|
#define DbgKdCheckLowMemoryApi 0x00003159L
|
|
#define DbgKdClearAllInternalBreakpointsApi 0x0000315AL
|
|
#define DbgKdFillMemoryApi 0x0000315BL
|
|
#define DbgKdQueryMemoryApi 0x0000315CL
|
|
#define DbgKdSwitchPartition 0x0000315DL
|
|
|
|
#define DbgKdMaximumManipulate 0x0000315EL
|
|
|
|
typedef struct _KD_CONTEXT {
|
|
UINT32 KdpDefaultRetries;
|
|
BOOLEAN KdpControlCPending;
|
|
} KD_CONTEXT, *PKD_CONTEXT;
|
|
|
|
typedef enum {
|
|
ContinueError = 0,
|
|
ContinueSuccess = 1,
|
|
ContinueProcessorReselected,
|
|
ContinueNextProcessor
|
|
} KCONTINUE_STATUS;
|
|
|
|
//
|
|
// If the packet type is PACKET_TYPE_KD_FILE_IO, then
|
|
// the format of the packet data is as follows:
|
|
//
|
|
|
|
#define DbgKdCreateFileApi 0x00003430L
|
|
#define DbgKdReadFileApi 0x00003431L
|
|
#define DbgKdWriteFileApi 0x00003432L
|
|
#define DbgKdCloseFileApi 0x00003433L
|
|
|
|
// Unicode filename follows as additional data.
|
|
typedef struct _DBGKD_CREATE_FILE {
|
|
UINT32 DesiredAccess;
|
|
UINT32 FileAttributes;
|
|
UINT32 ShareAccess;
|
|
UINT32 CreateDisposition;
|
|
UINT32 CreateOptions;
|
|
// Return values.
|
|
UINT64 Handle;
|
|
UINT64 Length;
|
|
} DBGKD_CREATE_FILE, *PDBGKD_CREATE_FILE;
|
|
|
|
// Data is returned as additional data in the response.
|
|
typedef struct _DBGKD_READ_FILE {
|
|
UINT64 Handle;
|
|
UINT64 Offset;
|
|
UINT32 Length;
|
|
} DBGKD_READ_FILE, *PDBGKD_READ_FILE;
|
|
|
|
// Data is given as additional data.
|
|
typedef struct _DBGKD_WRITE_FILE {
|
|
UINT64 Handle;
|
|
UINT64 Offset;
|
|
UINT32 Length;
|
|
} DBGKD_WRITE_FILE, *PDBGKD_WRITE_FILE;
|
|
|
|
typedef struct _DBGKD_CLOSE_FILE {
|
|
UINT64 Handle;
|
|
} DBGKD_CLOSE_FILE, *PDBGKD_CLOSE_FILE;
|
|
|
|
typedef struct _DBGKD_FILE_IO {
|
|
UINT32 ApiNumber;
|
|
NTSTATUS Status;
|
|
union {
|
|
UINT64 ReserveSpace[7];
|
|
DBGKD_CREATE_FILE CreateFile;
|
|
DBGKD_READ_FILE ReadFile;
|
|
DBGKD_WRITE_FILE WriteFile;
|
|
DBGKD_CLOSE_FILE CloseFile;
|
|
};
|
|
} DBGKD_FILE_IO, *PDBGKD_FILE_IO;
|
|
|
|
//
|
|
// status Constants for Packet waiting
|
|
//
|
|
|
|
typedef enum {
|
|
KDP_PACKET_RECEIVED = 0,
|
|
KDP_PACKET_TIMEOUT = 1,
|
|
KDP_PACKET_RESEND = 2
|
|
} KDP_STATUS;
|
|
|
|
//
|
|
// Status Constants for reading data from comport
|
|
//
|
|
|
|
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
|
|
|
|
#define STATUS_VCPP_EXCEPTION ((NTSTATUS)0x406d1388L)
|
|
#define STATUS_CPP_EH_EXCEPTION ((NTSTATUS)0xe06d7363L)
|
|
|
|
// The operation that was requested is pending completion.
|
|
#define STATUS_PENDING ((NTSTATUS)0x00000103L) // winnt
|
|
|
|
// The requested operation was unsuccessful.
|
|
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
|
|
|
|
// The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory could not be "%s".
|
|
#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L) // winnt
|
|
|
|
// Illegal Instruction: An attempt was made to execute an illegal instruction.
|
|
#define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS)0xC000001DL) // winnt
|
|
|
|
// {Application Error}:
|
|
// The exception %s (0x%08lx) occurred in the application at location 0x%08lx.
|
|
//
|
|
#define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS)0xC0000144L)
|
|
|
|
// {EXCEPTION}: Breakpoint: A breakpoint has been reached.
|
|
#define STATUS_BREAKPOINT ((NTSTATUS)0x80000003L) // winnt
|
|
|
|
//
|
|
// MessageId: STATUS_SINGLE_STEP
|
|
//
|
|
// MessageText:
|
|
//
|
|
// {EXCEPTION}
|
|
// Single Step
|
|
// A single step or trace operation has just been completed.
|
|
//
|
|
#define STATUS_SINGLE_STEP ((NTSTATUS)0x80000004L) // winnt
|
|
|
|
//
|
|
// MessageId: STATUS_WAKE_SYSTEM_DEBUGGER
|
|
//
|
|
// MessageText:
|
|
//
|
|
// {EXCEPTION}
|
|
// Kernel Debugger Awakened
|
|
// The system debugger was awakened by an interrupt.
|
|
//
|
|
#define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS)0x80000007L) // winnt
|
|
|
|
|
|
#define DBGKD_64BIT_PROTOCOL_VERSION2 6
|
|
//
|
|
// If DBGKD_VERS_FLAG_DATA is set in Flags, info should be retrieved from
|
|
// the KDDEBUGGER_DATA block rather than from the DBGKD_GET_VERSION
|
|
// packet. The data will remain in the version packet for a while to
|
|
// reduce compatibility problems.
|
|
//
|
|
|
|
#define DBGKD_VERS_FLAG_MP 0x0001 // kernel is MP built
|
|
#define DBGKD_VERS_FLAG_DATA 0x0002 // DebuggerDataList is valid
|
|
#define DBGKD_VERS_FLAG_PTR64 0x0004 // native pointers are 64 bits
|
|
#define DBGKD_VERS_FLAG_NOMM 0x0008 // No MM - don't decode PTEs
|
|
#define DBGKD_VERS_FLAG_HSS 0x0010 // hardware stepping support
|
|
#define DBGKD_VERS_FLAG_PARTITIONS 0x0020 // multiple OS partitions exist
|
|
|
|
#define IMAGE_FILE_MACHINE_X86 0x014c // Intel 386, etc.
|
|
#define IMAGE_FILE_MACHINE_X64 0x8664 // AMD64 (K8), etc.
|
|
#define IMAGE_FILE_MACHINE_ARM 0x01c0 // Little endian ARM w/ Thumb
|
|
|
|
//
|
|
// KD version MajorVersion high-byte identifiers.
|
|
//
|
|
typedef enum _DBGKD_MAJOR_TYPES {
|
|
DBGKD_MAJOR_NT,
|
|
DBGKD_MAJOR_XBOX,
|
|
DBGKD_MAJOR_BIG,
|
|
DBGKD_MAJOR_EXDI,
|
|
DBGKD_MAJOR_NTBD,
|
|
DBGKD_MAJOR_EFI,
|
|
DBGKD_MAJOR_TNT,
|
|
DBGKD_MAJOR_SINGULARITY,
|
|
DBGKD_MAJOR_COUNT
|
|
} DBGKD_MAJOR_TYPES;
|
|
|
|
#define DBGKD_MAJOR_TYPE(MajorVersion) \
|
|
((DBGKD_MAJOR_TYPES)((MajorVersion) >> 8))
|
|
|
|
|
|
#define MMDBG_COPY_WRITE 0x00000001
|
|
#define MMDBG_COPY_PHYSICAL 0x00000002
|
|
#define MMDBG_COPY_UNSAFE 0x00000004
|
|
#define MMDBG_COPY_CACHED 0x00000008
|
|
#define MMDBG_COPY_UNCACHED 0x00000010
|
|
#define MMDBG_COPY_WRITE_COMBINED 0x00000020
|
|
|
|
#define MMDBG_COPY_MAX_SIZE 8
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
void KdInitialize(Class_Microsoft_Singularity_Hal_Platform *platform);
|
|
void KdPutChar(char c);
|
|
|
|
void kdprintf(const char * pszFmt, ...); // Low level debug (to screen) only.
|
|
void kdprints(const char * pszFmt); // Low level debug (to screen) only.
|
|
|
|
void KdpSpin();
|
|
UINT32 KdpComputeChecksum(IN PCHAR Buffer, IN UINT32 Length);
|
|
|
|
bool KdpSerialInit(Class_Microsoft_Singularity_Hal_Platform *nbi);
|
|
KDP_STATUS KdpSerialGetByte(OUT PUCHAR Input, BOOL WaitForByte);
|
|
void KdpSerialPutByte(IN UCHAR Output);
|
|
|
|
void KdpSerialSendPacket(UINT32 PacketType,
|
|
IN PSTRING MessageHeader,
|
|
IN PSTRING MessageData OPTIONAL,
|
|
IN OUT PKD_CONTEXT KdContext);
|
|
KDP_STATUS KdpSerialReceivePacket(IN UINT32 PacketType,
|
|
OUT PSTRING MessageHeader,
|
|
OUT PSTRING MessageData,
|
|
OUT UINT32 * DataLength,
|
|
IN OUT PKD_CONTEXT KdContext);
|
|
bool KdpSerialPollBreakIn();
|
|
|
|
bool Kdp1394Init(UINT16 Channel, ULONG_PTR Base, ULONG_PTR BufferAddr32, UINT32 BufferSize32);
|
|
|
|
void Kdp1394SendPacket(UINT32 PacketType,
|
|
IN PSTRING MessageHeader,
|
|
IN PSTRING MessageData OPTIONAL,
|
|
IN OUT PKD_CONTEXT KdContext);
|
|
KDP_STATUS Kdp1394ReceivePacket(IN UINT32 PacketType,
|
|
OUT PSTRING MessageHeader,
|
|
OUT PSTRING MessageData,
|
|
OUT UINT32 * DataLength,
|
|
IN OUT PKD_CONTEXT KdContext);
|
|
bool Kdp1394PollBreakIn();
|
|
|
|
///////////////////////////////////////////////// Processor Specific Routines.
|
|
//
|
|
bool KdpDisableInterruptsInline();
|
|
void KdpRestoreInterruptsInline(bool enabled);
|
|
void KdpPause();
|
|
void KdpFlushInstCache();
|
|
bool KdpReadMsr(UINT32 msr, OUT UINT32 *plo, OUT UINT32 *phi);
|
|
bool KdpWriteMsr(UINT32 msr, UINT32 lo, UINT32 hi);
|
|
|
|
void KdpToKdContext(IN CONST Struct_Microsoft_Singularity_Isal_SpillContext *singularity,
|
|
OUT CONTEXT *windbg);
|
|
void KdpFromKdContext(IN CONST CONTEXT *windbg,
|
|
OUT Struct_Microsoft_Singularity_Isal_SpillContext *singularity);
|
|
|
|
void KdpSetControlReport(IN OUT PDBGKD_CONTROL_REPORT report,
|
|
IN CONST Struct_Microsoft_Singularity_Isal_SpillContext *x86Context);
|
|
void KdpSetControlSet(IN CONST DBGKD_CONTROL_SET * control,
|
|
IN OUT Struct_Microsoft_Singularity_Isal_SpillContext *x86Context);
|
|
|
|
void KdpReadSpecialRegisters(OUT KSPECIAL_REGISTERS *pksp,
|
|
IN CONST Struct_Microsoft_Singularity_Isal_SpillContext *x86Context);
|
|
void KdpWriteSpecialRegisters(IN CONST KSPECIAL_REGISTERS *pksp);
|
|
|
|
KdDebugTrapData * KdpIsDebugTrap(IN CONST Struct_Microsoft_Singularity_Isal_SpillContext *context,
|
|
int id);
|
|
|
|
void KdpConvertTrapToException(IN OUT EXCEPTION_RECORD64 *per,
|
|
IN OUT Struct_Microsoft_Singularity_Isal_SpillContext *context,
|
|
int id);
|
|
|
|
int KdpReadWriteIoSpace(int size, int iowrite, unsigned short addr, unsigned int value);
|
|
|
|
//////////////////////////////////////////////////////////// Shared Variables.
|
|
//
|
|
|
|
extern BOOL KdDebuggerNotPresent;
|
|
extern UINT32 KdCompNumberRetries;
|
|
extern UINT32 KdCompRetryCount;
|
|
extern UINT32 KdPacketId;
|
|
|
|
///////////////////////////////////////////////////////////////// End of File.
|