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}};
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;
//
#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
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
KernelTable = &KernelTranslationTable;
FlatMapTable = &FlatMapTranslationTable;
MasterTable = &MasterTranslationTable;
- HyperSpaceTable = &HyperSpaceTranslationTable;
//
// Set the master L1 PDE as the TTB
//
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
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.
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;
//
// 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));
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
//