|
|
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
kdp.h
Abstract:
Private include file for the Kernel Debugger subcomponent of the NTOS project
Author:
Mike O'Leary (mikeol) 29-June-1989
Revision History:
--*/
#include "ntos.h"
#include "ki.h"
#include "ntdbg.h"
#include "string.h"
#include "stdlib.h"
#include "kdpcpu.h"
//
// Define constants.
//
//
// Addresses above GLOBAL_BREAKPOINT_LIMIT are either in system space
// or part of dynlink, so we treat them as global.
//
#define GLOBAL_BREAKPOINT_LIMIT 1610612736L // 1.5gigabytes
//
// Define breakpoint table entry structure.
//
#define KD_BREAKPOINT_IN_USE 0x00000001
#define KD_BREAKPOINT_NEEDS_WRITE 0x00000002
#define KD_BREAKPOINT_SUSPENDED 0x00000004
//
// status Constants for Packet waiting
//
#define KDP_PACKET_RECEIVED 0
#define KDP_PACKET_TIMEOUT 1
#define KDP_PACKET_RESEND 2
typedef struct _BREAKPOINT_ENTRY { ULONG Flags; ULONG DirectoryTableBase; PVOID Address; KDP_BREAKPOINT_TYPE Content; } BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
//
// Define function prototypes.
//
VOID KdpReboot ( VOID );
BOOLEAN KdpPrintString ( IN PSTRING Output );
BOOLEAN KdpPromptString ( IN PSTRING Output, IN OUT PSTRING Input );
ULONG KdpAddBreakpoint ( IN PVOID Address );
BOOLEAN KdpDeleteBreakpoint ( IN ULONG Handle );
BOOLEAN KdpDeleteBreakpointRange ( IN PVOID Lower, IN PVOID Upper );
ULONG KdpMoveMemory ( IN PCHAR Destination, IN PCHAR Source, IN ULONG Length );
VOID KdpQuickMoveMemory ( IN PCHAR Destination, IN PCHAR Source, IN ULONG Length );
ULONG KdpReceivePacket ( IN ULONG ExpectedPacketType, OUT PSTRING MessageHeader, OUT PSTRING MessageData, OUT PULONG DataLength );
VOID KdpSetLoadState( IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange, IN PCONTEXT ContextRecord );
VOID KdpSetStateChange( IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN BOOLEAN SecondChance );
VOID KdpGetStateChange( IN PDBGKD_MANIPULATE_STATE ManipulateState, IN PCONTEXT ContextRecord );
VOID KdpSendPacket ( IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData OPTIONAL );
BOOLEAN KdpStub ( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance );
BOOLEAN KdpTrap ( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance );
VOID KdpDisplayString ( IN PCHAR Output );
VOID KdpWriteComPacket ( USHORT, USHORT, PVOID, PVOID, PVOID );
BOOLEAN KdpReadComPacket ( VOID );
BOOLEAN KdpSwitchProcessor ( IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT ContextRecord, IN BOOLEAN SecondChance );
BOOLEAN KdpReportExceptionStateChange ( IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT ContextRecord, IN BOOLEAN SecondChance );
BOOLEAN KdpReportLoadSymbolsStateChange ( IN PSTRING PathName, IN PKD_SYMBOLS_INFO SymbolInfo, IN BOOLEAN UnloadSymbols, IN OUT PCONTEXT ContextRecord );
KCONTINUE_STATUS KdpSendWaitContinue( IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData OPTIONAL, IN OUT PCONTEXT ContextRecord );
VOID KdpReadVirtualMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWriteVirtualMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpReadPhysicalMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWritePhysicalMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpGetContext( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpSetContext( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWriteBreakpoint( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpRestoreBreakpoint( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpReadControlSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWriteControlSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpReadIoSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpReadMachineSpecificRegister( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWriteIoSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpWriteMachineSpecificRegister( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN PCONTEXT Context );
VOID KdpSuspendBreakpoint ( ULONG Handle );
VOID KdpSuspendAllBreakpoints ( VOID );
VOID KdpRestoreAllBreakpoints ( VOID );
//
// Define external references.
//
#define KDP_MESSAGE_BUFFER_SIZE 4096
extern BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE]; extern BOOLEAN KdpControlCPending; extern KSPIN_LOCK KdpDebuggerLock; extern PKDEBUG_ROUTINE KiDebugRoutine; extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine; extern KDP_BREAKPOINT_TYPE KdpBreakpointInstruction; extern UCHAR KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE]; extern ULONG KdpOweBreakpoint; extern ULONG KdpNextPacketIdToSend; extern ULONG KdpPacketIdExpected;
extern LARGE_INTEGER KdPerformanceCounterRate; extern LARGE_INTEGER KdTimerStart; extern LARGE_INTEGER KdTimerStop; extern LARGE_INTEGER KdTimerDifference;
typedef struct { ULONG Addr; // pc address of breakpoint
ULONG Flags; // Flags bits
ULONG Calls; // # of times traced routine called
ULONG CallsLastCheck; // # of calls at last periodic (1s) check
ULONG MaxCallsPerPeriod; ULONG MinInstructions; // largest number of instructions for 1 call
ULONG MaxInstructions; // smallest # of instructions for 1 call
ULONG TotalInstructions; // total instructions for all calls
ULONG Handle; // handle in (regular) bpt table
PVOID Thread; // Thread that's skipping this BP
ULONG ReturnAddress; // return address (if not COUNTONLY)
} DBGKD_INTERNAL_BREAKPOINT, *PDBGKD_INTERNAL_BREAKPOINT;
#define DBGKD_MAX_INTERNAL_BREAKPOINTS 20
extern DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS];
//
// Private procedure prototypes
//
VOID KdpInitCom( VOID );
VOID KdpPortLock( VOID );
VOID KdpPortUnlock( VOID );
BOOLEAN KdpPollBreakInWithPortLock( VOID );
USHORT KdpReceivePacketLeader ( IN ULONG PacketType, OUT PULONG PacketLeader );
#if DBG
#include <stdio.h>
#define DPRINT(s) KdpDprintf s
VOID KdpDprintf( IN PCHAR f, ... );
#else
#define DPRINT(s)
#endif
|