X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmain.c;h=99c10206306548969a58e8e557db444815c6860b;hb=a351b9ff476150105829df774989ecc98fb4e31a;hp=1d5d3a7f08f135f516cffc7179038c321a95485a;hpb=dea6bcf35a3f52396724d74e47f71cb3afade37c;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/main.c b/Kernel/arch/x86/main.c index 1d5d3a7f..99c10206 100644 --- a/Kernel/arch/x86/main.c +++ b/Kernel/arch/x86/main.c @@ -12,25 +12,26 @@ #define VGA_ERRORS 0 +#define MAX_ARGSTR_POS (0x400000-0x2000) + // === IMPORTS === extern void Heap_Install(void); extern void Desctab_Install(void); extern void MM_PreinitVirtual(void); extern void MM_Install(tMBoot_Info *MBoot); -extern void MM_InstallVirtual(void); +extern void MM_InstallVirtual(void); extern void Threads_Init(void); extern int Time_Setup(void); -extern Uint Proc_Clone(Uint *Err, Uint Flags); -extern void Threads_Sleep(void); // --- Core --- extern void System_Init(char *Commandline); // === PROTOTYPES === -void Arch_LoadBootModules(void); + int kmain(Uint MbMagic, void *MbInfoPtr); // === GLOBALS === char *gsBootCmdLine = NULL; struct { + Uint32 PBase; void *Base; Uint Size; char *ArgString; @@ -43,9 +44,11 @@ int kmain(Uint MbMagic, void *MbInfoPtr) int i; tMBoot_Module *mods; tMBoot_Info *mbInfo; + + LogF("Acess2 x86_65 v"EXPAND_STR(KERNEL_VERSION)"\n"); + LogF(" Build %i, Git Hash %s\n", BUILD_NUM, gsGitHash); - Log("MbMagic = %08x", MbMagic); - Log("MbInfoPtr = %p", MbInfoPtr); + Log("MbMagic = %08x, MbInfoPtr = %p", MbMagic, MbInfoPtr); // Set up non-boot info dependent stuff Desctab_Install(); // Set up GDT and IDT @@ -64,7 +67,7 @@ int kmain(Uint MbMagic, void *MbInfoPtr) // Multiboot 2 case MULTIBOOT2_MAGIC: - Warning("Multiboot 2 Not yet supported"); + Panic("Multiboot 2 not yet supported"); //MM_InstallMBoot2( MbInfo ); // Set up physical memory manager return 0; break; @@ -95,14 +98,30 @@ 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; - - gaArch_BootModules[i].Base = (void *)mods[i].Start; + int ofs; + + Log_Log("Arch", "Multiboot Module at 0x%08x, 0x%08x bytes (String at 0x%08x)", + mods[i].Start, mods[i].End-mods[i].Start, mods[i].String); + + gaArch_BootModules[i].PBase = mods[i].Start; gaArch_BootModules[i].Size = mods[i].End - mods[i].Start; - gaArch_BootModules[i].ArgString = (char *)mods[i].String; + + // Always HW map the module data + 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(mods[i].String, 2) + (mods[i].String&0xFFF) + ); + } + else + gaArch_BootModules[i].ArgString = (char *)mods[i].String + KERNEL_BASE; } // Pass on to Independent Loader @@ -117,7 +136,7 @@ int kmain(Uint MbMagic, void *MbInfoPtr) void Arch_LoadBootModules(void) { - int i; + int i, j, numPages; for( i = 0; i < giArch_NumBootModules; i ++ ) { Log_Log("Arch", "Loading '%s'", gaArch_BootModules[i].ArgString); @@ -126,6 +145,16 @@ void Arch_LoadBootModules(void) { Log_Warning("Arch", "Unable to load module"); } + + // Unmap and free + numPages = (gaArch_BootModules[i].Size + ((Uint)gaArch_BootModules[i].Base&0xFFF) + 0xFFF) >> 12; + MM_UnmapHWPages( (tVAddr)gaArch_BootModules[i].Base, numPages ); + + for( j = 0; j < numPages; j++ ) + MM_DerefPhys( gaArch_BootModules[i].PBase + (j << 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 );