X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmboot.c;h=b7cebbd4f45e570a3784ecfe06577404385503d2;hb=a3d5866d4aa87dd93db40e9e194fea6f2b0047a4;hp=897c9bbbb770218541b8c65d7d1e97c91d19c9b9;hpb=e7809e57b0692cf65ee1a7d2060c52fc53da49f2;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/mboot.c b/KernelLand/Kernel/arch/x86/mboot.c index 897c9bbb..b7cebbd4 100644 --- a/KernelLand/Kernel/arch/x86/mboot.c +++ b/KernelLand/Kernel/arch/x86/mboot.c @@ -13,8 +13,6 @@ int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt *Map, const int MapSize, tPAddr KStart, tPAddr KEnd) { int nPMemMapEnts = 0; - tMBoot_MMapEnt *ent = (void*)((tVAddr)MBInfo->MMapAddr + MapOffset); - tMBoot_MMapEnt *last = (void*)((tVAddr)ent + MBInfo->MMapLength); ENTER("pMBInfo pMapOffset pMap iMapSize PKStart PKEnd", MBInfo, MapOffset, Map, MapSize, KStart, KEnd); @@ -22,6 +20,8 @@ int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt * // Check that the memory map is present if( MBInfo->Flags & (1 << 6) ) { + tMBoot_MMapEnt *ent = (void*)((tVAddr)MBInfo->MMapAddr + MapOffset); + tMBoot_MMapEnt *last = (void*)((tVAddr)ent + MBInfo->MMapLength); // Build up memory map nPMemMapEnts = 0; while( ent < last && nPMemMapEnts < MapSize ) @@ -30,6 +30,7 @@ int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt * if( !MM_GetPhysAddr(ent) ) Log_KernelPanic("MBoot", "MBoot Map entry %i addres bad (%p)", nPMemMapEnts, ent); + LOG("%llx+%llx", ent->Base, ent->Length); nent->Start = ent->Base; nent->Length = ent->Length; @@ -47,10 +48,16 @@ int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt * nPMemMapEnts ++; ent = (void*)( (tVAddr)ent + ent->Size + 4 ); } + if( ent < last ) + { + Log_Warning("MBoot", "Memory map has >%i entries, internal version is truncated", + MapSize); + } } else if( MBInfo->Flags & (1 << 0) ) { Log_Warning("MBoot", "No memory map passed, using mem_lower and mem_upper"); + ASSERT(MapSize >= 2); nPMemMapEnts = 2; Map[0].Start = 0; Map[0].Length = MBInfo->LowMem * 1024; @@ -68,15 +75,18 @@ int Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt * } // Ensure it's valid + LOG("Validating"); nPMemMapEnts = PMemMap_ValidateMap(Map, nPMemMapEnts, MapSize); // TODO: Error handling // Replace kernel with PMEMTYPE_USED + LOG("Marking kernel"); nPMemMapEnts = PMemMap_MarkRangeUsed( Map, nPMemMapEnts, MapSize, KStart, KEnd - KStart ); + LOG("Dumping"); PMemMap_DumpBlocks(Map, nPMemMapEnts); // Check if boot modules were passed @@ -129,16 +139,15 @@ tBootModule *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *M // Always HW map the module data ofs = mods[i].Start&0xFFF; - ret[i].Base = (void*)( MM_MapHWPages(mods[i].Start, - (ret[i].Size+ofs+0xFFF) / 0x1000 - ) + ofs ); + ret[i].Base = (void*)( (tVAddr)MM_MapHWPages(mods[i].Start, (ret[i].Size+ofs+0xFFF) / 0x1000) + + ofs ); // Only map the string if needed if( !MM_GetPhysAddr( (void*)(mods[i].String + MapOffset) ) ) { // Assumes the string is < 4096 bytes long) ret[i].ArgString = (void*)( - MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF) + (tVAddr)MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF) ); } else