BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / commit / d41a53cbc7d055b1c00cf0a339dbed6925f4f02c / main.c

// Related

Orion

Barry Importing existing Orion kernel d41a53c (2 years, 4 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");
+}