diff --git a/freeldr/freeldr/CHANGELOG b/freeldr/freeldr/CHANGELOG index 701cde5e52e..74eef157a4c 100644 --- a/freeldr/freeldr/CHANGELOG +++ b/freeldr/freeldr/CHANGELOG @@ -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 diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index ca9410c1e2c..878460f7cc5 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -736,7 +736,7 @@ DetectHardware(VOID) { HKEY SystemKey; U32 BusNumber = 0; - S32 Error + S32 Error; DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n")); diff --git a/freeldr/freeldr/arch/i386/i386trap.S b/freeldr/freeldr/arch/i386/i386trap.S index 801387031fe..a2d30e5f090 100644 --- a/freeldr/freeldr/arch/i386/i386trap.S +++ b/freeldr/freeldr/arch/i386/i386trap.S @@ -22,6 +22,7 @@ #define ASM #include +#include @@ -80,7 +81,10 @@ i386ExceptionHandlerText: .ascii "FreeLoader i386 Exception Handler\n" - .asciz "Report bugs to Brian Palmer \n\n" + .ascii VERSION + .ascii "\n" +// .asciz "Report bugs to Brian Palmer \n\n" + .asciz "Report bugs to ReactOS Kernel mailing list \n\n" i386DivideByZeroText: .asciz "Exception 00: DIVIDE BY ZERO\n\n" diff --git a/freeldr/freeldr/debug.c b/freeldr/freeldr/debug.c index 4c9a6b09ba8..9ec15c42a95 100644 --- a/freeldr/freeldr/debug.c +++ b/freeldr/freeldr/debug.c @@ -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 diff --git a/freeldr/freeldr/include/linux.h b/freeldr/freeldr/include/linux.h index 9bcaf7db80d..280cbf762ad 100644 --- a/freeldr/freeldr/include/linux.h +++ b/freeldr/freeldr/include/linux.h @@ -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; diff --git a/freeldr/freeldr/include/mm.h b/freeldr/freeldr/include/mm.h index d744faba6f0..030238a33e7 100644 --- a/freeldr/freeldr/include/mm.h +++ b/freeldr/freeldr/include/mm.h @@ -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 diff --git a/freeldr/freeldr/include/version.h b/freeldr/freeldr/include/version.h index 964948e93cc..48c30a29b13 100644 --- a/freeldr/freeldr/include/version.h +++ b/freeldr/freeldr/include/version.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 " #define AUTHOR_EMAIL "" #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 diff --git a/freeldr/freeldr/linuxboot.c b/freeldr/freeldr/linuxboot.c index 70f233472b1..b1d99ee15c7 100644 --- a/freeldr/freeldr/linuxboot.c +++ b/freeldr/freeldr/linuxboot.c @@ -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; BytesLoaded0; 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; diff --git a/freeldr/freeldr/mm/mm.c b/freeldr/freeldr/mm/mm.c index ada9d510c97..c368a7fee88 100644 --- a/freeldr/freeldr/mm/mm.c +++ b/freeldr/freeldr/mm/mm.c @@ -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;