From 82280e1435efd1a24e435f24cd487b5b2763563f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 6 Oct 2010 14:39:56 +0000 Subject: [PATCH] [NTOSKRNL] Alternative workaround for pentium lock errata: Instead of burdening the page fault handler, just mark the IDT page as Write-Through if the bug is present. According to http://www.rcollins.org/Errata/Dec97/F00FBug.html it shall prevent the lock up. Please test. Dedicated to elhoir. svn path=/trunk/; revision=49018 --- reactos/ntoskrnl/ke/amd64/cpu.c | 1 - reactos/ntoskrnl/ke/i386/traphdlr.c | 8 -------- reactos/ntoskrnl/mm/ARM3/i386/init.c | 10 ++++++++++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/ke/amd64/cpu.c b/reactos/ntoskrnl/ke/amd64/cpu.c index 90a6b2c0641..2e414ba3413 100644 --- a/reactos/ntoskrnl/ke/amd64/cpu.c +++ b/reactos/ntoskrnl/ke/amd64/cpu.c @@ -37,7 +37,6 @@ ULONG KeLargestCacheLine = 0x40; ULONG KiDmaIoCoherency = 0; CHAR KeNumberProcessors = 0; KAFFINITY KeActiveProcessors = 1; -BOOLEAN KiI386PentiumLockErrataPresent; BOOLEAN KiSMTProcessorsPresent; /* Freeze data */ diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index 2374bf40505..4822b71b8aa 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -1176,14 +1176,6 @@ KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame) /* Save CR2 */ Cr2 = __readcr2(); - /* Check for Pentium LOCK errata */ - if (KiI386PentiumLockErrataPresent) - { - /* Not yet implemented */ - UNIMPLEMENTED; - while (TRUE); - } - /* HACK: Check if interrupts are disabled and enable them */ if (!(TrapFrame->EFlags & EFLAGS_INTERRUPT_MASK)) { diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index f561ab457db..cfb77c6e33c 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -567,6 +567,16 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + /* Check for Pentium LOCK errata */ + if (KiI386PentiumLockErrataPresent) + { + /* Mark the 1st IDT page as Write-Through to prevent a lockup + on a FOOF instruction. + See http://www.rcollins.org/Errata/Dec97/F00FBug.html */ + PointerPte = MiAddressToPte(KeGetPcr()->IDT); + PointerPte->u.Hard.WriteThrough = 1; + } + return STATUS_SUCCESS; }