mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 01:24:38 +00:00
Changes in v1.8.13 (6/05/2003) (brianp)
- Added support for booting Linux 2.4.x kernels - i386 exception handler now reports FreeLoader version number svn path=/trunk/; revision=4844
This commit is contained in:
parent
1179903bd5
commit
5320d2eb3f
11 changed files with 143 additions and 12 deletions
|
@ -1,3 +1,8 @@
|
|||
Changes in v1.8.13 (6/05/2003) (brianp)
|
||||
|
||||
- Added support for booting Linux 2.4.x kernels
|
||||
- i386 exception handler now reports FreeLoader version number
|
||||
|
||||
Changes in v1.8.12 (5/25/2003) (ekohl)
|
||||
|
||||
- Added .inf-file parser
|
||||
|
|
|
@ -736,7 +736,7 @@ DetectHardware(VOID)
|
|||
{
|
||||
HKEY SystemKey;
|
||||
U32 BusNumber = 0;
|
||||
S32 Error
|
||||
S32 Error;
|
||||
|
||||
DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n"));
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
#define ASM
|
||||
#include <arch.h>
|
||||
#include <version.h>
|
||||
|
||||
|
||||
|
||||
|
@ -80,7 +81,10 @@
|
|||
|
||||
i386ExceptionHandlerText:
|
||||
.ascii "FreeLoader i386 Exception Handler\n"
|
||||
.asciz "Report bugs to Brian Palmer <brianp@reactos.org>\n\n"
|
||||
.ascii VERSION
|
||||
.ascii "\n"
|
||||
// .asciz "Report bugs to Brian Palmer <brianp@reactos.org>\n\n"
|
||||
.asciz "Report bugs to ReactOS Kernel mailing list <ros-kernel@reactos.com>\n\n"
|
||||
|
||||
i386DivideByZeroText:
|
||||
.asciz "Exception 00: DIVIDE BY ZERO\n\n"
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
#ifdef DEBUG
|
||||
|
||||
//#define DEBUG_ALL
|
||||
#define DEBUG_INIFILE
|
||||
//#define DEBUG_INIFILE
|
||||
//#define DEBUG_REACTOS
|
||||
//#define DEBUG_CUSTOM
|
||||
//#define DEBUG_NONE
|
||||
#define DEBUG_NONE
|
||||
|
||||
#if defined (DEBUG_ALL)
|
||||
U32 DebugPrintMask = DPRINT_WARNING | DPRINT_MEMORY | DPRINT_FILESYSTEM |
|
||||
|
@ -40,7 +40,7 @@ U32 DebugPrintMask = DPRINT_INIFILE;
|
|||
#elif defined (DEBUG_REACTOS)
|
||||
U32 DebugPrintMask = DPRINT_REACTOS | DPRINT_REGISTRY;
|
||||
#elif defined (DEBUG_CUSTOM)
|
||||
U32 DebugPrintMask = DPRINT_WARNING|DPRINT_FILESYSTEM;
|
||||
U32 DebugPrintMask = DPRINT_WARNING|DPRINT_FILESYSTEM|DPRINT_MEMORY|DPRINT_LINUX;
|
||||
#else //#elif defined (DEBUG_NONE)
|
||||
U32 DebugPrintMask = 0;
|
||||
#endif
|
||||
|
|
|
@ -41,6 +41,8 @@
|
|||
#define LINUX_FLAG_LOAD_HIGH 0x01
|
||||
#define LINUX_FLAG_CAN_USE_HEAP 0x80
|
||||
|
||||
#define LINUX_MAX_INITRD_ADDRESS 0x38000000
|
||||
|
||||
typedef struct
|
||||
{
|
||||
U8 BootCode1[0x20];
|
||||
|
@ -115,6 +117,9 @@ typedef struct
|
|||
U16 HeapEnd; // space from here (exclusive) down to
|
||||
// end of setup code can be used by setup
|
||||
// for local heap purposes.
|
||||
U16 Pad1;
|
||||
U32 CommandLinePointer; // 32-bit pointer to the kernel command line
|
||||
U32 InitrdAddressMax; // Highest legal initrd address
|
||||
|
||||
|
||||
} PACKED LINUX_SETUPSECTOR, *PLINUX_SETUPSECTOR;
|
||||
|
|
|
@ -53,5 +53,6 @@ VOID MmFreeMemory(PVOID MemoryPointer);
|
|||
//PVOID MmAllocateLowMemory(U32 MemorySize);
|
||||
//VOID MmFreeLowMemory(PVOID MemoryPointer);
|
||||
PVOID MmAllocateMemoryAtAddress(U32 MemorySize, PVOID DesiredAddress);
|
||||
PVOID MmAllocateHighestMemoryBelowAddress(U32 MemorySize, PVOID DesiredAddress);
|
||||
|
||||
#endif // defined __MEMORY_H
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
|
||||
/* just some stuff */
|
||||
#define VERSION "FreeLoader v1.8.12"
|
||||
#define VERSION "FreeLoader v1.8.13"
|
||||
#define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>"
|
||||
#define AUTHOR_EMAIL "<brianp@sginet.com>"
|
||||
#define BY_AUTHOR "by Brian Palmer"
|
||||
|
@ -36,10 +36,14 @@
|
|||
//
|
||||
#define FREELOADER_MAJOR_VERSION 1
|
||||
#define FREELOADER_MINOR_VERSION 8
|
||||
#define FREELOADER_PATCH_VERSION 12
|
||||
#define FREELOADER_PATCH_VERSION 13
|
||||
|
||||
|
||||
#ifndef ASM
|
||||
|
||||
PUCHAR GetFreeLoaderVersionString(VOID);
|
||||
|
||||
#endif // ASM
|
||||
|
||||
|
||||
#endif // defined __VERSION_H
|
||||
|
|
|
@ -146,8 +146,15 @@ VOID LoadAndBootLinux(PUCHAR OperatingSystemName, PUCHAR Description)
|
|||
LinuxBootSector->RootDevice = 0x0200;
|
||||
}
|
||||
|
||||
LinuxBootSector->CommandLineMagic = LINUX_COMMAND_LINE_MAGIC;
|
||||
LinuxBootSector->CommandLineOffset = 0x9000;
|
||||
if (LinuxSetupSector->Version >= 0x0202)
|
||||
{
|
||||
LinuxSetupSector->CommandLinePointer = 0x99000;
|
||||
}
|
||||
else
|
||||
{
|
||||
LinuxBootSector->CommandLineMagic = LINUX_COMMAND_LINE_MAGIC;
|
||||
LinuxBootSector->CommandLineOffset = 0x9000;
|
||||
}
|
||||
|
||||
if (NewStyleLinuxKernel)
|
||||
{
|
||||
|
@ -455,7 +462,17 @@ BOOL LinuxReadInitrd(PFILE LinuxInitrdFile)
|
|||
UiDrawStatusText(StatusText);
|
||||
|
||||
// Allocate memory for the ramdisk
|
||||
LinuxInitrdLoadAddress = MmAllocateMemory(LinuxInitrdSize);
|
||||
//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)
|
||||
{
|
||||
LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LINUX_MAX_INITRD_ADDRESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
LinuxInitrdLoadAddress = MmAllocateHighestMemoryBelowAddress(LinuxInitrdSize, (PVOID)LinuxSetupSector->InitrdAddressMax);
|
||||
}
|
||||
if (LinuxInitrdLoadAddress == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
|
@ -465,6 +482,14 @@ BOOL LinuxReadInitrd(PFILE LinuxInitrdFile)
|
|||
LinuxSetupSector->RamdiskAddress = (U32)LinuxInitrdLoadAddress;
|
||||
LinuxSetupSector->RamdiskSize = LinuxInitrdSize;
|
||||
|
||||
DbgPrint((DPRINT_LINUX, "RamdiskAddress: 0x%x\n", LinuxSetupSector->RamdiskAddress));
|
||||
DbgPrint((DPRINT_LINUX, "RamdiskSize: 0x%x\n", LinuxSetupSector->RamdiskSize));
|
||||
|
||||
if (LinuxSetupSector->Version >= 0x0203)
|
||||
{
|
||||
DbgPrint((DPRINT_LINUX, "InitrdAddressMax: 0x%x\n", LinuxSetupSector->InitrdAddressMax));
|
||||
}
|
||||
|
||||
// Read in the ramdisk
|
||||
for (BytesLoaded=0; BytesLoaded<LinuxInitrdSize; )
|
||||
{
|
||||
|
|
|
@ -62,6 +62,7 @@ VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, U32 StartPage, U32 PageCoun
|
|||
VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, U32 StartPage, U32 PageCount); // Allocates the specified pages in the lookup table
|
||||
U32 MmCountFreePagesInLookupTable(PVOID PageLookupTable, U32 TotalPageCount); // Returns the number of free pages in the lookup table
|
||||
U32 MmFindAvailablePagesFromEnd(PVOID PageLookupTable, U32 TotalPageCount, U32 PagesNeeded); // Returns the page number of the first available page range from the end of memory
|
||||
U32 MmFindAvailablePagesBeforePage(PVOID PageLookupTable, U32 TotalPageCount, U32 PagesNeeded, U32 LastPage); // Returns the page number of the first available page range before the specified page
|
||||
VOID MmFixupSystemMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32* MapCount); // Removes entries in the memory map that describe memory above 4G
|
||||
VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, U32 TotalPageCount); // Sets the LastFreePageHint to the last usable page of memory
|
||||
BOOL MmAreMemoryPagesAvailable(PVOID PageLookupTable, U32 TotalPageCount, PVOID PageAddress, U32 PageCount); // Returns TRUE if the specified pages of memory are available, otherwise FALSE
|
||||
|
|
|
@ -342,7 +342,6 @@ U32 MmCountFreePagesInLookupTable(PVOID PageLookupTable, U32 TotalPageCount)
|
|||
U32 MmFindAvailablePagesFromEnd(PVOID PageLookupTable, U32 TotalPageCount, U32 PagesNeeded)
|
||||
{
|
||||
PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable;
|
||||
U32 AvailablePageStart;
|
||||
U32 AvailablePagesSoFar;
|
||||
U32 Index;
|
||||
|
||||
|
@ -351,7 +350,6 @@ U32 MmFindAvailablePagesFromEnd(PVOID PageLookupTable, U32 TotalPageCount, U32 P
|
|||
LastFreePageHint = TotalPageCount;
|
||||
}
|
||||
|
||||
AvailablePageStart = 0;
|
||||
AvailablePagesSoFar = 0;
|
||||
for (Index=LastFreePageHint-1; Index>0; Index--)
|
||||
{
|
||||
|
@ -374,6 +372,39 @@ U32 MmFindAvailablePagesFromEnd(PVOID PageLookupTable, U32 TotalPageCount, U32 P
|
|||
return 0;
|
||||
}
|
||||
|
||||
U32 MmFindAvailablePagesBeforePage(PVOID PageLookupTable, U32 TotalPageCount, U32 PagesNeeded, U32 LastPage)
|
||||
{
|
||||
PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable;
|
||||
U32 AvailablePagesSoFar;
|
||||
U32 Index;
|
||||
|
||||
if (LastPage > TotalPageCount)
|
||||
{
|
||||
return MmFindAvailablePagesFromEnd(PageLookupTable, TotalPageCount, PagesNeeded);
|
||||
}
|
||||
|
||||
AvailablePagesSoFar = 0;
|
||||
for (Index=LastPage-1; Index>0; Index--)
|
||||
{
|
||||
if (RealPageLookupTable[Index].PageAllocated != 0)
|
||||
{
|
||||
AvailablePagesSoFar = 0;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
AvailablePagesSoFar++;
|
||||
}
|
||||
|
||||
if (AvailablePagesSoFar >= PagesNeeded)
|
||||
{
|
||||
return Index;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VOID MmFixupSystemMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32* MapCount)
|
||||
{
|
||||
int Index;
|
||||
|
|
|
@ -138,6 +138,61 @@ PVOID MmAllocateMemoryAtAddress(U32 MemorySize, PVOID DesiredAddress)
|
|||
return MemPointer;
|
||||
}
|
||||
|
||||
PVOID MmAllocateHighestMemoryBelowAddress(U32 MemorySize, PVOID DesiredAddress)
|
||||
{
|
||||
U32 PagesNeeded;
|
||||
U32 FirstFreePageFromEnd;
|
||||
U32 DesiredAddressPageNumber;
|
||||
PVOID MemPointer;
|
||||
|
||||
if (MemorySize == 0)
|
||||
{
|
||||
DbgPrint((DPRINT_MEMORY, "MmAllocateHighestMemoryBelowAddress() called for 0 bytes. Returning NULL.\n"));
|
||||
UiMessageBoxCritical("Memory allocation failed: MmAllocateHighestMemoryBelowAddress() called for 0 bytes.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Find out how many blocks it will take to
|
||||
// satisfy this allocation
|
||||
PagesNeeded = ROUND_UP(MemorySize, MM_PAGE_SIZE) / MM_PAGE_SIZE;
|
||||
|
||||
// Get the page number for their desired address
|
||||
DesiredAddressPageNumber = (U32)DesiredAddress / MM_PAGE_SIZE;
|
||||
|
||||
// If we don't have enough available mem
|
||||
// then return NULL
|
||||
if (FreePagesInLookupTable < PagesNeeded)
|
||||
{
|
||||
DbgPrint((DPRINT_MEMORY, "Memory allocation failed. Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount));
|
||||
UiMessageBoxCritical("Memory allocation failed: out of memory.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FirstFreePageFromEnd = MmFindAvailablePagesBeforePage(PageLookupTableAddress, TotalPagesInLookupTable, PagesNeeded, DesiredAddressPageNumber);
|
||||
|
||||
if (FirstFreePageFromEnd == 0)
|
||||
{
|
||||
DbgPrint((DPRINT_MEMORY, "Memory allocation failed. Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount));
|
||||
UiMessageBoxCritical("Memory allocation failed: out of memory.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
MmAllocatePagesInLookupTable(PageLookupTableAddress, FirstFreePageFromEnd, PagesNeeded);
|
||||
|
||||
FreePagesInLookupTable -= PagesNeeded;
|
||||
MemPointer = (PVOID)(FirstFreePageFromEnd * MM_PAGE_SIZE);
|
||||
|
||||
#ifdef DEBUG
|
||||
IncrementAllocationCount();
|
||||
DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d. AllocCount: %d\n", MemorySize, PagesNeeded, FirstFreePageFromEnd, AllocationCount));
|
||||
DbgPrint((DPRINT_MEMORY, "Memory allocation pointer: 0x%x\n", MemPointer));
|
||||
//VerifyHeap();
|
||||
#endif // DEBUG
|
||||
|
||||
// Now return the pointer
|
||||
return MemPointer;
|
||||
}
|
||||
|
||||
VOID MmFreeMemory(PVOID MemoryPointer)
|
||||
{
|
||||
U32 PageNumber;
|
||||
|
|
Loading…
Reference in a new issue