https://git.reactos.org/?p=reactos.git;a=commitdiff;h=63e22b82877ec5cca928c…
commit 63e22b82877ec5cca928c1c16101df4c3209c01c
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Oct 6 19:22:18 2019 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Tue Oct 8 01:30:25 2019 +0200
[FREELDR] Add support for loading Linux in x64 FreeLdr. Part 2/2: C code.
- 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 | 5 +++--
boot/freeldr/freeldr/custom.c | 14 ++++++-------
boot/freeldr/freeldr/include/custom.h | 4 ++--
boot/freeldr/freeldr/include/linux.h | 4 ++--
boot/freeldr/freeldr/include/miscboot.h | 4 ++--
boot/freeldr/freeldr/linuxboot.c | 36 +++++++++++++++++----------------
boot/freeldr/freeldr/miscboot.c | 4 ++--
7 files changed, 37 insertions(+), 34 deletions(-)
diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c
index 4a1923dff19..9830c2ec74f 100644
--- a/boot/freeldr/freeldr/bootmgr.c
+++ b/boot/freeldr/freeldr/bootmgr.c
@@ -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},
diff --git a/boot/freeldr/freeldr/custom.c b/boot/freeldr/freeldr/custom.c
index 604d7ac9629..7cfd38c8d40 100644
--- a/boot/freeldr/freeldr/custom.c
+++ b/boot/freeldr/freeldr/custom.c
@@ -23,14 +23,14 @@
/* 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(
diff --git a/boot/freeldr/freeldr/include/custom.h
b/boot/freeldr/freeldr/include/custom.h
index 57164b84c8e..8fb4f7bdae3 100644
--- a/boot/freeldr/freeldr/include/custom.h
+++ b/boot/freeldr/freeldr/include/custom.h
@@ -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(
diff --git a/boot/freeldr/freeldr/include/linux.h b/boot/freeldr/freeldr/include/linux.h
index c51f70dab9f..6bb92d946c7 100644
--- a/boot/freeldr/freeldr/include/linux.h
+++ b/boot/freeldr/freeldr/include/linux.h
@@ -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
diff --git a/boot/freeldr/freeldr/include/miscboot.h
b/boot/freeldr/freeldr/include/miscboot.h
index 9ba1cb8448d..0f05fd1ce03 100644
--- a/boot/freeldr/freeldr/include/miscboot.h
+++ b/boot/freeldr/freeldr/include/miscboot.h
@@ -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 */
diff --git a/boot/freeldr/freeldr/linuxboot.c b/boot/freeldr/freeldr/linuxboot.c
index fa9ad60d442..fae1f8da6a2 100644
--- a/boot/freeldr/freeldr/linuxboot.c
+++ b/boot/freeldr/freeldr/linuxboot.c
@@ -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 */
diff --git a/boot/freeldr/freeldr/miscboot.c b/boot/freeldr/freeldr/miscboot.c
index 6ea56631654..a00072d3efd 100644
--- a/boot/freeldr/freeldr/miscboot.c
+++ b/boot/freeldr/freeldr/miscboot.c
@@ -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 */