diff --git a/reactos/ntoskrnl/kd64/amd64/kdx64.c b/reactos/ntoskrnl/kd64/amd64/kdx64.c index 9bb81b1b6ba..df27345bf92 100644 --- a/reactos/ntoskrnl/kd64/amd64/kdx64.c +++ b/reactos/ntoskrnl/kd64/amd64/kdx64.c @@ -85,7 +85,7 @@ KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange, /* Set Report Flags */ WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS; - if (WaitStateChange->ControlReport.SegCs == KGDT_64_R0_CODE) + if (WaitStateChange->ControlReport.SegCs == KGDT64_R0_CODE) { WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS; } diff --git a/reactos/ntoskrnl/kd64/kddata.c b/reactos/ntoskrnl/kd64/kddata.c index c5db36d4f23..edce7d7983f 100644 --- a/reactos/ntoskrnl/kd64/kddata.c +++ b/reactos/ntoskrnl/kd64/kddata.c @@ -526,14 +526,14 @@ KDDEBUGGER_DATA64 KdDebuggerDataBlock = // // AMD64 GDT/LDT/TSS constants // - KGDT_64_R0_CODE, - KGDT_64_DATA, - KGDT_64_DATA, - KGDT_64_R3_CODE, - KGDT_64_DATA, - KGDT_64_DATA, + KGDT64_R0_CODE, + KGDT64_R3_DATA, + KGDT64_R3_DATA, + KGDT64_R3_CODE, + KGDT64_R3_DATA, + KGDT64_R3_DATA, 0, - KGDT_TSS, + KGDT64_SYS_TSS, 0, 0, #else diff --git a/reactos/ntoskrnl/ke/amd64/context.c b/reactos/ntoskrnl/ke/amd64/context.c index 32758073fea..239a697e660 100644 --- a/reactos/ntoskrnl/ke/amd64/context.c +++ b/reactos/ntoskrnl/ke/amd64/context.c @@ -74,11 +74,11 @@ KeContextToTrapFrame(IN PCONTEXT Context, if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) { /* Check if this was a Kernel Trap */ - if (Context->SegCs == KGDT_64_R0_CODE) + if (Context->SegCs == KGDT64_R0_CODE) { /* Set valid selectors */ - TrapFrame->SegCs = KGDT_64_R0_CODE; - TrapFrame->SegSs = KGDT_64_R0_SS; + TrapFrame->SegCs = KGDT64_R0_CODE; + TrapFrame->SegSs = KGDT64_R0_DATA; } else { @@ -97,13 +97,13 @@ KeContextToTrapFrame(IN PCONTEXT Context, if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) { /* Check if this was a Kernel Trap */ - if (Context->SegCs == KGDT_64_R0_CODE) + if (Context->SegCs == KGDT64_R0_CODE) { /* Set valid selectors */ - TrapFrame->SegDs = KGDT_64_DATA | RPL_MASK; - TrapFrame->SegEs = KGDT_64_DATA | RPL_MASK; - TrapFrame->SegFs = KGDT_32_R3_TEB | RPL_MASK; - TrapFrame->SegGs = KGDT_64_DATA | RPL_MASK; + TrapFrame->SegDs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegEs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + TrapFrame->SegGs = KGDT64_R3_DATA | RPL_MASK; } else { @@ -190,11 +190,11 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) { /* Check if this was a Kernel Trap */ - if (TrapFrame->SegCs == KGDT_64_R0_CODE) + if (TrapFrame->SegCs == KGDT64_R0_CODE) { /* Set valid selectors */ - Context->SegCs = KGDT_64_R0_CODE; - Context->SegSs = KGDT_64_R0_SS; + Context->SegCs = KGDT64_R0_CODE; + Context->SegSs = KGDT64_R0_DATA; } else { @@ -213,13 +213,13 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) { /* Check if this was a Kernel Trap */ - if (TrapFrame->SegCs == KGDT_64_R0_CODE) + if (TrapFrame->SegCs == KGDT64_R0_CODE) { /* Set valid selectors */ - Context->SegDs = KGDT_64_DATA | RPL_MASK; - Context->SegEs = KGDT_64_DATA | RPL_MASK; - Context->SegFs = KGDT_32_R3_TEB | RPL_MASK; - Context->SegGs = KGDT_64_DATA | RPL_MASK; + Context->SegDs = KGDT64_R3_DATA | RPL_MASK; + Context->SegEs = KGDT64_R3_DATA | RPL_MASK; + Context->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + Context->SegGs = KGDT64_R3_DATA | RPL_MASK; } else { diff --git a/reactos/ntoskrnl/ke/amd64/cpu.c b/reactos/ntoskrnl/ke/amd64/cpu.c index aafd704455b..90a6b2c0641 100644 --- a/reactos/ntoskrnl/ke/amd64/cpu.c +++ b/reactos/ntoskrnl/ke/amd64/cpu.c @@ -379,7 +379,7 @@ KiInitializeTss(IN PKTSS64 Tss, PKGDTENTRY64 TssEntry; /* Get pointer to the GDT entry */ - TssEntry = KiGetGdtEntry(KeGetPcr()->GdtBase, KGDT_TSS); + TssEntry = KiGetGdtEntry(KeGetPcr()->GdtBase, KGDT64_SYS_TSS); /* Initialize the GDT entry */ KiInitGdtEntry(TssEntry, (ULONG64)Tss, sizeof(KTSS64), AMD64_TSS, 0); @@ -403,7 +403,7 @@ KiInitializeTss(IN PKTSS64 Tss, Tss->Ist[3] = (ULONG64)KiDoubleFaultStack; /* Load the task register */ - __ltr(KGDT_TSS); + __ltr(KGDT64_SYS_TSS); } VOID diff --git a/reactos/ntoskrnl/ke/amd64/except.c b/reactos/ntoskrnl/ke/amd64/except.c index 86abc32ad8d..97845595b43 100644 --- a/reactos/ntoskrnl/ke/amd64/except.c +++ b/reactos/ntoskrnl/ke/amd64/except.c @@ -50,10 +50,9 @@ KIDT_INIT KiInterruptInitTable[] = KIDTENTRY64 KiIdt[256]; KDESCRIPTOR KiIdtDescriptor = {{0}, sizeof(KiIdt) - 1, KiIdt}; + /* FUNCTIONS *****************************************************************/ - - VOID INIT_FUNCTION NTAPI @@ -80,7 +79,7 @@ KeInitExceptions(VOID) KiIdt[i].IstIndex = 0; } KiIdt[i].OffsetLow = Offset & 0xffff; - KiIdt[i].Selector = KGDT_64_R0_CODE; + KiIdt[i].Selector = KGDT64_R0_CODE; KiIdt[i].Type = 0x0e; KiIdt[i].Reserved0 = 0; KiIdt[i].Present = 1; @@ -242,6 +241,20 @@ KiGeneralProtectionFaultHandler( ASSERT(FALSE); } + /* Check for lazy segment load */ + if (TrapFrame->SegDs != (KGDT64_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegDs = (KGDT64_R3_DATA | RPL_MASK); + return STATUS_SUCCESS; + } + else if (TrapFrame->SegEs != (KGDT64_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegEs = (KGDT64_R3_DATA | RPL_MASK); + return STATUS_SUCCESS; + } + /* Check for nested exception */ if ((TrapFrame->Rip >= (ULONG64)KiGeneralProtectionFaultHandler) && (TrapFrame->Rip < (ULONG64)KiGeneralProtectionFaultHandler)) @@ -271,20 +284,6 @@ KiGeneralProtectionFaultHandler( return STATUS_ACCESS_VIOLATION; } - /* Check for lazy segment load */ - if (TrapFrame->SegDs != (KGDT64_R0_DATA | RPL_MASK)) - { - /* Fix it */ - TrapFrame->SegDs = (KGDT64_R0_DATA | RPL_MASK); - return STATUS_SUCCESS; - } - else if (TrapFrame->SegEs != (KGDT64_R0_DATA | RPL_MASK)) - { - /* Fix it */ - TrapFrame->SegEs = (KGDT64_R0_DATA | RPL_MASK); - return STATUS_SUCCESS; - } - ASSERT(FALSE); return STATUS_UNSUCCESSFUL; } diff --git a/reactos/ntoskrnl/ke/amd64/kiinit.c b/reactos/ntoskrnl/ke/amd64/kiinit.c index b80872aeed9..d35128f2c40 100644 --- a/reactos/ntoskrnl/ke/amd64/kiinit.c +++ b/reactos/ntoskrnl/ke/amd64/kiinit.c @@ -120,7 +120,7 @@ KiInitializePcr(IN PKIPCR Pcr, /* Get TSS Selector */ __str(&Tr); - ASSERT(Tr == KGDT_TSS); + ASSERT(Tr == KGDT64_SYS_TSS); /* Get TSS Entry */ TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr); @@ -390,9 +390,9 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) __writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr); /* Load Ring 3 selectors for DS/ES/FS */ - Ke386SetDs(KGDT_64_DATA | RPL_MASK); - Ke386SetEs(KGDT_64_DATA | RPL_MASK); - Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK); + Ke386SetDs(KGDT64_R3_DATA | RPL_MASK); + Ke386SetEs(KGDT64_R3_DATA | RPL_MASK); + Ke386SetFs(KGDT64_R3_CMTEB | RPL_MASK); /* LDT is unused */ __lldt(0); diff --git a/reactos/ntoskrnl/ke/amd64/trap.S b/reactos/ntoskrnl/ke/amd64/trap.S index 711b1769ebe..76e3fe42b51 100644 --- a/reactos/ntoskrnl/ke/amd64/trap.S +++ b/reactos/ntoskrnl/ke/amd64/trap.S @@ -274,6 +274,7 @@ ENDR /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */ sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + .allocstack (SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME) /* Set up EXCEPTION_RECORD */ lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]