[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.
This commit is contained in:
Hermès Bélusca-Maïto 2019-10-06 19:22:18 +02:00
parent 0d6631c2da
commit 63e22b8287
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
7 changed files with 37 additions and 34 deletions

View file

@ -54,12 +54,13 @@ static const struct
{ {
{"ReactOSSetup", EditCustomBootReactOSSetup, LoadReactOSSetup}, {"ReactOSSetup", EditCustomBootReactOSSetup, LoadReactOSSetup},
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
{"Drive" , EditCustomBootDisk , LoadAndBootDevice}, {"Drive" , EditCustomBootDisk , LoadAndBootDevice},
{"Partition" , EditCustomBootPartition , LoadAndBootDevice}, {"Partition" , EditCustomBootPartition , LoadAndBootDevice},
{"BootSector" , EditCustomBootSectorFile, LoadAndBootDevice}, {"BootSector" , EditCustomBootSectorFile, LoadAndBootDevice},
{"Linux" , EditCustomBootLinux, LoadAndBootLinux }, {"Linux" , EditCustomBootLinux, LoadAndBootLinux },
#endif
#ifdef _M_IX86
{"WindowsNT40" , EditCustomBootNTOS , LoadAndBootWindows}, {"WindowsNT40" , EditCustomBootNTOS , LoadAndBootWindows},
#endif #endif
{"Windows" , EditCustomBootNTOS , LoadAndBootWindows}, {"Windows" , EditCustomBootNTOS , LoadAndBootWindows},

View file

@ -23,14 +23,14 @@
/* GLOBALS ********************************************************************/ /* 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 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 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 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"; 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 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."; 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) VOID OptionMenuCustomBoot(VOID)
{ {
PCSTR CustomBootMenuList[] = { PCSTR CustomBootMenuList[] = {
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
"Disk", "Disk",
"Partition", "Partition",
"Boot Sector File", "Boot Sector File",
@ -75,7 +75,7 @@ VOID OptionMenuCustomBoot(VOID)
OperatingSystem.SectionId = 0; OperatingSystem.SectionId = 0;
switch (SelectedMenuItem) switch (SelectedMenuItem)
{ {
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
case 0: // Disk case 0: // Disk
EditCustomBootDisk(&OperatingSystem); EditCustomBootDisk(&OperatingSystem);
break; break;
@ -101,7 +101,7 @@ VOID OptionMenuCustomBoot(VOID)
case 1: // ReactOS Setup case 1: // ReactOS Setup
EditCustomBootReactOS(&OperatingSystem, TRUE); EditCustomBootReactOS(&OperatingSystem, TRUE);
break; break;
#endif #endif /* _M_IX86 || _M_AMD64 */
} }
/* And boot it */ /* And boot it */
@ -114,7 +114,7 @@ VOID OptionMenuCustomBoot(VOID)
#endif // HAS_OPTION_MENU_CUSTOM_BOOT #endif // HAS_OPTION_MENU_CUSTOM_BOOT
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
VOID VOID
EditCustomBootDisk( EditCustomBootDisk(
@ -612,7 +612,7 @@ EditCustomBootLinux(
OperatingSystem->LoadIdentifier = "Custom Linux Setup"; OperatingSystem->LoadIdentifier = "Custom Linux Setup";
} }
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */
VOID VOID
EditCustomBootReactOS( EditCustomBootReactOS(

View file

@ -27,7 +27,7 @@
VOID OptionMenuCustomBoot(VOID); VOID OptionMenuCustomBoot(VOID);
#endif #endif
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
VOID VOID
EditCustomBootDisk( EditCustomBootDisk(
@ -45,7 +45,7 @@ VOID
EditCustomBootLinux( EditCustomBootLinux(
IN OUT OperatingSystemItem* OperatingSystem); IN OUT OperatingSystemItem* OperatingSystem);
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */
VOID VOID
EditCustomBootReactOS( EditCustomBootReactOS(

View file

@ -23,7 +23,7 @@
#ifndef __LINUX_H #ifndef __LINUX_H
#define __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_LILO 0x01
#define LINUX_LOADER_TYPE_LOADLIN 0x11 #define LINUX_LOADER_TYPE_LOADLIN 0x11
@ -142,6 +142,6 @@ LoadAndBootLinux(
IN PCHAR Argv[], IN PCHAR Argv[],
IN PCHAR Envp[]); IN PCHAR Envp[]);
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */
#endif // defined __LINUX_H #endif // defined __LINUX_H

View file

@ -19,7 +19,7 @@
#pragma once #pragma once
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
ARC_STATUS ARC_STATUS
LoadAndBootDevice( LoadAndBootDevice(
@ -27,4 +27,4 @@ LoadAndBootDevice(
IN PCHAR Argv[], IN PCHAR Argv[],
IN PCHAR Envp[]); IN PCHAR Envp[]);
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */

View file

@ -22,9 +22,7 @@
* https://www.kernel.org/doc/Documentation/x86/boot.txt * https://www.kernel.org/doc/Documentation/x86/boot.txt
*/ */
#ifndef _M_ARM #if defined(_M_IX86) || defined(_M_AMD64)
#ifdef _M_IX86
/* INCLUDES *******************************************************************/ /* INCLUDES *******************************************************************/
@ -439,7 +437,7 @@ static BOOLEAN LinuxReadKernel(ULONG LinuxKernelFile)
Position.QuadPart = 512 + SetupSectorSize; Position.QuadPart = 512 + SetupSectorSize;
if (ArcSeek(LinuxKernelFile, &Position, SeekAbsolute) != ESUCCESS) if (ArcSeek(LinuxKernelFile, &Position, SeekAbsolute) != ESUCCESS)
return FALSE; return FALSE;
for (BytesLoaded=0; BytesLoaded<LinuxKernelSize; ) for (BytesLoaded = 0; BytesLoaded < LinuxKernelSize; )
{ {
if (ArcRead(LinuxKernelFile, LoadAddress, LINUX_READ_CHUNK_SIZE, NULL) != ESUCCESS) if (ArcRead(LinuxKernelFile, LoadAddress, LINUX_READ_CHUNK_SIZE, NULL) != ESUCCESS)
return FALSE; return FALSE;
@ -498,25 +496,31 @@ static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
RtlStringCbPrintfA(StatusText, sizeof(StatusText), "Loading %s", LinuxInitrdName); RtlStringCbPrintfA(StatusText, sizeof(StatusText), "Loading %s", LinuxInitrdName);
UiDrawStatusText(StatusText); UiDrawStatusText(StatusText);
// Allocate memory for the ramdisk /* Allocate memory for the ramdisk, below 4GB */
//LinuxInitrdLoadAddress = MmAllocateMemory(LinuxInitrdSize); // LinuxInitrdLoadAddress = MmAllocateMemory(LinuxInitrdSize);
// Try to align it at the next MB boundary after the kernel /* Try to align it at the next MB boundary after the kernel */
//LinuxInitrdLoadAddress = MmAllocateMemoryAtAddress(LinuxInitrdSize, (PVOID)ROUND_UP((LINUX_KERNEL_LOAD_ADDRESS + LinuxKernelSize), 0x100000)); // LinuxInitrdLoadAddress = MmAllocateMemoryAtAddress(LinuxInitrdSize, (PVOID)ROUND_UP((LINUX_KERNEL_LOAD_ADDRESS + LinuxKernelSize), 0x100000));
if (LinuxSetupSector->Version <= 0x0202) if (LinuxSetupSector->Version <= 0x0202)
{ {
#ifdef _M_AMD64
C_ASSERT(LINUX_MAX_INITRD_ADDRESS < 0x100000000);
#endif
LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LINUX_MAX_INITRD_ADDRESS, LoaderSystemCode); LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LINUX_MAX_INITRD_ADDRESS, LoaderSystemCode);
} }
else else
{ {
LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LinuxSetupSector->InitrdAddressMax, LoaderSystemCode); LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, UlongToPtr(LinuxSetupSector->InitrdAddressMax), LoaderSystemCode);
} }
if (LinuxInitrdLoadAddress == NULL) if (LinuxInitrdLoadAddress == NULL)
{ {
return FALSE; return FALSE;
} }
#ifdef _M_AMD64
ASSERT((ULONG_PTR)LinuxInitrdLoadAddress < 0x100000000);
#endif
/* Set the information in the setup struct */ /* Set the information in the setup struct */
LinuxSetupSector->RamdiskAddress = (ULONG)LinuxInitrdLoadAddress; LinuxSetupSector->RamdiskAddress = PtrToUlong(LinuxInitrdLoadAddress);
LinuxSetupSector->RamdiskSize = LinuxInitrdSize; LinuxSetupSector->RamdiskSize = LinuxInitrdSize;
TRACE("RamdiskAddress: 0x%x\n", LinuxSetupSector->RamdiskAddress); TRACE("RamdiskAddress: 0x%x\n", LinuxSetupSector->RamdiskAddress);
@ -528,9 +532,9 @@ static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
} }
/* Load the ramdisk */ /* 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; return FALSE;
BytesLoaded += LINUX_READ_CHUNK_SIZE; BytesLoaded += LINUX_READ_CHUNK_SIZE;
@ -542,6 +546,4 @@ static BOOLEAN LinuxReadInitrd(ULONG LinuxInitrdFile)
return TRUE; return TRUE;
} }
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */
#endif

View file

@ -17,7 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
#ifdef _M_IX86 #if defined(_M_IX86) || defined(_M_AMD64)
/* INCLUDES *******************************************************************/ /* INCLUDES *******************************************************************/
@ -331,4 +331,4 @@ LoadAndBootDevice(
return ESUCCESS; return ESUCCESS;
} }
#endif // _M_IX86 #endif /* _M_IX86 || _M_AMD64 */