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;
}
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);
+}
+
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