From 5257ae819634d8ee09a48b33ca12dd3604b75fe6 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 10 Oct 2007 12:39:54 +0000 Subject: [PATCH] - Copy kernel's IDT entries to the IDT we've got from the bootloader. Fixes boot-process initiated by ntldr-compatible loaders. svn path=/trunk/; revision=29477 --- reactos/ntoskrnl/ke/i386/kiinit.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reactos/ntoskrnl/ke/i386/kiinit.c b/reactos/ntoskrnl/ke/i386/kiinit.c index a8e9b1ff65b..1ac5c1229ee 100644 --- a/reactos/ntoskrnl/ke/i386/kiinit.c +++ b/reactos/ntoskrnl/ke/i386/kiinit.c @@ -661,6 +661,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) ULONG InitialStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; + KIDTENTRY NmiEntry, DoubleFaultEntry; PKTSS Tss; PKIPCR Pcr; @@ -722,6 +723,19 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) Ke386SetDs(KGDT_R3_DATA | RPL_MASK); Ke386SetEs(KGDT_R3_DATA | RPL_MASK); + /* Save NMI and double fault traps */ + RtlCopyMemory(&NmiEntry, &Idt[2], sizeof(KIDTENTRY)); + RtlCopyMemory(&DoubleFaultEntry, &Idt[8], sizeof(KIDTENTRY)); + + /* Copy kernel's trap handlers */ + RtlCopyMemory(Idt, + (PVOID)KiIdtDescriptor.Base, + KiIdtDescriptor.Limit + 1); + + /* Restore NMI and double fault */ + RtlCopyMemory(&Idt[2], &NmiEntry, sizeof(KIDTENTRY)); + RtlCopyMemory(&Idt[8], &DoubleFaultEntry, sizeof(KIDTENTRY)); + AppCpuInit: /* Loop until we can release the freeze lock */ do