Bochs debug output is only a simple print routine and not a wrapper which can handle faults. Modified: trunk/reactos/ntoskrnl/include/internal/kd.h Modified: trunk/reactos/ntoskrnl/kd/kdinit.c Modified: trunk/reactos/ntoskrnl/kd/wrappers/bochs.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/kd.h --- trunk/reactos/ntoskrnl/include/internal/kd.h 2006-01-15 03:11:31 UTC (rev 20882) +++ trunk/reactos/ntoskrnl/include/internal/kd.h 2006-01-15 08:49:26 UTC (rev 20883) @@ -202,7 +202,8 @@
#define KdScreen 0 #define KdSerial 1 #define KdFile 2 -#define KdMax 3 +#define KdBochs 3 +#define KdMax 4
/* KD Private Debug Modes */ typedef struct _KDP_DEBUG_MODE @@ -215,11 +216,11 @@ UCHAR Screen :1; UCHAR Serial :1; UCHAR File :1; + UCHAR Bochs :1;
/* Currently Supported Wrappers */ UCHAR Pice :1; UCHAR Gdb :1; - UCHAR Bochs :1; };
/* Generic Value */ _____
Modified: trunk/reactos/ntoskrnl/kd/kdinit.c --- trunk/reactos/ntoskrnl/kd/kdinit.c 2006-01-15 03:11:31 UTC (rev 20882) +++ trunk/reactos/ntoskrnl/kd/kdinit.c 2006-01-15 08:49:26 UTC (rev 20883) @@ -25,20 +25,19 @@
ULONG KdpPortIrq; #ifdef AUTO_ENABLE_BOCHS KDP_DEBUG_MODE KdpDebugMode = {{{.Bochs=TRUE}}};; -PKDP_INIT_ROUTINE WrapperInitRoutine = KdpBochsInit; -KD_DISPATCH_TABLE WrapperTable = {.KdpInitRoutine = KdpBochsInit, .KdpPrintRoutine = KdpBochsDebugPrint}; #else KDP_DEBUG_MODE KdpDebugMode; +#endif PKDP_INIT_ROUTINE WrapperInitRoutine; KD_DISPATCH_TABLE WrapperTable; -#endif BOOLEAN KdpEarlyBreak = FALSE; LIST_ENTRY KdProviders = {&KdProviders, &KdProviders}; KD_DISPATCH_TABLE DispatchTable[KdMax];
PKDP_INIT_ROUTINE InitRoutines[KdMax] = {KdpScreenInit, KdpSerialInit, - KdpInitDebugLog}; + KdpInitDebugLog, + KdpBochsInit};
/* PRIVATE FUNCTIONS *********************************************************/
@@ -49,15 +48,6 @@ { PCHAR p2 = Currentp2;
- /* Check for BOCHS Debugging */ - if (!_strnicmp(p2, "BOCHS", 5)) - { - /* Enable It */ - p2 += 5; - KdpDebugMode.Bochs = TRUE; - WrapperInitRoutine = KdpBochsInit; - } - /* Check for GDB Debugging */ if (!_strnicmp(p2, "GDB", 3)) { @@ -128,6 +118,14 @@ KdpDebugMode.File = TRUE; }
+ /* Check for BOCHS Debugging */ + else if (!_strnicmp(p2, "BOCHS", 5)) + { + /* Enable It */ + p2 += 5; + KdpDebugMode.Bochs = TRUE; + } + return p2; }
_____
Modified: trunk/reactos/ntoskrnl/kd/wrappers/bochs.c --- trunk/reactos/ntoskrnl/kd/wrappers/bochs.c 2006-01-15 03:11:31 UTC (rev 20882) +++ trunk/reactos/ntoskrnl/kd/wrappers/bochs.c 2006-01-15 08:49:26 UTC (rev 20883) @@ -21,6 +21,8 @@
KdpBochsDebugPrint(IN PCH Message, IN ULONG Length) { + if (!KdpDebugMode.Bochs) return; + while (*Message != 0) { if (*Message == '\n') @@ -44,16 +46,31 @@
VOID STDCALL -KdpBochsInit(PKD_DISPATCH_TABLE WrapperTable, +KdpBochsInit(PKD_DISPATCH_TABLE DispatchTable, ULONG BootPhase) { + BYTE Value; if (!KdpDebugMode.Bochs) return;
if (BootPhase == 0) { +#if defined(_M_IX86) && defined(__GNUC__) + __asm__("inb %w1, %b0\n\t" : "=a" (Value) : "d" (BOCHS_LOGGER_PORT)); +#else + Value = READ_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT); +#endif + if (Value != BOCHS_LOGGER_PORT) + { + KdpDebugMode.Bochs = FALSE; + return; + } + /* Write out the functions that we support for now */ - WrapperTable->KdpInitRoutine = KdpBochsInit; - WrapperTable->KdpPrintRoutine = KdpBochsDebugPrint; + DispatchTable->KdpInitRoutine = KdpBochsInit; + DispatchTable->KdpPrintRoutine = KdpBochsDebugPrint; + + /* Register as a Provider */ + InsertTailList(&KdProviders, &DispatchTable->KdProvidersList); } else if (BootPhase == 2) {