diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/drivers/interrupts.c | 2 | ||||
-rw-r--r-- | kernel/drivers/timer.c | 2 | ||||
-rw-r--r-- | kernel/features/load.c | 6 | ||||
-rw-r--r-- | kernel/features/proc.c | 5 | ||||
-rw-r--r-- | kernel/features/syscall.c | 7 | ||||
-rw-r--r-- | kernel/inc/load.h | 2 | ||||
-rw-r--r-- | kernel/inc/proc.h | 1 |
7 files changed, 19 insertions, 6 deletions
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 <proc.h> #include <str.h> -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 |