This is wrong, wrong, wrong.

1) The feature needs to be enabled on all processors, not just one. There's
a reason for that loop.

2) ValidKernelPte/Pde being marked global will make ALL kernel pages
global. This is probably not what you want.

Best regards,
Alex Ionescu

On Wed, Oct 14, 2015 at 12:33 PM, <sginsb...@svn.reactos.org> wrote:

> Author: sginsberg
> Date: Wed Oct 14 19:33:35 2015
> New Revision: 69528
>
> URL: http://svn.reactos.org/svn/reactos?rev=69528&view=rev
> Log:
> [NTOS]
> Add super-complicated handling of global pages to KeFlushCurrentTb (pretty
> much the same code which has been in HalpFlushTLB for the past ~6 years).
> This should be all that is required to make this feature work (everything
> else being in place already), and *seems* to work fine but is disabled
> under a switch until tested thoroughly.
>
> Global pages, an important optimization that allows for not flushing the
> whole x86 TLB every time CR3 is changed (typically on context switch to a
> new process, or during process attach/detach), relies on us doing extra
> work whenever we do alter a global page. This is likely where any bugs will
> have to be flushed out!
>
> Fixup Ki386EnableGlobalPage while we are at it -- disable/restore
> interrupts properly, and verify PGE-bit isn't set (nothing should have
> touched it before this routine, which is responsible for initializing it,
> so we shouldn't have to disable it). Fix, but disable, the CPU-sync spin as
> well as there should be no particular reason to do this for PGE-enabling
> during initialization (no other processor will be messing with PTEs at this
> stage, as compared to a call to KeFlushEntireTb).
>
> Everyone, repeat after me: Global pages are awesome!
>
> Modified:
>     trunk/reactos/ntoskrnl/include/ntoskrnl.h
>     trunk/reactos/ntoskrnl/ke/i386/cpu.c
>     trunk/reactos/ntoskrnl/ke/i386/patpge.c
>     trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
>
> Modified: trunk/reactos/ntoskrnl/include/ntoskrnl.h
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/ntoskrnl.h?rev=69528&r1=69527&r2=69528&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/include/ntoskrnl.h   [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/include/ntoskrnl.h   [iso-8859-1] Wed Oct 14
> 19:33:35 2015
> @@ -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"
>
> Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev=69528&r1=69527&r2=69528&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ke/i386/cpu.c        [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ke/i386/cpu.c        [iso-8859-1] Wed Oct 14
> 19:33:35 2015
> @@ -878,8 +878,37 @@
>  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
>
> Modified: trunk/reactos/ntoskrnl/ke/i386/patpge.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/patpge.c?rev=69528&r1=69527&r2=69528&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/ke/i386/patpge.c     [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/ke/i386/patpge.c     [iso-8859-1] Wed Oct 14
> 19:33:35 2015
> @@ -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();
> -
> -    /* Decrease CPU Count and loop until it's reached 0 */
> -    do {InterlockedDecrement(Count);} while (!*Count);
> -
> -    /* Now check if this is the Boot CPU */
> -    if (!KeGetPcr()->Number)
> -    {
> -        /* It is.FIXME: Patch KeFlushCurrentTb */
> -    }
> -
> -    /* Now get CR4 and make sure PGE is masked out */
> +    Enable = KeDisableInterrupts();
> +
> +    /* Spin until other processors are ready */
> +    //Count = (PLONG)Context;
> +    //InterlockedDecrement(Count);
> +    //while (*Count) YieldProcessor();
> +
> +#if defined(_GLOBAL_PAGES_ARE_AWESOME_)
> +
> +    /* Get CR4 and ensure global pages are disabled */
>      Cr4 = __readcr4();
> -    __writecr4(Cr4 & ~CR4_PGE);
> -
> -    /* Flush the TLB */
> -    Cr3 = __readcr3();
> -    __writecr3(Cr3);
> +    ASSERT(!(Cr4 & CR4_PGE));
> +
> +    /* 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);
> -
> -    /* Restore interrupts */
> -    _enable();
> +    __writecr4(Cr4 | CR4_PGE);
> +
> +#endif
> +
> +    /* Restore interrupts and return */
> +    KeRestoreInterrupts(Enable);
>      return 0;
>  }
>
>
> Modified: trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c?rev=69528&r1=69527&r2=69528&view=diff
>
> ==============================================================================
> --- trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c  [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c  [iso-8859-1] Wed Oct 14
> 19:33:35 2015
> @@ -249,15 +249,18 @@
>      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;
>
>
>
_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to