X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fmboot.c;h=726d2d23311b9698d3bf27c4e69c551aa5a860d0;hb=c1b33e91984102c1aa9a2ffe19f02c315b481726;hp=08331a10a6134912c559e7a6948ac11cfc13a3e6;hpb=b806b8f55067584cb90fe20277235369a1111c66;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/mboot.c b/KernelLand/Kernel/arch/x86/mboot.c index 08331a10..726d2d23 100644 --- a/KernelLand/Kernel/arch/x86/mboot.c +++ b/KernelLand/Kernel/arch/x86/mboot.c @@ -139,22 +139,29 @@ tBootModule *Multiboot_LoadModules(tMBoot_Info *MBInfo, tVAddr MapOffset, int *M // Always HW map the module data ofs = mods[i].Start&0xFFF; - ret[i].Base = (void*)( MM_MapHWPages(mods[i].Start, - (ret[i].Size+ofs+0xFFF) / 0x1000 - ) + ofs ); + 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*)( - 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); +} +