162 lines
3.4 KiB
C
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");
|
|
}
|
|
}
|