mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 21:44:31 +00:00
[NTOS:KE/x64] Improve KiInitializePcr
This commit is contained in:
parent
d2a3b1c791
commit
8c466c3e36
|
@ -474,13 +474,6 @@ KiSetTrapContext(
|
||||||
_In_ PCONTEXT Context,
|
_In_ PCONTEXT Context,
|
||||||
_In_ KPROCESSOR_MODE RequestorMode);
|
_In_ KPROCESSOR_MODE RequestorMode);
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
KiInitializePcr(IN PKIPCR Pcr,
|
|
||||||
IN ULONG ProcessorNumber,
|
|
||||||
IN PKTHREAD IdleThread,
|
|
||||||
IN PVOID DpcStack);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -87,17 +87,17 @@ KiInitMachineDependent(VOID)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
KiInitializePcr(
|
||||||
KiInitializePcr(IN PKIPCR Pcr,
|
_Out_ PKIPCR Pcr,
|
||||||
IN ULONG ProcessorNumber,
|
_In_ ULONG ProcessorNumber,
|
||||||
IN PKTHREAD IdleThread,
|
_In_ PKGDTENTRY64 GdtBase,
|
||||||
IN PVOID DpcStack)
|
_In_ PKIDTENTRY64 IdtBase,
|
||||||
|
_In_ PKTSS64 TssBase,
|
||||||
|
_In_ PKTHREAD IdleThread,
|
||||||
|
_In_ PVOID DpcStack)
|
||||||
{
|
{
|
||||||
KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0};
|
|
||||||
PKGDTENTRY64 TssEntry;
|
|
||||||
USHORT Tr = 0;
|
|
||||||
|
|
||||||
/* Zero out the PCR */
|
/* Zero out the PCR */
|
||||||
RtlZeroMemory(Pcr, sizeof(KIPCR));
|
RtlZeroMemory(Pcr, sizeof(KIPCR));
|
||||||
|
|
||||||
|
@ -126,21 +126,12 @@ KiInitializePcr(IN PKIPCR Pcr,
|
||||||
Pcr->Prcb.Number = (UCHAR)ProcessorNumber;
|
Pcr->Prcb.Number = (UCHAR)ProcessorNumber;
|
||||||
Pcr->Prcb.SetMember = 1ULL << ProcessorNumber;
|
Pcr->Prcb.SetMember = 1ULL << ProcessorNumber;
|
||||||
|
|
||||||
/* Get GDT and IDT descriptors */
|
/* Set GDT and IDT base */
|
||||||
__sgdt(&GdtDescriptor.Limit);
|
Pcr->GdtBase = GdtBase;
|
||||||
__sidt(&IdtDescriptor.Limit);
|
Pcr->IdtBase = IdtBase;
|
||||||
Pcr->GdtBase = (PVOID)GdtDescriptor.Base;
|
|
||||||
Pcr->IdtBase = (PKIDTENTRY)IdtDescriptor.Base;
|
|
||||||
|
|
||||||
/* Get TSS Selector */
|
/* Set TssBase */
|
||||||
__str(&Tr);
|
Pcr->TssBase = TssBase;
|
||||||
ASSERT(Tr == KGDT64_SYS_TSS);
|
|
||||||
|
|
||||||
/* Get TSS Entry */
|
|
||||||
TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr);
|
|
||||||
|
|
||||||
/* Get the KTSS itself */
|
|
||||||
Pcr->TssBase = KiGetGdtDescriptorBase(TssEntry);
|
|
||||||
|
|
||||||
Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME
|
Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME
|
||||||
|
|
||||||
|
@ -285,14 +276,32 @@ VOID
|
||||||
KiInitializeP0BootStructures(
|
KiInitializeP0BootStructures(
|
||||||
_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock)
|
_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
{
|
{
|
||||||
|
KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0};
|
||||||
|
PKGDTENTRY64 TssEntry;
|
||||||
|
PKTSS64 TssBase;
|
||||||
|
|
||||||
/* Set the initial stack, idle thread and process for processor 0 */
|
/* Set the initial stack, idle thread and process for processor 0 */
|
||||||
LoaderBlock->KernelStack = (ULONG_PTR)KiP0BootStack;
|
LoaderBlock->KernelStack = (ULONG_PTR)KiP0BootStack;
|
||||||
LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread;
|
LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread;
|
||||||
LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb;
|
LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb;
|
||||||
LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb;
|
LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb;
|
||||||
|
|
||||||
|
/* Get GDT and IDT descriptors */
|
||||||
|
__sgdt(&GdtDescriptor.Limit);
|
||||||
|
__sidt(&IdtDescriptor.Limit);
|
||||||
|
|
||||||
|
/* Get the boot TSS from the GDT */
|
||||||
|
TssEntry = KiGetGdtEntry(GdtDescriptor.Base, KGDT64_SYS_TSS);
|
||||||
|
TssBase = KiGetGdtDescriptorBase(TssEntry);
|
||||||
|
|
||||||
/* Initialize the PCR */
|
/* Initialize the PCR */
|
||||||
KiInitializePcr(&KiInitialPcr, 0, &KiInitialThread.Tcb, KiP0DoubleFaultStack);
|
KiInitializePcr(&KiInitialPcr,
|
||||||
|
0,
|
||||||
|
GdtDescriptor.Base,
|
||||||
|
IdtDescriptor.Base,
|
||||||
|
TssBase,
|
||||||
|
&KiInitialThread.Tcb,
|
||||||
|
KiP0DoubleFaultStack);
|
||||||
|
|
||||||
/* Setup the TSS descriptors and entries */
|
/* Setup the TSS descriptors and entries */
|
||||||
KiInitializeTss(&KiInitialPcr,
|
KiInitializeTss(&KiInitialPcr,
|
||||||
|
|
Loading…
Reference in a new issue