From 88cb154d19e77fe0cc5f33ac2dccc6a8ef54aa0b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 17 Jan 2000 21:02:50 +0000 Subject: [PATCH] Changed debug output to use INT 2D svn path=/trunk/; revision=936 --- reactos/doc/HACKING | 2 +- reactos/include/internal/kd.h | 13 +++ reactos/include/internal/ntoskrnl.h | 2 +- reactos/ntoskrnl/dbg/print.c | 144 ++++------------------------ reactos/ntoskrnl/kd/kdebug.c | 94 +++++++++++++++++- reactos/ntoskrnl/kd/service.c | 111 +++++++++++++++++++++ reactos/ntoskrnl/ke/main.c | 4 +- reactos/ntoskrnl/makefile_rex | 4 +- 8 files changed, 238 insertions(+), 136 deletions(-) create mode 100644 reactos/include/internal/kd.h create mode 100644 reactos/ntoskrnl/kd/service.c diff --git a/reactos/doc/HACKING b/reactos/doc/HACKING index ca683443d3a..8c8cf4e95a4 100644 --- a/reactos/doc/HACKING +++ b/reactos/doc/HACKING @@ -52,7 +52,7 @@ Debugging kernel-mode code is tricky, these are some snippets easier to see where output is coming from. DbgPrint can be used at any point including in interrupt handlers. - There are options in ntoskrnl/dbg/print.c for copying DbgPrint output + There are options in ntoskrnl/kd/kdebug.c for copying DbgPrint output to a serial device or bochs logging port (parallel support should also be added). This can be useful if a lot of output is being generated. diff --git a/reactos/include/internal/kd.h b/reactos/include/internal/kd.h new file mode 100644 index 00000000000..c3470b8c01f --- /dev/null +++ b/reactos/include/internal/kd.h @@ -0,0 +1,13 @@ +/* $Id: kd.h,v 1.1 2000/01/17 21:00:53 ekohl Exp $ + * + * kernel debugger prototypes + */ + +#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H +#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H + + +ULONG KdpPrintString (PANSI_STRING String); + + +#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */ diff --git a/reactos/include/internal/ntoskrnl.h b/reactos/include/internal/ntoskrnl.h index db40457a978..0e32bd652cb 100644 --- a/reactos/include/internal/ntoskrnl.h +++ b/reactos/include/internal/ntoskrnl.h @@ -87,6 +87,6 @@ VOID TstBegin(VOID); VOID KeInit(VOID); VOID CmInitializeRegistry(VOID); VOID CmImportHive(PCHAR); -VOID DbgInit(VOID); +VOID KdInitSystem(VOID); #endif diff --git a/reactos/ntoskrnl/dbg/print.c b/reactos/ntoskrnl/dbg/print.c index abc22538139..fca67a4afc2 100644 --- a/reactos/ntoskrnl/dbg/print.c +++ b/reactos/ntoskrnl/dbg/print.c @@ -1,4 +1,4 @@ -/* $Id: print.c,v 1.5 1999/12/26 15:50:47 dwelch Exp $ +/* $Id: print.c,v 1.6 2000/01/17 21:01:37 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -12,144 +12,38 @@ /* INCLUDES *****************************************************************/ #include -#include -#include - #include -/* - * Uncomment one of the following symbols to select a debug output style. - * - * SCREEN_DEBUGGING: - * Debug information is printed on the screen. - * - * SERIAL_DEBUGGING: - * Debug information is printed to a serial device. Check the port - * address, the baud rate and the data format. - * Default: COM1 19200 Baud 8N1 (8 data bits, no parity, 1 stop bit) - * - * BOCHS_DEBUGGING: (not tested yet) - * Debug information is printed to the bochs logging port. Bochs - * writes the output to a log file. - */ - -#define SCREEN_DEBUGGING /* debug info is printed on the screen */ -/* #define SERIAL_DEBUGGING */ /* remote debugging */ -/* #define BOCHS_DEBUGGING */ /* debug output using bochs */ - - -#define SERIAL_DEBUG_PORT 0x03f8 /* COM 1 */ -/* #define SERIAL_DEBUG_PORT 0x02f8 */ /* COM 2 */ -#define SERIAL_DEBUG_BAUD_RATE 19200 - - -#define BOCHS_DEBUGGING -#ifdef BOCHS_DEBUGGING -#define BOCHS_LOGGER_PORT (0xe9) -#endif - /* FUNCTIONS ****************************************************************/ -#ifdef SERIAL_DEBUGGING -static VOID -DbgDisplaySerialString(PCH String) -{ - PCH pch = String; - - while (*pch != 0) - { - if (*pch == '\n') - { - KdPortPutByte ('\r'); - } - - KdPortPutByte (*pch); - - pch++; - } -} -#endif /* SERIAL_DEBUGGING */ - - -#ifdef BOCHS_DEBUGGING -static VOID -DbgDisplayBochsString(PCH String) -{ - PCH pch = String; - - while (*pch != 0) - { - if (*pch == '\n') - { - WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, '\r'); - } - - WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, *pch); - - pch++; - } -} -#endif /* BOCHS_DEBUGGING */ - - -VOID -DbgInit (VOID) -{ -#ifdef SERIAL_DEBUGGING - KD_PORT_INFORMATION PortInfo; - - PortInfo.BaseAddress = SERIAL_DEBUG_PORT; - PortInfo.BaudRate = SERIAL_DEBUG_BAUD_RATE; - - KdPortInitialize (&PortInfo, - 0, - 0); -#endif -} - +ULONG DbgService (ULONG Service, PVOID Context1, PVOID Context2); +__asm__ ("\n\t.global _DbgService\n\t" + "_DbgService:\n\t" + "mov 4(%esp), %eax\n\t" + "mov 8(%esp), %ecx\n\t" + "mov 12(%esp), %edx\n\t" + "int $0x2D\n\t" + "ret\n\t"); ULONG DbgPrint(PCH Format, ...) { - char buffer[256]; + ANSI_STRING DebugString; + CHAR Buffer[512]; va_list ap; - unsigned int eflags; - /* - * Because this is used by alomost every subsystem including irqs it - * must be atomic. The following code sequence disables interrupts after - * saving the previous state of the interrupt flag - */ - __asm__("pushf\n\tpop %0\n\tcli\n\t" - : "=m" (eflags) - : /* */); + /* init ansi string */ + DebugString.Buffer = Buffer; + DebugString.MaximumLength = 512; - /* - * Process the format string into a fixed length buffer using the - * standard C RTL function - */ - va_start(ap,Format); - vsprintf(buffer,Format,ap); - va_end(ap); + va_start (ap, Format); + DebugString.Length = vsprintf (Buffer, Format, ap); + va_end (ap); -#ifdef SCREEN_DEBUGGING - HalDisplayString (buffer); -#endif -#ifdef SERIAL_DEBUGGING - DbgDisplaySerialString (buffer); -#endif -#ifdef BOCHS_DEBUGGING - DbgDisplayBochsString (buffer); -#endif + DbgService (1, &DebugString, NULL); - /* - * Restore the interrupt flag - */ - __asm__("push %0\n\tpopf\n\t" - : - : "m" (eflags)); - return(strlen(buffer)); + return (ULONG)DebugString.Length; } /* EOF */ diff --git a/reactos/ntoskrnl/kd/kdebug.c b/reactos/ntoskrnl/kd/kdebug.c index 0b2d8b34b08..3a8b1274d44 100644 --- a/reactos/ntoskrnl/kd/kdebug.c +++ b/reactos/ntoskrnl/kd/kdebug.c @@ -1,10 +1,52 @@ -/* $Id: kdebug.c,v 1.2 1999/10/21 11:13:38 ekohl Exp $ - * - * reactos/ntoskrnl/kd/kdebug.c +/* $Id: kdebug.c,v 1.3 2000/01/17 21:02:06 ekohl Exp $ * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/kd/kdebug.c + * PURPOSE: Kernel debugger + * PROGRAMMER: Eric Kohl (ekohl@abo.rhein-zeitung.de) + * UPDATE HISTORY: + * 21/10/99: Created */ -#include +#include +#include +#include + + +/* + * Uncomment one of the following symbols to select a debug output style. + * + * SCREEN_DEBUGGING: + * Debug information is printed on the screen. + * + * SERIAL_DEBUGGING: + * Debug information is printed to a serial device. Check the port + * address, the baud rate and the data format. + * Default: COM1 19200 Baud 8N1 (8 data bits, no parity, 1 stop bit) + * + * BOCHS_DEBUGGING: (not tested yet) + * Debug information is printed to the bochs logging port. Bochs + * writes the output to a log file. + */ + +#define SCREEN_DEBUGGING /* debug info is printed on the screen */ +//#define SERIAL_DEBUGGING /* remote debugging */ +//#define BOCHS_DEBUGGING /* debug output using bochs */ + + +#define SERIAL_DEBUG_PORT 0x03f8 /* COM 1 */ +// #define SERIAL_DEBUG_PORT 0x02f8 /* COM 2 */ +#define SERIAL_DEBUG_BAUD_RATE 19200 + + +//#define BOCHS_DEBUGGING +#ifdef BOCHS_DEBUGGING +#define BOCHS_LOGGER_PORT (0xe9) +#endif + + +/* VARIABLES ***************************************************************/ //BYTE STDCALL KdPortPollByte(VOID); @@ -24,7 +66,7 @@ KdDebuggerNotPresent = TRUE; /* PRIVATE FUNCTIONS ********************************************************/ VOID -KdInit (VOID) +KdInitSystem (VOID) { /* FIXME: parse kernel command line */ @@ -43,6 +85,48 @@ KdInit (VOID) } +ULONG +KdpPrintString (PANSI_STRING String) +{ +#if defined(SERIAL_DEBUGGING) || defined(BOCHS_DEBUGGING) + PCH pch = String->Buffer; +#endif + +#ifdef SCREEN_DEBUGGING + HalDisplayString (String->Buffer); +#endif + +#ifdef SERIAL_DEBUGGING + while (*pch != 0) + { + if (*pch == '\n') + { + KdPortPutByte ('\r'); + } + + KdPortPutByte (*pch); + + pch++; + } +#endif + +#ifdef BOCHS_DEBUGGING + while (*pch != 0) + { + if (*pch == '\n') + { + WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, '\r'); + } + + WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, *pch); + + pch++; + } +#endif + + return (ULONG)String->Length; +} + /* PUBLIC FUNCTIONS *********************************************************/ /* NTOSKRNL.KdPollBreakIn */ diff --git a/reactos/ntoskrnl/kd/service.c b/reactos/ntoskrnl/kd/service.c new file mode 100644 index 00000000000..e43953882f0 --- /dev/null +++ b/reactos/ntoskrnl/kd/service.c @@ -0,0 +1,111 @@ +/* $Id: service.c,v 1.1 2000/01/17 21:02:06 ekohl Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/kd/service.c + * PURPOSE: Debug service dispatcher + * PROGRAMMER: Eric Kohl (ekohl@abo.rhein-zeitung.de) + * UPDATE HISTORY: + * 17/01/2000: Created + */ + +#include +#include +#include + +/* FUNCTIONS ***************************************************************/ + +ULONG +KdpServiceDispatcher ( + ULONG Service, + PVOID Context1, + PVOID Context2) +{ + ULONG Result = 0; + + switch (Service) + { + case 1: /* DbgPrint */ + Result = KdpPrintString ((PANSI_STRING)Context1); +// HalDisplayString (((PANSI_STRING)Context1)->Buffer); + break; + + default: + HalDisplayString ("Invalid debug service call!\n"); + break; + } + + return Result; +} + + +#define _STR(x) #x +#define STR(x) _STR(x) + +void interrupt_handler2d(void); + __asm__("\n\t.global _interrupt_handler2d\n\t" + "_interrupt_handler2d:\n\t" + + /* Save the user context */ + "pushl %ebp\n\t" /* Ebp */ + + "pushl %eax\n\t" /* Eax */ + "pushl %ecx\n\t" /* Ecx */ + "pushl %edx\n\t" /* Edx */ + "pushl %ebx\n\t" /* Ebx */ + "pushl %esi\n\t" /* Esi */ + "pushl %edi\n\t" /* Edi */ + + "pushl %ds\n\t" /* SegDs */ + "pushl %es\n\t" /* SegEs */ + "pushl %fs\n\t" /* SegFs */ + "pushl %gs\n\t" /* SegGs */ + + "subl $112,%esp\n\t" /* FloatSave */ + + "pushl $0\n\t" /* Dr7 */ + "pushl $0\n\t" /* Dr6 */ + "pushl $0\n\t" /* Dr3 */ + "pushl $0\n\t" /* Dr2 */ + "pushl $0\n\t" /* Dr1 */ + "pushl $0\n\t" /* Dr0 */ + + "pushl $0\n\t" /* ContextFlags */ + + /* Set ES to kernel segment */ + "movw $"STR(KERNEL_DS)",%bx\n\t" + "movw %bx,%es\n\t" + + /* FIXME: check to see if SS is valid/inrange */ + + /* DS is now also kernel segment */ + "movw %bx,%ds\n\t" + + /* Call debug service dispatcher */ + "pushl %edx\n\t" + "pushl %ecx\n\t" + "pushl %eax\n\t" + "call _KdpServiceDispatcher\n\t" + "addl $12,%esp\n\t" /* restore stack pointer */ + + /* Restore the user context */ + "addl $4,%esp\n\t" /* UserContext */ + "addl $24,%esp\n\t" /* Dr[0-3,6-7] */ + "addl $112,%esp\n\t" /* FloatingSave */ + "popl %gs\n\t" /* SegGs */ + "popl %fs\n\t" /* SegFs */ + "popl %es\n\t" /* SegEs */ + "popl %ds\n\t" /* SegDs */ + + "popl %edi\n\t" /* Edi */ + "popl %esi\n\t" /* Esi */ + "popl %ebx\n\t" /* Ebx */ + "popl %edx\n\t" /* Edx */ + "popl %ecx\n\t" /* Ecx */ + "addl $4,%esp\n\t" /* Eax (Not restored) */ + + "popl %ebp\n\t" /* Ebp */ + + "iret\n\t"); + +/* EOF */ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index df5cdf5cb48..9695b9b1797 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.33 1999/12/18 17:48:22 dwelch Exp $ +/* $Id: main.c,v 1.34 2000/01/17 21:01:16 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -160,7 +160,7 @@ asmlinkage void _main(boot_param* _bp) /* * Initialize the debug output */ - DbgInit (); + KdInitSystem (); start = KERNEL_BASE + PAGE_ROUND_UP(bp.module_length[0]); if (start < ((int)&end)) diff --git a/reactos/ntoskrnl/makefile_rex b/reactos/ntoskrnl/makefile_rex index 276bd78e92a..085272f6fc7 100644 --- a/reactos/ntoskrnl/makefile_rex +++ b/reactos/ntoskrnl/makefile_rex @@ -1,4 +1,4 @@ -# $Id: makefile_rex,v 1.46 2000/01/14 02:22:40 ekohl Exp $ +# $Id: makefile_rex,v 1.47 2000/01/17 21:02:30 ekohl Exp $ # # ReactOS Operating System # @@ -72,7 +72,7 @@ PO_OBJECTS = po/power.o CC_OBJECTS = cc/cacheman.o cc/view.o -KD_OBJECTS = kd/kdebug.o +KD_OBJECTS = kd/kdebug.o kd/service.o RESOURCE_OBJECT = $(TARGET).coff