[NTOS:KE/x64] Improve KiInitializeTss

This commit is contained in:
Timo Kreuzer 2023-12-02 13:24:28 +02:00
parent bbe16859b5
commit e1497d43d7
2 changed files with 17 additions and 11 deletions

View file

@ -385,8 +385,6 @@ Ki386PerfEnd(VOID)
struct _KPCR; struct _KPCR;
//VOID KiInitializeTss(IN PKTSS Tss, IN UINT64 Stack);
DECLSPEC_NORETURN VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack); DECLSPEC_NORETURN VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack);
VOID KiDivideErrorFault(VOID); VOID KiDivideErrorFault(VOID);
VOID KiDebugTrapOrFault(VOID); VOID KiDebugTrapOrFault(VOID);

View file

@ -242,15 +242,19 @@ KiInitializeCpu(PKIPCR Pcr)
_mm_setcsr(INITIAL_MXCSR); _mm_setcsr(INITIAL_MXCSR);
} }
static
VOID VOID
FASTCALL KiInitializeTss(
KiInitializeTss(IN PKTSS64 Tss, _In_ PKIPCR Pcr,
IN UINT64 Stack) _Out_ PKTSS64 Tss,
_In_ PVOID InitialStack,
_In_ PVOID DoubleFaultStack,
_In_ PVOID NmiStack)
{ {
PKGDTENTRY64 TssEntry; PKGDTENTRY64 TssEntry;
/* Get pointer to the GDT entry */ /* Get pointer to the GDT entry */
TssEntry = KiGetGdtEntry(KeGetPcr()->GdtBase, KGDT64_SYS_TSS); TssEntry = KiGetGdtEntry(Pcr->GdtBase, KGDT64_SYS_TSS);
/* Initialize the GDT entry */ /* Initialize the GDT entry */
KiInitGdtEntry(TssEntry, (ULONG64)Tss, sizeof(KTSS64), AMD64_TSS, 0); KiInitGdtEntry(TssEntry, (ULONG64)Tss, sizeof(KTSS64), AMD64_TSS, 0);
@ -262,16 +266,16 @@ KiInitializeTss(IN PKTSS64 Tss,
Tss->IoMapBase = 0x68; Tss->IoMapBase = 0x68;
/* Setup ring 0 stack pointer */ /* Setup ring 0 stack pointer */
Tss->Rsp0 = Stack; Tss->Rsp0 = (ULONG64)InitialStack;
/* Setup a stack for Double Fault Traps */ /* Setup a stack for Double Fault Traps */
Tss->Ist[1] = (ULONG64)KiP0DoubleFaultStack; Tss->Ist[1] = (ULONG64)DoubleFaultStack;
/* Setup a stack for CheckAbort Traps */ /* Setup a stack for CheckAbort Traps */
Tss->Ist[2] = (ULONG64)KiP0DoubleFaultStack; Tss->Ist[2] = (ULONG64)DoubleFaultStack;
/* Setup a stack for NMI Traps */ /* Setup a stack for NMI Traps */
Tss->Ist[3] = (ULONG64)KiP0DoubleFaultStack; Tss->Ist[3] = (ULONG64)NmiStack;
/* Load the task register */ /* Load the task register */
__ltr(KGDT64_SYS_TSS); __ltr(KGDT64_SYS_TSS);
@ -470,7 +474,11 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
KiInitModuleList(LoaderBlock); KiInitModuleList(LoaderBlock);
/* Setup the TSS descriptors and entries */ /* Setup the TSS descriptors and entries */
KiInitializeTss(Pcr->TssBase, InitialStack); KiInitializeTss(Pcr,
Pcr->TssBase,
(PVOID)InitialStack,
KiP0DoubleFaultStack,
KiP0DoubleFaultStack);
/* Setup the IDT */ /* Setup the IDT */
KeInitExceptions(); KeInitExceptions();