[FREELDR]
[reactos.git] / reactos / boot / freeldr / freeldr / arch / amd64 / loader.c
index adb50e9..9970090 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  FreeLoader
- *  Copyright (C) 1998-2003  Brian Palmer  <brianp@sginet.com>
- *  Copyright (C) 2005       Alex Ionescu  <alex@relsoft.net>
+ *  Copyright (C) 2008 - 2009 Timo Kreuzer (timo.kreuzer@reactor.org)
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#define _NTSYSTEM_
 #include <freeldr.h>
 
 #define NDEBUG
 #include <debug.h>
-#undef DbgPrint
 
 /* Page Directory and Tables for non-PAE Systems */
-extern PAGE_DIRECTORY_X86 startup_pagedirectory;
-extern PAGE_DIRECTORY_X86 lowmem_pagetable;
-extern PAGE_DIRECTORY_X86 kernel_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;
+extern ULONG_PTR NextModuleBase;
 extern ULONG_PTR KernelBase;
+ULONG_PTR GdtBase, IdtBase, TssBase;
 extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint;
+
+PPAGE_DIRECTORY_AMD64 pPML4;
+PVOID pIdt, pGdt;
+
 /* FUNCTIONS *****************************************************************/
 
+void
+EnableA20()
+{
+    /* Already done */
+}
+
 /*++
  * FrLdrStartup
  * INTERNAL
@@ -56,161 +58,7 @@ VOID
 NTAPI
 FrLdrStartup(ULONG Magic)
 {
-    ASSERT(FALSE);
-#if 0
-    /* Disable Interrupts */
-    _disable();
-
-    /* Re-initalize EFLAGS */
-    Ke386EraseFlags();
-
-    /* Initialize the page directory */
-    FrLdrSetupPageDirectory();
-
-    /* Initialize Paging, Write-Protection and Load NTOSKRNL */
-    FrLdrSetupPae(Magic);
-#endif
-}
-
-/*++
- * FrLdrSetupPae
- * INTERNAL
- *
- *     Configures PAE on a MP System, and sets the PDBR if it's supported, or if
- *     the system is UP.
- *
- * Params:
- *     Magic - Multiboot Magic
- *
- * Returns:
- *     None.
- *
- * Remarks:
- *     None.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrSetupPae(ULONG Magic)
-{
-#if 0
-    ULONG_PTR PageDirectoryBaseAddress = (ULONG_PTR)&startup_pagedirectory;
-
-    /* Set the PDBR */
-    __writecr3(PageDirectoryBaseAddress);
-
-    /* Enable Paging and Write Protect*/
-    __writecr0(__readcr0() | X86_CR0_PG | X86_CR0_WP);
-
-    /* Jump to Kernel */
-    (*KernelEntryPoint)(Magic, &LoaderBlock);
-#endif
-}
-
-/*++
- * FrLdrSetupPageDirectory
- * INTERNAL
- *
- *     Sets up the ReactOS Startup Page Directory.
- *
- * Params:
- *     None.
- *
- * Returns:
- *     None.
- *
- * Remarks:
- *     We are setting PDEs, but using the equvivalent (for our purpose) PTE structure.
- *     As such, please note that PageFrameNumber == PageEntryNumber.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrSetupPageDirectory(VOID)
-{
-#if 0
-    PPAGE_DIRECTORY_X86 PageDir;
-    ULONG KernelPageTableIndex;
-    ULONG i;
-
-    /* Get the Kernel Table Index */
-    KernelPageTableIndex = KernelBase >> PDE_SHIFT;
-
-    /* Get the Startup Page Directory */
-    PageDir = (PPAGE_DIRECTORY_X86)&startup_pagedirectory;
-
-    /* Set up the Low Memory PDE */
-    PageDir->Pde[LowMemPageTableIndex].Valid = 1;
-    PageDir->Pde[LowMemPageTableIndex].Write = 1;
-    PageDir->Pde[LowMemPageTableIndex].PageFrameNumber = PaPtrToPfn(lowmem_pagetable);
-
-    /* Set up the Kernel PDEs */
-    PageDir->Pde[KernelPageTableIndex].Valid = 1;
-    PageDir->Pde[KernelPageTableIndex].Write = 1;
-    PageDir->Pde[KernelPageTableIndex].PageFrameNumber = PaPtrToPfn(kernel_pagetable);
-    PageDir->Pde[KernelPageTableIndex + 1].Valid = 1;
-    PageDir->Pde[KernelPageTableIndex + 1].Write = 1;
-    PageDir->Pde[KernelPageTableIndex + 1].PageFrameNumber = PaPtrToPfn(kernel_pagetable + 4096);
-
-    /* Set up the Startup PDE */
-    PageDir->Pde[StartupPageTableIndex].Valid = 1;
-    PageDir->Pde[StartupPageTableIndex].Write = 1;
-    PageDir->Pde[StartupPageTableIndex].PageFrameNumber = PaPtrToPfn(startup_pagedirectory);
-
-    /* Set up the Hyperspace PDE */
-    PageDir->Pde[HyperspacePageTableIndex].Valid = 1;
-    PageDir->Pde[HyperspacePageTableIndex].Write = 1;
-    PageDir->Pde[HyperspacePageTableIndex].PageFrameNumber = PaPtrToPfn(hyperspace_pagetable);
-
-    /* Set up the HAL PDE */
-    PageDir->Pde[HalPageTableIndex].Valid = 1;
-    PageDir->Pde[HalPageTableIndex].Write = 1;
-    PageDir->Pde[HalPageTableIndex].PageFrameNumber = PaPtrToPfn(apic_pagetable);
-
-    /* Set up Low Memory PTEs */
-    PageDir = (PPAGE_DIRECTORY_X86)&lowmem_pagetable;
-    for (i=0; i<1024; i++)
-    {
-        PageDir->Pde[i].Valid = 1;
-        PageDir->Pde[i].Write = 1;
-        PageDir->Pde[i].Owner = 1;
-        PageDir->Pde[i].PageFrameNumber = PaToPfn(i * PAGE_SIZE);
-    }
-
-    /* Set up Kernel PTEs */
-    PageDir = (PPAGE_DIRECTORY_X86)&kernel_pagetable;
-    for (i=0; i<1536; i++)
-    {
-        PageDir->Pde[i].Valid = 1;
-        PageDir->Pde[i].Write = 1;
-        PageDir->Pde[i].PageFrameNumber = PaToPfn(KERNEL_BASE_PHYS + i * PAGE_SIZE);
-    }
-
-    /* Setup APIC Base */
-    PageDir = (PPAGE_DIRECTORY_X86)&apic_pagetable;
-    PageDir->Pde[0].Valid = 1;
-    PageDir->Pde[0].Write = 1;
-    PageDir->Pde[0].CacheDisable = 1;
-    PageDir->Pde[0].WriteThrough = 1;
-    PageDir->Pde[0].PageFrameNumber = PaToPfn(HAL_BASE);
-    PageDir->Pde[0x200].Valid = 1;
-    PageDir->Pde[0x200].Write = 1;
-    PageDir->Pde[0x200].CacheDisable = 1;
-    PageDir->Pde[0x200].WriteThrough = 1;
-    PageDir->Pde[0x200].PageFrameNumber = PaToPfn(HAL_BASE + KERNEL_BASE_PHYS);
-
-    /* Setup KUSER_SHARED_DATA Base */
-    PageDir->Pde[0x1F0].Valid = 1;
-    PageDir->Pde[0x1F0].Write = 1;
-    PageDir->Pde[0x1F0].PageFrameNumber = 2;
-
-    /* Setup KPCR Base*/
-    PageDir->Pde[0x1FF].Valid = 1;
-    PageDir->Pde[0x1FF].Write = 1;
-    PageDir->Pde[0x1FF].PageFrameNumber = 1;
-
-    /* Zero shared data */
-    RtlZeroMemory((PVOID)(2 << MM_PAGE_SHIFT), PAGE_SIZE);
-#endif
+       DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint);
+    for(;;);
 }