X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fpmemmap.c;h=bf341ff1fe9d5c60ce2eade33623ffbdaee5bd65;hb=9eadc33399e705035c33e8434a9644d91e44ed44;hp=50f8de19bfc7a0106e5330e6defae0cc2d3acce3;hpb=3d85d14c564e245c00d31b1adf9c4ee7c2d9754a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/pmemmap.c b/KernelLand/Kernel/pmemmap.c index 50f8de19..bf341ff1 100644 --- a/KernelLand/Kernel/pmemmap.c +++ b/KernelLand/Kernel/pmemmap.c @@ -5,6 +5,7 @@ * pmemmap.c * - Physical memory map manipulation */ +#define DEBUG 0 #include #include @@ -13,9 +14,10 @@ void PMemMap_DumpBlocks(tPMemMapEnt *map, int NEnts) { for( int i = 0; i < NEnts; i ++ ) { - Log_Debug("Arch", "%i: %i 0x%02x %08llx+%llx", + Log_Debug("PMemMap", "%i: %i 0x%02x %08llx+%llx (end %llx)", i, map[i].Type, map[i].NUMADomain, - map[i].Start, map[i].Length + map[i].Start, map[i].Length, + map[i].Start + map[i].Length ); } } @@ -30,11 +32,11 @@ int PMemMap_SplitBlock(tPMemMapEnt *map, int NEnts, int MaxEnts, int Block, Uint // out of space return NEnts; } - Block ++; if( Block < NEnts ) { - // Can't be anything after - memmove(&map[Block+1], &map[Block], (NEnts - Block)*sizeof(map[0])); + LOG("Moving %i entries from %i to %i", (NEnts - Block-1), Block+1, Block); + memmove(&map[Block+2], &map[Block+1], (NEnts - Block)*sizeof(map[0])); } + Block ++; NEnts ++; // New (free) block @@ -64,7 +66,8 @@ int PMemMap_CompactMap(tPMemMapEnt *map, int NEnts, int MaxEnts) // Ok, they should be together map[i-1].Length += map[i].Length; memmove(&map[i], &map[i+1], (NEnts - (i+1))*sizeof(map[0])); - + LOG("Joined %i and %i into %llx+%llx", i-1, i, map[i-1].Start, map[i-1].Length); + // Counteract the i++ in the loop iterator i --; NEnts --; @@ -85,8 +88,24 @@ int PMemMap_ValidateMap(tPMemMapEnt *map, int NEnts, int MaxEnts) } if( bNeedsSort ) { - Log_Warning("Arch", "TODO: Impliment memory map sorting"); - // TODO: Sort memory map + // Use a selection/swap sort + for( int i = 0; i < NEnts; i ++ ) + { + int sel = i; + for( int j = i+1; j < NEnts; j ++ ) + { + if( map[j].Start < map[sel].Start ) + sel = j; + } + if( sel != i ) { + LOG("Swapping %i and %i", i, sel); + LOG(" - %llx+%llx", map[i].Start, map[i].Length); + LOG(" - %llx+%llx", map[sel].Start, map[sel].Length); + tPMemMapEnt tmp = map[i]; + map[i] = map[sel]; + map[sel] = tmp; + } + } } // Ensure that the map has no overlaps @@ -101,7 +120,8 @@ int PMemMap_ValidateMap(tPMemMapEnt *map, int NEnts, int MaxEnts) ); } - return PMemMap_CompactMap(map, NEnts, MaxEnts); + NEnts = PMemMap_CompactMap(map, NEnts, MaxEnts); + return NEnts; }