X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmain.c;h=fa3cb4547fbea567663607f07afa7f94d7f6ebe3;hb=b2b9acdf26d6b525f09545b0d07845fde997873b;hp=3ea4b0e8db015685d045642a71448cd7e8bc1ab3;hpb=4ab9a574c9301d9590c91209f62c348e1d8c8883;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/main.c b/Kernel/arch/x86/main.c index 3ea4b0e8..fa3cb454 100644 --- a/Kernel/arch/x86/main.c +++ b/Kernel/arch/x86/main.c @@ -5,6 +5,7 @@ */ #include #include +#include #include #include #include @@ -26,59 +27,86 @@ extern void Threads_Exit(void); extern int Modules_LoadBuiltins(void); // === GLOBALS === +char *gsBootCmdLine = NULL; // === CODE === -int kmain(Uint MbMagic, tMBoot_Info *MbInfo) +int kmain(Uint MbMagic, void *MbInfoPtr) { int i; tMBoot_Module *mods; + tMBoot_Info *mbInfo; - // Adjust Multiboot structure address - MbInfo = (void*)( (Uint)MbInfo + KERNEL_BASE ); + Log("MbMagic = %08x", MbMagic); + Log("MbInfoPtr = %p", MbInfoPtr); + // Set up non-boot info dependent stuff Desctab_Install(); // Set up GDT and IDT MM_PreinitVirtual(); // Initialise vital mappings - MM_Install( MbInfo ); // Set up physical memory manager + + switch(MbMagic) + { + // Multiboot 1 + case MULTIBOOT_MAGIC: + // Adjust Multiboot structure address + mbInfo = (void*)( (Uint)MbInfoPtr + KERNEL_BASE ); + gsBootCmdLine = (char*)(mbInfo->CommandLine + KERNEL_BASE); + + MM_Install( mbInfo ); // Set up physical memory manager + break; + + // Multiboot 2 + case MULTIBOOT2_MAGIC: + Warning("Multiboot 2 Not yet supported"); + //MM_InstallMBoot2( MbInfo ); // Set up physical memory manager + return 0; + break; + + default: + Panic("Multiboot magic invalid %08x, expected %08x or %08x\n", + MbMagic, MULTIBOOT_MAGIC, MULTIBOOT2_MAGIC); + return 0; + } + 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..."); + Log_Log("Arch", "Initialising builtin modules..."); Modules_LoadBuiltins(); - Log("Loading %i Modules...", MbInfo->ModuleCount); + Log_Log("Arch", "Loading %i Modules...", mbInfo->ModuleCount); // Load initial modules - mods = (void*)( MbInfo->Modules + KERNEL_BASE ); - for( i = 0; i < MbInfo->ModuleCount; i ++ ) + mods = (void*)( mbInfo->Modules + KERNEL_BASE ); + 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; - Log("Loading '%s'", mods[i].String); + Log_Log("Arch", "Loading '%s'", mods[i].String); if( !Module_LoadMem( (void *)mods[i].Start, mods[i].End-mods[i].Start, (char *)mods[i].String ) ) { - Log_Warning("ARCH", "Unable to load module\n"); + Log_Warning("Arch", "Unable to load module\n"); } } // Pass on to Independent Loader - Log("Loading Configuration..."); - System_Init( (char*)(MbInfo->CommandLine + KERNEL_BASE) ); + Log_Log("Arch", "Starting system"); + System_Init( gsBootCmdLine ); // Sleep forever (sleeping beauty) for(;;)