Orion
Barry Importing existing Orion kernel d41a53c (3 years, 2 months ago)
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..d4e1421
--- /dev/null
+++ b/main.c
@@ -0,0 +1,118 @@
+/*
+ * This file contains the entrance point for the Kernel proper. The code here
+ * is called by the bootloader when it finishes. The main routine is
+ * responsible for setting up memory and starting the processes running.
+ * This file is also responsible for performing per-CPU setups, which is done
+ * before the Kernel starts multi-tasking.
+ */
+
+#include <stdint.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "mem/frame.h"
+#include "mem/paging.h"
+#include "mem/heap.h"
+#include "mem/mem.h"
+#include "proc/proc.h"
+#include "task/task.h"
+#include "vfs/vfs.h"
+#include "drivers/drivers.h"
+#include "net/net.h"
+#include "io.h"
+#include "screen.h"
+#include "spinlock.h"
+#include "multiboot.h"
+
+#include <sys/mount.h>
+
+void init_tty(void);
+
+extern char _bss[], _end[];
+
+uintptr_t initialStack;
+void *initrd;
+
+/* Setup current CPU */
+void
+cpu_load(void)
+{
+ /* Initialise SSE */
+ asm volatile(
+ "mov %cr0, %eax;"
+ "andl $0xfffffffb, %eax;"
+ "orl $0x2, %eax;"
+ "mov %eax, %cr0;"
+ "mov %cr4, %eax;"
+ "orl $0x600, %eax;"
+ "mov %eax, %cr4;"
+ );
+
+ /* Initialise CR4.PGE */
+ asm volatile(
+ "mov %cr4, %eax;"
+ "orl $0x10, %eax;"
+ "mov %eax, %cr4;"
+ );
+
+ /* Tables */
+ cpu_load_idt();
+ cpu_load_gdt();
+}
+
+/* Kernel main function */
+void
+kmain(uint32_t esp, struct MultibootInfo *mbinfo)
+{
+ /* Disable the cursor */
+ outb(0x3D4, 0x0A);
+ outb(0x3D5, 0x20);
+
+ kprintf("Starting the Orion Operating System");
+ void *ebda = (void *) (*((uint16_t *) 0x040E) << 4);
+ initrd = (void *) *((uint32_t *) mbinfo->modsAddr);
+
+ /* Zero-fill the BSS */
+ memset(_bss, 0, _end - _bss);
+
+ /* Setup frame allocator */
+ init_frames(mbinfo->mmapLen, (void *) mbinfo->mmapAddr);
+
+ /* Processor startup */
+ initialStack = esp;
+ init_idt();
+ init_gdt();
+ init_pic();
+ cpu_load();
+ init_multicore(ebda);
+
+ /* Check if 64-bit CPU */
+ uint32_t lm;
+ asm("cpuid" : "=d" (lm) : "a" (0x80000001));
+ if ((lm >> 29) & 1)
+ kprintf("CPU supports 64-bit mode");
+
+ /* Initialise paging */
+ init_paging();
+ /* Initialise Multitasking */
+ init_tasking();
+ /* Initialise VFS */
+ init_vfs();
+ register_exception(14, page_fault_handler);
+ /* Search for devices */
+ init_drivers();
+ init_tty();
+ /* Initialise Networking */
+// init_net();
+
+ /* Mount root disk */
+ mkdir("root", 0);
+ mount("/dev/hda", "/root", "Ext2FS", MS_RDONLY, NULL);
+ chroot("/root");
+ chdir("/");
+ mount("devfs", "/dev", "DevFS", 0, NULL);
+ mount("procfs", "/proc", "ProcFS", 0, NULL);
+
+ char *argv[] = { "init", NULL };
+ execve("/bin/init", argv, NULL);
+ panic("Could not run init");
+}