mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 17:06:29 +00:00
[NTOS]
- Fix KGDT64 names, - Add missing .ALLOCSTACK svn path=/branches/ros-amd64-bringup/; revision=45384
This commit is contained in:
parent
c8f9aa3f4b
commit
832d8290c8
|
@ -85,7 +85,7 @@ KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
|
||||||
|
|
||||||
/* Set Report Flags */
|
/* Set Report Flags */
|
||||||
WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS;
|
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;
|
WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -526,14 +526,14 @@ KDDEBUGGER_DATA64 KdDebuggerDataBlock =
|
||||||
//
|
//
|
||||||
// AMD64 GDT/LDT/TSS constants
|
// AMD64 GDT/LDT/TSS constants
|
||||||
//
|
//
|
||||||
KGDT_64_R0_CODE,
|
KGDT64_R0_CODE,
|
||||||
KGDT_64_DATA,
|
KGDT64_R3_DATA,
|
||||||
KGDT_64_DATA,
|
KGDT64_R3_DATA,
|
||||||
KGDT_64_R3_CODE,
|
KGDT64_R3_CODE,
|
||||||
KGDT_64_DATA,
|
KGDT64_R3_DATA,
|
||||||
KGDT_64_DATA,
|
KGDT64_R3_DATA,
|
||||||
0,
|
0,
|
||||||
KGDT_TSS,
|
KGDT64_SYS_TSS,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -74,11 +74,11 @@ KeContextToTrapFrame(IN PCONTEXT Context,
|
||||||
if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
|
if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
|
||||||
{
|
{
|
||||||
/* Check if this was a Kernel Trap */
|
/* Check if this was a Kernel Trap */
|
||||||
if (Context->SegCs == KGDT_64_R0_CODE)
|
if (Context->SegCs == KGDT64_R0_CODE)
|
||||||
{
|
{
|
||||||
/* Set valid selectors */
|
/* Set valid selectors */
|
||||||
TrapFrame->SegCs = KGDT_64_R0_CODE;
|
TrapFrame->SegCs = KGDT64_R0_CODE;
|
||||||
TrapFrame->SegSs = KGDT_64_R0_SS;
|
TrapFrame->SegSs = KGDT64_R0_DATA;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -97,13 +97,13 @@ KeContextToTrapFrame(IN PCONTEXT Context,
|
||||||
if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS)
|
if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS)
|
||||||
{
|
{
|
||||||
/* Check if this was a Kernel Trap */
|
/* Check if this was a Kernel Trap */
|
||||||
if (Context->SegCs == KGDT_64_R0_CODE)
|
if (Context->SegCs == KGDT64_R0_CODE)
|
||||||
{
|
{
|
||||||
/* Set valid selectors */
|
/* Set valid selectors */
|
||||||
TrapFrame->SegDs = KGDT_64_DATA | RPL_MASK;
|
TrapFrame->SegDs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
TrapFrame->SegEs = KGDT_64_DATA | RPL_MASK;
|
TrapFrame->SegEs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
TrapFrame->SegFs = KGDT_32_R3_TEB | RPL_MASK;
|
TrapFrame->SegFs = KGDT64_R3_CMTEB | RPL_MASK;
|
||||||
TrapFrame->SegGs = KGDT_64_DATA | RPL_MASK;
|
TrapFrame->SegGs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -190,11 +190,11 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame,
|
||||||
if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
|
if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
|
||||||
{
|
{
|
||||||
/* Check if this was a Kernel Trap */
|
/* Check if this was a Kernel Trap */
|
||||||
if (TrapFrame->SegCs == KGDT_64_R0_CODE)
|
if (TrapFrame->SegCs == KGDT64_R0_CODE)
|
||||||
{
|
{
|
||||||
/* Set valid selectors */
|
/* Set valid selectors */
|
||||||
Context->SegCs = KGDT_64_R0_CODE;
|
Context->SegCs = KGDT64_R0_CODE;
|
||||||
Context->SegSs = KGDT_64_R0_SS;
|
Context->SegSs = KGDT64_R0_DATA;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -213,13 +213,13 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame,
|
||||||
if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS)
|
if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS)
|
||||||
{
|
{
|
||||||
/* Check if this was a Kernel Trap */
|
/* Check if this was a Kernel Trap */
|
||||||
if (TrapFrame->SegCs == KGDT_64_R0_CODE)
|
if (TrapFrame->SegCs == KGDT64_R0_CODE)
|
||||||
{
|
{
|
||||||
/* Set valid selectors */
|
/* Set valid selectors */
|
||||||
Context->SegDs = KGDT_64_DATA | RPL_MASK;
|
Context->SegDs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
Context->SegEs = KGDT_64_DATA | RPL_MASK;
|
Context->SegEs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
Context->SegFs = KGDT_32_R3_TEB | RPL_MASK;
|
Context->SegFs = KGDT64_R3_CMTEB | RPL_MASK;
|
||||||
Context->SegGs = KGDT_64_DATA | RPL_MASK;
|
Context->SegGs = KGDT64_R3_DATA | RPL_MASK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -379,7 +379,7 @@ KiInitializeTss(IN PKTSS64 Tss,
|
||||||
PKGDTENTRY64 TssEntry;
|
PKGDTENTRY64 TssEntry;
|
||||||
|
|
||||||
/* Get pointer to the GDT entry */
|
/* Get pointer to the GDT entry */
|
||||||
TssEntry = KiGetGdtEntry(KeGetPcr()->GdtBase, KGDT_TSS);
|
TssEntry = KiGetGdtEntry(KeGetPcr()->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);
|
||||||
|
@ -403,7 +403,7 @@ KiInitializeTss(IN PKTSS64 Tss,
|
||||||
Tss->Ist[3] = (ULONG64)KiDoubleFaultStack;
|
Tss->Ist[3] = (ULONG64)KiDoubleFaultStack;
|
||||||
|
|
||||||
/* Load the task register */
|
/* Load the task register */
|
||||||
__ltr(KGDT_TSS);
|
__ltr(KGDT64_SYS_TSS);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -50,10 +50,9 @@ KIDT_INIT KiInterruptInitTable[] =
|
||||||
KIDTENTRY64 KiIdt[256];
|
KIDTENTRY64 KiIdt[256];
|
||||||
KDESCRIPTOR KiIdtDescriptor = {{0}, sizeof(KiIdt) - 1, KiIdt};
|
KDESCRIPTOR KiIdtDescriptor = {{0}, sizeof(KiIdt) - 1, KiIdt};
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
INIT_FUNCTION
|
INIT_FUNCTION
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -80,7 +79,7 @@ KeInitExceptions(VOID)
|
||||||
KiIdt[i].IstIndex = 0;
|
KiIdt[i].IstIndex = 0;
|
||||||
}
|
}
|
||||||
KiIdt[i].OffsetLow = Offset & 0xffff;
|
KiIdt[i].OffsetLow = Offset & 0xffff;
|
||||||
KiIdt[i].Selector = KGDT_64_R0_CODE;
|
KiIdt[i].Selector = KGDT64_R0_CODE;
|
||||||
KiIdt[i].Type = 0x0e;
|
KiIdt[i].Type = 0x0e;
|
||||||
KiIdt[i].Reserved0 = 0;
|
KiIdt[i].Reserved0 = 0;
|
||||||
KiIdt[i].Present = 1;
|
KiIdt[i].Present = 1;
|
||||||
|
@ -242,6 +241,20 @@ KiGeneralProtectionFaultHandler(
|
||||||
ASSERT(FALSE);
|
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 */
|
/* Check for nested exception */
|
||||||
if ((TrapFrame->Rip >= (ULONG64)KiGeneralProtectionFaultHandler) &&
|
if ((TrapFrame->Rip >= (ULONG64)KiGeneralProtectionFaultHandler) &&
|
||||||
(TrapFrame->Rip < (ULONG64)KiGeneralProtectionFaultHandler))
|
(TrapFrame->Rip < (ULONG64)KiGeneralProtectionFaultHandler))
|
||||||
|
@ -271,20 +284,6 @@ KiGeneralProtectionFaultHandler(
|
||||||
return STATUS_ACCESS_VIOLATION;
|
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);
|
ASSERT(FALSE);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,7 +120,7 @@ KiInitializePcr(IN PKIPCR Pcr,
|
||||||
|
|
||||||
/* Get TSS Selector */
|
/* Get TSS Selector */
|
||||||
__str(&Tr);
|
__str(&Tr);
|
||||||
ASSERT(Tr == KGDT_TSS);
|
ASSERT(Tr == KGDT64_SYS_TSS);
|
||||||
|
|
||||||
/* Get TSS Entry */
|
/* Get TSS Entry */
|
||||||
TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr);
|
TssEntry = KiGetGdtEntry(Pcr->GdtBase, Tr);
|
||||||
|
@ -390,9 +390,9 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
__writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr);
|
__writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr);
|
||||||
|
|
||||||
/* Load Ring 3 selectors for DS/ES/FS */
|
/* Load Ring 3 selectors for DS/ES/FS */
|
||||||
Ke386SetDs(KGDT_64_DATA | RPL_MASK);
|
Ke386SetDs(KGDT64_R3_DATA | RPL_MASK);
|
||||||
Ke386SetEs(KGDT_64_DATA | RPL_MASK);
|
Ke386SetEs(KGDT64_R3_DATA | RPL_MASK);
|
||||||
Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK);
|
Ke386SetFs(KGDT64_R3_CMTEB | RPL_MASK);
|
||||||
|
|
||||||
/* LDT is unused */
|
/* LDT is unused */
|
||||||
__lldt(0);
|
__lldt(0);
|
||||||
|
|
|
@ -274,6 +274,7 @@ ENDR
|
||||||
|
|
||||||
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
|
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
|
||||||
sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
|
sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
|
||||||
|
.allocstack (SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME)
|
||||||
|
|
||||||
/* Set up EXCEPTION_RECORD */
|
/* Set up EXCEPTION_RECORD */
|
||||||
lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
|
lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
|
||||||
|
|
Loading…
Reference in a new issue