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"); +}