diff --git a/sdk/xtdk/amd64/ketypes.h b/sdk/xtdk/amd64/ketypes.h index 80106ba..a315350 100644 --- a/sdk/xtdk/amd64/ketypes.h +++ b/sdk/xtdk/amd64/ketypes.h @@ -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; diff --git a/sdk/xtdk/i686/ketypes.h b/sdk/xtdk/i686/ketypes.h index 87c6b60..16d20ef 100644 --- a/sdk/xtdk/i686/ketypes.h +++ b/sdk/xtdk/i686/ketypes.h @@ -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; diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index a3f90ba..2840604 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -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; } /** diff --git a/xtoskrnl/ar/i686/procsup.c b/xtoskrnl/ar/i686/procsup.c index 3a6d644..4f9b21f 100644 --- a/xtoskrnl/ar/i686/procsup.c +++ b/xtoskrnl/ar/i686/procsup.c @@ -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; diff --git a/xtoskrnl/includes/amd64/ari.h b/xtoskrnl/includes/amd64/ari.h index 53f698d..b4da180 100644 --- a/xtoskrnl/includes/amd64/ari.h +++ b/xtoskrnl/includes/amd64/ari.h @@ -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 diff --git a/xtoskrnl/includes/i686/ari.h b/xtoskrnl/includes/i686/ari.h index 5e90ef9..199fcb1 100644 --- a/xtoskrnl/includes/i686/ari.h +++ b/xtoskrnl/includes/i686/ari.h @@ -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 diff --git a/xtoskrnl/ke/amd64/krnlinit.c b/xtoskrnl/ke/amd64/krnlinit.c index e51a381..57a6bdd 100644 --- a/xtoskrnl/ke/amd64/krnlinit.c +++ b/xtoskrnl/ke/amd64/krnlinit.c @@ -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; } /** diff --git a/xtoskrnl/ke/i686/krnlinit.c b/xtoskrnl/ke/i686/krnlinit.c index 15e75f8..485613d 100644 --- a/xtoskrnl/ke/i686/krnlinit.c +++ b/xtoskrnl/ke/i686/krnlinit.c @@ -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; } /** diff --git a/xtoskrnl/po/idle.c b/xtoskrnl/po/idle.c index 31d3796..f00208e 100644 --- a/xtoskrnl/po/idle.c +++ b/xtoskrnl/po/idle.c @@ -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); }