-
- tMBoot_MMapEnt *ent = (void*)mbInfo->MMapAddr;
- tMBoot_MMapEnt *last = (void*)(mbInfo->MMapAddr + mbInfo->MMapLength);
-
- // Build up memory map
- nPMemMapEnts = 0;
- while( ent < last && nPMemMapEnts < MAX_PMEMMAP_ENTS )
- {
- tPMemMapEnt *nent = &pmemmap[nPMemMapEnts];
- nent->Start = ent->Base;
- nent->Length = ent->Length;
- switch(ent->Type)
- {
- case 1:
- nent->Type = PMEMTYPE_FREE;
- break;
- default:
- nent->Type = PMEMTYPE_RESERVED;
- break;
- }
- nent->NUMADomain = 0;
-
- nPMemMapEnts ++;
- ent = (void*)( (tVAddr)ent + ent->Size + 4 );
- }
-
- // Ensure it's valid
- nPMemMapEnts = PMemMap_ValidateMap(pmemmap, nPMemMapEnts, MAX_PMEMMAP_ENTS);
- // TODO: Error handling
-
- // Replace kernel with PMEMTYPE_USED
- nPMemMapEnts = PMemMap_MarkRangeUsed(
- pmemmap, nPMemMapEnts, MAX_PMEMMAP_ENTS,
- KERNEL_LOAD, (tVAddr)&gKernelEnd - KERNEL_LOAD - KERNEL_BASE
- );
-
- // Replace modules with PMEMTYPE_USED
- nPMemMapEnts = PMemMap_MarkRangeUsed(pmemmap, nPMemMapEnts, MAX_PMEMMAP_ENTS,
- mbInfo->Modules, mbInfo->ModuleCount*sizeof(*mods)
- );
- mods = (void*)mbInfo->Modules;
- for( int i = 0; i < mbInfo->ModuleCount; i ++ )
- {
- nPMemMapEnts = PMemMap_MarkRangeUsed(
- pmemmap, nPMemMapEnts, MAX_PMEMMAP_ENTS,
- mods->Start, mods->End - mods->Start
- );
- }
-
- // Debug - Output map
- PMemMap_DumpBlocks(pmemmap, nPMemMapEnts);