- Load LDT on context switch if required.
CORE-11511 #resolve
svn path=/trunk/; revision=71967
/* Check for new LDT */
if (NewProcess->LdtDescriptor.LimitLow != OldProcess->LdtDescriptor.LimitLow)
{
- /* Not handled yet */
- UNIMPLEMENTED_DBGBREAK();
- return;
+ if (NewProcess->LdtDescriptor.LimitLow)
+ {
+ KeSetGdtSelector(KGDT_LDT,
+ ((PULONG)&NewProcess->LdtDescriptor)[0],
+ ((PULONG)&NewProcess->LdtDescriptor)[1]);
+ Ke386SetLocalDescriptorTable(KGDT_LDT);
+ }
+ else
+ {
+ Ke386SetLocalDescriptorTable(0);
+ }
}
/* Update CR3 */
if ((Base + SegLimit > (ULONG_PTR) MmHighestUserAddress) ||
(Base > Base+SegLimit))
{
- DPRINT1("WARNING: Windows would mark this descriptor invalid!");
+ DPRINT1("WARNING: Windows would mark this descriptor invalid!\n");
}
/*
/* Check if there is a different LDT */
if (*(PULONGLONG)&OldProcess->LdtDescriptor != *(PULONGLONG)&NewProcess->LdtDescriptor)
{
- DPRINT1("LDT switch not implemented\n");
- ASSERT(FALSE);
+ if (NewProcess->LdtDescriptor.LimitLow)
+ {
+ KeSetGdtSelector(KGDT_LDT,
+ ((PULONG)&NewProcess->LdtDescriptor)[0],
+ ((PULONG)&NewProcess->LdtDescriptor)[1]);
+ Ke386SetLocalDescriptorTable(KGDT_LDT);
+ }
+ else
+ {
+ Ke386SetLocalDescriptorTable(0);
+ }
}
/* Switch address space and flush TLB */