From 32b8722128dfb4ca9e814940a23c2b22a283bb12 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 15 Aug 2020 14:21:52 +0200 Subject: Added some syscall wrappers --- kernel/drivers/interrupts.c | 2 +- kernel/drivers/timer.c | 2 +- kernel/features/load.c | 6 +++++- kernel/features/proc.c | 5 +++++ kernel/features/syscall.c | 7 +++++-- kernel/inc/load.h | 2 +- kernel/inc/proc.h | 1 + 7 files changed, 19 insertions(+), 6 deletions(-) (limited to 'kernel') diff --git a/kernel/drivers/interrupts.c b/kernel/drivers/interrupts.c index 0b94208..9088915 100644 --- a/kernel/drivers/interrupts.c +++ b/kernel/drivers/interrupts.c @@ -34,7 +34,7 @@ void idt_install() // Clear IDT by setting memory cells to 0 memset(&idt, 0, sizeof(struct idt_entry) * 256); - __asm__("lidt %0" : : "m"(idt_ptr)); + __asm__ volatile("lidt %0" : : "m"(idt_ptr)); } /** diff --git a/kernel/drivers/timer.c b/kernel/drivers/timer.c index a3b4137..0207cc0 100644 --- a/kernel/drivers/timer.c +++ b/kernel/drivers/timer.c @@ -27,7 +27,7 @@ void timer_wait(u32 ticks) eticks = timer_ticks + ticks; while (timer_ticks < eticks) { - __asm__("sti//hlt//cli"); + __asm__ volatile("sti//hlt//cli"); } } diff --git a/kernel/features/load.c b/kernel/features/load.c index 5ef7def..2f3f65f 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -9,9 +9,12 @@ #include #include -void bin_load(char *path, struct proc *proc) +int bin_load(char *path, struct proc *proc) { char *data = read_file(path); + if (!data) + return 0; + u32 stack = (u32)malloc(0x1000) + 0x1000; proc->regs.ebp = (u32)stack; @@ -19,6 +22,7 @@ void bin_load(char *path, struct proc *proc) proc->regs.useresp = (u32)stack; proc->regs.eip = (u32)data; strcpy(proc->name, path + 1); + return 1; } int elf_verify(struct elf_header *h) diff --git a/kernel/features/proc.c b/kernel/features/proc.c index 64a4ac1..40a52f8 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -72,6 +72,11 @@ void proc_attach(struct proc *proc) } } +void proc_exit() +{ + current->state = PROC_ASLEEP; +} + struct proc *proc_make() { struct proc *proc = malloc(sizeof(*proc)); diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c index 519532c..fd57f3b 100644 --- a/kernel/features/syscall.c +++ b/kernel/features/syscall.c @@ -30,8 +30,11 @@ void syscall_handler(struct regs *r) case SYS_EXEC: { char *path = (char *)r->ebx; struct proc *proc = proc_make(); - bin_load(path, proc); - proc_print(); + r->eax = bin_load(path, proc); + break; + } + case SYS_EXIT: { + proc_exit(); break; } default: { diff --git a/kernel/inc/load.h b/kernel/inc/load.h index 863f04f..43c941c 100644 --- a/kernel/inc/load.h +++ b/kernel/inc/load.h @@ -58,7 +58,7 @@ struct elf_program_header { u32 align; }; -void bin_load(char *path, struct proc *proc); +int bin_load(char *path, struct proc *proc); void elf_load(char *path, struct proc *proc); #endif diff --git a/kernel/inc/proc.h b/kernel/inc/proc.h index 39ba704..9f3816d 100644 --- a/kernel/inc/proc.h +++ b/kernel/inc/proc.h @@ -25,6 +25,7 @@ struct proc { void proc_init(); void proc_print(); +void proc_exit(); struct proc *proc_make(); #endif -- cgit v1.2.3