X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fmain.c;h=6388d1bf8e308bb80f4ce25995c81e0027176e67;hb=cb944fc8a944abe6921f7477cf73fc4b23e713a5;hp=8dfd17719634d9985a4ff95118849658ceaf7b57;hpb=eecce4b7a55315f6c385ad8be35c25dbb12d43d8;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/main.c b/Kernel/arch/x86_64/main.c index 8dfd1771..6388d1bf 100644 --- a/Kernel/arch/x86_64/main.c +++ b/Kernel/arch/x86_64/main.c @@ -2,28 +2,72 @@ * Acess2 x86_64 Project */ #include +#include // === IMPORTS === extern void Desctab_Init(void); extern void MM_InitVirt(void); +extern void Heap_Install(void); +extern void Threads_Init(void); +//extern void Time_Setup(void); +extern void System_Init(char *Commandline); + +extern void MM_InitPhys_Multiboot(tMBoot_Info *MBoot); // === PROTOTYPES === // === GLOBALS == +char *gsBootCmdLine = NULL; // === CODE === void kmain(Uint MbMagic, void *MbInfoPtr) { - *(Uint16*)(0xB8000) = 0x1F00|'A'; + tMBoot_Info *mbInfo; Desctab_Init(); - *(Uint16*)(0xB8000) = 0x1F00|'B'; MM_InitVirt(); - *(Uint16*)(0xB8000) = 0x1F00|'B'; + *(Uint16*)(0xB8000) = 0x1F00|'C'; + + switch(MbMagic) + { + // Multiboot 1 + case MULTIBOOT_MAGIC: + // Adjust Multiboot structure address + mbInfo = (void*)( (Uint)MbInfoPtr + KERNEL_BASE ); + gsBootCmdLine = (char*)(mbInfo->CommandLine + KERNEL_BASE); + + MM_InitPhys_Multiboot( mbInfo ); // Set up physical memory manager + break; + default: + Panic("Multiboot magic invalid %08x, expected %08x\n", + MbMagic, MULTIBOOT_MAGIC); + return ; + } + + *(Uint16*)(0xB8000) = 0x1F00|'D'; + Heap_Install(); + + *(Uint16*)(0xB8000) = 0x1F00|'E'; + Log_Log("Arch", "Starting threading..."); + Threads_Init(); + + //Time_Setup(); + *(Uint16*)(0xB8000) = 0x1F00|'F'; + + Log_Log("Arch", "Starting VFS..."); + // Load Virtual Filesystem + VFS_Init(); + + *(Uint16*)(0xB8000) = 0x1F00|'G'; + + // Pass on to Independent Loader + Log_Log("Arch", "Starting system"); + System_Init(gsBootCmdLine); + // Sleep forever (sleeping beauty) for(;;) - __asm__ __volatile__ ("hlt"); + Threads_Sleep(); } void Arch_LoadBootModules(void)