mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 06:43:13 +00:00
[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:
parent
0d6631c2da
commit
63e22b8287
7 changed files with 37 additions and 34 deletions
|
@ -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},
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue