Alex Ionescu ionucu@videotron.ca Various bugcheck code improvements: - Fix bugcheck code and make debugging easier for unhandled exceptions/spinlocks. - Fix a race condition with TAB+B, - Fix irql to be high_level. - Fix calling unsafe function by caching bugcode data. - Fix support for smp by using IPI. - Fix not-breakpointing when no debugger is there. - Implement KeBugCheck callbacks with reason. - Fix callbacks not being called. - Fix proper breakpoint during bugcheck. Filip Navara xnavara@volny.cz - Move the bugcheck initialization code into Ke (was in Ex on Alex's branch). Modified: trunk/reactos/ntoskrnl/include/internal/debug.h Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/ke/bug.c Modified: trunk/reactos/ntoskrnl/ke/catch.c Modified: trunk/reactos/ntoskrnl/ke/i386/brkpoint.c Modified: trunk/reactos/ntoskrnl/ke/i386/kernel.c Modified: trunk/reactos/ntoskrnl/ke/spinlock.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/debug.h --- trunk/reactos/ntoskrnl/include/internal/debug.h 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/include/internal/debug.h 2005-03-12 16:01:30 UTC (rev 13969) @@ -38,11 +38,11 @@
/* Assert only on "checked" version */ #ifndef NASSERT #ifdef CONFIG_SMP -#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->ProcessorNumber), KeBugCheck(0); } -#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->ProcessorNumber), KeBugCheck(0); } +#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->ProcessorNumber), DbgBreakPoint(); } +#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->ProcessorNumber), DbgBreakPoint(); } #else -#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); } -#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); } +#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); DbgBreakPoint(); } +#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); DbgBreakPoint(); } #endif
#define assertmsg(_c_, _m_) \ _____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h --- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-03-12 16:01:30 UTC (rev 13969) @@ -196,7 +196,7 @@
VOID KeInitDispatcher(VOID); VOID KeInitializeDispatcher(VOID); VOID KiInitializeSystemClock(VOID); -VOID KeInitializeBugCheck(VOID); +VOID KiInitializeBugCheck(VOID); VOID Phase1Initialization(PVOID Context);
VOID KeInit1(PCHAR CommandLine, PULONG LastKernelAddress); _____
Modified: trunk/reactos/ntoskrnl/ke/bug.c --- trunk/reactos/ntoskrnl/ke/bug.c 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/ke/bug.c 2005-03-12 16:01:30 UTC (rev 13969) @@ -1,200 +1,445 @@
-/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/bug.c * PURPOSE: Graceful system shutdown if a bug is detected * - * PROGRAMMERS: David Welch (welch@cwcom.net) + * PROGRAMMERS: Alex Ionescu - Rewrote Bugcheck Routines and implemented Reason Callbacks. + * David Welch (welch@cwcom.net) * Phillip Susi */
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h> -#include <ntos/bootvid.h> +#define NDEBUG #include <internal/debug.h> -#include "../../hal/halx86/include/hal.h"
/* GLOBALS ******************************************************************/
static LIST_ENTRY BugcheckCallbackListHead = {NULL,NULL}; +static LIST_ENTRY BugcheckReasonCallbackListHead = {NULL,NULL}; static ULONG InBugCheck; +static PRTL_MESSAGE_RESOURCE_DATA KiBugCodeMessages; +static ULONG KeBugCheckCount = 1;
/* FUNCTIONS *****************************************************************/
-VOID INIT_FUNCTION -KeInitializeBugCheck(VOID) +VOID +INIT_FUNCTION +KiInitializeBugCheck(VOID) { - InitializeListHead(&BugcheckCallbackListHead); - InBugCheck = 0; + PRTL_MESSAGE_RESOURCE_DATA BugCheckData; + LDR_RESOURCE_INFO ResourceInfo; + PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; + NTSTATUS Status; + + /* Initialize Callbadk Listhead and State */ + InitializeListHead(&BugcheckCallbackListHead); + InitializeListHead(&BugcheckReasonCallbackListHead); + InBugCheck = 0; + + /* Cache the Bugcheck Message Strings. Prepare the Lookup Data */ + ResourceInfo.Type = 11; + ResourceInfo.Name = 1; + ResourceInfo.Language = 9; + + /* Do the lookup. */ + Status = LdrFindResource_U((PVOID)KERNEL_BASE, + &ResourceInfo, + RESOURCE_DATA_LEVEL, + &ResourceDataEntry); + + /* Make sure it worked */ + if (NT_SUCCESS(Status)) { + + DPRINT1("Found Bugcheck Resource Data!\n"); + + /* Now actually get a pointer to it */ + Status = LdrAccessResource((PVOID)KERNEL_BASE, + ResourceDataEntry, + (PVOID*)&BugCheckData, + NULL); + + /* Make sure it worked */ + if (NT_SUCCESS(Status)) { + + DPRINT1("Got Pointer to Bugcheck Resource Data!\n"); + KiBugCodeMessages = BugCheckData; + } + } }
/* * @implemented */ -BOOLEAN STDCALL +BOOLEAN +STDCALL KeDeregisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord) { - /* Check the Current State */ - if (CallbackRecord->State == BufferInserted) { - CallbackRecord->State = BufferEmpty; - RemoveEntryList(&CallbackRecord->Entry); - return TRUE; - } - - /* The callback wasn't registered */ - return FALSE; + KIRQL OldIrql; + BOOLEAN Status = FALSE; + + /* Raise IRQL to High */ + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + /* Check the Current State */ + if (CallbackRecord->State == BufferInserted) { + + /* Reset state and remove from list */ + CallbackRecord->State = BufferEmpty; + RemoveEntryList(&CallbackRecord->Entry); + + Status = TRUE; + } + + /* Lower IRQL and return */ + KeLowerIrql(OldIrql); + return Status; }
/* * @implemented */ -BOOLEAN STDCALL +BOOLEAN +STDCALL +KeDeregisterBugCheckReasonCallback(IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord) +{ + KIRQL OldIrql; + BOOLEAN Status = FALSE; + + /* Raise IRQL to High */ + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + /* Check the Current State */ + if (CallbackRecord->State == BufferInserted) { + + /* Reset state and remove from list */ + CallbackRecord->State = BufferEmpty; + RemoveEntryList(&CallbackRecord->Entry); + + Status = TRUE; + } + + /* Lower IRQL and return */ + KeLowerIrql(OldIrql); + return Status; +} + +/* + * @implemented + */ +BOOLEAN +STDCALL KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord, - PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, - PVOID Buffer, - ULONG Length, - PUCHAR Component) + PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, + PVOID Buffer, + ULONG Length, + PUCHAR Component) { + KIRQL OldIrql; + BOOLEAN Status = FALSE; + + /* Raise IRQL to High */ + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + /* Check the Current State first so we don't double-register */ + if (CallbackRecord->State == BufferEmpty) { + + /* Set the Callback Settings and insert into the list */ + CallbackRecord->Length = Length; + CallbackRecord->Buffer = Buffer; + CallbackRecord->Component = Component; + CallbackRecord->CallbackRoutine = CallbackRoutine; + CallbackRecord->State = BufferInserted; + InsertTailList(&BugcheckCallbackListHead, &CallbackRecord->Entry); + + Status = TRUE; + }
- /* Check the Current State first so we don't double-register */ - if (CallbackRecord->State == BufferEmpty) { - CallbackRecord->Length = Length; - CallbackRecord->Buffer = Buffer; - CallbackRecord->Component = Component; - CallbackRecord->CallbackRoutine = CallbackRoutine; - CallbackRecord->State = BufferInserted; - InsertTailList(&BugcheckCallbackListHead, &CallbackRecord->Entry); - - return TRUE; - } - - /* The Callback was already registered */ - return(FALSE); + /* Lower IRQL and return */ + KeLowerIrql(OldIrql); + return Status; }
-VOID STDCALL -KeBugCheckWithTf(ULONG BugCheckCode, - ULONG BugCheckParameter1, - ULONG BugCheckParameter2, - ULONG BugCheckParameter3, - ULONG BugCheckParameter4, - PKTRAP_FRAME Tf) +/* + * @implemented + */ +BOOLEAN +STDCALL +KeRegisterBugCheckReasonCallback(IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + IN KBUGCHECK_CALLBACK_REASON Reason, + IN PUCHAR Component) { - PRTL_MESSAGE_RESOURCE_ENTRY Message; - NTSTATUS Status; - ULONG Mask; - KIRQL OldIrql; + KIRQL OldIrql; + BOOLEAN Status = FALSE; + + /* Raise IRQL to High */ + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + /* Check the Current State first so we don't double-register */ + if (CallbackRecord->State == BufferEmpty) { + + /* Set the Callback Settings and insert into the list */ + CallbackRecord->Component = Component; + CallbackRecord->CallbackRoutine = CallbackRoutine; + CallbackRecord->State = BufferInserted; + CallbackRecord->Reason = Reason; + InsertTailList(&BugcheckReasonCallbackListHead, &CallbackRecord->Entry); + + Status = TRUE; + }
- /* Make sure we're switching back to the blue screen and print messages on it */ - HalReleaseDisplayOwnership(); - if (0 == (KdDebugState & KD_DEBUG_GDB)) - { - KdDebugState |= KD_DEBUG_SCREEN; + /* Lower IRQL and return */ + KeLowerIrql(OldIrql); + return Status; +} + +VOID +STDCALL +KeGetBugMessageText(ULONG BugCheckCode, PANSI_STRING OutputString) +{ + ULONG i; + ULONG IdOffset; + ULONG_PTR MessageEntry; + PCHAR BugCode; + + /* Find the message. This code is based on RtlFindMesssage -- Alex */ + for (i = 0; i < KiBugCodeMessages->NumberOfBlocks; i++) { + + /* Check if the ID Matches */ + if ((BugCheckCode >= KiBugCodeMessages->Blocks[i].LowId) && + (BugCheckCode <= KiBugCodeMessages->Blocks[i].HighId)) { + + /* Get Offset to Entry */ + MessageEntry = (ULONG_PTR)KiBugCodeMessages + KiBugCodeMessages->Blocks[i].OffsetToEntries; + IdOffset = BugCheckCode - KiBugCodeMessages->Blocks[i].LowId; + + /* Get offset to ID */ + for (i = 0; i < IdOffset; i++) { + + /* Advance in the Entries */ + MessageEntry += ((PRTL_MESSAGE_RESOURCE_ENTRY)MessageEntry)->Length; + } + + /* Get the final Code */ + BugCode = ((PRTL_MESSAGE_RESOURCE_ENTRY)MessageEntry)->Text; + + /* Return it in the OutputString */ + if (OutputString) { + + OutputString->Buffer = BugCode; + OutputString->Length = strlen(BugCode) + 1; + OutputString->MaximumLength = strlen(BugCode) + 1; + + } else { + + /* Direct Output to Screen */ + DbgPrint("%s\n", BugCode); + break; + } + } } +}
- Ke386DisableInterrupts(); - DebugLogDumpMessages(); +VOID +STDCALL +KiDoBugCheckCallbacks(VOID) +{ + PKBUGCHECK_CALLBACK_RECORD CurrentRecord; + PLIST_ENTRY ListHead; + PLIST_ENTRY NextEntry; + + /* FIXME: Check Checksum and add support for WithReason Callbacks */ + + /* First make sure that the list is Initialized... it might not be */ + ListHead = &BugcheckCallbackListHead; + if (ListHead->Flink && ListHead->Blink) { + + /* Loop the list */ + NextEntry = ListHead->Flink; + while (NextEntry != ListHead) { + + /* Get the Callback Record */ + CurrentRecord = CONTAINING_RECORD(NextEntry, + KBUGCHECK_CALLBACK_RECORD, + Entry); + + /* Make sure it's inserted */ + if (CurrentRecord->State == BufferInserted) { + + /* Call the routine */ + CurrentRecord->State = BufferStarted; + (CurrentRecord->CallbackRoutine)(CurrentRecord->Buffer, + CurrentRecord->Length); + CurrentRecord->State = BufferFinished; + } + + /* Move to next Entry */ + NextEntry = NextEntry->Flink; + } + } +}
- if (MmGetKernelAddressSpace()->Lock.Owner == KeGetCurrentThread()) - { - MmUnlockAddressSpace(MmGetKernelAddressSpace()); +VOID +STDCALL +KeBugCheckWithTf(ULONG BugCheckCode, + ULONG BugCheckParameter1, + ULONG BugCheckParameter2, + ULONG BugCheckParameter3, + ULONG BugCheckParameter4, + PKTRAP_FRAME Tf) +{ + KIRQL OldIrql; + BOOLEAN GotExtendedCrashInfo = FALSE; + PVOID Address = 0; + PLIST_ENTRY CurrentEntry; + MODULE_TEXT_SECTION* CurrentSection = NULL; + extern LIST_ENTRY ModuleTextListHead; + + /* Make sure we're switching back to the blue screen and print messages on it */ + HalReleaseDisplayOwnership(); + if (0 == (KdDebugState & KD_DEBUG_GDB)) KdDebugState |= KD_DEBUG_SCREEN; + + /* Try to find out who did this. For this, we need a Trap Frame. + * Note: Some special BSODs pass the Frame/EIP as a Param. MSDN has the + * info so it eventually needs to be supported. + */ + if (Tf) { + + /* For now, get Address from EIP */ + Address = (PVOID)Tf->Eip; + + /* Try to get information on the module */ + CurrentEntry = ModuleTextListHead.Flink; + while (CurrentEntry != &ModuleTextListHead && CurrentEntry != NULL) { + + /* Get the current Section */ + CurrentSection = CONTAINING_RECORD(CurrentEntry, + MODULE_TEXT_SECTION, + ListEntry); + + /* Check if this is the right one */ + if ((Address != NULL && (Address >= (PVOID)CurrentSection->Base && + Address < (PVOID)(CurrentSection->Base + CurrentSection->Length)))) { + + /* We got it */ + GotExtendedCrashInfo = TRUE; + break; + } + + /* Loop again */ + CurrentEntry = CurrentEntry->Flink; + } } + + /* Raise IRQL to HIGH_LEVEL */ + Ke386DisableInterrupts(); + KeRaiseIrql(HIGH_LEVEL, &OldIrql);
- if (KeGetCurrentIrql() < DISPATCH_LEVEL) - { - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + /* Disable Interrupts, Dump Debug Messages */ + DebugLogDumpMessages(); + + /* Unload the Kernel Adress Space if we own it */ + if (MmGetKernelAddressSpace()->Lock.Owner == KeGetCurrentThread()) + MmUnlockAddressSpace(MmGetKernelAddressSpace()); + + /* FIXMEs: Use inbv to clear, fill and write to screen. */ + + /* Show the STOP Message */ + DbgPrint("A problem has been detected and ReactOS has been shut down to prevent " + "damage to your computer.\n\n"); + + /* Show the module name of who caused this */ + if (GotExtendedCrashInfo) { + + DbgPrint("The problem seems to be caused by the following file: %S\n\n", CurrentSection->Name); } - DbgPrint("Bug detected (code %x param %x %x %x %x)\n", - BugCheckCode, - BugCheckParameter1, - BugCheckParameter2, - BugCheckParameter3, - BugCheckParameter4);
- Status = RtlFindMessage((PVOID)KERNEL_BASE, //0xC0000000, - 11, //RT_MESSAGETABLE, - 0x09, //0x409, - BugCheckCode, - &Message); - if (NT_SUCCESS(Status)) - { - if (Message->Flags == 0) - DbgPrint(" %s\n", Message->Text); - else - DbgPrint(" %S\n", (PWSTR)Message->Text); + /* Find the Bug Code String */ + KeGetBugMessageText(BugCheckCode, NULL); + + /* Show the techincal Data */ + DbgPrint("Technical information:\n\n*** STOP: 0x%08lX (0x%p,0x%p,0x%p,0x%p)\n\n", + BugCheckCode, + BugCheckParameter1, + BugCheckParameter2, + BugCheckParameter3, + BugCheckParameter4); + + /* Show the module name and more data of who caused this */ + if (GotExtendedCrashInfo) { + + DbgPrint("*** %S - Address 0x%p base at 0x%p, DateStamp 0x%x\n\n", + CurrentSection->Name, + Address, + CurrentSection->Base, + 0); } - else - { - DbgPrint(" No message text found!\n\n"); - } - Mask = 1 << KeGetCurrentProcessorNumber(); - if (InBugCheck & Mask) - { -#ifdef MP - DbgPrint("Recursive bug check on CPU%d, halting now\n", KeGetCurrentProcessorNumber()); - /* - * FIXME: - * Send an ipi to all other processors which halt them too. - */ -#else - DbgPrint("Recursive bug check halting now\n"); + + /* There can only be one Bugcheck per Bootup */ + if (!InterlockedDecrement(&KeBugCheckCount)) { + +#ifdef CONFIG_SMP + ULONG i; + /* Freeze the other CPUs */ + for (i = 0; i < KeNumberProcessors; i++) { + if (i != KeGetCurrentProcessorNumber()) { + + /* Send the IPI and give them one second to catch up */ + KiIpiSendRequest(1 << i, IPI_REQUEST_FREEZE); + KeStallExecutionProcessor(1000000); + } + } #endif - Ke386HaltProcessor(); - } - /* - * FIXME: - * Use InterlockedOr or InterlockedBitSet. - */ - InBugCheck |= Mask; - if (Tf != NULL) - { - KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2); - } - else - { + + /* Check if we got a Trap Frame */ + if (Tf) { + + /* Dump it */ + KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2); + + } else { + + /* We can only dump the frames */ #if defined(__GNUC__) - KeDumpStackFrames((PULONG)__builtin_frame_address(0)); + KeDumpStackFrames((PULONG)__builtin_frame_address(0)); #elif defined(_MSC_VER) - __asm push ebp - __asm call KeDumpStackFrames - __asm add esp, 4 + __asm push ebp + __asm call KeDumpStackFrames + __asm add esp, 4 #else #error Unknown compiler for inline assembler #endif - } - MmDumpToPagingFile(BugCheckCode, BugCheckParameter1, - BugCheckParameter2, BugCheckParameter3, - BugCheckParameter4, Tf); + } + + /* Call the Callbacks */; + KiDoBugCheckCallbacks();
- if (KdDebuggerEnabled) - { - Ke386EnableInterrupts(); - DbgBreakPointNoBugCheck(); - Ke386DisableInterrupts(); + /* Dump the BSOD to the Paging File */ + MmDumpToPagingFile(BugCheckCode, + BugCheckParameter1, + BugCheckParameter2, + BugCheckParameter3, + BugCheckParameter4, + Tf); + + /* Wake up the Debugger */ + if (KdDebuggerEnabled) { + Ke386EnableInterrupts(); + DbgBreakPointWithStatus(DBG_STATUS_BUGCHECK_SECOND); + Ke386DisableInterrupts(); + } }
- for (;;) - { - /* - * FIXME: - * Send an ipi to all other processors which halt them too. - */ - Ke386HaltProcessor(); - } + /* Halt this CPU now */ + for (;;) Ke386HaltProcessor(); }
/* * @implemented - */ -VOID STDCALL -KeBugCheckEx(ULONG BugCheckCode, - ULONG BugCheckParameter1, - ULONG BugCheckParameter2, - ULONG BugCheckParameter3, - ULONG BugCheckParameter4) -/* + * * FUNCTION: Brings the system down in a controlled manner when an * inconsistency that might otherwise cause corruption has been detected * ARGUMENTS: @@ -202,23 +447,34 @@ * BugCheckParameter[1-4] = Additional information about bug * RETURNS: Doesn't */ +VOID +STDCALL +KeBugCheckEx(ULONG BugCheckCode, + ULONG BugCheckParameter1, + ULONG BugCheckParameter2, + ULONG BugCheckParameter3, + ULONG BugCheckParameter4) { - KeBugCheckWithTf(BugCheckCode, BugCheckParameter1, BugCheckParameter2, - BugCheckParameter3, BugCheckParameter4, NULL); + /* Call the Trap Frame version without a Trap Frame */ + KeBugCheckWithTf(BugCheckCode, + BugCheckParameter1, + BugCheckParameter2, + BugCheckParameter3, + BugCheckParameter4, + NULL); }
/* * @implemented - */ -VOID STDCALL -KeBugCheck(ULONG BugCheckCode) -/* + * * FUNCTION: Brings the system down in a controlled manner when an * inconsistency that might otherwise cause corruption has been detected * ARGUMENTS: * BugCheckCode = Specifies the reason for the bug check * RETURNS: Doesn't */ +VOID STDCALL +KeBugCheck(ULONG BugCheckCode) { KeBugCheckEx(BugCheckCode, 0, 0, 0, 0); } _____
Modified: trunk/reactos/ntoskrnl/ke/catch.c --- trunk/reactos/ntoskrnl/ke/catch.c 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/ke/catch.c 2005-03-12 16:01:30 UTC (rev 13969) @@ -260,19 +260,6 @@
/* * @unimplemented */ -BOOLEAN -STDCALL -KeDeregisterBugCheckReasonCallback( - IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord - ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ ULONG STDCALL KeGetRecommendedSharedDataAlignment( @@ -283,20 +270,4 @@ return 0; }
-/* - * @unimplemented - */ -BOOLEAN -STDCALL -KeRegisterBugCheckReasonCallback( - IN PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, - IN KBUGCHECK_CALLBACK_REASON Reason, - IN PUCHAR Component - ) -{ - UNIMPLEMENTED; - return FALSE; -} - /* EOF */ _____
Modified: trunk/reactos/ntoskrnl/ke/i386/brkpoint.c --- trunk/reactos/ntoskrnl/ke/i386/brkpoint.c 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/ke/i386/brkpoint.c 2005-03-12 16:01:30 UTC (rev 13969) @@ -1,4 +1,4 @@
-/* $Id:$ +/* $Id$ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -34,10 +34,10 @@ * @implemented */ #if defined(__GNUC__) -__asm__(".globl _DbgBreakPointNoBugCheck@0\n\t" - "_DbgBreakPointNoBugCheck@0:\n\t" - "int $3\n\t" - "ret\n\t"); + __asm__(".globl _DbgBreakPointNoBugCheck@0\n\t" + "_DbgBreakPointNoBugCheck@0:\n\t" + "int $3\n\t" + "ret\n\t"); #endif
/* _____
Modified: trunk/reactos/ntoskrnl/ke/i386/kernel.c --- trunk/reactos/ntoskrnl/ke/i386/kernel.c 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/ke/i386/kernel.c 2005-03-12 16:01:30 UTC (rev 13969) @@ -355,7 +355,7 @@
{ PKPCR Pcr = KeGetCurrentKPCR();
- KeInitializeBugCheck(); + KiInitializeBugCheck(); KeInitializeDispatcher(); KiInitializeSystemClock();
_____
Modified: trunk/reactos/ntoskrnl/ke/spinlock.c --- trunk/reactos/ntoskrnl/ke/spinlock.c 2005-03-12 14:15:49 UTC (rev 13968) +++ trunk/reactos/ntoskrnl/ke/spinlock.c 2005-03-12 16:01:30 UTC (rev 13969) @@ -178,11 +178,7 @@
* FIXME: This depends on gcc assembling this test to a single load from * the spinlock's value. */ - if (*SpinLock >= 2) - { - DbgPrint("Lock %x has bad value %x\n", SpinLock, *SpinLock); - KEBUGCHECK(0); - } + ASSERT(*SpinLock == 0 || 1);
while ((i = InterlockedExchangeUL(SpinLock, 1)) == 1) { @@ -199,7 +195,7 @@ #endif #else DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i); - KEBUGCHECK(0); + KEBUGCHECKEX(SPIN_LOCK_ALREADY_OWNED, (ULONG)SpinLock, 0, 0, 0); #endif /* CONFIG_SMP */ } } @@ -227,7 +223,7 @@ if (*SpinLock != 1) { DbgPrint("Releasing unacquired spinlock %x\n", SpinLock); - KEBUGCHECK(0); + KEBUGCHECKEX(SPIN_LOCK_NOT_OWNED, (ULONG)SpinLock, 0, 0, 0); } (void)InterlockedExchangeUL(SpinLock, 0); }