Author: hbelusca
Date: Thu May 9 13:12:58 2013
New Revision: 58974
URL:
http://svn.reactos.org/svn/reactos?rev=58974&view=rev
Log:
Merge my current work done on the kd++ branch:
- FreeLdr is able now to load personalized Kernel Debugger Transport DLLs by reading at
the kernel command line and interpreting the /DEBUGPORT=xxx entry (--> loads KDxxx.DLL
dll in \SystemRoot\System32\).
Therefore we can not only load the "default" kdcom.dll, but also 3rd-party
ones such as kdbazis.dll from VirtualKD (from revision 58902).
- The GCC-compiled-only version of kdcom, containing legacy COM code, was removed and put
directly along KDBG. It remains only a stub / template for future kdcom-like dlls. The
MSVC-version remains untouched.
- Make those functions ^ use directly the CPORTLIB library.
Added:
trunk/reactos/drivers/base/kdcom/ (props changed)
- copied from r58973, branches/kd++/drivers/base/kdcom/
trunk/reactos/drivers/base/kdrosdbg/ (props changed)
- copied from r58973, branches/kd++/drivers/base/kdrosdbg/
trunk/reactos/ntoskrnl/kd/arm/
- copied from r58973, branches/kd++/ntoskrnl/kd/arm/
trunk/reactos/ntoskrnl/kd/i386/kdbg.c
- copied unchanged from r58973, branches/kd++/ntoskrnl/kd/i386/kdbg.c
Removed:
trunk/reactos/drivers/base/kddll/
Modified:
trunk/reactos/ (props changed)
trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c
trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
trunk/reactos/drivers/base/CMakeLists.txt
trunk/reactos/include/reactos/windbgkd.h
trunk/reactos/ntoskrnl/CMakeLists.txt
trunk/reactos/ntoskrnl/include/internal/kd.h
trunk/reactos/ntoskrnl/include/internal/tag.h
trunk/reactos/ntoskrnl/kd/kdinit.c
trunk/reactos/ntoskrnl/kd/kdio.c
trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
trunk/reactos/ntoskrnl/kd/wrappers/gdbstub_powerpc.c
trunk/reactos/ntoskrnl/kdbg/kdb.h
Propchange: trunk/reactos/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu May 9 13:12:58 2013
@@ -4,6 +4,7 @@
/branches/GSoC_Network:51545-51546
/branches/cmake-bringup:50484,50693,50719,51544-52564
/branches/header-work:45691-47721
+/branches/kd++:58883-58973
/branches/reactos-yarotows:45219-46371,46373-48025,48027-49273
/branches/reactx/reactos:49994-49995
/branches/ros-amd64-bringup:36852
Modified: trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/disk/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/disk/scsiport.c [iso-8859-1] Thu May 9 13:12:58
2013
@@ -1568,7 +1568,7 @@
ULONG ImportTableSize;
PLDR_DATA_TABLE_ENTRY BootDdDTE, FreeldrDTE;
CHAR NtBootDdPath[MAX_PATH];
- PVOID ImageBase;
+ PVOID ImageBase = NULL;
ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath);
BOOLEAN Status;
Modified: trunk/reactos/boot/freeldr/freeldr/windows/peloader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/peloader.c [iso-8859-1] Thu May 9 13:12:58
2013
@@ -255,11 +255,12 @@
return TRUE;
}
-/* WinLdrLoadImage loads the specified image from the file (it doesn't
- perform any additional operations on the filename, just directly
- calls the file I/O routines), and relocates it so that it's ready
- to be used when paging is enabled.
- Addressing mode: physical
+/*
+ * WinLdrLoadImage loads the specified image from the file (it doesn't
+ * perform any additional operations on the filename, just directly
+ * calls the file I/O routines), and relocates it so that it's ready
+ * to be used when paging is enabled.
+ * Addressing mode: physical
*/
BOOLEAN
WinLdrLoadImage(IN PCHAR FileName,
@@ -429,7 +430,6 @@
/* If loading failed - return right now */
if (Status != ESUCCESS)
return FALSE;
-
/* Relocate the image, if it needs it */
if (NtHeaders->OptionalHeader.ImageBase != (ULONG_PTR)VirtualBase)
@@ -756,7 +756,7 @@
{
CHAR FullDllName[256];
BOOLEAN Status;
- PVOID BasePA;
+ PVOID BasePA = NULL;
/* Prepare the full path to the file to be loaded */
strcpy(FullDllName, DirectoryPath);
@@ -781,7 +781,7 @@
DataTableEntry);
if (!Status)
{
- ERR("WinLdrAllocateDataTableEntry() failed with Status=0x%X\n", Status);
+ ERR("WinLdrAllocateDataTableEntry() failed\n");
return Status;
}
@@ -791,7 +791,7 @@
Status = WinLdrScanImportDescriptorTable(ModuleListHead, DirectoryPath,
*DataTableEntry);
if (!Status)
{
- ERR("WinLdrScanImportDescriptorTable() failed with Status=0x%X\n", Status);
+ ERR("WinLdrScanImportDescriptorTable() failed\n");
return Status;
}
Modified: trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] Thu May 9 13:12:58
2013
@@ -227,7 +227,7 @@
static BOOLEAN
WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead,
- LPSTR BootPath,
+ LPCSTR BootPath,
PUNICODE_STRING FilePath,
ULONG Flags,
PLDR_DATA_TABLE_ENTRY *DriverDTE)
@@ -237,7 +237,7 @@
CHAR DllName[1024];
PCHAR DriverNamePos;
BOOLEAN Status;
- PVOID DriverBase;
+ PVOID DriverBase = NULL;
// Separate the path to file name and directory path
_snprintf(DriverPath, sizeof(DriverPath), "%wZ", FilePath);
@@ -258,7 +258,6 @@
}
TRACE("DriverPath: %s, DllName: %s, LPB\n", DriverPath, DllName);
-
// Check if driver is already loaded
Status = WinLdrCheckForLoadedDll(LoadOrderListHead, DllName, DriverDTE);
@@ -299,7 +298,7 @@
BOOLEAN
WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock,
- LPSTR BootPath)
+ LPCSTR BootPath)
{
PLIST_ENTRY NextBd;
PBOOT_DRIVER_LIST_ENTRY BootDriver;
@@ -318,8 +317,11 @@
// Paths are relative (FIXME: Are they always relative?)
// Load it
- Status = WinLdrLoadDeviceDriver(&LoaderBlock->LoadOrderListHead, BootPath,
&BootDriver->FilePath,
- 0, &BootDriver->LdrEntry);
+ Status = WinLdrLoadDeviceDriver(&LoaderBlock->LoadOrderListHead,
+ BootPath,
+ &BootDriver->FilePath,
+ 0,
+ &BootDriver->LdrEntry);
// If loading failed - cry loudly
//FIXME: Maybe remove it from the list and try to continue?
@@ -340,8 +342,10 @@
return TRUE;
}
-PVOID WinLdrLoadModule(PCSTR ModuleName, ULONG *Size,
- TYPE_OF_MEMORY MemoryType)
+PVOID
+WinLdrLoadModule(PCSTR ModuleName,
+ ULONG *Size,
+ TYPE_OF_MEMORY MemoryType)
{
ULONG FileId;
PVOID PhysicalBase;
@@ -398,7 +402,6 @@
return PhysicalBase;
}
-
USHORT
WinLdrDetectVersion()
{
@@ -420,19 +423,20 @@
}
static
-PVOID
+BOOLEAN
LoadModule(
PLOADER_PARAMETER_BLOCK LoaderBlock,
PCCH Path,
PCCH File,
TYPE_OF_MEMORY MemoryType,
PLDR_DATA_TABLE_ENTRY *Dte,
+ BOOLEAN IsKdTransportDll,
ULONG Percentage)
{
+ BOOLEAN Status;
CHAR FullFileName[MAX_PATH];
CHAR ProgressString[256];
- NTSTATUS Status;
- PVOID BaseAdress;
+ PVOID BaseAdress = NULL;
UiDrawBackdrop();
sprintf(ProgressString, "Loading %s...", File);
@@ -443,15 +447,146 @@
strcat(FullFileName, File);
Status = WinLdrLoadImage(FullFileName, MemoryType, &BaseAdress);
- TRACE("%s loaded with status %d at %p\n",
- File, Status, BaseAdress);
+ if (!Status)
+ {
+ TRACE("Loading %s failed\n", File);
+ return FALSE;
+ }
+ TRACE("%s loaded successfully at %p\n", File, BaseAdress);
strcpy(FullFileName, "WINDOWS\\SYSTEM32\\");
strcat(FullFileName, File);
- WinLdrAllocateDataTableEntry(&LoaderBlock->LoadOrderListHead, File,
- FullFileName, BaseAdress, Dte);
-
- return BaseAdress;
+ /*
+ * Cheat about the base DLL name if we are loading
+ * the Kernel Debugger Transport DLL, to make the
+ * PE loader happy.
+ */
+ Status = WinLdrAllocateDataTableEntry(&LoaderBlock->LoadOrderListHead,
+ (IsKdTransportDll ? "KDCOM.DLL" :
File),
+ FullFileName,
+ BaseAdress,
+ Dte);
+
+ return Status;
+}
+
+static
+BOOLEAN
+LoadWindowsCore(IN USHORT OperatingSystemVersion,
+ IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN LPCSTR BootOptions,
+ IN LPCSTR BootPath,
+ IN OUT PLDR_DATA_TABLE_ENTRY* KernelDTE)
+{
+ BOOLEAN Status;
+ CHAR DirPath[MAX_PATH];
+ CHAR KdTransportDllName[MAX_PATH];
+ PLDR_DATA_TABLE_ENTRY HalDTE, KdComDTE = NULL;
+
+ if (!KernelDTE) return FALSE;
+
+ /* Load the Kernel */
+ LoadModule(LoaderBlock, BootPath, "NTOSKRNL.EXE", LoaderSystemCode, KernelDTE,
FALSE, 30);
+
+ /* Load the HAL */
+ LoadModule(LoaderBlock, BootPath, "HAL.DLL", LoaderHalCode, &HalDTE,
FALSE, 45);
+
+ /* Load the Kernel Debugger Transport DLL */
+ if (OperatingSystemVersion > _WIN32_WINNT_WIN2K)
+ {
+ /*
+ * According to
http://www.nynaeve.net/?p=173 :
+ * "[...] Another enhancement that could be done Microsoft-side would be
+ * a better interface for replacing KD transport modules. Right now, due
+ * to the fact that ntoskrnl is static linked to KDCOM.DLL, the OS loader
+ * has a hardcoded hack that interprets the KD type in the OS loader options,
+ * loads one of the (hardcoded filenames) "kdcom.dll",
"kd1394.dll", or
+ * "kdusb2.dll" modules, and inserts them into the loaded module list under
+ * the name "kdcom.dll". [...]"
+ */
+
+ /*
+ * This loop replaces a dumb call to strstr(..., "DEBUGPORT=").
+ * Indeed I want it to be case-insensitive to allow "debugport="
+ * or "DeBuGpOrT=" or... , and I don't want it to match malformed
+ * command-line options, such as:
+ *
+ * "...foo DEBUGPORT=xxx bar..."
+ * "...foo/DEBUGPORT=xxx bar..."
+ * "...foo/DEBUGPORT=bar..."
+ *
+ * i.e. the "DEBUGPORT=" switch must start with a slash and be separated
+ * from the rest by whitespace, unless it begins the command-line, e.g.:
+ *
+ * "/DEBUGPORT=COM1 foo...bar..."
+ * "...foo /DEBUGPORT=USB bar..."
+ * or:
+ * "...foo /DEBUGPORT= bar..."
+ * (in that case, we default the port to COM).
+ */
+ while (BootOptions)
+ {
+ /* Skip possible initial whitespace */
+ BootOptions += strspn(BootOptions, " \t");
+
+ /* Check whether a new commutator starts and it is the DEBUGPORT one */
+ if (*BootOptions != '/' || _strnicmp(++BootOptions, "DEBUGPORT=",
10) != 0)
+ {
+ /* Search for another whitespace */
+ BootOptions = strpbrk(BootOptions, " \t");
+ continue;
+ }
+ else
+ {
+ /* We found the DEBUGPORT commutator. Move to the port name. */
+ BootOptions += 10;
+ break;
+ }
+ }
+
+ if (BootOptions)
+ {
+ /*
+ * We have found the DEBUGPORT commutator. Parse the port name.
+ * Format: /DEBUGPORT=COM1 or /DEBUGPORT=FILE:\Device\HarddiskX\PartitionY\debug.log
or /DEBUGPORT=FOO
+ * If we only have /DEBUGPORT= (i.e. without any port name), defaults it to
"COM".
+ */
+ strcpy(KdTransportDllName, "KD");
+ if (_strnicmp(BootOptions, "COM", 3) == 0 && '0' <=
BootOptions[3] && BootOptions[3] <= '9')
+ {
+ strncat(KdTransportDllName, BootOptions, 3);
+ }
+ else
+ {
+ size_t i = strcspn(BootOptions, " \t:"); /* Skip valid separators:
whitespace or colon */
+ if (i == 0)
+ strcat(KdTransportDllName, "COM");
+ else
+ strncat(KdTransportDllName, BootOptions, i);
+ }
+ strcat(KdTransportDllName, ".DLL");
+ _strupr(KdTransportDllName);
+
+ /*
+ * Load the transport DLL. Specify it to LoadModule so that it can
+ * change the base DLL name of the loaded transport DLL to the default
+ * "KDCOM.DLL" name, to make the PE loader happy.
+ */
+ LoadModule(LoaderBlock, BootPath, KdTransportDllName, LoaderSystemCode, &KdComDTE,
TRUE, 60);
+ }
+ }
+
+ /* Load all referenced DLLs for Kernel, HAL and Kernel Debugger Transport DLL */
+ strcpy(DirPath, BootPath);
+ strcat(DirPath, "system32\\");
+ Status = WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
DirPath, *KernelDTE);
+ Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
DirPath, HalDTE);
+ if (KdComDTE)
+ {
+ Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
DirPath, KdComDTE);
+ }
+
+ return Status;
}
VOID
@@ -496,7 +631,7 @@
strcat(BootPath, FileName);
}
- /* append a backslash */
+ /* Append a backslash */
if ((strlen(BootPath)==0) || BootPath[strlen(BootPath)] != '\\')
strcat(BootPath, "\\");
@@ -547,13 +682,13 @@
UiDrawBackdrop();
UiDrawProgressBarCenter(15, 100, "Loading system hive...");
Status = WinLdrInitSystemHive(LoaderBlock, BootPath);
- TRACE("SYSTEM hive loaded with status %d\n", Status);
+ TRACE("SYSTEM hive %s\n", (Status ? "loaded" : "not
loaded"));
/* Load NLS data, OEM font, and prepare boot drivers list */
Status = WinLdrScanSystemHive(LoaderBlock, BootPath);
- TRACE("SYSTEM hive scanned with status %d\n", Status);
-
-
+ TRACE("SYSTEM hive %s\n", (Status ? "scanned" : "not
scanned"));
+
+ /* Finish loading */
LoadAndBootWindowsCommon(OperatingSystemVersion,
LoaderBlock,
BootOptions,
@@ -571,8 +706,7 @@
{
PLOADER_PARAMETER_BLOCK LoaderBlockVA;
BOOLEAN Status;
- CHAR FileName[MAX_PATH];
- PLDR_DATA_TABLE_ENTRY KernelDTE, HalDTE, KdComDTE = NULL;
+ PLDR_DATA_TABLE_ENTRY KernelDTE;
KERNEL_ENTRY_POINT KiSystemStartup;
LPCSTR SystemRoot;
TRACE("LoadAndBootWindowsCommon()\n");
@@ -586,40 +720,30 @@
if (OperatingSystemVersion == 0)
OperatingSystemVersion = WinLdrDetectVersion();
- /* Load kernel */
- LoadModule(LoaderBlock, BootPath, "NTOSKRNL.EXE", LoaderSystemCode,
&KernelDTE, 30);
-
- /* Load HAL */
- LoadModule(LoaderBlock, BootPath, "HAL.DLL", LoaderHalCode, &HalDTE, 45);
-
- /* Load kernel-debugger support dll */
- if (OperatingSystemVersion > _WIN32_WINNT_WIN2K)
- {
- LoadModule(LoaderBlock, BootPath, "KDCOM.DLL", LoaderSystemCode,
&KdComDTE, 60);
- }
-
- /* Load all referenced DLLs for kernel, HAL and kdcom.dll */
- strcpy(FileName, BootPath);
- strcat(FileName, "system32\\");
- Status = WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, KernelDTE);
- Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, HalDTE);
- if (KdComDTE)
- Status &= WinLdrScanImportDescriptorTable(&LoaderBlock->LoadOrderListHead,
FileName, KdComDTE);
-
+ /* Load the operating system core: the Kernel, the HAL and the Kernel Debugger Transport
DLL */
+ Status = LoadWindowsCore(OperatingSystemVersion,
+ LoaderBlock,
+ BootOptions,
+ BootPath,
+ &KernelDTE);
if (!Status)
{
- UiMessageBox("Error loading imported dll.");
+ UiMessageBox("Error loading NTOS core.");
return;
}
/* Load boot drivers */
UiDrawBackdrop();
UiDrawProgressBarCenter(100, 100, "Loading boot drivers...");
- Status = WinLdrLoadBootDrivers(LoaderBlock, (PCHAR)BootPath);
+ Status = WinLdrLoadBootDrivers(LoaderBlock, BootPath);
TRACE("Boot drivers loaded with status %d\n", Status);
/* Initialize Phase 1 - no drivers loading anymore */
- WinLdrInitializePhase1(LoaderBlock, BootOptions, SystemRoot, BootPath,
OperatingSystemVersion);
+ WinLdrInitializePhase1(LoaderBlock,
+ BootOptions,
+ SystemRoot,
+ BootPath,
+ OperatingSystemVersion);
/* Save entry-point pointer and Loader block VAs */
KiSystemStartup = (KERNEL_ENTRY_POINT)KernelDTE->EntryPoint;
@@ -644,7 +768,7 @@
LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
TRACE("Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
- KiSystemStartup, LoaderBlockVA);
+ KiSystemStartup, LoaderBlockVA);
// Zero KI_USER_SHARED_DATA page
memset((PVOID)KI_USER_SHARED_DATA, 0, MM_PAGE_SIZE);
@@ -722,5 +846,3 @@
NextBd = ArcDisk->ListEntry.Flink;
}
}
-
-
Modified: trunk/reactos/drivers/base/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/CMakeLists.tx…
==============================================================================
--- trunk/reactos/drivers/base/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/drivers/base/CMakeLists.txt [iso-8859-1] Thu May 9 13:12:58 2013
@@ -3,9 +3,10 @@
add_subdirectory(bootvid)
if(_WINKD_)
-add_subdirectory(kddll)
+add_subdirectory(kdcom)
else()
-add_subdirectory(kdcom)
+add_subdirectory(kdrosdbg)
endif()
+
add_subdirectory(nmidebug)
add_subdirectory(null)
Propchange: trunk/reactos/drivers/base/kdcom/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Thu May 9 13:12:58 2013
@@ -0,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)
Propchange: trunk/reactos/drivers/base/kdcom/
------------------------------------------------------------------------------
bugtraq:message = See issue #%BUGID% for more details.
Propchange: trunk/reactos/drivers/base/kdcom/
------------------------------------------------------------------------------
bugtraq:url =
http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange: trunk/reactos/drivers/base/kdcom/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Propchange: trunk/reactos/drivers/base/kdrosdbg/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu May 9 13:12:58 2013
@@ -0,0 +1,7 @@
+GNUmakefile
+*.vcproj
+*.user
+*.cbp
+*.ncb
+*.suo
+*.sln
Modified: trunk/reactos/include/reactos/windbgkd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/windbgkd.h…
==============================================================================
--- trunk/reactos/include/reactos/windbgkd.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/windbgkd.h [iso-8859-1] Thu May 9 13:12:58 2013
@@ -451,7 +451,7 @@
ULONG Thread;
ULONG ProgramCounter;
union
- {
+ {
DBGKM_EXCEPTION32 Exception;
DBGKD_LOAD_SYMBOLS32 LoadSymbols;
} u;
@@ -481,13 +481,13 @@
ULONG64 Thread;
ULONG64 ProgramCounter;
union
- {
+ {
DBGKM_EXCEPTION64 Exception;
DBGKD_LOAD_SYMBOLS64 LoadSymbols;
DBGKD_COMMAND_STRING CommandString;
} u;
union
- {
+ {
DBGKD_CONTROL_REPORT ControlReport;
DBGKD_ANY_CONTROL_REPORT AnyControlReport;
};
@@ -814,7 +814,7 @@
ULONG ApiNumber;
ULONG Status;
union
- {
+ {
ULONG64 ReserveSpace[7];
DBGKD_CREATE_FILE CreateFile;
DBGKD_READ_FILE ReadFile;
@@ -843,7 +843,7 @@
{
ULONG ApiNumber;
union
- {
+ {
DBGKD_REQUEST_BREAKPOINT RequestBreakpoint;
DBGKD_RELEASE_BREAKPOINT ReleaseBreakpoint;
} u;
Modified: trunk/reactos/ntoskrnl/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/CMakeLists.txt?re…
==============================================================================
--- trunk/reactos/ntoskrnl/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/CMakeLists.txt [iso-8859-1] Thu May 9 13:12:58 2013
@@ -363,6 +363,7 @@
if(NOT _WINKD_)
if(ARCH STREQUAL "i386")
list(APPEND SOURCE
+ kd/i386/kdbg.c
kd/i386/kdmemsup.c
kd/wrappers/gdbstub.c)
if(KDBG)
@@ -372,6 +373,7 @@
elseif(ARCH STREQUAL "amd64")
list(APPEND SOURCE
kd/amd64/kd.c
+ kd/i386/kdbg.c # Use the x86 file
kd/amd64/kdmemsup.c)
if(KDBG)
list(APPEND ASM_SOURCE kdbg/amd64/kdb_help.S)
@@ -379,6 +381,8 @@
kdbg/amd64/i386-dis.c
kdbg/amd64/kdb.c)
endif()
+ elseif(ARCH STREQUAL "arm")
+ list(APPEND SOURCE kd/arm/kdbg.c)
elseif(ARCH STREQUAL "powerpc")
list(APPEND SOURCE kd/wrappers/gdbstub_powerpc.c)
endif()
Modified: trunk/reactos/ntoskrnl/include/internal/kd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/kd.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/kd.h [iso-8859-1] Thu May 9 13:12:58 2013
@@ -1,4 +1,6 @@
#pragma once
+
+#include <cportlib/cportlib.h>
#ifdef _M_PPC
#define KdDebuggerEnabled _KdDebuggerEnabled
@@ -8,15 +10,8 @@
//
// Kernel Debugger Port Definition
//
-typedef struct _KD_PORT_INFORMATION
-{
- ULONG ComPort;
- ULONG BaudRate;
- ULONG BaseAddress;
-} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
-
struct _KD_DISPATCH_TABLE;
-extern KD_PORT_INFORMATION GdbPortInfo;
+extern CPPORT GdbPortInfo;
extern BOOLEAN _KdDebuggerEnabled;
extern BOOLEAN _KdDebuggerNotPresent;
extern BOOLEAN KdBreakAfterSymbolLoad;
@@ -25,41 +20,21 @@
BOOLEAN
NTAPI
-KdPortInitialize(
- PKD_PORT_INFORMATION PortInformation,
- ULONG Unknown1,
- ULONG Unknown2
-);
-
-BOOLEAN
-NTAPI
KdPortInitializeEx(
- PKD_PORT_INFORMATION PortInformation,
- ULONG Unknown1,
- ULONG Unknown2
-);
-
-BOOLEAN
-NTAPI
-KdPortGetByte(
+ PCPPORT PortInformation,
+ ULONG ComPortNumber
+);
+
+BOOLEAN
+NTAPI
+KdPortGetByteEx(
+ PCPPORT PortInformation,
PUCHAR ByteReceived);
-BOOLEAN
-NTAPI
-KdPortGetByteEx(
- PKD_PORT_INFORMATION PortInformation,
- PUCHAR ByteReceived);
-
-VOID
-NTAPI
-KdPortPutByte(
- UCHAR ByteToSend
-);
-
VOID
NTAPI
KdPortPutByteEx(
- PKD_PORT_INFORMATION PortInformation,
+ PCPPORT PortInformation,
UCHAR ByteToSend
);
@@ -359,7 +334,8 @@
extern ULONG KdpPort;
/* Port Information for the Serial Native Mode */
-extern KD_PORT_INFORMATION SerialPortInfo;
+extern ULONG SerialPortNumber;
+extern CPPORT SerialPortInfo;
/* Init Functions for Native Providers */
extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
Modified: trunk/reactos/ntoskrnl/include/internal/tag.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/tag.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/tag.h [iso-8859-1] Thu May 9 13:12:58 2013
@@ -95,10 +95,6 @@
#define TAG_VPB ' BPV'
#define TAG_SYSB 'BSYS'
-/* formerly located in kdbg/kdb_symbols.c */
-#define TAG_KDBS 'SBDK'
-#define TAG_KDBG 'GBDK'
-
/* formerly located in ldr/loader.c */
#define TAG_DRIVER_MEM 'MVRD' /* drvm */
#define TAG_MODULE_OBJECT 'omlk' /* klmo - kernel ldr module object */
Modified: trunk/reactos/ntoskrnl/kd/kdinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/kdinit.c?rev=5…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/kdinit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/kdinit.c [iso-8859-1] Thu May 9 13:12:58 2013
@@ -16,7 +16,8 @@
/* VARIABLES ***************************************************************/
-KD_PORT_INFORMATION PortInfo = {DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_BAUD_RATE, 0};
+ULONG PortNumber = DEFAULT_DEBUG_PORT;
+CPPORT PortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
ULONG KdpPortIrq;
#ifdef AUTO_ENABLE_BOCHS
KDP_DEBUG_MODE KdpDebugMode = {{{.Bochs=TRUE}}};
@@ -68,7 +69,7 @@
KdpDebugMode.Serial = TRUE;
/* Set the port to use */
- SerialPortInfo.ComPort = Value;
+ SerialPortNumber = Value;
KdpPort = Value;
}
}
@@ -78,8 +79,8 @@
if (Value)
{
KdpDebugMode.Serial = TRUE;
- SerialPortInfo.BaseAddress = Value;
- SerialPortInfo.ComPort = 0;
+ SerialPortInfo.Address = UlongToPtr(Value);
+ SerialPortNumber = 0;
KdpPort = 0;
}
}
Modified: trunk/reactos/ntoskrnl/kd/kdio.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/kdio.c?rev=589…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/kdio.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/kdio.c [iso-8859-1] Thu May 9 13:12:58 2013
@@ -26,7 +26,8 @@
ANSI_STRING KdpLogFileName = RTL_CONSTANT_STRING("\\SystemRoot\\debug.log");
KSPIN_LOCK KdpSerialSpinLock;
-KD_PORT_INFORMATION SerialPortInfo = { DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_BAUD_RATE, 0 };
+ULONG SerialPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT SerialPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
/* Current Port in use. FIXME: Do we support more then one? */
ULONG KdpPort;
@@ -358,12 +359,12 @@
DispatchTable->KdpPrintRoutine = KdpSerialDebugPrint;
/* Initialize the Port */
- if (!KdPortInitializeEx(&SerialPortInfo, 0, 0))
+ if (!KdPortInitializeEx(&SerialPortInfo, SerialPortNumber))
{
KdpDebugMode.Serial = FALSE;
return;
}
- KdComPortInUse = (PUCHAR)(ULONG_PTR)SerialPortInfo.BaseAddress;
+ KdComPortInUse = SerialPortInfo.Address;
/* Initialize spinlock */
KeInitializeSpinLock(&KdpSerialSpinLock);
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/wrappers/gdbst…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] Thu May 9 13:12:58 2013
@@ -44,7 +44,8 @@
extern LIST_ENTRY PsActiveProcessHead;
/* FIXME hardcoded for COM2, 115200 baud */
-KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 };
+ULONG GdbPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT GdbPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
static CHAR GspInBuffer[1000];
static CHAR GspOutBuffer[1000];
@@ -126,9 +127,7 @@
{
UCHAR Value;
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
-
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value)) ;
return Value;
}
@@ -145,8 +144,7 @@
while (TRUE)
{
/* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar()) != '$')
- ;
+ while ((ch = GdbGetChar()) != '$') ;
retry:
Checksum = 0;
@@ -784,7 +782,6 @@
}
else if (strncmp(Request, "Rcmd,", 5) == 0)
{
- ;
}
}
@@ -943,12 +940,14 @@
ULONG Index;
for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ {
if (GspSwBreakpoints[Index].Address == Address)
{
if (PIndex)
*PIndex = Index;
return TRUE;
}
+ }
return FALSE;
}
@@ -1569,7 +1568,7 @@
WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
/* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
+ KdPortInitializeEx(&GdbPortInfo, GdbPortNumber);
}
else if (BootPhase == 1)
{
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub_powerpc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/wrappers/gdbst…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub_powerpc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub_powerpc.c [iso-8859-1] Thu May 9 13:12:58
2013
@@ -88,44 +88,47 @@
#include <debug.h>
/************************************************************************/
+
+static BOOLEAN GspInitialized;
+static BOOLEAN GspRemoteDebug;
+
+static CONST CHAR HexChars[]="0123456789abcdef";
+
+static PETHREAD GspRunThread; /* NULL means run all threads */
+static PETHREAD GspDbgThread;
+static PETHREAD GspEnumThread;
+
+static FAST_MUTEX GspLock;
+
+extern LIST_ENTRY PsActiveProcessHead;
+
+/* FIXME hardcoded for COM2, 115200 baud */
+ULONG GdbPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT GdbPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
+
/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
/* at least NUMREGBYTES*2 are needed for register packets */
#define BUFMAX 1000
-
-static BOOLEAN GspInitialized;
-
-static BOOLEAN GspRemoteDebug;
-
-static CONST CHAR HexChars[]="0123456789abcdef";
-
-static PETHREAD GspRunThread; /* NULL means run all threads */
-static PETHREAD GspDbgThread;
-static PETHREAD GspEnumThread;
-
-static FAST_MUTEX GspLock;
-
-extern LIST_ENTRY PsActiveProcessHead;
-
-/* FIXME hardcoded for COM2, 115200 baud */
-KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 };
+static CHAR GspInBuffer[BUFMAX];
+static CHAR GspOutBuffer[BUFMAX];
/* Number of Registers. */
#define NUMREGS 16
enum REGISTER_NAMES
{
- EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
- PC /* also known as eip */,
- PS /* also known as eflags */,
- CS, SS, DS, ES, FS, GS
+ EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+ PC /* also known as eip */,
+ PS /* also known as eflags */,
+ CS, SS, DS, ES, FS, GS
};
typedef struct _CPU_REGISTER
{
- ULONG Size;
- ULONG OffsetInTF;
- ULONG OffsetInContext;
- BOOLEAN SetInContext;
+ ULONG Size;
+ ULONG OffsetInTF;
+ ULONG OffsetInContext;
+ BOOLEAN SetInContext;
} CPU_REGISTER, *PCPU_REGISTER;
static CPU_REGISTER GspRegisters[NUMREGS] =
@@ -134,54 +137,45 @@
static PCHAR GspThreadStates[DeferredReady+1] =
{
- "Initialized",
- "Ready",
- "Running",
- "Standby",
- "Terminated",
- "Waiting",
- "Transition",
- "DeferredReady"
+ "Initialized",
+ "Ready",
+ "Running",
+ "Standby",
+ "Terminated",
+ "Waiting",
+ "Transition",
+ "DeferredReady"
};
LONG
HexValue(CHAR ch)
{
- if ((ch >= '0') && (ch <= '9'))
- {
- return (ch - '0');
- }
- if ((ch >= 'a') && (ch <= 'f'))
- {
- return (ch - 'a' + 10);
- }
- if ((ch >= 'A') && (ch <= 'F'))
- {
- return (ch - 'A' + 10);
- }
-
- return -1;
-}
-
-static CHAR GspInBuffer[BUFMAX];
-static CHAR GspOutBuffer[BUFMAX];
+ if ((ch >= '0') && (ch <= '9'))
+ return (ch - '0');
+
+ if ((ch >= 'a') && (ch <= 'f'))
+ return (ch - 'a' + 10);
+
+ if ((ch >= 'A') && (ch <= 'F'))
+ return (ch - 'A' + 10);
+
+ return -1;
+}
VOID
GdbPutChar(UCHAR Value)
{
- KdPortPutByteEx(&GdbPortInfo, Value);
+ KdPortPutByteEx(&GdbPortInfo, Value);
}
UCHAR
GdbGetChar(VOID)
{
- UCHAR Value;
-
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
-
- return Value;
+ UCHAR Value;
+
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value)) ;
+ return Value;
}
/* scan for the sequence $<data>#<Checksum> */
@@ -189,57 +183,53 @@
PCHAR
GspGetPacket()
{
- PCHAR Buffer = &GspInBuffer[0];
- CHAR Checksum;
- CHAR XmitChecksum;
- ULONG Count;
- CHAR ch;
-
- while (TRUE)
- {
- /* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar ()) != '$')
- ;
-
- retry:
- Checksum = 0;
- XmitChecksum = -1;
- Count = 0;
-
- /* now, read until a # or end of Buffer is found */
- while (Count < BUFMAX)
- {
- ch = GdbGetChar();
- if (ch == '$')
- {
- goto retry;
- }
- if (ch == '#')
- {
- break;
- }
- Checksum = Checksum + ch;
- Buffer[Count] = ch;
- Count = Count + 1;
- }
- Buffer[Count] = 0;
-
- if (ch == '#')
- {
- ch = GdbGetChar();
- XmitChecksum = (CHAR)(HexValue(ch) << 4);
- ch = GdbGetChar();
- XmitChecksum += (CHAR)(HexValue(ch));
-
- if (Checksum != XmitChecksum)
- {
- GdbPutChar('-'); /* failed checksum */
- }
- else
- {
- GdbPutChar('+'); /* successful transfer */
-
- return &Buffer[0];
+ PCHAR Buffer = &GspInBuffer[0];
+ CHAR Checksum;
+ CHAR XmitChecksum;
+ ULONG Count;
+ CHAR ch;
+
+ while (TRUE)
+ {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = GdbGetChar ()) != '$') ;
+
+retry:
+ Checksum = 0;
+ XmitChecksum = -1;
+ Count = 0;
+
+ /* now, read until a # or end of Buffer is found */
+ while (Count < BUFMAX)
+ {
+ ch = GdbGetChar();
+ if (ch == '$')
+ goto retry;
+
+ if (ch == '#')
+ break;
+
+ Checksum = Checksum + ch;
+ Buffer[Count] = ch;
+ Count = Count + 1;
+ }
+ Buffer[Count] = 0;
+
+ if (ch == '#')
+ {
+ ch = GdbGetChar();
+ XmitChecksum = (CHAR)(HexValue(ch) << 4);
+ ch = GdbGetChar();
+ XmitChecksum += (CHAR)(HexValue(ch));
+
+ if (Checksum != XmitChecksum)
+ {
+ GdbPutChar('-'); /* failed checksum */
+ }
+ else
+ {
+ GdbPutChar('+'); /* successful transfer */
+ return &Buffer[0];
}
}
}
@@ -250,54 +240,54 @@
VOID
GspPutPacket(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- do
- {
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
- }
- while (GdbGetChar() != '+');
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ do
+ {
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
+ }
+ while (GdbGetChar() != '+');
}
VOID
GspPutPacketNoWait(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
}
/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an
@@ -308,19 +298,33 @@
static CHAR
GspReadMemSafe(PCHAR Address)
{
- CHAR ch;
-
- if (NULL == Address)
- {
- GspMemoryError = TRUE;
- return '\0';
- }
-
- GspAccessLocation = Address;
- ch = *Address;
- GspAccessLocation = NULL;
-
- return ch;
+ CHAR ch;
+
+ if (NULL == Address)
+ {
+ GspMemoryError = TRUE;
+ return '\0';
+ }
+
+ GspAccessLocation = Address;
+ ch = *Address;
+ GspAccessLocation = NULL;
+
+ return ch;
+}
+
+static CHAR
+GspWriteMemSafeGetContent(PVOID Context, ULONG Offset)
+{
+ ASSERT(0 == Offset);
+ return *((PCHAR) Context);
+}
+
+static void
+GspWriteMemSafe(PCHAR Address,
+ CHAR Ch)
+{
+ GspWriteMem(Address, 1, TRUE, GspWriteMemSafeGetContent, &Ch);
}
/* Convert the memory pointed to by Address into hex, placing result in Buffer */
@@ -329,131 +333,110 @@
a fault; if FALSE treat a fault like any other fault in the stub. */
static PCHAR
GspMem2Hex(PCHAR Address,
- PCHAR Buffer,
- LONG Count,
- BOOLEAN MayFault)
-{
- ULONG i;
- CHAR ch;
-
- for (i = 0; i < (ULONG) Count; i++)
- {
- if (MayFault)
- {
- ch = GspReadMemSafe(Address);
- if (GspMemoryError)
- {
- return Buffer;
- }
- }
- else
- {
- ch = *Address;
- }
- *Buffer++ = HexChars[(ch >> 4) & 0xf];
- *Buffer++ = HexChars[ch & 0xf];
- Address++;
- }
-
- *Buffer = 0;
- return Buffer;
+ PCHAR Buffer,
+ LONG Count,
+ BOOLEAN MayFault)
+{
+ ULONG i;
+ CHAR ch;
+
+ for (i = 0; i < (ULONG) Count; i++)
+ {
+ if (MayFault)
+ {
+ ch = GspReadMemSafe(Address);
+ if (GspMemoryError)
+ return Buffer;
+ }
+ else
+ {
+ ch = *Address;
+ }
+ *Buffer++ = HexChars[(ch >> 4) & 0xf];
+ *Buffer++ = HexChars[ch & 0xf];
+ Address++;
+ }
+
+ *Buffer = 0;
+ return Buffer;
}
static ULONG
GspWriteMem(PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault,
- CHAR (*GetContent)(PVOID Context, ULONG Offset),
- PVOID Context)
-{
- PCHAR Current;
- PCHAR Page;
- ULONG CountInPage;
- ULONG i;
- CHAR ch;
- ULONG OldProt = 0;
-
- Current = Address;
- while (Current < Address + Count)
- {
- Page = (PCHAR)PAGE_ROUND_DOWN(Current);
- if (Address + Count <= Page + PAGE_SIZE)
- {
- /* Fits in this page */
- CountInPage = Count;
- }
- else
- {
- /* Flows into next page, handle only current page in this iteration */
- CountInPage = PAGE_SIZE - (Address - Page);
- }
- if (MayFault)
- {
- OldProt = MmGetPageProtect(NULL, Address);
- MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE);
- }
-
- for (i = 0; i < CountInPage && ! GspMemoryError; i++)
- {
- ch = (*GetContent)(Context, Current - Address);
-
- if (MayFault)
- {
- GspAccessLocation = Current;
- }
- *Current = ch;
- if (MayFault)
- {
- GspAccessLocation = NULL;
- }
- Current++;
- }
- if (MayFault)
- {
- MmSetPageProtect(NULL, Page, OldProt);
- if (GspMemoryError)
- {
- return Current - Address;
- }
- }
- }
-
- return Current - Address;
+ ULONG Count,
+ BOOLEAN MayFault,
+ CHAR (*GetContent)(PVOID Context, ULONG Offset),
+ PVOID Context)
+{
+ PCHAR Current;
+ PCHAR Page;
+ ULONG CountInPage;
+ ULONG i;
+ CHAR ch;
+ ULONG OldProt = 0;
+
+ Current = Address;
+ while (Current < Address + Count)
+ {
+ Page = (PCHAR)PAGE_ROUND_DOWN(Current);
+ if (Address + Count <= Page + PAGE_SIZE)
+ {
+ /* Fits in this page */
+ CountInPage = Count;
+ }
+ else
+ {
+ /* Flows into next page, handle only current page in this iteration */
+ CountInPage = PAGE_SIZE - (Address - Page);
+ }
+ if (MayFault)
+ {
+ OldProt = MmGetPageProtect(NULL, Address);
+ MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE);
+ }
+
+ for (i = 0; i < CountInPage && ! GspMemoryError; i++)
+ {
+ ch = (*GetContent)(Context, Current - Address);
+
+ if (MayFault)
+ GspAccessLocation = Current;
+
+ *Current = ch;
+
+ if (MayFault)
+ GspAccessLocation = NULL;
+
+ Current++;
+ }
+ if (MayFault)
+ {
+ MmSetPageProtect(NULL, Page, OldProt);
+ if (GspMemoryError)
+ return Current - Address;
+ }
+ }
+
+ return Current - Address;
}
static CHAR
GspHex2MemGetContent(PVOID Context, ULONG Offset)
{
- return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
- HexValue(*((PCHAR) Context + 2 * Offset + 1)));
+ return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
+ HexValue(*((PCHAR) Context + 2 * Offset + 1)));
}
/* Convert the hex array pointed to by Buffer into binary to be placed at Address */
/* Return a pointer to the character AFTER the last byte read from Buffer */
static PCHAR
GspHex2Mem(PCHAR Buffer,
- PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault)
-{
- Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
-
- return Buffer + 2 * Count;
-}
-
-static CHAR
-GspWriteMemSafeGetContent(PVOID Context, ULONG Offset)
-{
- ASSERT(0 == Offset);
-
- return *((PCHAR) Context);
-}
-
-static void
-GspWriteMemSafe(PCHAR Address,
- CHAR Ch)
-{
- GspWriteMem(Address, 1, TRUE, GspWriteMemSafeGetContent, &Ch);
+ PCHAR Address,
+ ULONG Count,
+ BOOLEAN MayFault)
+{
+ Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
+ return Buffer + 2 * Count;
}
@@ -462,33 +445,38 @@
ULONG
GspComputeSignal(NTSTATUS ExceptionCode)
{
- ULONG SigVal;
-
- switch (ExceptionCode)
- {
- case STATUS_INTEGER_DIVIDE_BY_ZERO:
- SigVal = 8; /* divide by zero */
- break;
- case STATUS_SINGLE_STEP:
- case STATUS_BREAKPOINT:
- SigVal = 5; /* breakpoint */
- break;
- case STATUS_INTEGER_OVERFLOW:
- case STATUS_ARRAY_BOUNDS_EXCEEDED:
- SigVal = 16; /* bound instruction */
- break;
- case STATUS_ILLEGAL_INSTRUCTION:
- SigVal = 4; /* Invalid opcode */
- break;
- case STATUS_STACK_OVERFLOW:
- case STATUS_DATATYPE_MISALIGNMENT:
- case STATUS_ACCESS_VIOLATION:
- SigVal = 11; /* access violation */
- break;
- default:
- SigVal = 7; /* "software generated" */
- }
- return SigVal;
+ ULONG SigVal;
+
+ switch (ExceptionCode)
+ {
+ case STATUS_INTEGER_DIVIDE_BY_ZERO:
+ SigVal = 8; /* divide by zero */
+ break;
+
+ case STATUS_SINGLE_STEP:
+ case STATUS_BREAKPOINT:
+ SigVal = 5; /* breakpoint */
+ break;
+
+ case STATUS_INTEGER_OVERFLOW:
+ case STATUS_ARRAY_BOUNDS_EXCEEDED:
+ SigVal = 16; /* bound instruction */
+ break;
+
+ case STATUS_ILLEGAL_INSTRUCTION:
+ SigVal = 4; /* Invalid opcode */
+ break;
+
+ case STATUS_STACK_OVERFLOW:
+ case STATUS_DATATYPE_MISALIGNMENT:
+ case STATUS_ACCESS_VIOLATION:
+ SigVal = 11; /* access violation */
+ break;
+
+ default:
+ SigVal = 7; /* "software generated" */
+ }
+ return SigVal;
}
@@ -1626,43 +1614,39 @@
BOOLEAN
NTAPI
GspBreakIn(PKINTERRUPT Interrupt,
- PVOID ServiceContext)
-{
- PKTRAP_FRAME TrapFrame;
- BOOLEAN DoBreakIn;
- CONTEXT Context;
- KIRQL OldIrql;
- UCHAR Value;
-
- DPRINT("Break In\n");
-
- DoBreakIn = FALSE;
- while (KdPortGetByteEx(&GdbPortInfo, &Value))
- {
- if (Value == 0x03)
- {
- DoBreakIn = TRUE;
- }
- }
-
- if (!DoBreakIn)
- {
- return TRUE;
- }
-
- KeRaiseIrql(HIGH_LEVEL, &OldIrql);
-
- TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
-
- KeTrapFrameToContext(TrapFrame, NULL, &Context);
-
- KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
-
- KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode);
-
- KeLowerIrql(OldIrql);
-
- return TRUE;
+ PVOID ServiceContext)
+{
+ PKTRAP_FRAME TrapFrame;
+ BOOLEAN DoBreakIn;
+ CONTEXT Context;
+ KIRQL OldIrql;
+ UCHAR Value;
+
+ DPRINT("Break In\n");
+
+ DoBreakIn = FALSE;
+ while (KdPortGetByteEx(&GdbPortInfo, &Value))
+ {
+ if (Value == 0x03)
+ DoBreakIn = TRUE;
+ }
+
+ if (!DoBreakIn)
+ return TRUE;
+
+ KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+
+ TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
+
+ KeTrapFrameToContext(TrapFrame, NULL, &Context);
+
+ KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
+
+ KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags,
KernelMode);
+
+ KeLowerIrql(OldIrql);
+
+ return TRUE;
}
VOID
@@ -1677,39 +1661,36 @@
KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable,
ULONG BootPhase)
{
- if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
- {
- return;
- }
-
- if (BootPhase == 0)
- {
- ExInitializeFastMutex(&GspLock);
-
- /* Write out the functions that we support for now */
- WrapperTable->KdpInitRoutine = KdpGdbStubInit;
- WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
- WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
-
- /* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
-
- KdpPort = GdbPortInfo.ComPort;
- }
- else if (BootPhase == 1)
- {
- GspInitialized = TRUE;
-
- GspRunThread = NULL;
- GspDbgThread = NULL;
- GspEnumThread = NULL;
-
- HalDisplayString("Waiting for GDB to attach\n");
- DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
- }
- else if (BootPhase == 2)
- {
- HalDisplayString("\n GDB debugging enabled\n\n");
+ if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
+ return;
+
+ if (BootPhase == 0)
+ {
+ ExInitializeFastMutex(&GspLock);
+
+ /* Write out the functions that we support for now */
+ WrapperTable->KdpInitRoutine = KdpGdbStubInit;
+ WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
+ WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
+
+ /* Initialize the Port */
+ KdPortInitializeEx(&GdbPortInfo, GdbPortNumber);
+ // KdpPort = GdbPortInfo.ComPort;
+ }
+ else if (BootPhase == 1)
+ {
+ GspInitialized = TRUE;
+
+ GspRunThread = NULL;
+ GspDbgThread = NULL;
+ GspEnumThread = NULL;
+
+ HalDisplayString("Waiting for GDB to attach\n");
+ DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+ }
+ else if (BootPhase == 2)
+ {
+ HalDisplayString("\n GDB debugging enabled\n\n");
}
}
Modified: trunk/reactos/ntoskrnl/kdbg/kdb.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb.h?rev=58…
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb.h [iso-8859-1] Thu May 9 13:12:58 2013
@@ -5,6 +5,10 @@
#ifndef RTL_NUMBER_OF
# define RTL_NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
#endif
+
+/* formerly located in kdbg/kdb_symbols.c */
+#define TAG_KDBS 'SBDK'
+#define TAG_KDBG 'GBDK'
/* TYPES *********************************************************************/