- Fix KGDT64 names, 
- Add missing .ALLOCSTACK

svn path=/branches/ros-amd64-bringup/; revision=45384
This commit is contained in:
Timo Kreuzer 2010-02-03 00:18:24 +00:00
parent c8f9aa3f4b
commit 832d8290c8
7 changed files with 47 additions and 47 deletions

View file

@ -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;
} }

View file

@ -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

View file

@ -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
{ {

View file

@ -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

View file

@ -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;
} }

View file

@ -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);

View file

@ -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]