[FREELDR] Add support for loading Linux in x64 FreeLdr. Part 2/2: C code.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 6 Oct 2019 17:22:18 +0000 (19:22 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 7 Oct 2019 23:30:25 +0000 (01:30 +0200)
- Re-enable custom and Linux boot menu entries.
- Fix compilation and add address limit checks for x64 build of linux loader.

boot/freeldr/freeldr/bootmgr.c
boot/freeldr/freeldr/custom.c
boot/freeldr/freeldr/include/custom.h
boot/freeldr/freeldr/include/linux.h
boot/freeldr/freeldr/include/miscboot.h
boot/freeldr/freeldr/linuxboot.c
boot/freeldr/freeldr/miscboot.c

index 4a1923d..9830c2e 100644 (file)
@@ -54,12 +54,13 @@ static const struct
 {
     {"ReactOSSetup", EditCustomBootReactOSSetup, LoadReactOSSetup},
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
     {"Drive"       , EditCustomBootDisk      , LoadAndBootDevice},
     {"Partition"   , EditCustomBootPartition , LoadAndBootDevice},
     {"BootSector"  , EditCustomBootSectorFile, LoadAndBootDevice},
-
     {"Linux"       , EditCustomBootLinux, LoadAndBootLinux  },
+#endif
+#ifdef _M_IX86
     {"WindowsNT40" , EditCustomBootNTOS , LoadAndBootWindows},
 #endif
     {"Windows"     , EditCustomBootNTOS , LoadAndBootWindows},
index 604d7ac..7cfd38c 100644 (file)
 
 /* GLOBALS ********************************************************************/
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 const CHAR BootSectorFilePrompt[] = "Enter the boot sector file path.\n\nExamples:\n\\BOOTSECT.DOS\n/boot/bootsect.dos";
 const CHAR LinuxKernelPrompt[] = "Enter the Linux kernel image path.\n\nExamples:\n/vmlinuz\n/boot/vmlinuz-2.4.18";
 const CHAR LinuxInitrdPrompt[] = "Enter the initrd image path.\n\nExamples:\n/initrd.gz\n/boot/root.img.gz\n\nLeave blank for no initial ram disk.";
 const CHAR LinuxCommandLinePrompt[] = "Enter the Linux kernel command line.\n\nExamples:\nroot=/dev/hda1\nroot=/dev/fd0 read-only\nroot=/dev/sdb1 init=/sbin/init";
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */
 
 const CHAR BootDrivePrompt[] = "Enter the boot drive.\n\nExamples:\nfd0 - first floppy drive\nhd0 - first hard drive\nhd1 - second hard drive\ncd0 - first CD-ROM drive.\n\nBIOS drive numbers may also be used:\n0 - first floppy drive\n0x80 - first hard drive\n0x81 - second hard drive";
 const CHAR BootPartitionPrompt[] = "Enter the boot partition.\n\nEnter 0 for the active (bootable) partition.";
@@ -46,7 +46,7 @@ const CHAR CustomBootPrompt[] = "Press ENTER to boot your custom boot setup.";
 VOID OptionMenuCustomBoot(VOID)
 {
     PCSTR CustomBootMenuList[] = {
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
         "Disk",
         "Partition",
         "Boot Sector File",
@@ -75,7 +75,7 @@ VOID OptionMenuCustomBoot(VOID)
     OperatingSystem.SectionId = 0;
     switch (SelectedMenuItem)
     {
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
         case 0: // Disk
             EditCustomBootDisk(&OperatingSystem);
             break;
@@ -101,7 +101,7 @@ VOID OptionMenuCustomBoot(VOID)
         case 1: // ReactOS Setup
             EditCustomBootReactOS(&OperatingSystem, TRUE);
             break;
-#endif
+#endif /* _M_IX86 || _M_AMD64 */
     }
 
     /* And boot it */
@@ -114,7 +114,7 @@ VOID OptionMenuCustomBoot(VOID)
 
 #endif // HAS_OPTION_MENU_CUSTOM_BOOT
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 VOID
 EditCustomBootDisk(
@@ -612,7 +612,7 @@ EditCustomBootLinux(
     OperatingSystem->LoadIdentifier = "Custom Linux Setup";
 }
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */
 
 VOID
 EditCustomBootReactOS(
index 57164b8..8fb4f7b 100644 (file)
@@ -27,7 +27,7 @@
 VOID OptionMenuCustomBoot(VOID);
 #endif
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 VOID
 EditCustomBootDisk(
@@ -45,7 +45,7 @@ VOID
 EditCustomBootLinux(
     IN OUT OperatingSystemItem* OperatingSystem);
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */
 
 VOID
 EditCustomBootReactOS(
index c51f70d..6bb92d9 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef __LINUX_H
 #define __LINUX_H
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 #define LINUX_LOADER_TYPE_LILO          0x01
 #define LINUX_LOADER_TYPE_LOADLIN       0x11
@@ -142,6 +142,6 @@ LoadAndBootLinux(
     IN PCHAR Argv[],
     IN PCHAR Envp[]);
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */
 
 #endif // defined __LINUX_H
index 9ba1cb8..0f05fd1 100644 (file)
@@ -19,7 +19,7 @@
 
 #pragma once
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 ARC_STATUS
 LoadAndBootDevice(
@@ -27,4 +27,4 @@ LoadAndBootDevice(
     IN PCHAR Argv[],
     IN PCHAR Envp[]);
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */
index fa9ad60..fae1f8d 100644 (file)
@@ -22,9 +22,7 @@
  * https://www.kernel.org/doc/Documentation/x86/boot.txt
  */
 
-#ifndef _M_ARM
-
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 /* INCLUDES *******************************************************************/
 
@@ -439,7 +437,7 @@ static BOOLEAN LinuxReadKernel(ULONG LinuxKernelFile)
     Position.QuadPart = 512 + SetupSectorSize;
     if (ArcSeek(LinuxKernelFile, &Position, SeekAbsolute) != ESUCCESS)
         return FALSE;
-    for (BytesLoaded=0; BytesLoaded<LinuxKernelSize; )
+    for (BytesLoaded = 0; BytesLoaded < LinuxKernelSize; )
     {
         if (ArcRead(LinuxKernelFile, LoadAddress, LINUX_READ_CHUNK_SIZE, NULL) != ESUCCESS)
             return FALSE;
@@ -492,31 +490,37 @@ static BOOLEAN LinuxCheckKernelVersion(VOID)
 
 static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
 {
-    ULONG        BytesLoaded;
-    CHAR    StatusText[260];
+    ULONG BytesLoaded;
+    CHAR  StatusText[260];
 
     RtlStringCbPrintfA(StatusText, sizeof(StatusText), "Loading %s", LinuxInitrdName);
     UiDrawStatusText(StatusText);
 
-    // Allocate memory for the ramdisk
-    //LinuxInitrdLoadAddress = MmAllocateMemory(LinuxInitrdSize);
-    // Try to align it at the next MB boundary after the kernel
-    //LinuxInitrdLoadAddress = MmAllocateMemoryAtAddress(LinuxInitrdSize, (PVOID)ROUND_UP((LINUX_KERNEL_LOAD_ADDRESS + LinuxKernelSize), 0x100000));
+    /* Allocate memory for the ramdisk, below 4GB */
+    // LinuxInitrdLoadAddress = MmAllocateMemory(LinuxInitrdSize);
+    /* Try to align it at the next MB boundary after the kernel */
+    // LinuxInitrdLoadAddress = MmAllocateMemoryAtAddress(LinuxInitrdSize, (PVOID)ROUND_UP((LINUX_KERNEL_LOAD_ADDRESS + LinuxKernelSize), 0x100000));
     if (LinuxSetupSector->Version <= 0x0202)
     {
+#ifdef _M_AMD64
+        C_ASSERT(LINUX_MAX_INITRD_ADDRESS < 0x100000000);
+#endif
         LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LINUX_MAX_INITRD_ADDRESS, LoaderSystemCode);
     }
     else
     {
-        LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LinuxSetupSector->InitrdAddressMax, LoaderSystemCode);
+        LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, UlongToPtr(LinuxSetupSector->InitrdAddressMax), LoaderSystemCode);
     }
     if (LinuxInitrdLoadAddress == NULL)
     {
         return FALSE;
     }
+#ifdef _M_AMD64
+    ASSERT((ULONG_PTR)LinuxInitrdLoadAddress < 0x100000000);
+#endif
 
     /* Set the information in the setup struct */
-    LinuxSetupSector->RamdiskAddress = (ULONG)LinuxInitrdLoadAddress;
+    LinuxSetupSector->RamdiskAddress = PtrToUlong(LinuxInitrdLoadAddress);
     LinuxSetupSector->RamdiskSize = LinuxInitrdSize;
 
     TRACE("RamdiskAddress: 0x%x\n", LinuxSetupSector->RamdiskAddress);
@@ -528,9 +532,9 @@ static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
     }
 
     /* Load the ramdisk */
-    for (BytesLoaded=0; BytesLoaded<LinuxInitrdSize; )
+    for (BytesLoaded = 0; BytesLoaded < LinuxInitrdSize; )
     {
-        if (ArcRead(LinuxInitrdFile, (PVOID)LinuxInitrdLoadAddress, LINUX_READ_CHUNK_SIZE, NULL) != ESUCCESS)
+        if (ArcRead(LinuxInitrdFile, LinuxInitrdLoadAddress, LINUX_READ_CHUNK_SIZE, NULL) != ESUCCESS)
             return FALSE;
 
         BytesLoaded += LINUX_READ_CHUNK_SIZE;
@@ -542,6 +546,4 @@ static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
     return TRUE;
 }
 
-#endif // _M_IX86
-
-#endif
+#endif /* _M_IX86 || _M_AMD64 */
index 6ea5663..a00072d 100644 (file)
@@ -17,7 +17,7 @@
  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
 
 /* INCLUDES *******************************************************************/
 
@@ -331,4 +331,4 @@ LoadAndBootDevice(
     return ESUCCESS;
 }
 
-#endif // _M_IX86
+#endif /* _M_IX86 || _M_AMD64 */