2 * Acess2 Kernel x86 Port
3 * - By John Hodge (thePowersGang)
13 int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt *Map, const int MapSize, tPAddr KStart, tPAddr KEnd)
16 tMBoot_MMapEnt *ent = (void*)((tVAddr)MBInfo->MMapAddr + MapOffset);
17 tMBoot_MMapEnt *last = (void*)((tVAddr)ent + MBInfo->MMapLength);
19 ENTER("pMBInfo pMapOffset pMap iMapSize PKStart PKEnd",
20 MBInfo, MapOffset, Map, MapSize, KStart, KEnd);
22 // Build up memory map
24 while( ent < last && nPMemMapEnts < MapSize )
26 tPMemMapEnt *nent = &Map[nPMemMapEnts];
27 nent->Start = ent->Base;
28 nent->Length = ent->Length;
32 nent->Type = PMEMTYPE_FREE;
35 nent->Type = PMEMTYPE_RESERVED;
41 ent = (void*)( (tVAddr)ent + ent->Size + 4 );
45 nPMemMapEnts = PMemMap_ValidateMap(Map, nPMemMapEnts, MapSize);
46 // TODO: Error handling
48 // Replace kernel with PMEMTYPE_USED
49 nPMemMapEnts = PMemMap_MarkRangeUsed(
50 Map, nPMemMapEnts, MapSize,
54 // Replace modules with PMEMTYPE_USED
55 nPMemMapEnts = PMemMap_MarkRangeUsed(Map, nPMemMapEnts, MapSize,
56 MBInfo->Modules, MBInfo->ModuleCount*sizeof(tMBoot_Module)
58 tMBoot_Module *mods = (void*)( (tVAddr)MBInfo->Modules + MapOffset);
59 for( int i = 0; i < MBInfo->ModuleCount; i ++ )
61 nPMemMapEnts = PMemMap_MarkRangeUsed(
62 Map, nPMemMapEnts, MapSize,
63 mods->Start, mods->End - mods->Start
68 PMemMap_DumpBlocks(Map, nPMemMapEnts);
70 LEAVE('i', nPMemMapEnts);
74 tBootModule *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *ModuleCount)
76 tMBoot_Module *mods = (void*)( MBInfo->Modules + MapOffset );
77 *ModuleCount = MBInfo->ModuleCount;
78 tBootModule *ret = malloc( MBInfo->ModuleCount * sizeof(*ret) );
79 for( int i = 0; i < MBInfo->ModuleCount; i ++ )
83 Log_Log("Arch", "Multiboot Module at 0x%08x, 0x%08x bytes (String at 0x%08x)",
84 mods[i].Start, mods[i].End-mods[i].Start, mods[i].String);
86 ret[i].PBase = mods[i].Start;
87 ret[i].Size = mods[i].End - mods[i].Start;
89 // Always HW map the module data
90 ofs = mods[i].Start&0xFFF;
91 ret[i].Base = (void*)( MM_MapHWPages(mods[i].Start,
92 (ret[i].Size+ofs+0xFFF) / 0x1000
95 // Only map the string if needed
96 if( !MM_GetPhysAddr( (void*)(mods[i].String + MapOffset) ) )
98 // Assumes the string is < 4096 bytes long)
99 ret[i].ArgString = (void*)(
100 MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF)
104 ret[i].ArgString = (char*)(tVAddr)mods[i].String + MapOffset;