Kernel - Cleaned up MM_AllocDMA/_MapHWPages/_GetPhysAddr
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / mboot.c
index 897c9bb..b7cebbd 100644 (file)
@@ -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

UCC git Repository :: git.ucc.asn.au