- Add support for ram disk offset (.IMG file is a RAW image, partition starts later...)
authorevb <evb@svn.reactos.org>
Thu, 4 Feb 2010 01:24:45 +0000 (01:24 +0000)
committerevb <evb@svn.reactos.org>
Thu, 4 Feb 2010 01:24:45 +0000 (01:24 +0000)
- Fix ram disk support in FreeLDR, ARC changes had broken support for booting FreeLDR (not just the Windows) from a ram disk. ARM port now initializes ramdisk as an FS device.
- Fix hardcoded DISKREADBUFFER and FILESYSBUFFER values. On ARM these will be dynamically selected for each board (need to improve this through LLB).
- Now FreeLDR.ini is read, and crash happens because UI routines are all NULL.

svn path=/trunk/; revision=45405

reactos/boot/armllb/hw/versatile/hwinit.c
reactos/boot/freeldr/freeldr/arch/arm/macharm.c
reactos/boot/freeldr/freeldr/cmdline.c
reactos/boot/freeldr/freeldr/disk/ramdisk.c
reactos/boot/freeldr/freeldr/include/arch.h
reactos/boot/freeldr/freeldr/include/ramdisk.h

index ca04d47..e532b58 100755 (executable)
@@ -40,9 +40,9 @@ LlbHwLoadOsLoaderFromRam(VOID)
     
     /* The OS loader is next, followed by the root file system */
     RootFs = Base + 0x80000; // 512 KB (see nandflash)
-    
+        
     /* Set parameters for the OS loader */
-    sprintf(CommandLine, "rdbase=0x%x rdsize=0x%x", RootFs, Size);
+    sprintf(CommandLine, "rdbase=0x%x rdsize=0x%x rdoffset=%d", RootFs, Size, 32256);
     LlbSetCommandLine(CommandLine);
     
     /* Return the OS loader base address */
index 6ad82aa..2a03e29 100644 (file)
@@ -20,6 +20,7 @@ ULONG BootDrive, BootPartition;
 VOID ArmPrepareForReactOS(IN BOOLEAN Setup);
 ADDRESS_RANGE ArmBoardMemoryMap[16];
 ULONG ArmBoardMemoryMapRangeCount;
+ULONG gDiskReadBuffer, gFileSysBuffer;
 
 /* FUNCTIONS ******************************************************************/
 
@@ -69,25 +70,26 @@ ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
 }
 
 BOOLEAN
-ArmDiskGetDriveGeometry(IN ULONG DriveNumber,
-                        OUT PGEOMETRY Geometry)
+ArmDiskNormalizeSystemPath(IN OUT PCHAR SystemPath,
+                           IN unsigned Size)
 {
-    return FALSE;
+    TuiPrintf("Called: %s\n", SystemPath);
+    while (TRUE);
+    return TRUE;
 }
 
 BOOLEAN
-ArmDiskReadLogicalSectors(IN ULONG DriveNumber,
-                          IN ULONGLONG SectorNumber,
-                          IN ULONG SectorCount,
-                          IN PVOID Buffer)
+ArmDiskGetBootPath(OUT PCHAR BootPath,
+                   IN unsigned Size)
 {
-    return FALSE;
-}
-
-ULONG
-ArmDiskGetCacheableBlockCount(IN ULONG DriveNumber)
-{
-    return 0;
+    PCCH Path = "ramdisk(0)";
+    
+    /* Make sure enough space exists */
+    if (Size < sizeof(Path)) return FALSE;
+    
+    /* On ARM platforms, the loader is always in RAM */
+    strcpy(BootPath, Path);
+    return TRUE;
 }
 
 PCONFIGURATION_COMPONENT_DATA
@@ -107,6 +109,11 @@ ArmHwDetect(VOID)
     // or OpenFirmware device trees, and we will convert it to ARC.
     //
     
+    //
+    // Register RAMDISK Device
+    //
+    RamDiskInitialize();
+    
     //
     // Return the root node
     //
@@ -138,6 +145,8 @@ MachInit(IN PCCH CommandLine)
         // Check for Feroceon-base boards
         //
         case MACH_TYPE_FEROCEON:
+            TuiPrintf("Not implemented\n");
+            while (TRUE);
             break;
             
         //
@@ -149,6 +158,10 @@ MachInit(IN PCCH CommandLine)
             MachVtbl.ConsPutChar = ArmBoardBlock->ConsPutChar;
             MachVtbl.ConsKbHit = ArmBoardBlock->ConsKbHit;
             MachVtbl.ConsGetCh = ArmBoardBlock->ConsGetCh;
+            
+            /* Setup the disk and file system buffers */
+            gDiskReadBuffer = 0x00090000;
+            gFileSysBuffer = 0x00090000;
             break;
             
         //
@@ -156,6 +169,8 @@ MachInit(IN PCCH CommandLine)
         // For now that means only Beagle, but ZOOM and others should be ok too
         //
         case MACH_TYPE_OMAP3_BEAGLE:
+            TuiPrintf("Not implemented\n");
+            while (TRUE);
             break;
             
         default:
@@ -172,15 +187,8 @@ MachInit(IN PCCH CommandLine)
     //
     // Setup disk I/O routines
     //
-    MachVtbl.DiskReadLogicalSectors = ArmDiskReadLogicalSectors;
-    MachVtbl.DiskGetDriveGeometry = ArmDiskGetDriveGeometry;
-    MachVtbl.DiskGetCacheableBlockCount = ArmDiskGetCacheableBlockCount;
-    
-    //
-    // Now set default disk handling routines -- we don't need to override
-    //
-    MachVtbl.DiskGetBootPath = DiskGetBootPath;
-    MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath;
+    MachVtbl.DiskGetBootPath = ArmDiskGetBootPath;
+    MachVtbl.DiskNormalizeSystemPath = ArmDiskNormalizeSystemPath;
     
     //
     // We can now print to the console
index a1ce65c..7032457 100644 (file)
@@ -21,7 +21,7 @@ VOID
 CmdLineParse(IN PCHAR CmdLine)
 {
     PCHAR End, Setting;
-    ULONG Length;
+    ULONG Length, Offset = 0;
 
     //
     // Set defaults
@@ -76,6 +76,21 @@ CmdLineParse(IN PCHAR CmdLine)
                                         sizeof(ANSI_NULL),
                                         NULL,
                                         0);
+
+    //
+    // Get ramdisk offset
+    //
+    Setting = strstr(CmdLine, "rdoffset=");
+    if (Setting) Offset = strtoul(Setting +
+                                  sizeof("rdoffset=") -
+                                  sizeof(ANSI_NULL),
+                                  NULL,
+                                  0);
+
+    //
+    // Fix it up
+    //
+    gRamDiskBase = (PVOID)((ULONG_PTR)gRamDiskBase + Offset);
 }
 
 PCCH
index 18397d6..fadf341 100644 (file)
@@ -108,6 +108,14 @@ static const DEVVTBL RamDiskVtbl = {
     RamDiskSeek,
 };
 
+VOID
+NTAPI
+RamDiskInitialize(VOID)
+{
+    /* Setup the RAMDISK device */
+    FsRegisterDevice("ramdisk(0)", &RamDiskVtbl);
+}
+
 VOID
 NTAPI
 RamDiskLoadVirtualFile(IN PCHAR FileName)
index 7e924be..c3e3c45 100644 (file)
 #define FILESYSBUFFER          0x80000 /* Buffer to store file system data (e.g. cluster buffer for FAT) */
 #define DISKREADBUFFER         0x90000 /* Buffer to store data read in from the disk via the BIOS */
 #define DISKREADBUFFER_SIZE 512
-#elif defined(_M_PPC) || defined(_M_MIPS) || defined(_M_ARM)
+#elif defined(_M_PPC) || defined(_M_MIPS)
 #define DISKREADBUFFER             0x80000000
 #define FILESYSBUFFER           0x80000000
+#elif defined(_M_ARM)
+extern ULONG gDiskReadBuffer, gFileSysBuffer;
+#define DISKREADBUFFER gDiskReadBuffer
+#define FILESYSBUFFER  gFileSysBuffer
 #endif
 
 /* Makes "x" a global variable or label */
index f8338ee..c77c09e 100644 (file)
@@ -18,6 +18,12 @@ RamDiskLoadVirtualFile(
     IN PCHAR FileName
 );
 
+VOID
+NTAPI
+RamDiskInitialize(
+    VOID
+);
+
 extern PVOID gRamDiskBase;
 extern ULONG gRamDiskSize;