+/*
+ * Acess2 x86_64 Project
+ */
+#include <acess.h>
+#include <mboot.h>
+#include <init.h>
+
+// === IMPORTS ===
+extern void Desctab_Init(void);
+extern void MM_InitVirt(void);
+extern void Heap_Install(void);
+extern void Threads_Init(void);
+extern int Time_Setup(void);
+extern void System_Init(char *Commandline);
+
+extern void MM_InitPhys_Multiboot(tMBoot_Info *MBoot);
+
+// === PROTOTYPES ===
+void kmain(Uint MbMagic, void *MbInfoPtr);
+
+// === GLOBALS ==
+char *gsBootCmdLine = NULL;
+
+// === CODE ===
+void kmain(Uint MbMagic, void *MbInfoPtr)
+{
+ tMBoot_Info *mbInfo;
+
+ LogF("Acess2 x86_65 v"EXPAND_STR(KERNEL_VERSION)"\n");
+ LogF(" Build %i, Git Hash %s\n", BUILD_NUM, gsGitHash);
+
+ Desctab_Init();
+
+ MM_InitVirt();
+ *(Uint16*)(KERNEL_BASE|0xB8000) = 0x1F00|'C';
+
+ switch(MbMagic)
+ {
+ // Multiboot 1
+ case MULTIBOOT_MAGIC:
+ // Adjust Multiboot structure address
+ mbInfo = (void*)( (Uint)MbInfoPtr + KERNEL_BASE );
+ gsBootCmdLine = (char*)( (Uint)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 ;
+ }
+
+ Log("gsBootCmdLine = '%s'", gsBootCmdLine);
+
+ *(Uint16*)(KERNEL_BASE|0xB8000) = 0x1F00|'D';
+ Heap_Install();
+
+ *(Uint16*)(KERNEL_BASE|0xB8000) = 0x1F00|'E';
+ Threads_Init();
+
+ Time_Setup();
+ *(Uint16*)(KERNEL_BASE|0xB8000) = 0x1F00|'F';
+
+ // Load Virtual Filesystem
+ Log_Log("Arch", "Starting VFS...");
+ VFS_Init();
+
+ *(Uint16*)(KERNEL_BASE|0xB8000) = 0x1F00|'Z';
+
+ // Pass on to Independent Loader
+ Log_Log("Arch", "Starting system");
+ System_Init(gsBootCmdLine);
+
+ // Sleep forever (sleeping beauty)
+ for(;;)
+ Threads_Sleep();
+}
+
+void Arch_LoadBootModules(void)
+{
+
+}
+
+void StartupPrint(const char *String)
+{
+
+}