.code32
/* Store the boot drive */
- movb %dl,(_i386BootDrive)
+ movb %dl,(_BootDrive)
/* Store the boot partition */
- movb %dh,(_i386BootPartition)
+ movb %dh,(_BootPartition)
/* GO! */
xorl %eax,%eax
* other boot loaders like Grub
*/
-#define MB_INFO_SIZE 90
#define MB_INFO_FLAGS_OFFSET 0
#define MB_INFO_BOOT_DEVICE_OFFSET 12
#define MB_INFO_COMMAND_LINE_OFFSET 16
-#define CMDLINE_SIZE 256
/*
* We want to execute at 0x8000 (to be compatible with bootsector
* above 1MB. So we let Grub load us there and then relocate
* ourself to 0x8000
*/
+#define CMDLINE_BASE 0x7000
#define FREELDR_BASE 0x8000
#define INITIAL_BASE 0x200000
movw %dx,%ds
movw %dx,%es
- /* Check for valid multiboot signature */
- cmpl $MULTIBOOT_BOOTLOADER_MAGIC,%eax
- jne mbfail
-
- /* Store multiboot info in a safe place */
- movl %ebx,%esi
- movl $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi
- movl $MB_INFO_SIZE,%ecx
- rep movsb
-
- /* Save commandline */
- movl MB_INFO_FLAGS_OFFSET(%ebx),%edx
- testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
- jz mb3
- movl MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi
- movl $(cmdline + INITIAL_BASE - FREELDR_BASE),%edi
- movl $CMDLINE_SIZE,%ecx
-mb2: lodsb
- stosb
- testb %al,%al
- jz mb3
- dec %ecx
- jnz mb2
-mb3:
-
/* Copy to low mem */
movl $INITIAL_BASE,%esi
movl $FREELDR_BASE,%edi
/* Clear prefetch queue & correct CS,
* jump to low mem */
- ljmp $PMODE_CS, $mb4
-mb4:
+ ljmp $PMODE_CS, $mb2
+mb2:
/* Reload segment selectors */
movw $PMODE_DS,%dx
movw %dx,%ds
movw %dx,%ss
movl $STACK32ADDR,%esp
- movl $mb_info,%ebx
+ /* Check for valid multiboot signature */
+ cmpl $MULTIBOOT_BOOTLOADER_MAGIC,%eax
+ jne mbfail
+
/* See if the boot device was passed in */
movl MB_INFO_FLAGS_OFFSET(%ebx),%edx
testl $MB_INFO_FLAG_BOOT_DEVICE,%edx
- jz mb5
+ jz mb3
/* Retrieve boot device info */
movl MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax
shrl $16,%eax
incb %al
- movb %al,_i386BootPartition
- movb %ah,_i386BootDrive
- jmp mb6
-mb5: /* No boot device known, assume first partition of first harddisk */
- movb $0x80,_i386BootDrive
- movb $1,_i386BootPartition
-mb6:
- /* Check for command line */
- mov $cmdline,%eax
- testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx)
- jnz mb7
+ movb %al,_BootPartition
+ movb %ah,_BootDrive
+ jmp mb4
+mb3: /* No boot device known, assume first partition of first harddisk */
+ movb $0x80,_BootDrive
+ movb $1,_BootPartition
+mb4:
+
+ /* Check for a command line */
xorl %eax,%eax
-mb7:
+ testl $MB_INFO_FLAG_COMMAND_LINE,%edx
+ jz mb6
+ /* Copy command line to low mem*/
+ movl MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi
+ movl $CMDLINE_BASE,%edi
+mb5: lodsb
+ stosb
+ testb %al,%al
+ jnz mb5
+ movl $CMDLINE_BASE,%eax
+mb6:
/* GO! */
pushl %eax
.word 0x3ff /* Limit */
.long 0 /* Base Address */
-EXTERN(_i386BootDrive)
+EXTERN(_BootDrive)
.long 0
-EXTERN(_i386BootPartition)
+EXTERN(_BootPartition)
.long 0
-
-.bss
-mb_info:
- .fill MB_INFO_SIZE, 1, 0
-
-cmdline:
- .fill CMDLINE_SIZE, 1, 0
#include "rtl.h"
VOID
-MachInit(char *CmdLine)
+MachInit(VOID)
{
ULONG PciId;
PciId = READ_PORT_ULONG((ULONG*) 0xcfc);
if (0x02a510de == PciId)
{
- XboxMachInit(CmdLine);
+ XboxMachInit();
}
else
{
- PcMachInit(CmdLine);
+ PcMachInit();
}
HalpCalibrateStallExecution();
.code16
/* Set the boot drive */
- movb (_i386BootDrive),%dl
+ movb (_BootDrive),%dl
/* Load segment registers */
cli
+++ /dev/null
-/*
- * FreeLoader
- *
- * Copyright (C) 2003 Eric Kohl
- *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * 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.
- */
-
-#ifndef __I386_I386_H_
-#define __I386_I386_H_
-
-
-extern ULONG i386BootDrive;
-extern ULONG i386BootPartition;
-
-extern BOOL i386DiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector,
- PULONGLONG SectorCount, int *FsType);
-extern BOOL i386DiskGetSystemVolume(char *SystemPath, char *RemainingPath,
- PULONG Device, PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount, int *FsType);
-extern BOOL i386DiskGetBootPath(char *BootPath, unsigned Size);
-extern VOID i386DiskGetBootDevice(PULONG BootDevice);
-extern BOOL i386DiskBootingFromFloppy(VOID);
-
-#endif /* __I386_I386_H_ */
-
-/* EOF */
#include "freeldr.h"
#include "debug.h"
-#include "i386.h"
-#include "fsrec.h"
/////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
return TRUE;
}
-BOOL i386DiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType)
-{
- PARTITION_TABLE_ENTRY PartitionTableEntry;
- UCHAR VolumeType;
-
- DbgPrint((DPRINT_FILESYSTEM, "FsOpenVolume() DriveNumber: 0x%x PartitionNumber: 0x%x\n", i386BootDrive, i386BootPartition));
-
- // Check and see if it is a floppy drive
- // If so then just assume FAT12 file system type
- if (DiskIsDriveRemovable(i386BootDrive))
- {
- DbgPrint((DPRINT_FILESYSTEM, "Drive is a floppy diskette drive. Assuming FAT12 file system.\n"));
-
- *DriveNumber = i386BootDrive;
- *StartSector = 0;
- *SectorCount = 2 * 80 * 18; /* FIXME hardcoded for 1.44 Mb */
- *FsType = FS_FAT;
- return TRUE;
- }
-
- // Check for ISO9660 file system type
- if (i386BootDrive >= 0x80 && FsRecIsIso9660(i386BootDrive))
- {
- DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive. Assuming ISO-9660 file system.\n"));
-
- *DriveNumber = i386BootDrive;
- *StartSector = 0;
- *SectorCount = 0;
- *FsType = FS_ISO9660;
- return TRUE;
- }
-
- // Get the requested partition entry
- if (i386BootPartition == 0)
- {
- // Partition requested was zero which means the boot partition
- if (! DiskGetActivePartitionEntry(i386BootDrive, &PartitionTableEntry))
- {
- return FALSE;
- }
- }
- else
- {
- // Get requested partition
- if (! MachDiskGetPartitionEntry(i386BootDrive, i386BootPartition, &PartitionTableEntry))
- {
- return FALSE;
- }
- }
-
- // Check for valid partition
- if (PartitionTableEntry.SystemIndicator == PARTITION_ENTRY_UNUSED)
- {
- return FALSE;
- }
-
- // Try to recognize the file system
- if (!FsRecognizeVolume(i386BootDrive, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
- {
- return FALSE;
- }
-
- *DriveNumber = i386BootDrive;
- *StartSector = PartitionTableEntry.SectorCountBeforePartition;
- *SectorCount = PartitionTableEntry.PartitionSectorCount;
-
- //switch (PartitionTableEntry.SystemIndicator)
- switch (VolumeType)
- {
- case PARTITION_FAT_12:
- case PARTITION_FAT_16:
- case PARTITION_HUGE:
- case PARTITION_XINT13:
- case PARTITION_FAT32:
- case PARTITION_FAT32_XINT13:
- *FsType = FS_FAT;
- return TRUE;
- case PARTITION_EXT2:
- *FsType = FS_EXT2;
- return TRUE;
- case PARTITION_NTFS:
- *FsType = FS_NTFS;
- return TRUE;
- default:
- *FsType = 0;
- return FALSE;
- }
-
- return TRUE;
-}
-
-VOID
-i386DiskGetBootDevice(PULONG BootDevice)
-{
- ((char *)BootDevice)[0] = (char)i386BootDrive;
- ((char *)BootDevice)[1] = (char)i386BootPartition;
-}
-
-BOOL
-i386DiskBootingFromFloppy(VOID)
-{
- return i386BootDrive < 0x80;
-}
-
-#define IsRecognizedPartition(P) \
- ((P) == PARTITION_FAT_12 || \
- (P) == PARTITION_FAT_16 || \
- (P) == PARTITION_HUGE || \
- (P) == PARTITION_IFS || \
- (P) == PARTITION_EXT2 || \
- (P) == PARTITION_FAT32 || \
- (P) == PARTITION_FAT32_XINT13 || \
- (P) == PARTITION_XINT13)
-
-BOOL i386DiskGetSystemVolume(char *SystemPath,
- char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType)
-{
- ULONG PartitionNumber;
- PARTITION_TABLE_ENTRY PartitionTableEntry;
- UCHAR VolumeType;
- CHAR BootPath[256];
- unsigned i, RosPartition;
-
- /*
- * Verify system path
- */
- if (!DissectArcPath(SystemPath, BootPath, DriveNumber, &PartitionNumber))
- {
- return FALSE;
- }
- if (NULL != RemainingPath)
- {
- strcpy(RemainingPath, BootPath);
- }
-
- /* 0xff -> no partition table present, use whole device */
- if (0xff == PartitionNumber)
- {
- PartitionTableEntry.SectorCountBeforePartition = 0;
- i = 0xff;
- }
- else
- {
- /* recalculate the boot partition for freeldr */
- i = 0;
- RosPartition = 0;
- while (1)
- {
- if (!MachDiskGetPartitionEntry(*DriveNumber, ++i, &PartitionTableEntry))
- {
- return FALSE;
- }
- if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator))
- {
- if (++RosPartition == PartitionNumber)
- {
- break;
- }
- }
- }
- }
-
- /* Check for ISO9660 file system type */
- if (*DriveNumber >= 0x80 && FsRecIsIso9660(*DriveNumber))
- {
- DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive. Assuming ISO-9660 file system.\n"));
-
- if (NULL != Device)
- {
- ((char *)Device)[0] = (char)(*DriveNumber);
- ((char *)Device)[1] = (char)i;
- }
- *StartSector = 0;
- *SectorCount = 0;
- *FsType = FS_ISO9660;
- return TRUE;
- }
-
- if (!FsRecognizeVolume(*DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
- {
- return FALSE;
- }
-
- if (NULL != Device)
- {
- ((char *)Device)[0] = (char)(*DriveNumber);
- ((char *)Device)[1] = (char)i;
- }
- *StartSector = PartitionTableEntry.SectorCountBeforePartition;
- *SectorCount = PartitionTableEntry.PartitionSectorCount;
-
- switch (VolumeType)
- {
- case PARTITION_FAT_12:
- case PARTITION_FAT_16:
- case PARTITION_HUGE:
- case PARTITION_XINT13:
- case PARTITION_FAT32:
- case PARTITION_FAT32_XINT13:
- *FsType = FS_FAT;
- return TRUE;
- case PARTITION_EXT2:
- *FsType = FS_EXT2;
- return TRUE;
- case PARTITION_NTFS:
- *FsType = FS_NTFS;
- return TRUE;
- default:
- *FsType = 0;
- return FALSE;
- }
-
- return FALSE;
-}
-
-BOOL
-i386DiskGetBootPath(char *BootPath, unsigned Size)
-{
- static char Path[] = "multi(0)disk(0)";
- char Device[4];
-
- itoa(i386BootDrive, Device, 10);
- if (Size <= sizeof(Path) + 6 + strlen(Device))
- {
- return FALSE;
- }
- strcpy(BootPath, Path);
- strcat(BootPath, MachDiskBootingFromFloppy() ? "fdisk" : "cdrom");
- strcat(strcat(strcat(BootPath, "("), Device), ")");
-
- return TRUE;
-}
-
-#endif /* defined __i386__ */
-
-/* EOF */
+#endif // defined __i386__
.code16
/* Set the boot drive */
- movb (_i386BootDrive),%dl
+ movb (_BootDrive),%dl
/* Load segment registers */
cli
.code16
/* Set the boot drive */
- movb (_i386BootDrive),%dl
+ movb (_BootDrive),%dl
/* Load segment registers */
cli
#include "machine.h"
#include "machpc.h"
#include "rtl.h"
-#include "i386.h"
VOID
-PcMachInit(char *CmdLine)
+PcMachInit(VOID)
{
EnableA20();
MachVtbl.VideoSync = PcVideoSync;
MachVtbl.VideoPrepareForReactOS = PcVideoPrepareForReactOS;
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
- MachVtbl.DiskGetBootVolume = i386DiskGetBootVolume;
- MachVtbl.DiskGetSystemVolume = i386DiskGetSystemVolume;
- MachVtbl.DiskGetBootPath = i386DiskGetBootPath;
- MachVtbl.DiskGetBootDevice = i386DiskGetBootDevice;
- MachVtbl.DiskBootingFromFloppy = i386DiskBootingFromFloppy;
MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
MachVtbl.DiskGetPartitionEntry = PcDiskGetPartitionEntry;
MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry;
#include "mm.h"
#endif
-VOID PcMachInit(char *CmdLine);
+VOID PcMachInit(VOID);
VOID PcConsPutChar(int Ch);
BOOL PcConsKbHit();
#include "mm.h"
#include "machine.h"
#include "machxbox.h"
-#include "i386.h"
VOID
-XboxMachInit(char *CmdLine)
+XboxMachInit(VOID)
{
/* Initialize our stuff */
XboxMemInit();
MachVtbl.VideoSync = XboxVideoSync;
MachVtbl.VideoPrepareForReactOS = XboxVideoPrepareForReactOS;
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
- MachVtbl.DiskGetBootVolume = i386DiskGetBootVolume;
- MachVtbl.DiskGetSystemVolume = i386DiskGetSystemVolume;
- MachVtbl.DiskGetBootPath = i386DiskGetBootPath;
- MachVtbl.DiskGetBootDevice = i386DiskGetBootDevice;
- MachVtbl.DiskBootingFromFloppy = i386DiskBootingFromFloppy;
MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
MachVtbl.DiskGetPartitionEntry = XboxDiskGetPartitionEntry;
MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry;
UCHAR XboxFont8x16[256 * 16];
-VOID XboxMachInit(char *CmdLine);
+VOID XboxMachInit(VOID);
VOID XboxConsPutChar(int Ch);
BOOL XboxConsKbHit();
BootMain("freeldr-ppc");
}
-void MachInit(char *CmdLine) {
+void MachInit() {
int len;
printf( "Determining boot device:\n" );
len = ofw_getprop(chosen_package, "bootpath",
LONG TimeOut;
ULONG SelectedOperatingSystem;
- if (!FsOpenBootVolume())
- {
- printf("Error opening boot partition for file access.\n");
- MachConsGetCh();
- return;
- }
-
if (!IniFileInitialize())
{
printf("Press any key to reboot.\n");
BOOL DiskGetActivePartitionEntry(ULONG DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry)
{
- ULONG BootablePartitionCount = 0;
- ULONG ActivePartition = 0;
+ ULONG BootablePartitionCount = 0;
MASTER_BOOT_RECORD MasterBootRecord;
// Read master boot record
if (MasterBootRecord.PartitionTable[0].BootIndicator == 0x80)
{
BootablePartitionCount++;
- ActivePartition = 0;
+ BootPartition = 0;
}
if (MasterBootRecord.PartitionTable[1].BootIndicator == 0x80)
{
BootablePartitionCount++;
- ActivePartition = 1;
+ BootPartition = 1;
}
if (MasterBootRecord.PartitionTable[2].BootIndicator == 0x80)
{
BootablePartitionCount++;
- ActivePartition = 2;
+ BootPartition = 2;
}
if (MasterBootRecord.PartitionTable[3].BootIndicator == 0x80)
{
BootablePartitionCount++;
- ActivePartition = 3;
+ BootPartition = 3;
}
// Make sure there was only one bootable partition
}
// Copy the partition table entry
- RtlCopyMemory(PartitionTableEntry, &MasterBootRecord.PartitionTable[ActivePartition], sizeof(PARTITION_TABLE_ENTRY));
+ RtlCopyMemory(PartitionTableEntry, &MasterBootRecord.PartitionTable[BootPartition], sizeof(PARTITION_TABLE_ENTRY));
return TRUE;
}
{
CmdLineParse(CmdLine);
- MachInit(CmdLine);
+ MachInit();
DebugInit();
/*
*
- * BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type);
+ * BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber);
*
* This function is called to open a disk volume for file access.
* It must be called before any of the file functions will work.
+ * It takes two parameters:
+ *
+ * Drive: The BIOS drive number of the disk to open
+ * Partition: This is zero for floppy drives.
+ * If the disk is a hard disk then this specifies
+ * The partition number to open (1 - 4)
+ * If it is zero then it opens the active (bootable) partition
*
*/
-static BOOL FsOpenVolume(ULONG DriveNumber, ULONGLONG StartSector, ULONGLONG SectorCount, int Type)
+BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber)
{
- UCHAR ErrorText[80];
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ UCHAR ErrorText[80];
+ UCHAR VolumeType;
- FsType = Type;
+ DbgPrint((DPRINT_FILESYSTEM, "FsOpenVolume() DriveNumber: 0x%x PartitionNumber: 0x%x\n", DriveNumber, PartitionNumber));
- switch (FsType)
+ // Check and see if it is a floppy drive
+ // If so then just assume FAT12 file system type
+ if (DiskIsDriveRemovable(DriveNumber))
{
- case FS_FAT:
- return FatOpenVolume(DriveNumber, StartSector, SectorCount);
- case FS_EXT2:
- return Ext2OpenVolume(DriveNumber, StartSector);
- case FS_NTFS:
- return NtfsOpenVolume(DriveNumber, StartSector);
- case FS_ISO9660:
+ DbgPrint((DPRINT_FILESYSTEM, "Drive is a floppy diskette drive. Assuming FAT12 file system.\n"));
+
+ FsType = FS_FAT;
+ return FatOpenVolume(DriveNumber, 0, 0);
+ }
+
+ // Check for ISO9660 file system type
+ if (DriveNumber >= 0x80 && FsRecIsIso9660(DriveNumber))
+ {
+ DbgPrint((DPRINT_FILESYSTEM, "Drive is a cdrom drive. Assuming ISO-9660 file system.\n"));
+
+ FsType = FS_ISO9660;
return IsoOpenVolume(DriveNumber);
- default:
- FsType = 0;
- sprintf(ErrorText, "Unsupported file system. Type: 0x%x", Type);
- FileSystemError(ErrorText);
}
- return FALSE;
-}
-/*
- *
- * BOOL FsOpenBootVolume()
- *
- * This function is called to open the boot disk volume for file access.
- * It must be called before any of the file functions will work.
- */
-BOOL FsOpenBootVolume()
-{
- ULONG DriveNumber;
- ULONGLONG StartSector;
- ULONGLONG SectorCount;
- int Type;
+ // Set the boot partition
+ BootPartition = PartitionNumber;
+
+ // Get the requested partition entry
+ if (PartitionNumber == 0)
+ {
+ // Partition requested was zero which means the boot partition
+ if (DiskGetActivePartitionEntry(DriveNumber, &PartitionTableEntry) == FALSE)
+ {
+ FileSystemError("No active partition.");
+ return FALSE;
+ }
+ }
+ else
+ {
+ // Get requested partition
+ if (MachDiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry) == FALSE)
+ {
+ FileSystemError("Partition not found.");
+ return FALSE;
+ }
+ }
- if (! MachDiskGetBootVolume(&DriveNumber, &StartSector, &SectorCount, &Type))
+ // Check for valid partition
+ if (PartitionTableEntry.SystemIndicator == PARTITION_ENTRY_UNUSED)
{
- FileSystemError("Unable to locate boot partition\n");
+ FileSystemError("Invalid partition.");
return FALSE;
}
- return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
-}
+ // Try to recognize the file system
+ if (!FsRecognizeVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, &VolumeType))
+ {
+ FileSystemError("Unrecognized file system.");
+ return FALSE;
+ }
-BOOL FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG Device)
-{
- ULONG DriveNumber;
- ULONGLONG StartSector;
- ULONGLONG SectorCount;
- int Type;
-
- if (! MachDiskGetSystemVolume(SystemPath, RemainingPath, Device,
- &DriveNumber, &StartSector, &SectorCount,
- &Type))
+ //switch (PartitionTableEntry.SystemIndicator)
+ switch (VolumeType)
{
- FileSystemError("Unable to locate system partition\n");
+ case PARTITION_FAT_12:
+ case PARTITION_FAT_16:
+ case PARTITION_HUGE:
+ case PARTITION_XINT13:
+ case PARTITION_FAT32:
+ case PARTITION_FAT32_XINT13:
+ FsType = FS_FAT;
+ return FatOpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, PartitionTableEntry.PartitionSectorCount);
+ case PARTITION_EXT2:
+ FsType = FS_EXT2;
+ return Ext2OpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition);
+ case PARTITION_NTFS:
+ FsType = FS_NTFS;
+ return NtfsOpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition);
+ default:
+ FsType = 0;
+ sprintf(ErrorText, "Unsupported file system. Type: 0x%x", VolumeType);
+ FileSystemError(ErrorText);
return FALSE;
}
- return FsOpenVolume(DriveNumber, StartSector, SectorCount, Type);
+ return TRUE;
}
-
PFILE FsOpenFile(PUCHAR FileName)
{
PFILE FileHandle = NULL;
#define ROUND_DOWN(N, S) ((N) & ~((S) - 1))
#define Ke386EraseFlags(x) __asm__ __volatile__("pushl $0 ; popfl\n")
+extern ULONG BootDrive; /* BIOS boot drive, 0-A:, 1-B:, 0x80-C:, 0x81-D:, etc. */
+extern ULONG BootPartition; /* Boot Partition, 1-4 */
extern BOOL UserInterfaceUp; /* Tells us if the user interface is displayed */
VOID BootMain(LPSTR CmdLine);
#define PFILE FILE *
VOID FileSystemError(PUCHAR ErrorString);
-BOOL FsOpenBootVolume();
-BOOL FsOpenSystemVolume(char *SystemPath, char *RemainingPath, PULONG BootDevice);
+BOOL FsOpenVolume(ULONG DriveNumber, ULONG PartitionNumber);
PFILE FsOpenFile(PUCHAR FileName);
VOID FsCloseFile(PFILE FileHandle);
BOOL FsReadFile(PFILE FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer);
ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize);
- BOOL (*DiskGetBootVolume)(PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType);
- BOOL (*DiskGetSystemVolume)(char *SystemPath, char *RemainingPath, PULONG Device, PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType);
- BOOL (*DiskGetBootPath)(char *BootPath, unsigned Size);
- VOID (*DiskGetBootDevice)(PULONG BootDevice);
- BOOL (*DiskBootingFromFloppy)(VOID);
BOOL (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer);
BOOL (*DiskGetPartitionEntry)(ULONG DriveNumber, ULONG PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry);
BOOL (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY DriveGeometry);
VOID (*HwDetect)(VOID);
} MACHVTBL, *PMACHVTBL;
-VOID MachInit(char *CmdLine);
+VOID MachInit(VOID);
extern MACHVTBL MachVtbl;
#define MachVideoSync() MachVtbl.VideoSync()
#define MachVideoPrepareForReactOS() MachVtbl.VideoPrepareForReactOS()
#define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size))
-#define MachDiskGetBootVolume(Drv, Start, Cnt, FsType) MachVtbl.DiskGetBootVolume((Drv), (Start), (Cnt), (FsType))
-#define MachDiskGetSystemVolume(SysPath, RemPath, Dev, Drv, Start, Cnt, FsType) MachVtbl.DiskGetSystemVolume((SysPath), (RemPath), (Dev), (Drv), (Start), (Cnt), (FsType))
-#define MachDiskGetBootPath(Path, Size) MachVtbl.DiskGetBootPath((Path), (Size))
-#define MachDiskGetBootDevice(BootDevice) MachVtbl.DiskGetBootDevice(BootDevice)
-#define MachDiskBootingFromFloppy() MachVtbl.DiskBootingFromFloppy()
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf))
#define MachDiskGetPartitionEntry(Drive, Part, Entry) MachVtbl.DiskGetPartitionEntry((Drive), (Part), (Entry))
#define MachDiskGetDriveGeometry(Drive, Geom) MachVtbl.DiskGetDriveGeometry((Drive), (Geom))
extern ULONG IniFileSectionCount;
extern ULONG IniFileSettingCount;
-PFILE IniOpenIniFile();
+PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber);
BOOL IniParseFile(PUCHAR IniFileData, ULONG IniFileSize);
ULONG IniGetNextLineSize(PUCHAR IniFileData, ULONG IniFileSize, ULONG CurrentOffset);
BOOL Success;
// Open freeldr.ini
- Freeldr_Ini = IniOpenIniFile();
+ // BootDrive & BootPartition are passed
+ // in from the boot sector code in the
+ // DL & DH registers.
+ Freeldr_Ini = IniOpenIniFile(BootDrive, BootPartition);
+
+ // If we couldn't open freeldr.ini on the partition
+ // they specified in the boot sector then try
+ // opening the active (boot) partition.
+ if ((Freeldr_Ini == NULL) && (BootPartition != 0))
+ {
+ BootPartition = 0;
+
+ Freeldr_Ini = IniOpenIniFile(BootDrive, BootPartition);
+
+ return FALSE;
+ }
if (Freeldr_Ini == NULL)
{
return Success;
}
-PFILE IniOpenIniFile()
+PFILE IniOpenIniFile(UCHAR BootDriveNumber, UCHAR BootPartitionNumber)
{
PFILE IniFileHandle; // File handle for freeldr.ini
+ if (!FsOpenVolume(BootDriveNumber, BootPartitionNumber))
+ {
+ if (BootPartitionNumber == 0)
+ {
+ printf("Error opening active (bootable) partition on boot drive 0x%x for file access.\n", BootDriveNumber);
+ }
+ else
+ {
+ printf("Error opening partition %d on boot drive 0x%x for file access.\n", BootPartitionNumber, BootDriveNumber);
+ }
+
+ return NULL;
+ }
+
// Try to open freeldr.ini
IniFileHandle = FsOpenFile("freeldr.ini");
PLINUX_BOOTSECTOR LinuxBootSector = NULL;
PLINUX_SETUPSECTOR LinuxSetupSector = NULL;
-ULONG SetupSectorSize = 0;
-BOOL NewStyleLinuxKernel = FALSE;
-ULONG LinuxKernelSize = 0;
-ULONG LinuxInitrdSize = 0;
-UCHAR LinuxKernelName[260];
-UCHAR LinuxInitrdName[260];
-BOOL LinuxHasInitrd = FALSE;
-UCHAR LinuxCommandLine[260] = "";
-ULONG LinuxCommandLineSize = 0;
-PVOID LinuxKernelLoadAddress = NULL;
-PVOID LinuxInitrdLoadAddress = NULL;
-UCHAR LinuxBootDescription[80];
-UCHAR LinuxBootPath[260] = "";
+ULONG SetupSectorSize = 0;
+BOOL NewStyleLinuxKernel = FALSE;
+ULONG LinuxKernelSize = 0;
+ULONG LinuxInitrdSize = 0;
+UCHAR LinuxKernelName[260];
+UCHAR LinuxInitrdName[260];
+BOOL LinuxHasInitrd = FALSE;
+UCHAR LinuxCommandLine[260] = "";
+ULONG LinuxCommandLineSize = 0;
+PVOID LinuxKernelLoadAddress = NULL;
+PVOID LinuxInitrdLoadAddress = NULL;
+UCHAR LinuxBootDescription[80];
VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description)
{
}
// Open the boot volume
- if (!FsOpenSystemVolume(LinuxBootPath, NULL, NULL))
+ if (!FsOpenVolume(BootDrive, BootPartition))
{
UiMessageBox("Failed to open boot drive.");
goto LinuxBootFailed;
BOOL LinuxParseIniSection(PUCHAR OperatingSystemName)
{
UCHAR SettingName[260];
- ULONG SectionId;
+ UCHAR SettingValue[260];
+ ULONG SectionId;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
return FALSE;
}
- if (!IniReadSettingByName(SectionId, "BootPath", LinuxBootPath, 260))
+ if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, 260))
{
- UiMessageBox("Boot path not specified for selected OS!");
+ UiMessageBox("Boot drive not specified for selected OS!");
return FALSE;
}
+ BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
+
+ BootPartition = 0;
+ if (IniReadSettingByName(SectionId, "BootPartition", SettingValue, 260))
+ {
+ BootPartition = atoi(SettingValue);
+ }
+
// Get the kernel name
if (!IniReadSettingByName(SectionId, "Kernel", LinuxKernelName, 260))
{
#undef MachVideoSync
#undef MachVideoPrepareForReactOS
#undef MachGetMemoryMap
-#undef MachDiskGetBootVolume
-#undef MachDiskGetSystemVolume
-#undef MachDiskGetBootPath
-#undef MachDiskGetBootDevice
-#undef MachDiskBootingFromFloppy
#undef MachDiskReadLogicalSectors
#undef MachDiskGetPartitionEntry
#undef MachDiskGetDriveGeometry
return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
}
-BOOL
-MachDiskGetBootVolume(PULONG DriveNumber, PULONGLONG StartSector, PULONGLONG SectorCount, int *FsType)
-{
- return MachVtbl.DiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType);
-}
-
-BOOL
-MachDiskGetSystemVolume(char *SystemPath,
- char *RemainingPath,
- PULONG Device,
- PULONG DriveNumber,
- PULONGLONG StartSector,
- PULONGLONG SectorCount,
- int *FsType)
-{
- return MachVtbl.DiskGetSystemVolume(SystemPath, RemainingPath, Device,
- DriveNumber, StartSector, SectorCount,
- FsType);
-}
-
-BOOL
-MachDiskGetBootPath(char *BootPath, unsigned Size)
-{
- return MachVtbl.DiskGetBootPath(BootPath, Size);
-}
-
-VOID
-MachDiskGetBootDevice(PULONG BootDevice)
-{
- MachVtbl.DiskGetBootDevice(BootDevice);
-}
-
-BOOL
-MachDiskBootingFromFloppy()
-{
- return MachVtbl.DiskBootingFromFloppy();
-}
-
BOOL
MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer)
{
{
PFILE FilePointer;
UCHAR SettingName[80];
- ULONG SectionId;
+ UCHAR SettingValue[80];
+ ULONG SectionId;
UCHAR FileName[260];
- ULONG BytesRead;
+ ULONG BytesRead;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
return;
}
+ if (!IniReadSettingByName(SectionId, "BootDrive", SettingValue, 80))
+ {
+ UiMessageBox("Boot drive not specified for selected OS!");
+ return;
+ }
+
+ BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
+
+ BootPartition = 0;
+ if (IniReadSettingByName(SectionId, "BootPartition", SettingValue, 80))
+ {
+ BootPartition = atoi(SettingValue);
+ }
+
if (!IniReadSettingByName(SectionId, "BootSectorFile", FileName, 260))
{
UiMessageBox("Boot sector file not specified for selected OS!");
return;
}
- if (!FsOpenSystemVolume(FileName, FileName, NULL))
+ if (!FsOpenVolume(BootDrive, BootPartition))
{
UiMessageBox("Failed to open boot drive.");
return;
VOID LoadAndBootPartition(PUCHAR OperatingSystemName)
{
- UCHAR SettingName[80];
- UCHAR SettingValue[80];
- ULONG SectionId;
+ UCHAR SettingName[80];
+ UCHAR SettingValue[80];
+ ULONG SectionId;
PARTITION_TABLE_ENTRY PartitionTableEntry;
- ULONG DriveNumber;
- ULONG PartitionNumber;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
return;
}
- DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+ BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
// Read the boot partition
if (!IniReadSettingByName(SectionId, "BootPartition", SettingValue, 80))
return;
}
- PartitionNumber = atoi(SettingValue);
+ BootPartition = atoi(SettingValue);
// Get the partition table entry
- if (!DiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry))
+ if (!DiskGetPartitionEntry(BootDrive, BootPartition, &PartitionTableEntry))
{
return;
}
// Now try to read the partition boot sector
// If this fails then abort
- if (!MachDiskReadLogicalSectors(DriveNumber, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
+ if (!MachDiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
{
return;
}
{
UCHAR SettingName[80];
UCHAR SettingValue[80];
- ULONG SectionId;
- ULONG DriveNumber;
+ ULONG SectionId;
// Find all the message box settings and run them
UiShowMessageBoxesInSection(OperatingSystemName);
return;
}
- DriveNumber = DriveMapGetBiosDriveNumber(SettingValue);
+ BootDrive = DriveMapGetBiosDriveNumber(SettingValue);
// Now try to read the boot sector (or mbr)
// If this fails then abort
- if (!MachDiskReadLogicalSectors(DriveNumber, 0, 1, (PVOID)0x7C00))
+ if (!MachDiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00))
{
return;
}
if (p == NULL)
return FALSE;
p++;
- *BootPartition = 0xff;
- }
- else if (strnicmp(p, "cdrom(", 6) == 0)
- {
- /*
- * cdrom path:
- * multi(0)disk(0)cdrom(x)\path
- */
- p = p + 6;
- *BootDrive = atoi(p);
- p = strchr(p, ')');
- if (p == NULL)
- return FALSE;
- p++;
- *BootPartition = 0xff;
+ *BootPartition = 0;
}
else if (strnicmp(p, "rdisk(", 6) == 0)
{
#define NDEBUG
#include <debug.h>
+#define IsRecognizedPartition(P) \
+ ((P) == PARTITION_FAT_12 || \
+ (P) == PARTITION_FAT_16 || \
+ (P) == PARTITION_HUGE || \
+ (P) == PARTITION_IFS || \
+ (P) == PARTITION_EXT2 || \
+ (P) == PARTITION_FAT32 || \
+ (P) == PARTITION_FAT32_XINT13 || \
+ (P) == PARTITION_XINT13)
+
BOOL
STDCALL
FrLdrLoadKernel(PCHAR szFileName,
PFILE FilePointer;
CHAR name[1024];
CHAR value[1024];
- CHAR SystemPath[1024];
CHAR szKernelName[1024];
CHAR szHalName[1024];
CHAR szFileName[1024];
ULONG_PTR Base;
ULONG Size;
+
+ PARTITION_TABLE_ENTRY PartitionTableEntry;
+ ULONG rosPartition;
extern ULONG PageDirectoryStart;
extern ULONG PageDirectoryEnd;
/*
* Make sure the system path is set in the .ini file
*/
- if (!IniReadSettingByName(SectionId, "SystemPath", SystemPath, sizeof(SystemPath)))
+ if (!IniReadSettingByName(SectionId, "SystemPath", value, 1024))
{
UiMessageBox("System path not specified for selected operating system.");
return;
/*
* Special case for Live CD.
*/
- if (!stricmp(SystemPath, "LiveCD"))
+ if (!stricmp(value, "LiveCD"))
{
- /* Normalize */
- MachDiskGetBootPath(SystemPath, sizeof(SystemPath));
- strcat(SystemPath, "\\reactos");
- strcat(strcpy(multiboot_kernel_cmdline, SystemPath),
- " /MININT");
+ strcpy(szBootPath, "\\reactos");
+
+ /* Set kernel command line */
+ sprintf(multiboot_kernel_cmdline,
+ "multi(0)disk(0)cdrom(%u)\\reactos /MININT",
+ (unsigned int)BootDrive);
}
else
{
- /* copy system path into kernel command line */
- strcpy(multiboot_kernel_cmdline, SystemPath);
+ /*
+ * Verify system path
+ */
+ if (!DissectArcPath(value, szBootPath, &BootDrive, &BootPartition))
+ {
+ sprintf(MsgBuffer,"Invalid system path: '%s'", value);
+ UiMessageBox(MsgBuffer);
+ return;
+ }
+
+ /* recalculate the boot partition for freeldr */
+ i = 0;
+ rosPartition = 0;
+ while (1)
+ {
+ if (!MachDiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry))
+ {
+ BootPartition = 0;
+ break;
+ }
+ if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator))
+ {
+ if (++rosPartition == BootPartition)
+ {
+ BootPartition = i;
+ break;
+ }
+ }
+ }
+
+ if (BootPartition == 0)
+ {
+ sprintf(MsgBuffer,"Invalid system path: '%s'", value);
+ UiMessageBox(MsgBuffer);
+ return;
+ }
+
+ /* copy ARC path into kernel command line */
+ strcpy(multiboot_kernel_cmdline, value);
}
+ /* Set boot drive and partition */
+ ((LPSTR )(&LoaderBlock.BootDevice))[0] = (CHAR)BootDrive;
+ ((LPSTR )(&LoaderBlock.BootDevice))[1] = (CHAR)BootPartition;
+
/*
* Read the optional kernel parameters (if any)
*/
strcat(multiboot_kernel_cmdline, value);
}
+ /* append a backslash */
+ if ((strlen(szBootPath)==0) ||
+ szBootPath[strlen(szBootPath)] != '\\')
+ strcat(szBootPath, "\\");
+
+ DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath));
+
UiDrawBackdrop();
UiDrawStatusText("Detecting Hardware...");
UiDrawProgressBarCenter(0, 100, "Loading ReactOS...");
/*
- * Try to open system drive
+ * Try to open boot drive
*/
- if (!FsOpenSystemVolume(SystemPath, szBootPath, &LoaderBlock.BootDevice))
+ if (!FsOpenVolume(BootDrive, BootPartition))
{
UiMessageBox("Failed to open boot drive.");
return;
}
- /* append a backslash */
- if ((strlen(szBootPath)==0) ||
- szBootPath[strlen(szBootPath)] != '\\')
- strcat(szBootPath, "\\");
-
- DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath));
-
/*
* Find the kernel image name
* and try to load the kernel off the disk
UiDrawStatusText("");
#endif
- /* set boot device */
- MachDiskGetBootDevice(&LoaderBlock.BootDevice);
+ /* set boot drive and partition */
+ ((char *)(&LoaderBlock.BootDevice))[0] = (char)BootDrive;
+ ((char *)(&LoaderBlock.BootDevice))[1] = (char)BootPartition;
+
/* Open boot drive */
- if (!FsOpenBootVolume())
+ if (!FsOpenVolume(BootDrive, BootPartition))
{
#ifdef USE_UI
UiMessageBox("Failed to open boot drive.");
/* Open 'txtsetup.sif' */
if (!InfOpenFile (&InfHandle,
- MachDiskBootingFromFloppy() ? "\\txtsetup.sif" : "\\reactos\\txtsetup.sif",
+ (BootDrive < 0x80) ? "\\txtsetup.sif" : "\\reactos\\txtsetup.sif",
&ErrorLine))
{
printf("Failed to open 'txtsetup.sif'\n");
printf("LoadOptions: '%s'\n", LoadOptions);
#endif
- if (MachDiskBootingFromFloppy())
+ if (BootDrive < 0x80)
{
/* Boot from floppy disk */
SourcePath = "\\";
}
/* Set kernel command line */
- MachDiskGetBootPath(multiboot_kernel_cmdline, sizeof(multiboot_kernel_cmdline));
- strcat(strcat(strcat(multiboot_kernel_cmdline, SourcePath), " "),
- LoadOptions);
+ sprintf(multiboot_kernel_cmdline,
+ "multi(0)disk(0)%s(%u)%s %s",
+ (BootDrive < 0x80) ? "fdisk" : "cdrom",
+ (unsigned int)BootDrive,
+ SourcePath,
+ LoadOptions);
/* Load ntoskrnl.exe */
if (!LoadKernel(SourcePath, "ntoskrnl.exe"))
#endif
/* Insert boot disk 2 */
- if (MachDiskBootingFromFloppy())
+ if (BootDrive < 0x80)
{
#ifdef USE_UI
UiMessageBox("Please insert \"ReactOS Boot Disk 2\" and press ENTER");
#endif
/* Open boot drive */
- if (!FsOpenBootVolume())
+ if (!FsOpenVolume(BootDrive, BootPartition))
{
#ifdef USE_UI
UiMessageBox("Failed to open boot drive.");