Orion
Barry Keyboard/Mouse drivers + POSIX names for structs 1628fcf (3 years, 1 month ago)
/*
* 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 <sys/mount.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"
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();
init_kbd();
// init_mouse();
/* 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");
}