- NDK 0.98, now with versionned headers. Too many changes to list, see the TinyKRNL...
[reactos.git] / reactos / ntoskrnl / include / internal / kd.h
index be4235f..f42e69e 100644 (file)
-/* $Id: kd.h,v 1.26 2004/08/07 03:41:30 sedwards Exp $
- *
- * kernel debugger prototypes
- */
-
 #ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
 #define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
 
-#include <internal/ke.h>
-#include <internal/ldr.h>
+//
+// Kernel Debugger Port Definition
+//
+typedef struct _KD_PORT_INFORMATION
+{
+    ULONG ComPort;
+    ULONG BaudRate;
+    ULONG BaseAddress;
+} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
 
-#define KD_DEBUG_DISABLED      0x00
-#define KD_DEBUG_GDB           0x01
-#define KD_DEBUG_PICE          0x02
-#define KD_DEBUG_SCREEN                0x04
-#define KD_DEBUG_SERIAL                0x08
-#define KD_DEBUG_BOCHS         0x10
-#define KD_DEBUG_BOOTLOG       0x20
-#define KD_DEBUG_MDA            0x40
-#define KD_DEBUG_KDB            0x80
-#define KD_DEBUG_KDSERIAL       0x100
-#define KD_DEBUG_KDNOECHO       0x200
+struct _KD_DISPATCH_TABLE;
+extern KD_PORT_INFORMATION GdbPortInfo;
 
-extern ULONG KdDebugState;
+BOOLEAN
+NTAPI
+KdPortInitialize(
+    PKD_PORT_INFORMATION PortInformation,
+    ULONG Unknown1,
+    ULONG Unknown2
+);
 
-KD_PORT_INFORMATION GdbPortInfo;
-KD_PORT_INFORMATION LogPortInfo;
+BOOLEAN
+NTAPI
+KdPortInitializeEx(
+    PKD_PORT_INFORMATION PortInformation,
+    ULONG Unknown1,
+    ULONG Unknown2
+);
 
-typedef enum _KD_CONTINUE_TYPE
-{
-  kdContinue = 0,
-  kdDoNotHandleException,
-  kdHandleException
-} KD_CONTINUE_TYPE;
+BOOLEAN
+NTAPI
+KdPortGetByte(
+    PUCHAR ByteRecieved);
+
+BOOLEAN
+NTAPI
+KdPortGetByteEx(
+    PKD_PORT_INFORMATION PortInformation,
+    PUCHAR ByteRecieved);
 
 VOID
-KbdDisableMouse();
+NTAPI
+KdPortPutByte(
+    UCHAR ByteToSend
+);
 
 VOID
-KbdEnableMouse();
+NTAPI
+KdPortPutByteEx(
+    PKD_PORT_INFORMATION PortInformation,
+    UCHAR ByteToSend
+);
 
-ULONG
-KdpPrintString (PANSI_STRING String);
+/* SYMBOL ROUTINES **********************************************************/
+#ifdef __NTOSKRNL__
+
+#if defined(KDBG) || defined(DBG)
 
 VOID
-DebugLogWrite(PCH String);
+KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
+
 VOID
-DebugLogInit(VOID);
+KdbSymFreeProcessSymbols(IN PEPROCESS Process);
+
 VOID
-DebugLogInit2(VOID);
+KdbSymLoadDriverSymbols(
+    IN PUNICODE_STRING Filename,
+    IN PLDR_DATA_TABLE_ENTRY Module
+);
 
 VOID
-STDCALL
-KdDisableDebugger(
-    VOID
-    );
+KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
 
 VOID
-STDCALL
-KdEnableDebugger(
-    VOID
-    );
+KdbSymProcessBootSymbols(IN PCHAR FileName);
 
-NTSTATUS
-STDCALL
-KdPowerTransition(
-       ULONG PowerState
-       );
+VOID
+KdbSymInit(
+    IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
+    IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
+);
 
 BOOLEAN
-STDCALL
-KeIsAttachedProcess(
-       VOID
-       );
+KdbSymPrintAddress(IN PVOID Address);
 
 VOID
-KdInit1(VOID);
+KdbDeleteProcessHook(IN PEPROCESS Process);
 
-VOID
-KdInit2(VOID);
+NTSTATUS
+KdbSymGetAddressInformation(
+    IN PROSSYM_INFO  RosSymInfo,
+    IN ULONG_PTR  RelativeAddress,
+    OUT PULONG LineNumber  OPTIONAL,
+    OUT PCH FileName  OPTIONAL,
+    OUT PCH FunctionName  OPTIONAL
+);
 
-VOID
-KdInit3(VOID);
+typedef struct _KDB_MODULE_INFO
+{
+    WCHAR        Name[256];
+    ULONG_PTR    Base;
+    ULONG        Size;
+    PROSSYM_INFO RosSymInfo;
+} KDB_MODULE_INFO, *PKDB_MODULE_INFO;
 
-VOID
-KdPutChar(UCHAR Value);
+/* MACROS FOR NON-KDBG BUILDS ************************************************/
 
-UCHAR
-KdGetChar(VOID);
+# define KDB_LOADUSERMODULE_HOOK(LDRMOD)       KdbSymLoadUserModuleSymbols(LDRMOD)
+# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
+# define KDB_UNLOADDRIVER_HOOK(MODULE)         KdbSymUnloadDriverSymbols(MODULE)
+# define KDB_LOADERINIT_HOOK(NTOS, HAL)                KdbSymInit(NTOS, HAL)
+# define KDB_SYMBOLFILE_HOOK(FILENAME)         KdbSymProcessBootSymbols(FILENAME)
+#else
+# define KDB_LOADUSERMODULE_HOOK(LDRMOD)       do { } while (0)
+# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
+# define KDB_UNLOADDRIVER_HOOK(MODULE)         do { } while (0)
+# define KDB_LOADERINIT_HOOK(NTOS, HAL)                do { } while (0)
+# define KDB_SYMBOLFILE_HOOK(FILENAME)         do { } while (0)
+# define KDB_CREATE_THREAD_HOOK(CONTEXT)       do { } while (0)
+#endif
 
-VOID
-KdGdbStubInit(ULONG Phase);
+#if defined(KDBG) || defined(DBG)
+# define KeRosPrintAddress(ADDRESS)         KdbSymPrintAddress(ADDRESS)
+#else
+# define KeRosPrintAddress(ADDRESS)         KiRosPrintAddress(ADDRESS)
+#endif
+
+#ifdef KDBG
+# define KdbInit()                          KdbpCliInit()
+# define KdbModuleLoaded(FILENAME)          KdbpCliModuleLoaded(FILENAME)
+# define KDB_DELETEPROCESS_HOOK(PROCESS)       KdbDeleteProcessHook(PROCESS)
+#else
+# define KdbEnterDebuggerException(ER, PM, C, TF, F)  kdHandleException
+# define KdbInit()                          do { } while (0)
+# define KdbEnter()                         do { } while (0)
+# define KdbModuleLoaded(X)                 do { } while (0)
+# define KDB_DELETEPROCESS_HOOK(PROCESS)       do { } while (0)
+#endif
 
+/* KD ROUTINES ***************************************************************/
+
+typedef enum _KD_CONTINUE_TYPE
+{
+    kdContinue = 0,
+    kdDoNotHandleException,
+    kdHandleException
+} KD_CONTINUE_TYPE;
+
+typedef
 VOID
-KdGdbDebugPrint (LPSTR Message);
+(STDCALL*PKDP_INIT_ROUTINE)(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase
+);
 
+typedef
 VOID
-KdDebugPrint (LPSTR Message);
+(STDCALL*PKDP_PRINT_ROUTINE)(
+    LPSTR String,
+    ULONG Length
+);
 
+typedef
 VOID
-KdbCreateThreadHook(PCONTEXT Context);
+(STDCALL*PKDP_PROMPT_ROUTINE)(PCH String);
 
+typedef
 KD_CONTINUE_TYPE
-KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
-                        PCONTEXT Context,
-                        PKTRAP_FRAME TrapFrame);
-VOID KdInitializeMda(VOID);
-VOID KdPrintMda(PCH pch);
-
-#ifndef KDBG
-#define KDB_DELETEPROCESS_HOOK(PROCESS)
-#define KDB_LOADDRIVER_HOOK(FILENAME, MODULE)
-#define KDB_UNLOADDRIVER_HOOK(MODULE)
-#define KDB_LOADERINIT_HOOK(NTOS, HAL)
-#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH)
-#define KDB_CREATE_THREAD_HOOK(CONTEXT)
-#else
-#define KDB_DELETEPROCESS_HOOK(PROCESS) KdbFreeSymbolsProcess(PROCESS)
-#define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbLoadDriver(FILENAME, MODULE)
-#define KDB_UNLOADDRIVER_HOOK(MODULE) KdbUnloadDriver(MODULE)
-#define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbLdrInit(NTOS, HAL)
-#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \
-        KdbProcessSymbolFile(LOADBASE, FILENAME, LENGTH)
-#define KDB_CREATE_THREAD_HOOK(CONTEXT) \
-       KdbCreateThreadHook(CONTEXT)
-#endif /* KDBG */
+(STDCALL*PKDP_EXCEPTION_ROUTINE)(
+    PEXCEPTION_RECORD ExceptionRecord,
+    PCONTEXT Context,
+    PKTRAP_FRAME TrapFrame
+);
+
+/* INIT ROUTINES *************************************************************/
 
 VOID
-KdbLdrLoadUserModuleSymbols(PLDR_MODULE LdrModule);
-VOID
-KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length);
+STDCALL
+KdpScreenInit(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase
+);
+
 VOID
-KdbLdrInit(MODULE_TEXT_SECTION* NtoskrnlTextSection,
-          MODULE_TEXT_SECTION* LdrHalTextSection);
+STDCALL
+KdpSerialInit(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase
+);
+
 VOID
-KdbUnloadDriver(PMODULE_OBJECT ModuleObject);
+STDCALL
+KdpInitDebugLog(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase
+);
+
 VOID
-KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module);
+STDCALL
+KdpBochsInit(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase
+);
+
 VOID
-KdbFreeSymbolsProcess(PEPROCESS Process);
-BOOLEAN
-KdbPrintAddress(PVOID address);
+STDCALL
+KdpGdbStubInit(
+    struct _KD_DISPATCH_TABLE *DispatchTable,
+    ULONG BootPhase);
+
+/* KD ROUTINES ***************************************************************/
+
 KD_CONTINUE_TYPE
-KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
-                         PCONTEXT Context,
-                         PKTRAP_FRAME TrapFrame);
+STDCALL
+KdpEnterDebuggerException(
+    PEXCEPTION_RECORD ExceptionRecord,
+    KPROCESSOR_MODE PreviousMode,
+    PCONTEXT Context,
+    PKTRAP_FRAME TrapFrame,
+    BOOLEAN FirstChance,
+    BOOLEAN Gdb
+);
+
+ULONG
+STDCALL
+KdpPrintString(
+    LPSTR String,
+    ULONG Length);
+
+BOOLEAN
+STDCALL
+KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
+
 VOID
-DebugLogDumpMessages(VOID);
+STDCALL
+KdpBochsDebugPrint(
+    IN PCH Message,
+    IN ULONG Length
+);
+
+/* KD GLOBALS  ***************************************************************/
+
+/* serial debug connection */
+#define DEFAULT_DEBUG_PORT      2 /* COM2 */
+#define DEFAULT_DEBUG_COM1_IRQ  4 /* COM1 IRQ */
+#define DEFAULT_DEBUG_COM2_IRQ  3 /* COM2 IRQ */
+#define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
+
+/* KD Native Modes */
+#define KdScreen 0
+#define KdSerial 1
+#define KdFile 2
+#define KdBochs 3
+#define KdMax 4
+
+/* KD Private Debug Modes */
+typedef struct _KDP_DEBUG_MODE
+{
+    union
+    {
+        struct
+        {
+            /* Native Modes */
+            UCHAR Screen :1;
+            UCHAR Serial :1;
+            UCHAR File   :1;
+            UCHAR Bochs  :1;
+
+            /* Currently Supported Wrappers */
+            UCHAR Pice   :1;
+            UCHAR Gdb    :1;
+        };
+
+        /* Generic Value */
+        ULONG Value;
+    };
+} KDP_DEBUG_MODE;
+
+/* KD Internal Debug Services */
+typedef enum _KDP_DEBUG_SERVICE
+{
+    DumpNonPagedPool = 0x1e, /* a */
+    ManualBugCheck = 0x30, /* b */
+    DumpNonPagedPoolStats = 0x2e, /* c */
+    DumpNewNonPagedPool = 0x20, /* d */
+    DumpNewNonPagedPoolStats = 0x12, /* e */
+    DumpAllThreads = 0x21, /* f */
+    DumpUserThreads = 0x22, /* g */
+    KdSpare1 = 0x23, /* h */
+    KdSpare2 = 0x17, /* i */
+    KdSpare3 = 0x24, /* j */
+    EnterDebugger = 0x25  /* k */
+} KDP_DEBUG_SERVICE;
+
+/* Dispatch Table for Wrapper Functions */
+typedef struct _KD_DISPATCH_TABLE
+{
+    LIST_ENTRY KdProvidersList;
+    PKDP_INIT_ROUTINE KdpInitRoutine;
+    PKDP_PRINT_ROUTINE KdpPrintRoutine;
+    PKDP_PROMPT_ROUTINE KdpPromptRoutine;
+    PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
+} KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
+
+/* The current Debugging Mode */
+extern KDP_DEBUG_MODE KdpDebugMode;
+
+/* The current Port IRQ */
+extern ULONG KdpPortIrq;
+
+/* The current Port */
+extern ULONG KdpPort;
+
+/* Port Information for the Serial Native Mode */
+extern KD_PORT_INFORMATION SerialPortInfo;
+
+/* Init Functions for Native Providers */
+extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
+
+/* Wrapper Init Function */
+extern PKDP_INIT_ROUTINE WrapperInitRoutine;
+
+/* Dispatch Tables for Native Providers */
+extern KD_DISPATCH_TABLE DispatchTable[KdMax];
+
+/* Dispatch Table for the Wrapper */
+extern KD_DISPATCH_TABLE WrapperTable;
+
+/* The KD Native Provider List */
+extern LIST_ENTRY KdProviders;
+
+/* Whether to enter KDB as early as possible or not */
+extern BOOLEAN KdpEarlyBreak;
 
+#endif
 #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */