summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-14 23:10:16 +0200
committerMiguel <m.i@gmx.at>2018-09-14 23:10:16 +0200
commitc4b20a0ebbde1348e1e085e2ea3be35345d92b7c (patch)
tree611b68c1d288cace070152c628bb0e0e211bb500 /kernel
parentfdf6100721870780319bc7cc766a0bb5b4789965 (diff)
tuining userspace and files
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exceptions.c64
-rw-r--r--kernel/kernel.c1
-rw-r--r--kernel/kernel.h6
-rw-r--r--kernel/scheduler.c1
-rw-r--r--kernel/syscalls.c18
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;