From 2e20ca1f14ca9dcffb426e9a00511281d713c64c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Fri, 2 Mar 2007 06:01:07 +0000 Subject: [PATCH] - Create PDE/PTE entries for KUSER_SHARED_DATA in FreeLDR, so that MmInit1 isn't needed to access it. - This allows us to access SharedUserData much earlier in the kernel, as well as in kdcom, which means the Windows/TinyKRNL version should now work without modification. svn path=/trunk/; revision=25941 --- .../boot/freeldr/freeldr/arch/i386/loader.c | 19 +++++++++++- reactos/boot/freeldr/freeldr/arch/i386/mb.S | 30 ++----------------- .../boot/freeldr/freeldr/include/reactos.h | 1 + reactos/ntoskrnl/ke/i386/kiinit.c | 12 +++----- 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/loader.c b/reactos/boot/freeldr/freeldr/arch/i386/loader.c index c5e13f5dd26..b0f5be398bf 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/loader.c @@ -40,9 +40,10 @@ ULONG_PTR KernelEntry; extern PAGE_DIRECTORY_X86 startup_pagedirectory; extern PAGE_DIRECTORY_X86 lowmem_pagetable; extern PAGE_DIRECTORY_X86 kernel_pagetable; -extern ULONG_PTR hyperspace_pagetable; +extern PAGE_DIRECTORY_X86 hyperspace_pagetable; extern PAGE_DIRECTORY_X86 apic_pagetable; extern PAGE_DIRECTORY_X86 kpcr_pagetable; +extern PAGE_DIRECTORY_X86 kuser_pagetable; PVOID NTAPI @@ -184,6 +185,11 @@ FrLdrSetupPageDirectory(VOID) PageDir->Pde[KpcrPageTableIndex].Write = 1; PageDir->Pde[KpcrPageTableIndex].PageFrameNumber = PaPtrToPfn(kpcr_pagetable); + /* Set up the KUSER PDE */ + PageDir->Pde[KuserPageTableIndex].Valid = 1; + PageDir->Pde[KuserPageTableIndex].Write = 1; + PageDir->Pde[KuserPageTableIndex].PageFrameNumber = PaPtrToPfn(kuser_pagetable); + /* Set up Low Memory PTEs */ PageDir = (PPAGE_DIRECTORY_X86)&lowmem_pagetable; for (i=0; i<1024; i++) @@ -221,6 +227,17 @@ FrLdrSetupPageDirectory(VOID) PageDir->Pde[0].Valid = 1; PageDir->Pde[0].Write = 1; PageDir->Pde[0].PageFrameNumber = 1; + + /* Setup KUSER PTEs */ + PageDir = (PPAGE_DIRECTORY_X86)&kuser_pagetable; + for (i = 0; i < 1024; i++) + { + /* SEetup each entry */ + PageDir->Pde[i].Valid = 1; + PageDir->Pde[i].Write = 1; + PageDir->Pde[i].Owner = 1; + PageDir->Pde[i].PageFrameNumber = PaToPfn(KI_USER_SHARED_DATA + i * PAGE_SIZE); + } } PLOADER_MODULE diff --git a/reactos/boot/freeldr/freeldr/arch/i386/mb.S b/reactos/boot/freeldr/freeldr/arch/i386/mb.S index 7bea5b2b0ee..d87e45758b8 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/mb.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/mb.S @@ -37,15 +37,8 @@ .globl _hyperspace_pagetable .globl _apic_pagetable .globl _kpcr_pagetable + .globl _kuser_pagetable - .globl _startup_pagedirectorytable_pae - .globl _startup_pagedirectory_pae - .globl _lowmem_pagetable_pae - .globl _kernel_pagetable_pae - .globl _hyperspace_pagetable_pae - .globl _apic_pagetable_pae - .globl _kpcr_pagetable_pae - .globl _PageDirectoryEnd // @@ -80,24 +73,7 @@ _apic_pagetable: _kpcr_pagetable: .fill 4096, 1, 0 -_startup_pagedirectory_pae: - .fill 4 * 4096, 1, 0 +_kuser_pagetable: + .fill 4096, 1, 0 -_lowmem_pagetable_pae: - .fill 2 * 4096, 1, 0 - -_kernel_pagetable_pae: - .fill 3*4096, 1, 0 - -_hyperspace_pagetable_pae: - .fill 2*4096, 1, 0 - -_apic_pagetable_pae: - .fill 2*4096, 1, 0 - -_kpcr_pagetable_pae: - .fill 4*4096, 1, 0 - -_startup_pagedirectorytable_pae: - .fill 4096, 1, 0 _PageDirectoryEnd: diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h index 2ff56169ca0..45f3dc8205e 100644 --- a/reactos/boot/freeldr/freeldr/include/reactos.h +++ b/reactos/boot/freeldr/freeldr/include/reactos.h @@ -53,6 +53,7 @@ #define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22) #define KpcrPageTableIndex (KPCR_BASE >> 22) #define ApicPageTableIndex (APIC_BASE >> 22) +#define KuserPageTableIndex (KI_USER_SHARED_DATA >> 22) #define KernelEntryPoint (KernelEntry - KERNEL_BASE_PHYS) + KernelBase diff --git a/reactos/ntoskrnl/ke/i386/kiinit.c b/reactos/ntoskrnl/ke/i386/kiinit.c index 2a0a0e7c956..f192c5e9dcc 100644 --- a/reactos/ntoskrnl/ke/i386/kiinit.c +++ b/reactos/ntoskrnl/ke/i386/kiinit.c @@ -381,7 +381,6 @@ KiInitializeKernel(IN PKPROCESS InitProcess, ULONG FeatureBits; LARGE_INTEGER PageDirectory; PVOID DpcStack; - ULONG NXSupportPolicy; ULONG Vendor[3]; /* Detect and set the CPU Type */ @@ -403,19 +402,19 @@ KiInitializeKernel(IN PKPROCESS InitProcess, FeatureBits = KiGetFeatureBits(); /* Set the default NX policy (opt-in) */ - NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN; + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN; /* Check if NPX is always on */ if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSON")) { /* Set it always on */ - NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSON; + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSON; FeatureBits |= KF_NX_ENABLED; } else if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTOUT")) { /* Set it in opt-out mode */ - NXSupportPolicy = NX_SUPPORT_POLICY_OPTOUT; + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTOUT; FeatureBits |= KF_NX_ENABLED; } else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTIN")) || @@ -428,7 +427,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess, (strstr(KeLoaderBlock->LoadOptions, "EXECUTE"))) { /* Set disabled mode */ - NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF; + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF; FeatureBits |= KF_NX_DISABLED; } @@ -533,9 +532,6 @@ KiInitializeKernel(IN PKPROCESS InitProcess, 0, 4096); - /* Set the NX Support policy */ - SharedUserData->NXSupportPolicy = (UCHAR)NXSupportPolicy; - /* Set basic CPU Features that user mode can read */ SharedUserData->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = (KeFeatureBits & KF_MMX) ? TRUE: FALSE;