Kernel/x86 - Multiboot module cleanup
authorJohn Hodge <[email protected]>
Wed, 19 Feb 2014 11:48:24 +0000 (19:48 +0800)
committerJohn Hodge <[email protected]>
Wed, 19 Feb 2014 11:48:24 +0000 (19:48 +0800)
KernelLand/Kernel/arch/x86/main.c
KernelLand/Kernel/arch/x86/mboot.c
KernelLand/Kernel/include/mboot.h

index 93470a4..10cac71 100644 (file)
@@ -134,20 +134,9 @@ void Arch_LoadBootModules(void)
                        Log_Warning("Arch", "Unable to load module");
                        continue ;
                }
-               
-               #if 0
-               // Unmap and free
-               int numPages = (mod->Size + ((tVAddr)mod->Base&0xFFF) + 0xFFF) >> 12;
-               MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].Base, numPages );
-               
-               //for( int j = 0; j < numPages; j++ )
-               //      MM_DerefPhys( mod->PBase + (j << 12) );
-               
-               if( (tVAddr) mod->ArgString > MAX_ARGSTR_POS )
-                       MM_UnmapHWPages( (tVAddr)mod->ArgString, 2 );
-               #endif
        }
        Log_Log("Arch", "Boot modules loaded");
-       if( gaArch_BootModules )
-               free( gaArch_BootModules );
+       Multiboot_FreeModules(giArch_NumBootModules, gaArch_BootModules);
+       giArch_NumBootModules = 0;
+       gaArch_BootModules = NULL;
 }
index b7cebbd..726d2d2 100644 (file)
@@ -142,18 +142,26 @@ tBootModule *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *M
                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*)(
-                               (tVAddr)MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF)
-                               );
-               }
-               else
-                       ret[i].ArgString = (char*)(tVAddr)mods[i].String + MapOffset;
+               // Assumes the string is < 4096 bytes long)
+               ret[i].ArgString = (char*)MM_MapHWPages(mods[i].String, 2) + (mods[i].String&0xFFF);
        }
 
        return ret;
 }
 
+void Multiboot_FreeModules(const int ModuleCount, tBootModule *Modules)
+{
+       for( int i = 0; i < ModuleCount; i ++ )
+       {
+               Uint    ofs = Modules[i].PBase % PAGE_SIZE;
+               Uint    nPages = (Modules[i].Size+ofs+PAGE_SIZE-1) / PAGE_SIZE;
+               MM_UnmapHWPages(Modules[i].Base, nPages);
+               MM_UnmapHWPages(Modules[i].ArgString, 2);
+               
+               // TODO: handle previous freeing of this page
+               for( int pg = 0; pg < nPages; pg ++ )
+                       MM_DerefPhys( Modules[i].PBase + pg*PAGE_SIZE );
+       }
+       free(Modules);
+}
+
index ad93655..6ffd5c1 100644 (file)
@@ -63,5 +63,6 @@ typedef struct {
 
 extern int     Multiboot_LoadMemoryMap(tMBoot_Info *MBInfo, tVAddr MapOffset, tPMemMapEnt *Map, const int MapSize, tPAddr KStart, tPAddr KEnd);
 extern tBootModule     *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *ModuleCount);
+extern void    Multiboot_FreeModules(const int ModuleCount, tBootModule *Modules);
 
 #endif

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