[freeldr] Rework the ramdisk driver to let it be a full device, instead of a deprecat...
[reactos.git] / reactos / boot / freeldr / freeldr / arch / arm / loader.c
index 82ff423..d1548d9 100644 (file)
@@ -30,7 +30,6 @@ CHAR ArmArcBootPath[64];
 CHAR ArmArcHalPath[64];
 CHAR ArmNtHalPath[64];
 CHAR ArmNtBootPath[64];
-WCHAR ArmModuleName[64];
 PNLS_DATA_BLOCK ArmNlsDataBlock;
 PLOADER_PARAMETER_EXTENSION ArmExtension;
 BIOS_MEMORY_DESCRIPTOR ArmBoardMemoryDescriptors[16] = {{0}};
@@ -43,11 +42,12 @@ PCHAR ArmSharedHeap;
 extern ADDRESS_RANGE ArmBoardMemoryMap[16];
 extern ULONG ArmBoardMemoryMapRangeCount;
 extern ARM_TRANSLATION_TABLE ArmTranslationTable;
-extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable, HyperSpaceTranslationTable;
+extern ARM_COARSE_PAGE_TABLE BootTranslationTable, KernelTranslationTable, FlatMapTranslationTable, MasterTranslationTable;
 extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint;
 extern ULONG_PTR KernelBase;
 extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16];
 extern ULONG RegistrySize, AnsiSize, OemSize, UnicodeSize, KernelSize, HalSize, DriverSize[16];
+extern PCHAR DriverName[16];
 extern ULONG Drivers;
 extern ULONG BootStack, TranslationTableStart, TranslationTableEnd;
 
@@ -82,20 +82,6 @@ ULONG LenBits[] =
 //
 #define UART_VIRTUAL 0xE0000000
 
-#define PTE_BASE     0xC0000000
-#define PDE_BASE     0xC1000000
-#define HYPER_SPACE  0xC1100000
-
-//
-// Take 0x80812345 and extract:
-// PTE_BASE[0x808][0x12]
-//
-#define MiAddressToPte(x)         \
-    (PTE_BASE + (((x) >> 20) << 12) + ((((x) >> 12) & 0xFF) << 2))
-
-#define MiAddressToPde(x)         \
-    (PDE_BASE + (((x) >> 20) << 2))
-
 /* FUNCTIONS ******************************************************************/
 
 PVOID
@@ -697,7 +683,7 @@ ArmSetupPageDirectory(VOID)
     ARM_PTE Pte;
     ULONG i, j;
     PARM_TRANSLATION_TABLE ArmTable;
-    PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable, HyperSpaceTable;
+    PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable;
     
     //
     // Get the PDEs that we will use
@@ -707,7 +693,6 @@ ArmSetupPageDirectory(VOID)
     KernelTable = &KernelTranslationTable;
     FlatMapTable = &FlatMapTranslationTable;
     MasterTable = &MasterTranslationTable;
-    HyperSpaceTable = &HyperSpaceTranslationTable;
     
     //
     // Set the master L1 PDE as the TTB
@@ -824,12 +809,6 @@ ArmSetupPageDirectory(VOID)
     //
     Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT;
     ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte;
-    
-    //
-    // Now create the template for the hyperspace table which maps 1MB
-    //
-    Pte.L1.Coarse.BaseAddress = (ULONG)HyperSpaceTable >> CPT_SHIFT;
-    ArmTable->Pte[HYPER_SPACE >> PDE_SHIFT] = Pte;
 
     //
     // Now create the template for the coarse page tables which map the first 8MB
@@ -997,12 +976,6 @@ ArmSetupPageDirectory(VOID)
     Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT;
     FlatMapTable->Pte[16] = Pte;
     
-    //
-    // And finally for the 0xC1100000 region (1MB)
-    //
-    Pte.L2.Small.BaseAddress = (ULONG)&HyperSpaceTranslationTable >> PTE_SHIFT;
-    FlatMapTable->Pte[17] = Pte;
-
     //
     // Now we handle the master translation area for our PDEs. We'll just make
     // the 4 page tables point to the ARM TTB.
@@ -1061,11 +1034,12 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
     ULONG ArcDiskCount = 0, Checksum = 0;
     PMASTER_BOOT_RECORD Mbr;
     PULONG Buffer;
+    PWCHAR ArmModuleName;
 
     //
     // Allocate the ARM Shared Heap
     //
-    ArmSharedHeap = MmAllocateMemory(PAGE_SIZE);
+    ArmSharedHeap = MmAllocateMemoryWithType(PAGE_SIZE, LoaderOsloaderHeap);
     ArmSharedHeapSize = 0;
     if (!ArmSharedHeap) return;
     
@@ -1231,6 +1205,7 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
     //
     // Setup loader entry for the kernel
     //
+    ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
     wcscpy(ArmModuleName, L"ntoskrnl.exe");
     LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
     RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
@@ -1244,12 +1219,55 @@ ArmPrepareForReactOS(IN BOOLEAN Setup)
     LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
     LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
     InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
+
+    //
+    // Setup loader entry for the HAL
+    //
+    ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
+    wcscpy(ArmModuleName, L"hal.dll");
+    LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
+    RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
+    LdrEntry->DllBase = (PVOID)(HalData | KSEG0_BASE);
+    LdrEntry->SizeOfImage = HalSize;
+    LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)HalData)->
+                                  OptionalHeader.AddressOfEntryPoint;
+    LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE);
+    LdrEntry->LoadCount = 1;
+    LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
+    RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName);
+    RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName);
+    LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
+    LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
+    InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
     
     //
     // Build descriptors for the drivers loaded
     //
     for (i = 0; i < Drivers; i++)
     {
+        //
+        // Setup loader entry for the driver
+        //
+        LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY));
+        RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY));
+        LdrEntry->DllBase = (PVOID)(DriverData[i] | KSEG0_BASE);
+        LdrEntry->SizeOfImage = DriverSize[i];
+        LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)DriverData[i])->
+                                      OptionalHeader.AddressOfEntryPoint;
+        LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE);
+        LdrEntry->LoadCount = 1;
+        LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED;
+        ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR));
+        RtlZeroMemory(ArmModuleName, 64 * sizeof(WCHAR));
+        LdrEntry->FullDllName.Length = strlen(DriverName[i]) * sizeof(WCHAR);
+        LdrEntry->FullDllName.MaximumLength = LdrEntry->FullDllName.Length;
+        LdrEntry->FullDllName.Buffer = ArmModuleName;
+        LdrEntry->BaseDllName = LdrEntry->FullDllName;
+        while (*DriverName[i]) *ArmModuleName++ = *DriverName[i]++;
+        LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE);
+        LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE);
+        InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks);
+
         //
         // Build a descriptor for the driver
         //