Author: ion
Date: Wed Jan 17 23:44:37 2007
New Revision: 25501
URL:
http://svn.reactos.org/svn/reactos?rev=25501&view=rev
Log:
[10 bug fixes]:
- Simplify KiSelectReadyThread.
- Use ASSERT_IRQL_EQUAL instead of ASSERT_IRQL, because ASSERT_IRQL is braindead and
doesn't actually do what the name proposes. This caused us to miss many critical bugs.
- Don't lower IRQL to PASSIVE_LEVEL after KeInsertQueueApc. This caused a call to
KiExitDispatcher at PASSIVE, which is completely fucked. Also do the same fix in
KeFreezeAllThreads and KeThawAllThreads.
- Implement code in KiDispatchInterrupt to switch to a new thread, but don't enable
for now.
- Fix the KiMask32Array. One of the values was totally off and screwed up
priority/affinity masks.
- Exit the dispatcher in KiAdjustQuantumThread. This wasn't done, thus causing a weird
system state.
- Fix a bug in KiSetPriorityThread which wasn't properly checking the
ProcessReadyQueue member and thus not applying priority changes.
- Fixup lock release and dispatcher exit in wait functions in the NoWait case. It was
inverted and messed up, leading to system inconsistency.
Modified:
trunk/reactos/include/ndk/asm.h
trunk/reactos/ntoskrnl/KrnlFun.c
trunk/reactos/ntoskrnl/include/internal/ke_x.h
trunk/reactos/ntoskrnl/io/iomgr/controller.c
trunk/reactos/ntoskrnl/io/iomgr/deviface.c
trunk/reactos/ntoskrnl/ke/apc.c
trunk/reactos/ntoskrnl/ke/dpc.c
trunk/reactos/ntoskrnl/ke/i386/cpu.c
trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S
trunk/reactos/ntoskrnl/ke/i386/thread.c
trunk/reactos/ntoskrnl/ke/i386/trap.s
trunk/reactos/ntoskrnl/ke/thrdobj.c
trunk/reactos/ntoskrnl/ke/thrdschd.c
trunk/reactos/ntoskrnl/ke/wait.c
trunk/reactos/ntoskrnl/ps/kill.c
trunk/reactos/ntoskrnl/vdm/vdmexec.c
Modified: trunk/reactos/include/ndk/asm.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/asm.h?rev=2550…
==============================================================================
--- trunk/reactos/include/ndk/asm.h (original)
+++ trunk/reactos/include/ndk/asm.h Wed Jan 17 23:44:37 2007
@@ -101,15 +101,16 @@
#define KTHREAD_STACK_LIMIT 0x1C
#define KTHREAD_TEB 0x74
#define KTHREAD_KERNEL_STACK 0x20
-#define KTHREAD_STATE 0x4C
-#define KTHREAD_NPX_STATE 0x4D
#define KTHREAD_ALERTED 0x5E
#define KTHREAD_APCSTATE_PROCESS 0x28 + 0x10
#define KTHREAD_PENDING_USER_APC 0x28 + 0x16
#define KTHREAD_PENDING_KERNEL_APC 0x28 + 0x15
#define KTHREAD_CONTEXT_SWITCHES 0x48
+#define KTHREAD_STATE 0x4C
+#define KTHREAD_NPX_STATE 0x4D
#define KTHREAD_WAIT_IRQL 0x4E
#define KTHREAD_NEXT_PROCESSOR 0x40
+#define KTHREAD_WAIT_REASON 0x5A
#define KTHREAD_SWAP_BUSY 0x5D
#define KTHREAD_SERVICE_TABLE 0x118
#define KTHREAD_PREVIOUS_MODE 0xD7
Modified: trunk/reactos/ntoskrnl/KrnlFun.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/KrnlFun.c?rev=255…
==============================================================================
--- trunk/reactos/ntoskrnl/KrnlFun.c (original)
+++ trunk/reactos/ntoskrnl/KrnlFun.c Wed Jan 17 23:44:37 2007
@@ -8,12 +8,15 @@
// Do NOT ask when it will be fixed.
// Failure to respect this will *ACHIEVE NOTHING*.
//
+// Ke1:
+// - Implement KiInitMachineDependent.
+// - Implement Privileged Instruction Handler in Umode GPF.
+//
// Ex:
// - Use pushlocks for handle implementation.
//
-// Ke1:
-// - Implement KiInitMachineDependent.
-// - Implement Privileged Instruction Handler in Umode GPF.
+// Ke2:
+// - Dispatcher Rewrite (DPCs-Timers-Waits).
//
// Hal:
// - Use APC and DPC Interrupt Dispatchers.
@@ -21,10 +24,6 @@
//
// Fstub:
// - Implement IoAssignDriveLetters using mount manager support.
-//
-// Ke2:
-// - New optimized table-based tick-hashed timer implementation.
-// - New Thread Scheduler based on 2003.
//
// Kd:
// - Implement KD Kernel Debugging and WinDBG support.
Modified: trunk/reactos/ntoskrnl/include/internal/ke_x.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ke_x.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/ke_x.h Wed Jan 17 23:44:37 2007
@@ -1257,21 +1257,20 @@
KiSelectReadyThread(IN KPRIORITY Priority,
IN PKPRCB Prcb)
{
- LONG PriorityMask, PrioritySet, HighPriority;
+ ULONG PrioritySet, HighPriority;
PLIST_ENTRY ListEntry;
PKTHREAD Thread = NULL;
/* Save the current mask and get the priority set for the CPU */
- PriorityMask = Priority;
- PrioritySet = Prcb->ReadySummary >> (UCHAR)Priority;
+ PrioritySet = Prcb->ReadySummary >> Priority;
if (!PrioritySet) goto Quickie;
- /* Get the highest priority possible */
+ /* Get the highest priority possible */
BitScanReverse((PULONG)&HighPriority, PrioritySet);
ASSERT((PrioritySet & PRIORITY_MASK(HighPriority)) != 0);
- HighPriority += PriorityMask;
-
- /* Make sure the list isn't at highest priority */
+ HighPriority += Priority;
+
+ /* Make sure the list isn't empty at the highest priority */
ASSERT(IsListEmpty(&Prcb->DispatcherReadyListHead[HighPriority]) == FALSE);
/* Get the first thread on the list */
Modified: trunk/reactos/ntoskrnl/io/iomgr/controller.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/controll…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/controller.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/controller.c Wed Jan 17 23:44:37 2007
@@ -28,7 +28,7 @@
IN PVOID Context)
{
IO_ALLOCATION_ACTION Result;
- ASSERT_IRQL(DISPATCH_LEVEL);
+ ASSERT_IRQL_EQUAL(DISPATCH_LEVEL);
/* Initialize the Wait Context Block */
DeviceObject->Queue.Wcb.DeviceContext = Context;
Modified: trunk/reactos/ntoskrnl/io/iomgr/deviface.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/deviface…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/deviface.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/deviface.c Wed Jan 17 23:44:37 2007
@@ -632,7 +632,7 @@
NTSTATUS Status;
PEXTENDED_DEVOBJ_EXTENSION DeviceObjectExtension;
- ASSERT_IRQL(PASSIVE_LEVEL);
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
DPRINT("IoRegisterDeviceInterface(): PDO %p, RefString: %wZ\n",
PhysicalDeviceObject, ReferenceString);
Modified: trunk/reactos/ntoskrnl/ke/apc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/apc.c?rev=2550…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/apc.c (original)
+++ trunk/reactos/ntoskrnl/ke/apc.c Wed Jan 17 23:44:37 2007
@@ -725,7 +725,7 @@
}
/* Release the APC lock and return success */
- KiReleaseApcLock(&ApcLock);
+ KiReleaseApcLockFromDpcLevel(&ApcLock);
KiExitDispatcher(ApcLock.OldIrql);
return State;
}
@@ -951,3 +951,4 @@
}
+
Modified: trunk/reactos/ntoskrnl/ke/dpc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/dpc.c?rev=2550…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/dpc.c (original)
+++ trunk/reactos/ntoskrnl/ke/dpc.c Wed Jan 17 23:44:37 2007
@@ -199,7 +199,7 @@
DeferredContext,
SystemArgument1,
SystemArgument2);
- ASSERT_IRQL(DISPATCH_LEVEL);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
/* Disable interrupts and keep looping */
_disable();
Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/cpu.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/cpu.c Wed Jan 17 23:44:37 2007
@@ -764,7 +764,7 @@
KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save)
{
PFNSAVE_FORMAT FpState;
- ASSERT_IRQL(DISPATCH_LEVEL);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
DPRINT1("%s is not really implemented\n", __FUNCTION__);
/* check if we are doing software emulation */
Modified: trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/ctxswitch…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S (original)
+++ trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S Wed Jan 17 23:44:37 2007
@@ -11,11 +11,11 @@
/* INCLUDES ******************************************************************/
#include <roscfg.h>
-#include <internal/i386/ke.h>
#include <ndk/asm.h>
.intel_syntax noprefix
#define Running 2
+#define WrDispatchInt 0x1F
/* FUNCTIONS ****************************************************************/
@@ -289,6 +289,7 @@
* Absolutely all registers except ESP can be trampled here for maximum code
flexibility.
*
*--*/
+.globl @KiSwapContextInternal@0
.func @KiSwapContextInternal@0, @KiSwapContextInternal@0
@KiSwapContextInternal@0:
@@ -413,7 +414,7 @@
sub eax, NPX_FRAME_LENGTH
/* Check if this isn't V86 Mode, so we can bias the Esp0 */
- test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz NoAdjust
/* Bias esp */
@@ -562,7 +563,6 @@
.globl @KiSwapContext@8
.func @KiSwapContext@8, @KiSwapContext@8
@KiSwapContext@8:
- /* Note, we CANNOT touch ebp */
/* Save 4 registers */
sub esp, 4 * 4
@@ -664,7 +664,7 @@
/* Set the current thread to ready */
mov edi, [ebx+KPCR_CURRENT_THREAD]
#ifdef CONFIG_SMP
- mov [edi+KTHREAD_STATE], Ready
+ mov byte ptr [edi+KTHREAD_SWAP_BUSY], 1
/* Acquire the PRCB Lock */
lock bts [ebx+KPCR_PRCB_PRCB_LOCK], 0
Modified: trunk/reactos/ntoskrnl/ke/i386/thread.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/thread.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/thread.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/thread.c Wed Jan 17 23:44:37 2007
@@ -6,18 +6,18 @@
* PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
*/
-/* INCLUDES ****************************************************************/
+/* INCLUDES ******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
-#include <internal/debug.h>
-
-typedef struct _KSHARED_CTXSWITCH_FRAME
+#include <debug.h>
+
+typedef struct _KSWITCHFRAME
{
PVOID ExceptionList;
- KIRQL WaitIrql;
- PVOID RetEip;
-} KSHARED_CTXSWITCH_FRAME, *PKSHARED_CTXSWITCH_FRAME;
+ BOOLEAN ApcBypassDisable;
+ PVOID RetAddr;
+} KSWITCHFRAME, *PKSWITCHFRAME;
typedef struct _KSTART_FRAME
{
@@ -27,65 +27,47 @@
BOOLEAN UserThread;
} KSTART_FRAME, *PKSTART_FRAME;
-/*
- * This is the Initial Thread Stack Frame on i386.
- *
- * It is composed of :
- *
- * - A shared Thread Switching frame so that we can use
- * the context-switching code when initializing the thread.
- *
- * - The Stack Frame for KiThreadStartup, which are the parameters
- * that it will receive (System/Start Routines & Context)
- *
- * - A Trap Frame with the Initial Context *IF AND ONLY IF THE THREAD IS USER*
- *
- * - The FPU Save Area, theoretically part of the Trap Frame's
"ExtendedRegisters"
- *
- * This Initial Thread Stack Frame starts at Thread->InitialStack and it spans
- * a total size of 0x2B8 bytes.
- */
-typedef struct _KUINIT_FRAME {
- KSHARED_CTXSWITCH_FRAME CtxSwitchFrame; /* -0x2B8 */
- KSTART_FRAME StartFrame; /* -0x2AC */
- KTRAP_FRAME TrapFrame; /* -0x29C */
- FX_SAVE_AREA FxSaveArea; /* -0x210 */
+typedef struct _KUINIT_FRAME
+{
+ KSWITCHFRAME CtxSwitchFrame;
+ KSTART_FRAME StartFrame;
+ KTRAP_FRAME TrapFrame;
+ FX_SAVE_AREA FxSaveArea;
} KUINIT_FRAME, *PKUINIT_FRAME;
-typedef struct _KKINIT_FRAME {
- KSHARED_CTXSWITCH_FRAME CtxSwitchFrame; /* -0x22C */
- KSTART_FRAME StartFrame; /* -0x220 */
- FX_SAVE_AREA FxSaveArea; /* -0x210 */
+typedef struct _KKINIT_FRAME
+{
+ KSWITCHFRAME CtxSwitchFrame;
+ KSTART_FRAME StartFrame;
+ FX_SAVE_AREA FxSaveArea;
} KKINIT_FRAME, *PKKINIT_FRAME;
/* FUNCTIONS *****************************************************************/
VOID
-STDCALL
-Ke386InitThreadWithContext(PKTHREAD Thread,
- PKSYSTEM_ROUTINE SystemRoutine,
- PKSTART_ROUTINE StartRoutine,
- PVOID StartContext,
- PCONTEXT ContextPointer)
+NTAPI
+Ke386InitThreadWithContext(IN PKTHREAD Thread,
+ IN PKSYSTEM_ROUTINE SystemRoutine,
+ IN PKSTART_ROUTINE StartRoutine,
+ IN PVOID StartContext,
+ IN PCONTEXT ContextPointer)
{
PFX_SAVE_AREA FxSaveArea;
PFXSAVE_FORMAT FxSaveFormat;
PKSTART_FRAME StartFrame;
- PKSHARED_CTXSWITCH_FRAME CtxSwitchFrame;
+ PKSWITCHFRAME CtxSwitchFrame;
PKTRAP_FRAME TrapFrame;
CONTEXT LocalContext;
PCONTEXT Context = NULL;
ULONG ContextFlags;
/* Check if this is a With-Context Thread */
- DPRINT("Ke386InitThreadContext\n");
if (ContextPointer)
{
/* Set up the Initial Frame */
PKUINIT_FRAME InitFrame;
InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack -
sizeof(KUINIT_FRAME));
- DPRINT("Setting up a user-mode thread. InitFrame at: %p\n", InitFrame);
/* Copy over the context we got */
RtlCopyMemory(&LocalContext, ContextPointer, sizeof(CONTEXT));
@@ -190,7 +172,6 @@
PKKINIT_FRAME InitFrame;
InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack -
sizeof(KKINIT_FRAME));
- DPRINT("Setting up a kernel thread. InitFrame at: %p\n", InitFrame);
/* Setup the Fx Area */
FxSaveArea = &InitFrame->FxSaveArea;
@@ -230,15 +211,14 @@
StartFrame->SystemRoutine = SystemRoutine;
/* And set up the Context Switch Frame */
- CtxSwitchFrame->RetEip = KiThreadStartup;
- CtxSwitchFrame->WaitIrql = APC_LEVEL;
- CtxSwitchFrame->ExceptionList = (PVOID)0xFFFFFFFF;
+ CtxSwitchFrame->RetAddr = KiThreadStartup;
+ CtxSwitchFrame->ApcBypassDisable = TRUE;
+ CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;;
/* Save back the new value of the kernel stack. */
- DPRINT("Final Kernel Stack: %x \n", CtxSwitchFrame);
Thread->KernelStack = (PVOID)CtxSwitchFrame;
- return;
}
/* EOF */
+
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/trap.s?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/trap.s (original)
+++ trunk/reactos/ntoskrnl/ke/i386/trap.s Wed Jan 17 23:44:37 2007
@@ -11,6 +11,9 @@
#include <asm.h>
#include <internal/i386/asmmacro.S>
.intel_syntax noprefix
+
+#define Running 2
+#define WrDispatchInt 0x1F
/* GLOBALS *******************************************************************/
@@ -2082,7 +2085,7 @@
/* Restore stack and exception list */
pop esp
- pop dword ptr [ebx]
+ pop dword ptr [ebx+KPCR_EXCEPTION_LIST]
pop ebp
CheckQuantum:
@@ -2096,10 +2099,44 @@
/* Check if we have a thread to swap to */
cmp byte ptr [ebx+KPCR_PRCB_NEXT_THREAD], 0
- jz Return
-
- /* FIXME: Schedule new thread */
- UNHANDLED_PATH
+ jmp Return
+
+ /* Make space on the stack to save registers */
+ sub esp, 3 * 4
+ mov [esp+8], esi
+ mov [esi+4], edi
+ mov [esi+0], ebp
+
+ /* Get the current thread */
+ mov edi, [ebx+KPCR_CURRENT_THREAD]
+
+#ifdef CONFIG_SMP
+ #error SMP Interrupt not handled!
+#endif
+
+ /* Get the next thread and clear it */
+ mov esi, [ebx+KPCR_PRCB_NEXT_THREAD]
+ and dword ptr [ebx+KPCR_PRCB_NEXT_THREAD], 0
+
+ /* Set us as the current running thread */
+ mov [ebx+KPCR_CURRENT_THREAD], esi
+ mov byte ptr [esi+KTHREAD_STATE], Running
+ mov byte ptr [edi+KTHREAD_WAIT_REASON], WrDispatchInt
+
+ /* Put thread in ECX and get the PRCB in EDX */
+ mov ecx, edi
+ lea edx, [ebx+KPCR_PRCB_DATA]
+ call @KiQueueReadyThread@8
+
+ /* Set APC_LEVEL and do the swap */
+ mov cl, APC_LEVEL
+ call @KiSwapContextInternal@0
+
+ /* Restore registers */
+ mov ebp, [esp+0]
+ mov edi, [esp+4]
+ mov esi, [esp+8]
+ add esp, 3*4
Return:
/* All done */
Modified: trunk/reactos/ntoskrnl/ke/thrdobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/thrdobj.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/thrdobj.c (original)
+++ trunk/reactos/ntoskrnl/ke/thrdobj.c Wed Jan 17 23:44:37 2007
@@ -18,7 +18,7 @@
ULONG KiMask32Array[MAXIMUM_PRIORITY] =
{
0x1, 0x2, 0x4, 0x8, 0x10, 0x20,
- 0x40, 0x80, 0x100, 0x200, 0x4000, 0x800,
+ 0x40, 0x80, 0x100, 0x200, 0x400, 0x800,
0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000,
0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000,
0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000,
@@ -311,7 +311,7 @@
} while (NextEntry != ListHead);
/* Release the process lock and exit the dispatcher */
- KiReleaseProcessLock(&LockHandle);
+ KiReleaseProcessLockFromDpcLevel(&LockHandle);
KiExitDispatcher(LockHandle.OldIrql);
}
@@ -634,7 +634,7 @@
} while (NextEntry != ListHead);
/* Release the process lock and exit the dispatcher */
- KiReleaseProcessLock(&LockHandle);
+ KiReleaseProcessLockFromDpcLevel(&LockHandle);
KiExitDispatcher(LockHandle.OldIrql);
/* Leave the critical region */
Modified: trunk/reactos/ntoskrnl/ke/thrdschd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/thrdschd.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/thrdschd.c (original)
+++ trunk/reactos/ntoskrnl/ke/thrdschd.c Wed Jan 17 23:44:37 2007
@@ -21,6 +21,15 @@
/* FUNCTIONS *****************************************************************/
+VOID
+FASTCALL
+KiQueueReadyThread(IN PKTHREAD Thread,
+ IN PKPRCB Prcb)
+{
+ /* Call the macro. We keep the API for compatibility with ASM code */
+ KxQueueReadyThread(Thread, Prcb);
+}
+
static
VOID
KiInsertIntoThreadList(KPRIORITY Priority,
@@ -247,7 +256,7 @@
if (Process->State != ProcessInMemory)
{
/* We don't page out processes in ROS */
- ASSERT(FALSE);
+ KEBUGCHECK(0);
}
else if (!Thread->KernelStackResident)
{
@@ -260,7 +269,7 @@
Thread->State = Transition;
/* The stack is always resident in ROS */
- ASSERT(FALSE);
+ KEBUGCHECK(0);
}
else
{
@@ -326,10 +335,11 @@
/* Release locks */
KiReleasePrcbLock(Prcb);
KiReleaseThreadLock(Thread);
-}
-
-VOID
-STDCALL
+ KiExitDispatcher(Thread->WaitIrql);
+}
+
+VOID
+NTAPI
KiSetPriorityThread(IN PKTHREAD Thread,
IN KPRIORITY Priority,
OUT PBOOLEAN Released)
@@ -351,7 +361,7 @@
if (Thread->State == Ready)
{
/* Make sure we're not on the ready queue */
- if (Thread->ProcessReadyQueue)
+ if (!Thread->ProcessReadyQueue)
{
/* Get the PRCB for the thread and lock it */
Processor = Thread->NextProcessor;
@@ -362,12 +372,12 @@
if ((Thread->State == Ready) &&
(Thread->NextProcessor == Prcb->Number))
{
+#ifdef NEW_SCHEDULER
/* Sanity check */
ASSERT((Prcb->ReadySummary &
PRIORITY_MASK(Thread->Priority)));
/* Remove it from the current queue */
-#ifdef NEW_SCHEDULER
if (RemoveEntryList(&Thread->WaitListEntry))
{
/* Update the ready summary */
@@ -395,7 +405,6 @@
else
{
/* Release the lock and loop again */
- KEBUGCHECK(0);
KiReleasePrcbLock(Prcb);
continue;
}
@@ -409,7 +418,6 @@
else if (Thread->State == Standby)
{
/* Get the PRCB for the thread and lock it */
- KEBUGCHECK(0);
Processor = Thread->NextProcessor;
Prcb = KiProcessorBlock[Processor];
KiAcquirePrcbLock(Prcb);
Modified: trunk/reactos/ntoskrnl/ke/wait.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/wait.c?rev=255…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/wait.c (original)
+++ trunk/reactos/ntoskrnl/ke/wait.c Wed Jan 17 23:44:37 2007
@@ -161,7 +161,7 @@
BOOLEAN PendingApc;
/* Make sure we're at synchronization level */
- ASSERT_IRQL(SYNCH_LEVEL);
+ ASSERT_IRQL_EQUAL(SYNCH_LEVEL);
/* Check if we have deferred threads */
KiCheckDeferredReadyList(Prcb);
@@ -484,11 +484,11 @@
return WaitStatus;
DontWait:
- /* Adjust the Quantum */
+ /* Release dispatcher lock but maintain high IRQL */
+ KiReleaseDispatcherLockFromDpcLevel();
+
+ /* Adjust the Quantum and return the wait status */
KiAdjustQuantumThread(Thread);
-
- /* Release & Return */
- KiReleaseDispatcherLock(Thread->WaitIrql);
return WaitStatus;
}
@@ -761,11 +761,11 @@
return WaitStatus;
DontWait:
- /* Adjust the Quantum */
+ /* Release dispatcher lock but maintain high IRQL */
+ KiReleaseDispatcherLockFromDpcLevel();
+
+ /* Adjust the Quantum and return the wait status */
KiAdjustQuantumThread(Thread);
-
- /* Release & Return */
- KiReleaseDispatcherLock(Thread->WaitIrql);
return WaitStatus;
}
Modified: trunk/reactos/ntoskrnl/ps/kill.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ps/kill.c?rev=255…
==============================================================================
--- trunk/reactos/ntoskrnl/ps/kill.c (original)
+++ trunk/reactos/ntoskrnl/ps/kill.c Wed Jan 17 23:44:37 2007
@@ -911,7 +911,7 @@
if ((bSelf) || (PsGetCurrentThread() == Thread))
{
/* This should only happen at passive */
- ASSERT_IRQL(PASSIVE_LEVEL);
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
/* Mark it as terminated */
PspSetCrossThreadFlag(Thread, CT_TERMINATED_BIT);
Modified: trunk/reactos/ntoskrnl/vdm/vdmexec.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/vdm/vdmexec.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/vdm/vdmexec.c (original)
+++ trunk/reactos/ntoskrnl/vdm/vdmexec.c Wed Jan 17 23:44:37 2007
@@ -49,7 +49,7 @@
ULONG EFlags, OldEFlags;
/* Make sure that we're at APC_LEVEL and that this is a valid frame */
- ASSERT_IRQL(APC_LEVEL);
+ ASSERT(KeGetCurrentIrql() == APC_LEVEL);
ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
/* Check if this is a V86 frame */
@@ -321,3 +321,4 @@
return TRUE;
}
+