mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
Further SMP work (associate an idle thread with each processor)
svn path=/trunk/; revision=1808
This commit is contained in:
parent
2cfadf3b41
commit
f29036d97b
15 changed files with 235 additions and 94 deletions
|
@ -180,7 +180,7 @@ KfLowerIrql (
|
||||||
{
|
{
|
||||||
DbgPrint ("(%s:%d) NewIrql %x CurrentIrql %x\n",
|
DbgPrint ("(%s:%d) NewIrql %x CurrentIrql %x\n",
|
||||||
__FILE__, __LINE__, NewIrql, CurrentIrql);
|
__FILE__, __LINE__, NewIrql, CurrentIrql);
|
||||||
KeDumpStackFrames (0, 32);
|
KeBugCheck(0);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,7 @@ VOID KeExpireTimers( PKDPC Apc,
|
||||||
VOID KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type,
|
VOID KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type,
|
||||||
ULONG Size, ULONG SignalState);
|
ULONG Size, ULONG SignalState);
|
||||||
|
|
||||||
VOID KeDumpStackFrames(PVOID Stack, ULONG NrFrames);
|
VOID KeDumpStackFrames(PULONG Frame);
|
||||||
ULONG KeAllocateGdtSelector(ULONG Desc[2]);
|
ULONG KeAllocateGdtSelector(ULONG Desc[2]);
|
||||||
VOID KeFreeGdtSelector(ULONG Entry);
|
VOID KeFreeGdtSelector(ULONG Entry);
|
||||||
BOOLEAN KiTestAlert(VOID);
|
BOOLEAN KiTestAlert(VOID);
|
||||||
|
@ -199,6 +199,12 @@ VOID
|
||||||
Ki386ApplicationProcessorInitializeTSS(VOID);
|
Ki386ApplicationProcessorInitializeTSS(VOID);
|
||||||
VOID
|
VOID
|
||||||
Ki386BootInitializeTSS(VOID);
|
Ki386BootInitializeTSS(VOID);
|
||||||
|
VOID
|
||||||
|
KiGdtPrepareForApplicationProcessorInit(ULONG Id);
|
||||||
|
VOID
|
||||||
|
KePrepareForApplicationProcessorInit(ULONG id);
|
||||||
|
VOID
|
||||||
|
Ki386InitializeLdt(VOID);
|
||||||
|
|
||||||
#endif /* not __ASM__ */
|
#endif /* not __ASM__ */
|
||||||
|
|
||||||
|
|
|
@ -462,4 +462,9 @@ MmGetSavedSwapEntryPage(PVOID PhysicalAddress);
|
||||||
|
|
||||||
#define STATUS_MM_RESTART_OPERATION (0xD0000001)
|
#define STATUS_MM_RESTART_OPERATION (0xD0000001)
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
MmCreateVirtualMappingForKernel(PVOID Address,
|
||||||
|
ULONG flProtect,
|
||||||
|
ULONG PhysicalAddress);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -555,6 +555,12 @@ PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode,
|
||||||
BOOLEAN DispatcherLock, KIRQL WaitIrql);
|
BOOLEAN DispatcherLock, KIRQL WaitIrql);
|
||||||
VOID
|
VOID
|
||||||
PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
|
PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
|
||||||
|
VOID
|
||||||
|
PsApplicationProcessorInit(VOID);
|
||||||
|
VOID
|
||||||
|
PsPrepareForApplicationProcessorInit(ULONG Id);
|
||||||
|
NTSTATUS
|
||||||
|
PsIdleThreadMain(PVOID Context);
|
||||||
|
|
||||||
#endif /* ASSEMBLER */
|
#endif /* ASSEMBLER */
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ke/bug.c
|
* FILE: ntoskrnl/ke/bug.c
|
||||||
|
@ -105,7 +105,7 @@ KeBugCheckEx (ULONG BugCheckCode,
|
||||||
PsGetCurrentThread()->Cid.UniqueThread);
|
PsGetCurrentThread()->Cid.UniqueThread);
|
||||||
}
|
}
|
||||||
// PsDumpThreads();
|
// PsDumpThreads();
|
||||||
KeDumpStackFrames(&((&BugCheckCode)[-1]),64);
|
KeDumpStackFrames((PULONG)__builtin_frame_address(0));
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
for(;;)
|
for(;;)
|
||||||
|
@ -148,7 +148,7 @@ KeBugCheck (ULONG BugCheckCode)
|
||||||
PsGetCurrentThread()->Cid.UniqueThread);
|
PsGetCurrentThread()->Cid.UniqueThread);
|
||||||
}
|
}
|
||||||
// PsDumpThreads();
|
// PsDumpThreads();
|
||||||
KeDumpStackFrames(&((&BugCheckCode)[-1]), 80);
|
KeDumpStackFrames((PULONG)__builtin_frame_address(0));
|
||||||
#if 1
|
#if 1
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,8 +71,6 @@ extern VOID KiTrapUnknown(VOID);
|
||||||
extern ULONG init_stack;
|
extern ULONG init_stack;
|
||||||
extern ULONG init_stack_top;
|
extern ULONG init_stack_top;
|
||||||
|
|
||||||
static char KiNullLdt[8] = {0,};
|
|
||||||
|
|
||||||
static char *ExceptionTypeStrings[] =
|
static char *ExceptionTypeStrings[] =
|
||||||
{
|
{
|
||||||
"Divide Error",
|
"Divide Error",
|
||||||
|
@ -595,44 +593,23 @@ KiTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KeDumpStackFrames(PVOID _Stack, ULONG NrFrames)
|
KeDumpStackFrames(PULONG Frame)
|
||||||
{
|
{
|
||||||
PULONG Stack = (PULONG)_Stack;
|
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG StackLimit;
|
|
||||||
|
|
||||||
Stack = (PVOID)(((ULONG)Stack) & (~0x3));
|
DbgPrint("Frames: ");
|
||||||
DbgPrint("Stack: %x\n", Stack);
|
i = 1;
|
||||||
if (PsGetCurrentThread() != NULL)
|
while (Frame != NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("kernel stack base %x\n",
|
print_address((PVOID)Frame[1]);
|
||||||
PsGetCurrentThread()->Tcb.StackLimit);
|
Frame = (PULONG)Frame[0];
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
|
if ((i % 8) != 0)
|
||||||
if (PsGetCurrentThread() != NULL)
|
|
||||||
{
|
{
|
||||||
StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StackLimit = (ULONG)&init_stack_top;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgPrint("Frames:\n");
|
|
||||||
for (i=0; i<NrFrames && ((ULONG)&Stack[i] < StackLimit); i++)
|
|
||||||
{
|
|
||||||
if (Stack[i] > KERNEL_BASE)
|
|
||||||
{
|
|
||||||
print_address((PVOID)Stack[i]);
|
|
||||||
DbgPrint(" ");
|
|
||||||
}
|
|
||||||
if (Stack[i] == 0xceafbeef)
|
|
||||||
{
|
|
||||||
DbgPrint("IRQ ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DbgPrint("\n");
|
DbgPrint("\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void set_system_call_gate(unsigned int sel, unsigned int func)
|
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;
|
KiIdt[sel].b = 0x8500;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeInitExceptions(void)
|
VOID
|
||||||
|
KeInitExceptions(VOID)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Initalize CPU exception handling
|
* FUNCTION: Initalize CPU exception handling
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
ULONG base, length;
|
|
||||||
extern USHORT KiBootGdt[];
|
|
||||||
|
|
||||||
DPRINT("KeInitExceptions()\n",0);
|
DPRINT("KeInitExceptions()\n");
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the other gates
|
* Set up the other gates
|
||||||
|
|
|
@ -64,6 +64,12 @@ static KSPIN_LOCK GdtLock;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
KiGdtPrepareForApplicationProcessorInit(ULONG Id)
|
||||||
|
{
|
||||||
|
KiGdtArray[Id] = ExAllocatePool(NonPagedPool, sizeof(USHORT) * 4 * 11);
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KiInitializeGdt(PKPCR Pcr)
|
KiInitializeGdt(PKPCR Pcr)
|
||||||
{
|
{
|
||||||
|
@ -85,9 +91,10 @@ KiInitializeGdt(PKPCR Pcr)
|
||||||
/*
|
/*
|
||||||
* Allocate a GDT
|
* Allocate a GDT
|
||||||
*/
|
*/
|
||||||
Gdt = ExAllocatePool(NonPagedPool, sizeof(USHORT) * 4 * 11);
|
Gdt = KiGdtArray[Pcr->ProcessorNumber];
|
||||||
if (Gdt == NULL)
|
if (Gdt == NULL)
|
||||||
{
|
{
|
||||||
|
DbgPrint("No GDT (%d)\n", Pcr->ProcessorNumber);
|
||||||
KeBugCheck(0);
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +105,6 @@ KiInitializeGdt(PKPCR Pcr)
|
||||||
* irrelevant.
|
* irrelevant.
|
||||||
*/
|
*/
|
||||||
memcpy(Gdt, KiBootGdt, sizeof(USHORT) * 4 * 11);
|
memcpy(Gdt, KiBootGdt, sizeof(USHORT) * 4 * 11);
|
||||||
KiGdtArray[Pcr->ProcessorNumber] = Gdt;
|
|
||||||
Pcr->GDT = Gdt;
|
Pcr->GDT = Gdt;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -143,6 +149,7 @@ KeSetBaseGdtSelector(ULONG Entry,
|
||||||
PVOID Base)
|
PVOID Base)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
|
PUSHORT Gdt = KeGetCurrentKPCR()->GDT;
|
||||||
|
|
||||||
DPRINT("KeSetBaseGdtSelector(Entry %x, Base %x)\n",
|
DPRINT("KeSetBaseGdtSelector(Entry %x, Base %x)\n",
|
||||||
Entry, Base);
|
Entry, Base);
|
||||||
|
@ -151,14 +158,14 @@ KeSetBaseGdtSelector(ULONG Entry,
|
||||||
|
|
||||||
Entry = (Entry & (~0x3)) / 2;
|
Entry = (Entry & (~0x3)) / 2;
|
||||||
|
|
||||||
KiBootGdt[Entry + 1] = ((ULONG)Base) & 0xffff;
|
Gdt[Entry + 1] = ((ULONG)Base) & 0xffff;
|
||||||
|
|
||||||
KiBootGdt[Entry + 2] = KiBootGdt[Entry + 2] & ~(0xff);
|
Gdt[Entry + 2] = Gdt[Entry + 2] & ~(0xff);
|
||||||
KiBootGdt[Entry + 2] = KiBootGdt[Entry + 2] |
|
Gdt[Entry + 2] = Gdt[Entry + 2] |
|
||||||
((((ULONG)Base) & 0xff0000) >> 16);
|
((((ULONG)Base) & 0xff0000) >> 16);
|
||||||
|
|
||||||
KiBootGdt[Entry + 3] = KiBootGdt[Entry + 3] & ~(0xff00);
|
Gdt[Entry + 3] = Gdt[Entry + 3] & ~(0xff00);
|
||||||
KiBootGdt[Entry + 3] = KiBootGdt[Entry + 3] |
|
Gdt[Entry + 3] = Gdt[Entry + 3] |
|
||||||
((((ULONG)Base) & 0xff000000) >> 16);
|
((((ULONG)Base) & 0xff000000) >> 16);
|
||||||
|
|
||||||
DPRINT("%x %x %x %x\n",
|
DPRINT("%x %x %x %x\n",
|
||||||
|
|
|
@ -40,11 +40,19 @@
|
||||||
|
|
||||||
ULONG KiPcrInitDone = 0;
|
ULONG KiPcrInitDone = 0;
|
||||||
static ULONG PcrsAllocated = 0;
|
static ULONG PcrsAllocated = 0;
|
||||||
|
static PVOID PcrPages[MAXIMUM_PROCESSORS];
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KeApplicationProcessorInit()
|
KePrepareForApplicationProcessorInit(ULONG Id)
|
||||||
|
{
|
||||||
|
PcrPages[Id] = MmAllocPage(0);
|
||||||
|
KiGdtPrepareForApplicationProcessorInit(Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
KeApplicationProcessorInit(VOID)
|
||||||
{
|
{
|
||||||
PKPCR KPCR;
|
PKPCR KPCR;
|
||||||
ULONG Offset;
|
ULONG Offset;
|
||||||
|
@ -52,12 +60,11 @@ KeApplicationProcessorInit()
|
||||||
/*
|
/*
|
||||||
* Create a PCR for this processor
|
* Create a PCR for this processor
|
||||||
*/
|
*/
|
||||||
Offset = InterlockedIncrement(&PcrsAllocated);
|
Offset = InterlockedIncrement(&PcrsAllocated) - 1;
|
||||||
KPCR = (PKPCR)(KPCR_BASE + (Offset * PAGESIZE));
|
KPCR = (PKPCR)(KPCR_BASE + (Offset * PAGESIZE));
|
||||||
MmCreateVirtualMapping(NULL,
|
MmCreateVirtualMappingForKernel((PVOID)KPCR,
|
||||||
(PVOID)KPCR,
|
|
||||||
PAGE_READWRITE,
|
PAGE_READWRITE,
|
||||||
(ULONG)MmAllocPage(0));
|
(ULONG)PcrPages[Offset]);
|
||||||
memset(KPCR, 0, PAGESIZE);
|
memset(KPCR, 0, PAGESIZE);
|
||||||
KPCR->ProcessorNumber = Offset;
|
KPCR->ProcessorNumber = Offset;
|
||||||
KPCR->Self = KPCR;
|
KPCR->Self = KPCR;
|
||||||
|
@ -68,10 +75,20 @@ KeApplicationProcessorInit()
|
||||||
*/
|
*/
|
||||||
KiInitializeGdt(KPCR);
|
KiInitializeGdt(KPCR);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is now safe to process interrupts
|
||||||
|
*/
|
||||||
|
KeLowerIrql(DISPATCH_LEVEL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the TSS
|
* Initialize the TSS
|
||||||
*/
|
*/
|
||||||
Ki386ApplicationProcessorInitializeTSS();
|
Ki386ApplicationProcessorInitializeTSS();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize a default LDT
|
||||||
|
*/
|
||||||
|
Ki386InitializeLdt();
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -103,6 +120,8 @@ KeInit1(VOID)
|
||||||
KPCR->ProcessorNumber = 0;
|
KPCR->ProcessorNumber = 0;
|
||||||
KiPcrInitDone = 1;
|
KiPcrInitDone = 1;
|
||||||
PcrsAllocated++;
|
PcrsAllocated++;
|
||||||
|
|
||||||
|
Ki386InitializeLdt();
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -38,9 +38,9 @@
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
* Empty LDT shared by every process that doesn't have its own.
|
||||||
*/
|
*/
|
||||||
//STATIC UCHAR KiNullLdt[8] = {0,};
|
STATIC UCHAR KiNullLdt[8];
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
@ -52,3 +52,21 @@ NtSetLdtEntries (HANDLE Thread,
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -210,7 +210,7 @@ _multiboot_entry:
|
||||||
movl %eax, %es
|
movl %eax, %es
|
||||||
movl %eax, %gs
|
movl %eax, %gs
|
||||||
movl %eax, %ss
|
movl %eax, %ss
|
||||||
movl $PCR_SELECTOR, %eax
|
movl $0, %eax
|
||||||
movl %eax, %fs
|
movl %eax, %fs
|
||||||
|
|
||||||
#ifdef MP
|
#ifdef MP
|
||||||
|
@ -253,6 +253,12 @@ _multiboot_entry:
|
||||||
|
|
||||||
#endif /* MP */
|
#endif /* MP */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load the PCR selector
|
||||||
|
*/
|
||||||
|
movl $PCR_SELECTOR, %eax
|
||||||
|
movl %eax, %fs
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load the initial kernel stack
|
* Load the initial kernel stack
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ke/main.c
|
* FILE: ntoskrnl/ke/main.c
|
||||||
|
@ -455,6 +455,8 @@ ExpInitializeExecutive(VOID)
|
||||||
|
|
||||||
while (!HalAllProcessorsStarted())
|
while (!HalAllProcessorsStarted())
|
||||||
{
|
{
|
||||||
|
KePrepareForApplicationProcessorInit(KeNumberProcessors);
|
||||||
|
PsPrepareForApplicationProcessorInit(KeNumberProcessors);
|
||||||
HalInitializeProcessor(KeNumberProcessors);
|
HalInitializeProcessor(KeNumberProcessors);
|
||||||
KeNumberProcessors++;
|
KeNumberProcessors++;
|
||||||
}
|
}
|
||||||
|
@ -577,6 +579,10 @@ KiSystemStartup(BOOLEAN BootProcessor)
|
||||||
}
|
}
|
||||||
/* Do application processor initialization */
|
/* Do application processor initialization */
|
||||||
KeApplicationProcessorInit();
|
KeApplicationProcessorInit();
|
||||||
|
PsApplicationProcessorInit();
|
||||||
|
KeLowerIrql(PASSIVE_LEVEL);
|
||||||
|
PsIdleThreadMain(NULL);
|
||||||
|
KeBugCheck(0);
|
||||||
for(;;);
|
for(;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
/* INCLUDES ****************************************************************/
|
/* INCLUDES ****************************************************************/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
|
#include <internal/config.h>
|
||||||
|
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
|
@ -81,8 +82,12 @@ KeAcquireSpinLockAtDpcLevel (PKSPIN_LOCK SpinLock)
|
||||||
|
|
||||||
while ((i = InterlockedExchange(&SpinLock->Lock, 1)) == 1)
|
while ((i = InterlockedExchange(&SpinLock->Lock, 1)) == 1)
|
||||||
{
|
{
|
||||||
|
#ifndef MP
|
||||||
DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i);
|
DbgPrint("Spinning on spinlock %x current value %x\n", SpinLock, i);
|
||||||
KeBugCheck(0);
|
KeBugCheck(0);
|
||||||
|
#else /* not MP */
|
||||||
|
/* Avoid reading the value again too fast */
|
||||||
|
#endif /* MP */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/mm/i386/page.c
|
* FILE: ntoskrnl/mm/i386/page.c
|
||||||
|
@ -583,6 +583,75 @@ BOOLEAN MmIsPagePresent(PEPROCESS Process, PVOID Address)
|
||||||
return((MmGetPageEntryForProcess1(Process, Address)) & PA_PRESENT);
|
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
|
NTSTATUS
|
||||||
MmCreateVirtualMappingUnsafe(PEPROCESS Process,
|
MmCreateVirtualMappingUnsafe(PEPROCESS Process,
|
||||||
PVOID Address,
|
PVOID Address,
|
||||||
|
|
|
@ -25,7 +25,8 @@ PETHREAD PiIdleThread;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
static NTSTATUS PsIdleThreadMain(PVOID Context)
|
NTSTATUS
|
||||||
|
PsIdleThreadMain(PVOID Context)
|
||||||
{
|
{
|
||||||
KIRQL oldlvl;
|
KIRQL oldlvl;
|
||||||
|
|
||||||
|
|
|
@ -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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -44,6 +44,7 @@ KSPIN_LOCK PiThreadListLock;
|
||||||
LIST_ENTRY PiThreadListHead;
|
LIST_ENTRY PiThreadListHead;
|
||||||
static LIST_ENTRY PriorityListHead[MAXIMUM_PRIORITY];
|
static LIST_ENTRY PriorityListHead[MAXIMUM_PRIORITY];
|
||||||
static BOOLEAN DoneInitYet = FALSE;
|
static BOOLEAN DoneInitYet = FALSE;
|
||||||
|
static PETHREAD IdleThreads[MAXIMUM_PROCESSORS];
|
||||||
ULONG PiNrThreads = 0;
|
ULONG PiNrThreads = 0;
|
||||||
ULONG PiNrRunnableThreads = 0;
|
ULONG PiNrRunnableThreads = 0;
|
||||||
|
|
||||||
|
@ -107,8 +108,8 @@ VOID PsDumpThreads(VOID)
|
||||||
DbgPrint("current %x current->Tcb.State %d eip %x/%x ",
|
DbgPrint("current %x current->Tcb.State %d eip %x/%x ",
|
||||||
current, current->Tcb.State,
|
current, current->Tcb.State,
|
||||||
0, current->Tcb.LastEip);
|
0, current->Tcb.LastEip);
|
||||||
KeDumpStackFrames((PVOID)current->Tcb.KernelStack,
|
// KeDumpStackFrames((PVOID)current->Tcb.KernelStack,
|
||||||
16);
|
// 16);
|
||||||
DbgPrint("PID %d ", current->ThreadsProcess->UniqueProcessId);
|
DbgPrint("PID %d ", current->ThreadsProcess->UniqueProcessId);
|
||||||
DbgPrint("\n");
|
DbgPrint("\n");
|
||||||
|
|
||||||
|
@ -289,6 +290,34 @@ PsFreezeAllThreads(PEPROCESS Process)
|
||||||
KeReleaseSpinLock(&PiThreadListLock, oldIrql);
|
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
|
VOID
|
||||||
PsInitThreadManagment(VOID)
|
PsInitThreadManagment(VOID)
|
||||||
/*
|
/*
|
||||||
|
@ -304,6 +333,7 @@ PsInitThreadManagment(VOID)
|
||||||
{
|
{
|
||||||
InitializeListHead(&PriorityListHead[i]);
|
InitializeListHead(&PriorityListHead[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeListHead(&PiThreadListHead);
|
InitializeListHead(&PiThreadListHead);
|
||||||
|
|
||||||
PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
PsThreadType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||||
|
|
Loading…
Reference in a new issue