diff options
| author | Miguel <m.i@gmx.at> | 2018-09-14 23:10:16 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-14 23:10:16 +0200 |
| commit | c4b20a0ebbde1348e1e085e2ea3be35345d92b7c (patch) | |
| tree | 611b68c1d288cace070152c628bb0e0e211bb500 /kernel | |
| parent | fdf6100721870780319bc7cc766a0bb5b4789965 (diff) | |
tuining userspace and files
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/exceptions.c | 64 | ||||
| -rw-r--r-- | kernel/kernel.c | 1 | ||||
| -rw-r--r-- | kernel/kernel.h | 6 | ||||
| -rw-r--r-- | kernel/scheduler.c | 1 | ||||
| -rw-r--r-- | kernel/syscalls.c | 18 |
5 files changed, 56 insertions, 34 deletions
diff --git a/kernel/exceptions.c b/kernel/exceptions.c index bcb5c40..4ad87e8 100644 --- a/kernel/exceptions.c +++ b/kernel/exceptions.c @@ -1,6 +1,7 @@ #include "kernel.h" #include "exceptions.h" #include "scheduler.h" +#include "syscalls.h" #include "log.h" #include "asm_x86.h" @@ -35,7 +36,7 @@ static void show_page_fault_error(uint32_t error_code) klog("at addr: 0x%08X",x86_get_cr(2)); } -void exception_handle(uint32_t esp, uint32_t irq) +uint32_t exception_handle(uint32_t esp, uint32_t irq) { uint32_t error_code=0; @@ -60,48 +61,71 @@ void exception_handle(uint32_t esp, uint32_t irq) switch(irq){ case 0: - kpanic("Divide by 0"); + klog("Divide by 0"); + break; case 1: - kpanic("Single step (debugger)"); + klog("Single step (debugger)"); + break; case 2: - kpanic("Non Maskable Interrupt"); + klog("Non Maskable Interrupt"); + break; case 3: - kpanic("Breakpoint (debugger)"); + klog("Breakpoint (debugger)"); + break; case 4: - kpanic("Overflow"); + klog("Overflow"); + break; case 5: - kpanic("Bounds check"); + klog("Bounds check"); + break; case 6: - kpanic("Undefined OP Code"); + klog("Undefined OP Code"); + break; case 7: - kpanic("No coprocessor"); + klog("No coprocessor"); + break; case 8: - kpanic("Double Fault"); + klog("Double Fault"); + break; case 9: - kpanic("Coprocessor Segment Overrun"); + klog("Coprocessor Segment Overrun"); + break; case 10: show_selector_error(error_code); - kpanic("Invalid TSS"); + klog("Invalid TSS"); + break; case 11: show_selector_error(error_code); - kpanic("Segment Not Present"); + klog("Segment Not Present"); + break; case 12: show_selector_error(error_code); - kpanic("Stack Segment Overrun"); + klog("Stack Segment Overrun"); + break; case 13: show_selector_error(error_code); - kpanic("Exception: Fault: General Protection Fault"); + klog("Exception: Fault: General Protection Fault"); + break; case 14: show_page_fault_error(error_code); - kpanic("Exception: Fault: Page Fault"); + klog("Exception: Fault: Page Fault"); + break; case 15: - kpanic("RESERVED"); + klog("RESERVED"); + break; case 16: - kpanic("Coprocessor error"); + klog("Coprocessor error"); + break; case 17: - kpanic("Alignment Check"); + klog("Alignment Check"); + break; case 18: - kpanic("Machine Check"); + klog("Machine Check"); + break; } + klog("killing task in question!"); + + task_syscall(SYSCALL_EXIT,task_get_current_pid(),0,0); + return scheduler_run(esp,0); } diff --git a/kernel/kernel.c b/kernel/kernel.c index 6f04454..9088d00 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -28,7 +28,6 @@ #include "driver/screen.h" #include "smp.h" -#include "fs/fs.h" #include "fs/elf.h" #include "kmalloc.h" #include "driver/vesa.h" diff --git a/kernel/kernel.h b/kernel/kernel.h index 27798cf..06f96e1 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -51,9 +51,9 @@ REFERENCES // minimal space between user and kernel pages 1024 pages! #define VMEM_KERNEL 0x00000000 // 8192 pages (32megs) / identity mapped -#define VMEM_KERNEL_END 0x02000000 +// VMEM_KERNEL END 0x02000000 -#define VMEM_USER_ENV 0x07000000 // ? pages / per user process +#define VMEM_USER_ENV 0x07000000 // 1 page / per user process #define VMEM_USER_PROG_PAGES 256 #define VMEM_USER_PROG 0x08048000 // ? pages / per user process (usual entry: 0x8048080) @@ -70,7 +70,7 @@ REFERENCES #define VMEM_COPY_PAGE 0xF4000000 // 1 page / temporery map-in tables for copying -//TODO: do not hardcode in crt0.s! +//TODO: do not hardcode in crt0.s!!!! #define VMEM_USER_NEWLIB 0xF5000000 // 1 page / newlib reentrancy struct. 1 per thread #define VMEM_FRAMEBUFFER 0xF6000000 // 8192 pages (32megs) / identity mapped diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 3b50259..ad6b370 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -14,7 +14,6 @@ #include "vmem.h" #include "spinlock.h" #include "syscalls.h" -#include "fs/fs.h" #include "fs/ext2.h" #define NO_TASK 0xffffffff diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 3fb813e..4d1c29d 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -1,6 +1,5 @@ #include "lib/string/string.h" #include "lib/printf/printf.h" -#include "fs/fs.h" #include "fs/ext2.h" #include "kernel.h" #include "driver/vesa.h" @@ -149,10 +148,11 @@ int syscall_read(int file, char *buf, int len) } //TODO: replace with dirent! -int syscall_readdir(const char *name,fs_dirent *dirs,int max) +int syscall_readdir(const char *name,fs_dirent *dirs,int *pos) { - - return fs_readdir(name,dirs,max); + uint32_t inode = ext2_filename_to_inode(VMEM_EXT2_RAMIMAGE,name); + if(inode==0)return 0; + return ext2_read_dir(VMEM_EXT2_RAMIMAGE, inode, dirs, pos); } // for non blocking io? @@ -215,7 +215,7 @@ int copy_args(char **in, char **out) int syscall_execve(char *name, char **argv, char **env,int pid) { - //TODO copy environment to target pages somehow// + fixme("not overwrite yourself?"); int arg_count=0; while(argv[arg_count]!=NULL)arg_count++; @@ -245,10 +245,10 @@ int syscall_execve(char *name, char **argv, char **env,int pid) return -1; // errror loading } - uint32_t *stack=VMEM_USER_STACK_TOP-3*32; - *++stack=argv1; - *++stack=arg_count; - *++stack=env1; + uint32_t *stack=VMEM_USER_STACK_TOP-4*32; + *--stack=argv1; + *--stack=arg_count; + *--stack=env1; task_reset(pid,entry_global,stack,alloc); return 0; |
