diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 404878ad00d..400a153ccc9 100644 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -98,6 +98,14 @@ #define ASSERT NT_ASSERT #endif + +// +// Switch for enabling global page support +// + +//#define _GLOBAL_PAGES_ARE_AWESOME_ + + /* Internal Headers */ #include "internal/ntoskrnl.h" #include "config.h" diff --git a/reactos/ntoskrnl/ke/i386/cpu.c b/reactos/ntoskrnl/ke/i386/cpu.c index c9ca0cda244..3d4ea82d9b8 100644 --- a/reactos/ntoskrnl/ke/i386/cpu.c +++ b/reactos/ntoskrnl/ke/i386/cpu.c @@ -878,8 +878,37 @@ VOID NTAPI KeFlushCurrentTb(VOID) { + +#if !defined(_GLOBAL_PAGES_ARE_AWESOME_) + /* Flush the TLB by resetting CR3 */ __writecr3(__readcr3()); + +#else + + /* Check if global pages are enabled */ + if (KeFeatureBits & KF_GLOBAL_PAGE) + { + ULONG Cr4; + + /* Disable PGE */ + Cr4 = __readcr4() & ~CR4_PGE; + __writecr4(Cr4); + + /* Flush everything */ + __writecr3(__readcr3()); + + /* Re-enable PGE */ + __writecr4(Cr4 | CR4_PGE); + } + else + { + /* No global pages, resetting CR3 is enough */ + __writecr3(__readcr3()); + } + +#endif + } VOID diff --git a/reactos/ntoskrnl/ke/i386/patpge.c b/reactos/ntoskrnl/ke/i386/patpge.c index 1e598ce355a..a0e9b494240 100644 --- a/reactos/ntoskrnl/ke/i386/patpge.c +++ b/reactos/ntoskrnl/ke/i386/patpge.c @@ -17,40 +17,41 @@ /* FUNCTIONS *****************************************************************/ +INIT_SECTION ULONG_PTR NTAPI -INIT_FUNCTION Ki386EnableGlobalPage(IN ULONG_PTR Context) { - PLONG Count = (PLONG)Context; - ULONG Cr4, Cr3; + //PLONG Count; +#if defined(_GLOBAL_PAGES_ARE_AWESOME_) + ULONG Cr4; +#endif + BOOLEAN Enable; /* Disable interrupts */ - _disable(); + Enable = KeDisableInterrupts(); - /* Decrease CPU Count and loop until it's reached 0 */ - do {InterlockedDecrement(Count);} while (!*Count); + /* Spin until other processors are ready */ + //Count = (PLONG)Context; + //InterlockedDecrement(Count); + //while (*Count) YieldProcessor(); - /* Now check if this is the Boot CPU */ - if (!KeGetPcr()->Number) - { - /* It is.FIXME: Patch KeFlushCurrentTb */ - } +#if defined(_GLOBAL_PAGES_ARE_AWESOME_) - /* Now get CR4 and make sure PGE is masked out */ + /* Get CR4 and ensure global pages are disabled */ Cr4 = __readcr4(); - __writecr4(Cr4 & ~CR4_PGE); + ASSERT(!(Cr4 & CR4_PGE)); - /* Flush the TLB */ - Cr3 = __readcr3(); - __writecr3(Cr3); + /* Reset CR3 to flush the TLB */ + __writecr3(__readcr3()); /* Now enable PGE */ - DPRINT("Global page support detected but not yet taken advantage of\n"); - //__writecr4(Cr4 | CR4_PGE); + __writecr4(Cr4 | CR4_PGE); - /* Restore interrupts */ - _enable(); +#endif + + /* Restore interrupts and return */ + KeRestoreInterrupts(Enable); return 0; } diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index c5c6bb308ba..5a42219302d 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -249,15 +249,18 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PMMPFN Pfn1; ULONG Flags; +#if defined(_GLOBAL_PAGES_ARE_AWESOME_) + /* Check for global bit */ -#if 0 if (KeFeatureBits & KF_GLOBAL_PAGE) { /* Set it on the template PTE and PDE */ ValidKernelPte.u.Hard.Global = TRUE; ValidKernelPde.u.Hard.Global = TRUE; } + #endif + /* Now templates are ready */ TempPte = ValidKernelPte; TempPde = ValidKernelPde;