quinn-os/kernel.c
2022-07-14 16:32:13 +10:00

162 lines
3.4 KiB
C

#include "multiboot.h"
#include "pvec.h"
#include "console.h"
#include "gdt.h"
#include "interrupts.h"
#include "memory.h"
#include "keyboard.h"
#include "ramdisk.h"
#include "pci.h"
#include "schedule.h"
#include "timer.h"
#include "syscalls.h"
#include "pata.h"
#include "mouse.h"
#include "fpu.h"
#include "ether.h"
#include "ipv4.h"
#include "string.h"
#include "serial.h"
#include "rtc.h"
#include "ahci.h"
#include "gui.h"
#include "hd.h"
extern struct task_t *current_task;
char *system_disk;
extern int last_syscall;
void abort(void) {
kprintf("Abort.\n");
while (1)
;
}
extern char *db_malloc_caller;
void abort_on_usage(void *m) {
kprintf("Abort on Usage error\n");
kprintf("DB MALLOC: %s\n", db_malloc_caller);
kprintf("PID: %d\n", current_task->pid);
kprintf("LAST SYSCALL %d\n", last_syscall);
while (1)
;
}
void abort_on_corruption(void *m) {
kprintf("Abort on Corruption\n");
kprintf("DB MALLOC: %s\n", db_malloc_caller);
kprintf("PID: %d (%s)\n", current_task->pid, current_task->name);
while (1)
;
}
void cli(void) { __asm__ __volatile__("cli"); }
void sti(void) { __asm__ __volatile__("sti"); }
void init(void) {
int ret;
char *sys_disk_env = (char *)malloc(strlen(system_disk) + 5);
char *init_cmd = (char *)malloc(strlen(system_disk) + 10);
strcpy(sys_disk_env, "SYS=");
strcat(sys_disk_env, system_disk);
strcpy(init_cmd, system_disk);
strcat(init_cmd, "/init.exe");
__asm__ volatile("int $0x30" : "=a"(ret) : "0"(SYS_OPEN), "b"("console:/"), "c"(O_RDWR), "d"(0));
__asm__ volatile("int $0x30" : "=a"(ret) : "0"(SYS_OPEN), "b"("console:/"), "c"(O_RDWR), "d"(0));
__asm__ volatile("int $0x30" : "=a"(ret) : "0"(SYS_OPEN), "b"("console:/"), "c"(O_RDWR), "d"(0));
static char *argv[] = {"init.exe", (void *)0};
static char *envp[4];
envp[0] = (char *)malloc(8);
strcpy(envp[0], "HOME=/");
envp[1] = (char *)malloc(8);
strcpy(envp[1], "PATH=/");
envp[2] = (char *)malloc(strlen(sys_disk_env) + 1);
strcpy(envp[2], sys_disk_env);
envp[3] = (void *)0;
__asm__ volatile("int $0x30" : "=a"(ret) : "0"(11), "b"(init_cmd), "c"(argv), "d"(envp));
while (1)
;
}
extern struct vfs_device_t *consoletty;
void kmain(void) {
extern unsigned int magic;
extern void *mbd;
char *cmd_line;
multiboot_info_t *mbinfo = (multiboot_info_t *)mbd;
int ret;
struct vfs_device_t *rd;
int fs_type;
init_serial();
init_mem(mbinfo);
init_paging();
init_gdt();
init_idt();
init_isrs();
init_scheduler();
init_gui(mbinfo);
init_console();
if (magic != 0x2BADB002) {
kprintf("WARNING: Invalid Magic Number\n");
}
init_fpu();
init_irqs();
init_keyboard();
init_mouse();
init_vfs();
init_pci();
init_hd();
init_pata();
init_ahci();
init_timer();
init_random();
init_ipv4();
init_ether();
init_syscalls();
if (init_ramdisk(mbinfo) == 1) {
fs_type = 1;
rd = (void *)0;
while (rd == (void *)0 && fs_type < 4) {
rd = vfs_register_device(1, "ramdisk", fs_type);
fs_type++;
}
}
cmd_line = (char *)mbinfo->cmdline;
system_disk = (char *)malloc(strlen(cmd_line) + 1);
strcpy(system_disk, cmd_line);
consoletty = vfs_register_device(0, "console", 0);
kprintf("System Disk: %s\n", system_disk);
sti();
__asm__ volatile("int $0x30" : "=a"(ret) : "0"(2));
if (!ret) {
init();
}
while (1) {
__asm__ volatile("hlt");
}
}