From f29036d97b7f4150fbc5eadbccc1475467397dac Mon Sep 17 00:00:00 2001 From: David Welch Date: Tue, 17 Apr 2001 04:11:01 +0000 Subject: [PATCH] Further SMP work (associate an idle thread with each processor) svn path=/trunk/; revision=1808 --- reactos/ntoskrnl/hal/x86/mpsirql.c | 22 ++++---- reactos/ntoskrnl/include/internal/ke.h | 8 ++- reactos/ntoskrnl/include/internal/mm.h | 5 ++ reactos/ntoskrnl/include/internal/ps.h | 6 +++ reactos/ntoskrnl/ke/bug.c | 6 +-- reactos/ntoskrnl/ke/i386/exp.c | 71 ++++++-------------------- reactos/ntoskrnl/ke/i386/gdt.c | 21 +++++--- reactos/ntoskrnl/ke/i386/kernel.c | 31 ++++++++--- reactos/ntoskrnl/ke/i386/ldt.c | 22 +++++++- reactos/ntoskrnl/ke/i386/multiboot.S | 8 ++- reactos/ntoskrnl/ke/main.c | 8 ++- reactos/ntoskrnl/ke/spinlock.c | 11 ++-- reactos/ntoskrnl/mm/i386/page.c | 71 +++++++++++++++++++++++++- reactos/ntoskrnl/ps/idle.c | 3 +- reactos/ntoskrnl/ps/thread.c | 36 +++++++++++-- 15 files changed, 235 insertions(+), 94 deletions(-) diff --git a/reactos/ntoskrnl/hal/x86/mpsirql.c b/reactos/ntoskrnl/hal/x86/mpsirql.c index 48c9b24b58f..94fd1e6d712 100644 --- a/reactos/ntoskrnl/hal/x86/mpsirql.c +++ b/reactos/ntoskrnl/hal/x86/mpsirql.c @@ -176,17 +176,17 @@ KfLowerIrql ( CurrentIrql = KeGetCurrentKPCR()->Irql; - if (NewIrql > CurrentIrql) - { - DbgPrint ("(%s:%d) NewIrql %x CurrentIrql %x\n", - __FILE__, __LINE__, NewIrql, CurrentIrql); - KeDumpStackFrames (0, 32); - for(;;); - } - - OldIrql = CurrentIrql; + if (NewIrql > CurrentIrql) + { + DbgPrint ("(%s:%d) NewIrql %x CurrentIrql %x\n", + __FILE__, __LINE__, NewIrql, CurrentIrql); + KeBugCheck(0); + for(;;); + } + + OldIrql = CurrentIrql; KeGetCurrentKPCR()->Irql = NewIrql; - HiSwitchIrql(OldIrql, Flags); + HiSwitchIrql(OldIrql, Flags); } @@ -240,7 +240,7 @@ KfRaiseIrql ( ) { KIRQL CurrentIrql; - KIRQL OldIrql; + KIRQL OldIrql; ULONG Flags; //DPRINT("KfRaiseIrql(NewIrql %d)\n", NewIrql); diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index c38b8455c09..eb70e3bd0ec 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -148,7 +148,7 @@ VOID KeExpireTimers( PKDPC Apc, VOID KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type, ULONG Size, ULONG SignalState); -VOID KeDumpStackFrames(PVOID Stack, ULONG NrFrames); +VOID KeDumpStackFrames(PULONG Frame); ULONG KeAllocateGdtSelector(ULONG Desc[2]); VOID KeFreeGdtSelector(ULONG Entry); BOOLEAN KiTestAlert(VOID); @@ -199,6 +199,12 @@ VOID Ki386ApplicationProcessorInitializeTSS(VOID); VOID Ki386BootInitializeTSS(VOID); +VOID +KiGdtPrepareForApplicationProcessorInit(ULONG Id); +VOID +KePrepareForApplicationProcessorInit(ULONG id); +VOID +Ki386InitializeLdt(VOID); #endif /* not __ASM__ */ diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 3406dbe77f5..9c7fb35e950 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -462,4 +462,9 @@ MmGetSavedSwapEntryPage(PVOID PhysicalAddress); #define STATUS_MM_RESTART_OPERATION (0xD0000001) +NTSTATUS +MmCreateVirtualMappingForKernel(PVOID Address, + ULONG flProtect, + ULONG PhysicalAddress); + #endif diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index 704ca814182..df894216b73 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -555,6 +555,12 @@ PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, BOOLEAN DispatcherLock, KIRQL WaitIrql); VOID PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus); +VOID +PsApplicationProcessorInit(VOID); +VOID +PsPrepareForApplicationProcessorInit(ULONG Id); +NTSTATUS +PsIdleThreadMain(PVOID Context); #endif /* ASSEMBLER */ diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index 00761aeb55b..fbf6f91794c 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bug.c,v 1.17 2001/03/16 23:04:59 dwelch Exp $ +/* $Id: bug.c,v 1.18 2001/04/17 04:11:00 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/bug.c @@ -105,7 +105,7 @@ KeBugCheckEx (ULONG BugCheckCode, PsGetCurrentThread()->Cid.UniqueThread); } // PsDumpThreads(); - KeDumpStackFrames(&((&BugCheckCode)[-1]),64); + KeDumpStackFrames((PULONG)__builtin_frame_address(0)); #if 1 for(;;) @@ -148,7 +148,7 @@ KeBugCheck (ULONG BugCheckCode) PsGetCurrentThread()->Cid.UniqueThread); } // PsDumpThreads(); - KeDumpStackFrames(&((&BugCheckCode)[-1]), 80); + KeDumpStackFrames((PULONG)__builtin_frame_address(0)); #if 1 for(;;) { diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 348fa0e554c..32ca3ac6956 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -71,8 +71,6 @@ extern VOID KiTrapUnknown(VOID); extern ULONG init_stack; extern ULONG init_stack_top; -static char KiNullLdt[8] = {0,}; - static char *ExceptionTypeStrings[] = { "Divide Error", @@ -595,43 +593,22 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr) } VOID -KeDumpStackFrames(PVOID _Stack, ULONG NrFrames) +KeDumpStackFrames(PULONG Frame) { - PULONG Stack = (PULONG)_Stack; - ULONG i; - ULONG StackLimit; - - Stack = (PVOID)(((ULONG)Stack) & (~0x3)); - DbgPrint("Stack: %x\n", Stack); - if (PsGetCurrentThread() != NULL) - { - DbgPrint("kernel stack base %x\n", - PsGetCurrentThread()->Tcb.StackLimit); - } + ULONG i; - if (PsGetCurrentThread() != NULL) - { - StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase; - } - else - { - StackLimit = (ULONG)&init_stack_top; - } - - DbgPrint("Frames:\n"); - for (i=0; i KERNEL_BASE) - { - print_address((PVOID)Stack[i]); - DbgPrint(" "); - } - if (Stack[i] == 0xceafbeef) - { - DbgPrint("IRQ "); - } - } - DbgPrint("\n"); + DbgPrint("Frames: "); + i = 1; + while (Frame != NULL) + { + print_address((PVOID)Frame[1]); + Frame = (PULONG)Frame[0]; + i++; + } + if ((i % 8) != 0) + { + DbgPrint("\n"); + } } static void set_system_call_gate(unsigned int sel, unsigned int func) @@ -658,29 +635,15 @@ set_task_gate(unsigned int sel, unsigned task_sel) KiIdt[sel].b = 0x8500; } -void KeInitExceptions(void) +VOID +KeInitExceptions(VOID) /* * FUNCTION: Initalize CPU exception handling */ { int i; - ULONG base, length; - extern USHORT KiBootGdt[]; - DPRINT("KeInitExceptions()\n",0); - - /* - * Set up an a descriptor for the LDT - */ - memset(KiNullLdt, 0, sizeof(KiNullLdt)); - base = (unsigned int)&KiNullLdt; - length = sizeof(KiNullLdt) - 1; - - KiBootGdt[(LDT_SELECTOR / 2) + 0] = (length & 0xFFFF); - KiBootGdt[(LDT_SELECTOR / 2) + 1] = (base & 0xFFFF); - KiBootGdt[(LDT_SELECTOR / 2) + 2] = ((base & 0xFF0000) >> 16) | 0x8200; - KiBootGdt[(LDT_SELECTOR / 2) + 3] = ((length & 0xF0000) >> 16) | - ((base & 0xFF000000) >> 16); + DPRINT("KeInitExceptions()\n"); /* * Set up the other gates diff --git a/reactos/ntoskrnl/ke/i386/gdt.c b/reactos/ntoskrnl/ke/i386/gdt.c index ff4bbbb7951..010af35db30 100644 --- a/reactos/ntoskrnl/ke/i386/gdt.c +++ b/reactos/ntoskrnl/ke/i386/gdt.c @@ -64,6 +64,12 @@ static KSPIN_LOCK GdtLock; /* FUNCTIONS *****************************************************************/ +VOID +KiGdtPrepareForApplicationProcessorInit(ULONG Id) +{ + KiGdtArray[Id] = ExAllocatePool(NonPagedPool, sizeof(USHORT) * 4 * 11); +} + VOID KiInitializeGdt(PKPCR Pcr) { @@ -85,9 +91,10 @@ KiInitializeGdt(PKPCR Pcr) /* * Allocate a GDT */ - Gdt = ExAllocatePool(NonPagedPool, sizeof(USHORT) * 4 * 11); + Gdt = KiGdtArray[Pcr->ProcessorNumber]; if (Gdt == NULL) { + DbgPrint("No GDT (%d)\n", Pcr->ProcessorNumber); KeBugCheck(0); } @@ -98,7 +105,6 @@ KiInitializeGdt(PKPCR Pcr) * irrelevant. */ memcpy(Gdt, KiBootGdt, sizeof(USHORT) * 4 * 11); - KiGdtArray[Pcr->ProcessorNumber] = Gdt; Pcr->GDT = Gdt; /* @@ -143,6 +149,7 @@ KeSetBaseGdtSelector(ULONG Entry, PVOID Base) { KIRQL oldIrql; + PUSHORT Gdt = KeGetCurrentKPCR()->GDT; DPRINT("KeSetBaseGdtSelector(Entry %x, Base %x)\n", Entry, Base); @@ -151,14 +158,14 @@ KeSetBaseGdtSelector(ULONG Entry, Entry = (Entry & (~0x3)) / 2; - KiBootGdt[Entry + 1] = ((ULONG)Base) & 0xffff; + Gdt[Entry + 1] = ((ULONG)Base) & 0xffff; - KiBootGdt[Entry + 2] = KiBootGdt[Entry + 2] & ~(0xff); - KiBootGdt[Entry + 2] = KiBootGdt[Entry + 2] | + Gdt[Entry + 2] = Gdt[Entry + 2] & ~(0xff); + Gdt[Entry + 2] = Gdt[Entry + 2] | ((((ULONG)Base) & 0xff0000) >> 16); - KiBootGdt[Entry + 3] = KiBootGdt[Entry + 3] & ~(0xff00); - KiBootGdt[Entry + 3] = KiBootGdt[Entry + 3] | + Gdt[Entry + 3] = Gdt[Entry + 3] & ~(0xff00); + Gdt[Entry + 3] = Gdt[Entry + 3] | ((((ULONG)Base) & 0xff000000) >> 16); DPRINT("%x %x %x %x\n", diff --git a/reactos/ntoskrnl/ke/i386/kernel.c b/reactos/ntoskrnl/ke/i386/kernel.c index 4750a18e32e..75f456cd206 100644 --- a/reactos/ntoskrnl/ke/i386/kernel.c +++ b/reactos/ntoskrnl/ke/i386/kernel.c @@ -40,11 +40,19 @@ ULONG KiPcrInitDone = 0; static ULONG PcrsAllocated = 0; +static PVOID PcrPages[MAXIMUM_PROCESSORS]; /* FUNCTIONS *****************************************************************/ VOID -KeApplicationProcessorInit() +KePrepareForApplicationProcessorInit(ULONG Id) +{ + PcrPages[Id] = MmAllocPage(0); + KiGdtPrepareForApplicationProcessorInit(Id); +} + +VOID +KeApplicationProcessorInit(VOID) { PKPCR KPCR; ULONG Offset; @@ -52,12 +60,11 @@ KeApplicationProcessorInit() /* * Create a PCR for this processor */ - Offset = InterlockedIncrement(&PcrsAllocated); + Offset = InterlockedIncrement(&PcrsAllocated) - 1; KPCR = (PKPCR)(KPCR_BASE + (Offset * PAGESIZE)); - MmCreateVirtualMapping(NULL, - (PVOID)KPCR, - PAGE_READWRITE, - (ULONG)MmAllocPage(0)); + MmCreateVirtualMappingForKernel((PVOID)KPCR, + PAGE_READWRITE, + (ULONG)PcrPages[Offset]); memset(KPCR, 0, PAGESIZE); KPCR->ProcessorNumber = Offset; KPCR->Self = KPCR; @@ -67,11 +74,21 @@ KeApplicationProcessorInit() * Initialize the GDT */ KiInitializeGdt(KPCR); + + /* + * It is now safe to process interrupts + */ + KeLowerIrql(DISPATCH_LEVEL); /* * Initialize the TSS */ Ki386ApplicationProcessorInitializeTSS(); + + /* + * Initialize a default LDT + */ + Ki386InitializeLdt(); } VOID @@ -103,6 +120,8 @@ KeInit1(VOID) KPCR->ProcessorNumber = 0; KiPcrInitDone = 1; PcrsAllocated++; + + Ki386InitializeLdt(); } VOID diff --git a/reactos/ntoskrnl/ke/i386/ldt.c b/reactos/ntoskrnl/ke/i386/ldt.c index c269e501d25..b1e33d59209 100644 --- a/reactos/ntoskrnl/ke/i386/ldt.c +++ b/reactos/ntoskrnl/ke/i386/ldt.c @@ -38,9 +38,9 @@ /* GLOBALS *******************************************************************/ /* - * + * Empty LDT shared by every process that doesn't have its own. */ -//STATIC UCHAR KiNullLdt[8] = {0,}; +STATIC UCHAR KiNullLdt[8]; /* FUNCTIONS *****************************************************************/ @@ -52,3 +52,21 @@ NtSetLdtEntries (HANDLE Thread, return(STATUS_NOT_IMPLEMENTED); } +VOID +Ki386InitializeLdt(VOID) +{ + PUSHORT Gdt = KeGetCurrentKPCR()->GDT; + unsigned int base, length; + + /* + * Set up an a descriptor for the LDT + */ + base = (unsigned int)&KiNullLdt; + length = sizeof(KiNullLdt) - 1; + + Gdt[(LDT_SELECTOR / 2) + 0] = (length & 0xFFFF); + Gdt[(LDT_SELECTOR / 2) + 1] = (base & 0xFFFF); + Gdt[(LDT_SELECTOR / 2) + 2] = ((base & 0xFF0000) >> 16) | 0x8200; + Gdt[(LDT_SELECTOR / 2) + 3] = ((length & 0xF0000) >> 16) | + ((base & 0xFF000000) >> 16); +} diff --git a/reactos/ntoskrnl/ke/i386/multiboot.S b/reactos/ntoskrnl/ke/i386/multiboot.S index 6791d8f5c2c..2630caa6dba 100644 --- a/reactos/ntoskrnl/ke/i386/multiboot.S +++ b/reactos/ntoskrnl/ke/i386/multiboot.S @@ -210,7 +210,7 @@ _multiboot_entry: movl %eax, %es movl %eax, %gs movl %eax, %ss - movl $PCR_SELECTOR, %eax + movl $0, %eax movl %eax, %fs #ifdef MP @@ -253,6 +253,12 @@ _multiboot_entry: #endif /* MP */ + /* + * Load the PCR selector + */ + movl $PCR_SELECTOR, %eax + movl %eax, %fs + /* * Load the initial kernel stack */ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index a1e1d9510a3..0810181be23 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.91 2001/04/16 23:29:54 dwelch Exp $ +/* $Id: main.c,v 1.92 2001/04/17 04:11:00 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -455,6 +455,8 @@ ExpInitializeExecutive(VOID) while (!HalAllProcessorsStarted()) { + KePrepareForApplicationProcessorInit(KeNumberProcessors); + PsPrepareForApplicationProcessorInit(KeNumberProcessors); HalInitializeProcessor(KeNumberProcessors); KeNumberProcessors++; } @@ -577,6 +579,10 @@ KiSystemStartup(BOOLEAN BootProcessor) } /* Do application processor initialization */ KeApplicationProcessorInit(); + PsApplicationProcessorInit(); + KeLowerIrql(PASSIVE_LEVEL); + PsIdleThreadMain(NULL); + KeBugCheck(0); for(;;); } diff --git a/reactos/ntoskrnl/ke/spinlock.c b/reactos/ntoskrnl/ke/spinlock.c index ebfb70f59eb..e577ad4cbb1 100644 --- a/reactos/ntoskrnl/ke/spinlock.c +++ b/reactos/ntoskrnl/ke/spinlock.c @@ -1,4 +1,4 @@ -/* $Id: spinlock.c,v 1.6 2000/12/26 05:32:44 dwelch Exp $ +/* $Id: spinlock.c,v 1.7 2001/04/17 04:11:01 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -17,6 +17,7 @@ /* INCLUDES ****************************************************************/ #include +#include #include @@ -81,8 +82,12 @@ KeAcquireSpinLockAtDpcLevel (PKSPIN_LOCK SpinLock) while ((i = InterlockedExchange(&SpinLock->Lock, 1)) == 1) { - DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i); - KeBugCheck(0); +#ifndef MP + DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i); + KeBugCheck(0); +#else /* not MP */ + /* Avoid reading the value again too fast */ +#endif /* MP */ } } diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 89df80cbe01..8f464f1ad2e 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: page.c,v 1.28 2001/04/16 23:29:55 dwelch Exp $ +/* $Id: page.c,v 1.29 2001/04/17 04:11:01 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -583,6 +583,75 @@ BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address) return((MmGetPageEntryForProcess1(Process, Address)) & PA_PRESENT); } +NTSTATUS +MmCreateVirtualMappingForKernel(PVOID Address, + ULONG flProtect, + ULONG PhysicalAddress) +{ + PEPROCESS CurrentProcess; + ULONG Attributes; + PULONG Pte; + NTSTATUS Status; + PEPROCESS Process = NULL; + + if (Process != NULL) + { + CurrentProcess = PsGetCurrentProcess(); + } + else + { + CurrentProcess = NULL; + } + + if (Process == NULL && Address < (PVOID)KERNEL_BASE) + { + DPRINT1("No process\n"); + KeBugCheck(0); + } + if (Process != NULL && Address >= (PVOID)KERNEL_BASE) + { + DPRINT1("Setting kernel address with process context\n"); + KeBugCheck(0); + } + Attributes = ProtectToPTE(flProtect); + + if (Process != NULL && Process != CurrentProcess) + { + KeAttachProcess(Process); + } + + Status = MmGetPageEntry2(Address, &Pte); + if (!NT_SUCCESS(Status)) + { + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(Status); + } + if (PAGE_MASK((*Pte)) != 0) + { + } + *Pte = PhysicalAddress | Attributes; + if (Process != NULL && + Process->AddressSpace.PageTableRefCountTable != NULL && + ADDR_TO_PAGE_TABLE(Address) < 768 && + Attributes & PA_PRESENT) + { + PUSHORT Ptrc; + + Ptrc = Process->AddressSpace.PageTableRefCountTable; + + Ptrc[ADDR_TO_PAGE_TABLE(Address)]++; + } + FLUSH_TLB; + if (Process != NULL && Process != CurrentProcess) + { + KeDetachProcess(); + } + return(STATUS_SUCCESS); +} + NTSTATUS MmCreateVirtualMappingUnsafe(PEPROCESS Process, PVOID Address, diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index 4e9f2d4009d..d21fcb4ad3c 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -25,7 +25,8 @@ PETHREAD PiIdleThread; /* FUNCTIONS *****************************************************************/ -static NTSTATUS PsIdleThreadMain(PVOID Context) +NTSTATUS +PsIdleThreadMain(PVOID Context) { KIRQL oldlvl; diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index d8051caf6b3..a0ce76a348d 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.75 2001/04/16 16:29:03 dwelch Exp $ +/* $Id: thread.c,v 1.76 2001/04/17 04:11:01 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -44,6 +44,7 @@ KSPIN_LOCK PiThreadListLock; LIST_ENTRY PiThreadListHead; static LIST_ENTRY PriorityListHead[MAXIMUM_PRIORITY]; static BOOLEAN DoneInitYet = FALSE; +static PETHREAD IdleThreads[MAXIMUM_PROCESSORS]; ULONG PiNrThreads = 0; ULONG PiNrRunnableThreads = 0; @@ -107,8 +108,8 @@ VOID PsDumpThreads(VOID) DbgPrint("current %x current->Tcb.State %d eip %x/%x ", current, current->Tcb.State, 0, current->Tcb.LastEip); - KeDumpStackFrames((PVOID)current->Tcb.KernelStack, - 16); + // KeDumpStackFrames((PVOID)current->Tcb.KernelStack, + // 16); DbgPrint("PID %d ", current->ThreadsProcess->UniqueProcessId); DbgPrint("\n"); @@ -289,6 +290,34 @@ PsFreezeAllThreads(PEPROCESS Process) KeReleaseSpinLock(&PiThreadListLock, oldIrql); } +VOID +PsApplicationProcessorInit(VOID) +{ + KeGetCurrentKPCR()->CurrentThread = + (PVOID)IdleThreads[KeGetCurrentProcessorNumber()]; +} + +VOID +PsPrepareForApplicationProcessorInit(ULONG Id) +{ + PETHREAD IdleThread; + HANDLE IdleThreadHandle; + + PsInitializeThread(NULL, + &IdleThread, + &IdleThreadHandle, + THREAD_ALL_ACCESS, + NULL, + TRUE); + IdleThread->Tcb.State = THREAD_STATE_RUNNING; + IdleThread->Tcb.FreezeCount = 0; + IdleThread->Tcb.UserAffinity = 1 << Id; + IdleThread->Tcb.Priority = LOW_PRIORITY; + IdleThreads[Id] = IdleThread; + + NtClose(IdleThreadHandle); +} + VOID PsInitThreadManagment(VOID) /* @@ -304,6 +333,7 @@ PsInitThreadManagment(VOID) { InitializeListHead(&PriorityListHead[i]); } + InitializeListHead(&PiThreadListHead); PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));