X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmain.c;h=3ea4f3f32a4ee7d89fdf587d31bf2e0ca1bdb824;hb=4b80e9762374558077e28e321d75029645529a45;hp=34cc4146aa40b4c35715b48619e4d45c0dcfaaa7;hpb=c6061d381c0af2dcc7c971347d036dc17399887a;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/main.c b/Kernel/arch/x86/main.c index 34cc4146..3ea4f3f3 100644 --- a/Kernel/arch/x86/main.c +++ b/Kernel/arch/x86/main.c @@ -12,6 +12,8 @@ #define VGA_ERRORS 0 +#define MAX_ARGSTR_POS (0x400000-0x2000) + // === IMPORTS === extern void Heap_Install(void); extern void Desctab_Install(void); @@ -22,7 +24,6 @@ extern void Threads_Init(void); extern int Time_Setup(void); extern Uint Proc_Clone(Uint *Err, Uint Flags); extern void Threads_Sleep(void); -extern void Threads_Exit(void); // --- Core --- extern void System_Init(char *Commandline); @@ -96,14 +97,27 @@ int kmain(Uint MbMagic, void *MbInfoPtr) gaArch_BootModules = malloc( giArch_NumBootModules * sizeof(*gaArch_BootModules) ); for( i = 0; i < mbInfo->ModuleCount; i ++ ) { - // Adjust into higher half - mods[i].Start += KERNEL_BASE; - mods[i].End += KERNEL_BASE; - mods[i].String += KERNEL_BASE; + int ofs; - gaArch_BootModules[i].Base = (void *)mods[i].Start; + // Always HW map the module data gaArch_BootModules[i].Size = mods[i].End - mods[i].Start; - gaArch_BootModules[i].ArgString = (char *)mods[i].String; + + ofs = mods[i].Start&0xFFF; + gaArch_BootModules[i].Base = (void*)( MM_MapHWPages(mods[i].Start, + (gaArch_BootModules[i].Size+ofs+0xFFF) / 0x1000 + ) + ofs ); + + // Only map the string if needed + if( (tVAddr)mods[i].String > MAX_ARGSTR_POS ) + { + // Assumes the string is < 4096 bytes long) + gaArch_BootModules[i].ArgString = (void*)( + MM_MapHWPages((tVAddr)mods[i].String, 2) + + ((tVAddr)mods[i].String&0xFFF) + ); + } + else + gaArch_BootModules[i].ArgString = (char *)mods[i].String + KERNEL_BASE; } // Pass on to Independent Loader @@ -121,12 +135,24 @@ void Arch_LoadBootModules(void) int i; for( i = 0; i < giArch_NumBootModules; i ++ ) { + Log_Debug("Arch", "Module %i: %p - %p 0x%x", + i, gaArch_BootModules[i].ArgString, + gaArch_BootModules[i].Base, gaArch_BootModules[i].Size + ); Log_Log("Arch", "Loading '%s'", gaArch_BootModules[i].ArgString); if( !Module_LoadMem( gaArch_BootModules[i].Base, gaArch_BootModules[i].Size, gaArch_BootModules[i].ArgString ) ) { Log_Warning("Arch", "Unable to load module"); } + + MM_UnmapHWPages( + (tVAddr)gaArch_BootModules[i].Base, + (gaArch_BootModules[i].Size + ((Uint)gaArch_BootModules[i].Base&0xFFF) + 0xFFF) >> 12 + ); + + if( (tVAddr) gaArch_BootModules[i].ArgString > MAX_ARGSTR_POS ) + MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].ArgString, 2 ); } Log_Log("Arch", "Boot modules loaded"); free( gaArch_BootModules );