From 4bcb47a522b92aeb36187f337f31d5b1c9b30909 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 19 Jul 2016 12:51:49 +0000 Subject: [PATCH] [NTOS:KE] - Load LDT on context switch if required. CORE-11511 #resolve svn path=/trunk/; revision=71967 --- reactos/ntoskrnl/ke/i386/context.c | 14 +++++++++++--- reactos/ntoskrnl/ke/i386/ldt.c | 2 +- reactos/ntoskrnl/ke/i386/thrdini.c | 13 +++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/context.c b/reactos/ntoskrnl/ke/i386/context.c index e1a7f11a6c5..5617a678514 100644 --- a/reactos/ntoskrnl/ke/i386/context.c +++ b/reactos/ntoskrnl/ke/i386/context.c @@ -34,9 +34,17 @@ KiSwapProcess(IN PKPROCESS NewProcess, /* 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 */ diff --git a/reactos/ntoskrnl/ke/i386/ldt.c b/reactos/ntoskrnl/ke/i386/ldt.c index 14298de2994..3501712ffaf 100644 --- a/reactos/ntoskrnl/ke/i386/ldt.c +++ b/reactos/ntoskrnl/ke/i386/ldt.c @@ -167,7 +167,7 @@ BOOLEAN PspIsDescriptorValid(PLDT_ENTRY ldt_entry) 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"); } /* diff --git a/reactos/ntoskrnl/ke/i386/thrdini.c b/reactos/ntoskrnl/ke/i386/thrdini.c index ba7935c3dd1..66264b5030e 100644 --- a/reactos/ntoskrnl/ke/i386/thrdini.c +++ b/reactos/ntoskrnl/ke/i386/thrdini.c @@ -345,8 +345,17 @@ KiSwapContextExit(IN PKTHREAD OldThread, /* 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 */ -- 2.17.1