X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmboot.c;h=726d2d23311b9698d3bf27c4e69c551aa5a860d0;hb=a02ac21b74b7030647c033ed6c6793e2d69364ac;hp=b7cebbd4f45e570a3784ecfe06577404385503d2;hpb=15ac49743495dd72ef6c7dd26094eed5169d5090;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/mboot.c b/KernelLand/Kernel/arch/x86/mboot.c index b7cebbd4..726d2d23 100644 --- a/KernelLand/Kernel/arch/x86/mboot.c +++ b/KernelLand/Kernel/arch/x86/mboot.c @@ -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); +} +