forked from xt-sys/exectos
Use correct stack when using preallocated processor structures
This commit is contained in:
parent
3c3a756771
commit
38b0b2ac7d
@ -495,7 +495,7 @@ typedef struct _KPROCESSOR_STATE
|
||||
typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
{
|
||||
ULONG MxCsr;
|
||||
UCHAR Number;
|
||||
UCHAR CpuNumber;
|
||||
PKTHREAD CurrentThread;
|
||||
PKTHREAD IdleThread;
|
||||
PKTHREAD NextThread;
|
||||
|
@ -457,7 +457,7 @@ typedef struct _KPROCESSOR_CONTROL_BLOCK
|
||||
PKTHREAD CurrentThread;
|
||||
PKTHREAD IdleThread;
|
||||
PKTHREAD NextThread;
|
||||
UCHAR Number;
|
||||
UCHAR CpuNumber;
|
||||
ULONG_PTR SetMember;
|
||||
CPU_IDENTIFICATION CpuId;
|
||||
KPROCESSOR_STATE ProcessorState;
|
||||
|
@ -53,8 +53,8 @@ ArInitializeProcessor(IN PVOID ProcessorStructures)
|
||||
|
||||
/* Initialize GDT, IDT and TSS */
|
||||
ArpInitializeGdt(ProcessorBlock);
|
||||
ArpInitializeTss(ProcessorBlock);
|
||||
ArpInitializeIdt(ProcessorBlock);
|
||||
ArpInitializeTss(ProcessorBlock, KernelBootStack, KernelFaultStack);
|
||||
|
||||
/* Set GDT and IDT descriptors */
|
||||
GdtDescriptor.Base = Gdt;
|
||||
@ -313,9 +313,9 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
ProcessorBlock->Prcb.DpcStack = DpcStack;
|
||||
|
||||
/* Setup processor control block */
|
||||
ProcessorBlock->Prcb.Number = 0;
|
||||
ProcessorBlock->Prcb.SetMember = 1ULL;
|
||||
ProcessorBlock->Prcb.MultiThreadProcessorSet = 1ULL;
|
||||
ProcessorBlock->Prcb.CpuNumber = ProcessorBlock->CpuNumber;
|
||||
ProcessorBlock->Prcb.SetMember = 1ULL << ProcessorBlock->CpuNumber;
|
||||
ProcessorBlock->Prcb.MultiThreadProcessorSet = 1ULL << ProcessorBlock->CpuNumber;
|
||||
|
||||
/* Clear DR6 and DR7 registers */
|
||||
ProcessorBlock->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0;
|
||||
@ -488,16 +488,18 @@ ArpInitializeSegments(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelBootStack,
|
||||
IN PVOID KernelFaultStack)
|
||||
{
|
||||
/* Fill TSS with zeroes */
|
||||
RtlZeroMemory(ProcessorBlock->TssBase, sizeof(KTSS));
|
||||
|
||||
/* Setup I/O map and stacks for ring0 & traps */
|
||||
ProcessorBlock->TssBase->IoMapBase = sizeof(KTSS);
|
||||
ProcessorBlock->TssBase->Rsp0 = (ULONG_PTR)&ArKernelBootStack;
|
||||
ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = (ULONG_PTR)&ArKernelFaultStack;
|
||||
ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = (ULONG_PTR)&ArKernelFaultStack;
|
||||
ProcessorBlock->TssBase->Rsp0 = (ULONG_PTR)KernelBootStack;
|
||||
ProcessorBlock->TssBase->Ist[KIDT_IST_PANIC] = (ULONG_PTR)KernelFaultStack;
|
||||
ProcessorBlock->TssBase->Ist[KIDT_IST_MCA] = (ULONG_PTR)KernelFaultStack;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -53,8 +53,8 @@ ArInitializeProcessor(IN PVOID ProcessorStructures)
|
||||
|
||||
/* Initialize GDT, IDT and TSS */
|
||||
ArpInitializeGdt(ProcessorBlock);
|
||||
ArpInitializeTss(ProcessorBlock);
|
||||
ArpInitializeIdt(ProcessorBlock);
|
||||
ArpInitializeTss(ProcessorBlock, KernelBootStack, KernelFaultStack);
|
||||
|
||||
/* Set GDT and IDT descriptors */
|
||||
GdtDescriptor.Base = Gdt;
|
||||
@ -311,9 +311,9 @@ ArpInitializeProcessorBlock(OUT PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
ProcessorBlock->Prcb.DpcStack = DpcStack;
|
||||
|
||||
/* Setup processor control block */
|
||||
ProcessorBlock->Prcb.Number = 0;
|
||||
ProcessorBlock->Prcb.SetMember = 1;
|
||||
ProcessorBlock->Prcb.MultiThreadProcessorSet = 1;
|
||||
ProcessorBlock->Prcb.CpuNumber = ProcessorBlock->CpuNumber;
|
||||
ProcessorBlock->Prcb.SetMember = 1 << ProcessorBlock->CpuNumber;
|
||||
ProcessorBlock->Prcb.MultiThreadProcessorSet = 1 << ProcessorBlock->CpuNumber;
|
||||
|
||||
/* Clear DR6 and DR7 registers */
|
||||
ProcessorBlock->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0;
|
||||
@ -435,7 +435,9 @@ ArpInitializeSegments(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelBootStack,
|
||||
IN PVOID KernelFaultStack)
|
||||
{
|
||||
/* Clear I/O map */
|
||||
RtlSetMemory(ProcessorBlock->TssBase->IoMaps[0].IoMap, 0xFF, IOPM_FULL_SIZE);
|
||||
@ -458,6 +460,7 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
|
||||
/* Set I/O map base and disable traps */
|
||||
ProcessorBlock->TssBase->IoMapBase = sizeof(KTSS);
|
||||
ProcessorBlock->TssBase->Esp0 = (ULONG_PTR)KernelBootStack;
|
||||
ProcessorBlock->TssBase->Flags = 0;
|
||||
|
||||
/* Set LDT and SS */
|
||||
@ -465,8 +468,8 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
ProcessorBlock->TssBase->Ss0 = KGDT_R0_DATA;
|
||||
|
||||
/* Initialize task gates for DoubleFault and NMI traps */
|
||||
ArpSetDoubleFaultTssEntry(ProcessorBlock);
|
||||
ArpSetNonMaskableInterruptTssEntry(ProcessorBlock);
|
||||
ArpSetDoubleFaultTssEntry(ProcessorBlock, KernelFaultStack);
|
||||
ArpSetNonMaskableInterruptTssEntry(ProcessorBlock, KernelFaultStack);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -481,7 +484,8 @@ ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelFaultStack)
|
||||
{
|
||||
PKGDTENTRY TaskGateEntry, TssEntry;
|
||||
PKTSS Tss;
|
||||
@ -499,8 +503,8 @@ ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
Tss->Flags = 0;
|
||||
Tss->LDT = KGDT_R0_LDT;
|
||||
Tss->CR3 = ArReadControlRegister(3);
|
||||
Tss->Esp = (ULONG_PTR)&ArKernelFaultStack;
|
||||
Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack;
|
||||
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
||||
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
||||
Tss->Eip = PtrToUlong(ArpHandleTrap08);
|
||||
Tss->Cs = KGDT_R0_CODE;
|
||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||
@ -650,7 +654,8 @@ ArpSetIdtGate(IN PKIDTENTRY Idt,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelFaultStack)
|
||||
{
|
||||
PKGDTENTRY TaskGateEntry, TssEntry;
|
||||
PKTSS Tss;
|
||||
@ -668,8 +673,8 @@ ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock)
|
||||
Tss->Flags = 0;
|
||||
Tss->LDT = KGDT_R0_LDT;
|
||||
Tss->CR3 = ArReadControlRegister(3);
|
||||
Tss->Esp = (ULONG_PTR)&ArKernelFaultStack;
|
||||
Tss->Esp0 = (ULONG_PTR)&ArKernelFaultStack;
|
||||
Tss->Esp = (ULONG_PTR)KernelFaultStack;
|
||||
Tss->Esp0 = (ULONG_PTR)KernelFaultStack;
|
||||
Tss->Eip = PtrToUlong(ArpHandleTrap02);
|
||||
Tss->Cs = KGDT_R0_CODE;
|
||||
Tss->Ds = KGDT_R3_DATA | RPL_MASK;
|
||||
|
@ -304,7 +304,9 @@ ArpInitializeSegments(VOID);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelBootStack,
|
||||
IN PVOID KernelFaultStack);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
|
@ -292,11 +292,14 @@ ArpInitializeSegments(VOID);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||
ArpInitializeTss(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelBootStack,
|
||||
IN PVOID KernelFaultStack);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||
ArpSetDoubleFaultTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelFaultStack);
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
@ -319,7 +322,8 @@ ArpSetIdtGate(IN PKIDTENTRY Idt,
|
||||
|
||||
XTAPI
|
||||
VOID
|
||||
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock);
|
||||
ArpSetNonMaskableInterruptTssEntry(IN PKPROCESSOR_BLOCK ProcessorBlock,
|
||||
IN PVOID KernelFaultStack);
|
||||
|
||||
XTCDECL
|
||||
VOID
|
||||
|
@ -50,12 +50,12 @@ KepInitializeKernel(VOID)
|
||||
|
||||
/* Initialize Idle thread */
|
||||
KeInitializeThread(CurrentProcess, CurrentThread, NULL, NULL, NULL, NULL, NULL, ArKernelBootStack, TRUE);
|
||||
CurrentThread->NextProcessor = Prcb->Number;
|
||||
CurrentThread->NextProcessor = Prcb->CpuNumber;
|
||||
CurrentThread->Priority = THREAD_HIGH_PRIORITY;
|
||||
CurrentThread->State = Running;
|
||||
CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->Number;
|
||||
CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->CpuNumber;
|
||||
CurrentThread->WaitRunLevel = DISPATCH_LEVEL;
|
||||
CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number;
|
||||
CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->CpuNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -50,12 +50,12 @@ KepInitializeKernel(VOID)
|
||||
|
||||
/* Initialize Idle thread */
|
||||
KeInitializeThread(CurrentProcess, CurrentThread, NULL, NULL, NULL, NULL, NULL, ArKernelBootStack, TRUE);
|
||||
CurrentThread->NextProcessor = Prcb->Number;
|
||||
CurrentThread->NextProcessor = Prcb->CpuNumber;
|
||||
CurrentThread->Priority = THREAD_HIGH_PRIORITY;
|
||||
CurrentThread->State = Running;
|
||||
CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->Number;
|
||||
CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->CpuNumber;
|
||||
CurrentThread->WaitRunLevel = DISPATCH_LEVEL;
|
||||
CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number;
|
||||
CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->CpuNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -33,7 +33,7 @@ PoInitializeProcessorControlBlock(IN OUT PKPROCESSOR_CONTROL_BLOCK Prcb)
|
||||
|
||||
/* Initialize DPC and Timer */
|
||||
KeInitializeDpc(&Prcb->PowerState.PerfDpc, PopPerfIdleDpc, Prcb);
|
||||
KeSetTargetProcessorDpc(&Prcb->PowerState.PerfDpc, Prcb->Number);
|
||||
KeSetTargetProcessorDpc(&Prcb->PowerState.PerfDpc, Prcb->CpuNumber);
|
||||
KeInitializeTimer(&Prcb->PowerState.PerfTimer, SynchronizationTimer);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user