X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmain.c;h=e9cbf2af6b6e94ddf96692c70c6cb3c52440eb70;hb=af06250e20bef07a11b7b916941b38c80490719d;hp=8660343c65bf9e5e920073f900cea8efef3140ee;hpb=88ad2daf974ce4c4c770307546a9b4968c6183c2;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/main.c b/Kernel/arch/x86/main.c index 8660343c..e9cbf2af 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,12 +24,20 @@ 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); -extern int Modules_LoadBuiltins(void); +// === PROTOTYPES === +void Arch_LoadBootModules(void); // === GLOBALS === char *gsBootCmdLine = NULL; +struct { + void *Base; + Uint Size; + char *ArgString; +} *gaArch_BootModules; + int giArch_NumBootModules = 0; // === CODE === int kmain(Uint MbMagic, void *MbInfoPtr) @@ -41,7 +51,7 @@ int kmain(Uint MbMagic, void *MbInfoPtr) // Set up non-boot info dependent stuff Desctab_Install(); // Set up GDT and IDT - MM_PreinitVirtual(); // Initialise vital mappings + MM_PreinitVirtual(); // Initialise virtual mappings switch(MbMagic) { @@ -70,46 +80,84 @@ int kmain(Uint MbMagic, void *MbInfoPtr) MM_InstallVirtual(); // Clean up virtual address space Heap_Install(); // Create initial heap - Log("Starting Multitasking..."); + //Log_Log("Arch", "Starting Multitasking..."); // Start Multitasking Threads_Init(); // Start Timers Time_Setup(); - Log("Starting VFS..."); + Log_Log("Arch", "Starting VFS..."); // Load Virtual Filesystem VFS_Init(); - // Initialise builtin modules - Log("Initialising builtin modules..."); - Modules_LoadBuiltins(); - - Log("Loading %i Modules...", mbInfo->ModuleCount); - // Load initial modules mods = (void*)( mbInfo->Modules + KERNEL_BASE ); + giArch_NumBootModules = mbInfo->ModuleCount; + gaArch_BootModules = malloc( giArch_NumBootModules * sizeof(*gaArch_BootModules) ); for( i = 0; i < mbInfo->ModuleCount; i ++ ) { + int ofs; + // TODO: Handle this better by using MM_MapHW/MM_MapTemp // Adjust into higher half - mods[i].Start += KERNEL_BASE; - mods[i].End += KERNEL_BASE; - mods[i].String += KERNEL_BASE; + //mods[i].Start += KERNEL_BASE; + //mods[i].End += KERNEL_BASE; + //mods[i].String += KERNEL_BASE; + + gaArch_BootModules[i].Size = mods[i].End - mods[i].Start; - Log("Loading '%s'", 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 ); + //gaArch_BootModules[i].ArgString = MM_MapHW(mods[i].String, 1) + // + (mods[i].String&0xFFF); - if( !Module_LoadMem( (void *)mods[i].Start, mods[i].End-mods[i].Start, (char *)mods[i].String ) ) + if( (tVAddr)mods[i].String > MAX_ARGSTR_POS ) { - Log_Warning("ARCH", "Unable to load module\n"); + 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 - Log("Loading Configuration..."); - System_Init( gsBootCmdLine ); + Log_Log("Arch", "Starting system"); + System_Init(gsBootCmdLine); // Sleep forever (sleeping beauty) for(;;) Threads_Sleep(); return 0; } + +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 ); +}