diff options
| author | Miguel <m.i@gmx.at> | 2018-09-02 03:53:32 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-02 03:53:32 +0200 |
| commit | ab6b44f5197e4c6c19f225f909035385d37883b4 (patch) | |
| tree | 2c07e5bc65cf8e19a6433a7c0c5135eabb56a59c | |
| parent | c459fab7662eaf45df9994c828065b9fc8d4a8ac (diff) | |
foolsnake showcasing multithreading and our console
| -rw-r--r-- | kernel/scheduler.c | 16 | ||||
| -rw-r--r-- | kernel/syscalls.c | 2 | ||||
| -rw-r--r-- | kernel/syscalls.h | 3 | ||||
| -rw-r--r-- | kernel/vmem.c | 14 | ||||
| -rw-r--r-- | newlib/syscalls.c | 5 | ||||
| -rw-r--r-- | userspace/err.c | 2 | ||||
| -rw-r--r-- | userspace/snake2.c | 55 |
7 files changed, 88 insertions, 9 deletions
diff --git a/kernel/scheduler.c b/kernel/scheduler.c index a16dd02..2373e36 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -38,7 +38,7 @@ volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack) stk[17]=stack; } -volatile int add_task(uint32_t parent) +volatile int add_task(uint32_t parent,uint32_t vmem) { for(int i=0;i<MAX_TASKS;i++) { @@ -47,7 +47,7 @@ volatile int add_task(uint32_t parent) task_list[i].parent=parent; // TODO: do this without paging please! - task_list[i].vmem=vmem_new_space_dir(task_list[parent].vmem); //TODO: what will happen if we get rescheduled!?!?! + task_list[i].vmem=vmem; task_list[i].esp = kballoc(4)+2*4096; // center // TODO: use own page here and copy it instead of this! @@ -218,8 +218,16 @@ volatile uint32_t task_wait(uint32_t pid) volatile uint32_t task_fork(uint32_t pid) { - int ret=add_task(pid); - klog("[%d] forked -> [%d] (free blocks remaining: %d )", current_task, pid,mem_get_free_blocks_count()); +//TODO: what will happen if we get rescheduled!?!?! + int ret=add_task(pid,vmem_new_space_dir(task_list[pid].vmem,false)); + klog("[%d] forked -> [%d] (free blocks remaining: %d )", pid, ret,mem_get_free_blocks_count()); + return ret; +} +volatile uint32_t task_clone(uint32_t pid) +{ +//TODO: what will happen if we get rescheduled!?!?! + int ret=add_task(pid,vmem_new_space_dir(task_list[pid].vmem,true)); + klog("[%d] cloned -> [%d] (free blocks remaining: %d )", pid, ret,mem_get_free_blocks_count()); return ret; } diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 2a31a81..f92ef4d 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -330,6 +330,8 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint return syscall_execve(p1,p2,p3,pid); case SYSCALL_FORK : return task_fork(pid); + case SYSCALL_CLONE : + return task_clone(pid); case SYSCALL_GETPID : // return syscall_getpid(p1,p2,p3); return -1; diff --git a/kernel/syscalls.h b/kernel/syscalls.h index e88d8c3..56e78a2 100644 --- a/kernel/syscalls.h +++ b/kernel/syscalls.h @@ -19,7 +19,8 @@ #define SYSCALL_GETTIMEOFDAY 71 #define SYSCALL_READDIR 63 #define SYSCALL_KILL 73 -#define SYSCALL_POLL 80 +#define SYSCALL_POLL 80 //shit!? +#define SYSCALL_CLONE 83 // new planned syscalls for graphx diff --git a/kernel/vmem.c b/kernel/vmem.c index d026e9e..2d3a5e4 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -229,7 +229,7 @@ void vmem_free_dir(pdirectory *dir) // PROGRAMM SPACE HARDCODED TO 0x8000000+2 pages and 0x8c00000+1 pages // -pdirectory* vmem_new_space_dir(pdirectory *copy_dir) +pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) { x86_paging_disable(); @@ -352,6 +352,13 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) virt_addr=0x8000000; for(int j=0;j<2;j++) { + if(stack_only) + { + dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]= + copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]; + virt_addr+=1024*4096; + continue; + } ptable* table = (ptable*) kballoc (1); pd_entry *oldentry=NULL; @@ -362,6 +369,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) oldentry=&(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]); oldtable=pd_entry_get_frame(oldentry); } + klog("oldtable at: 0x%08X",oldtable); if (!table)kpanic("unable to alloc table"); @@ -405,7 +413,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) virt_addr+=1024*4096; } - // programm space + // programm space : stack? virt_addr=0x8c00000; for(int j=0;j<1;j++) { @@ -476,7 +484,7 @@ pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr) { fb_addr=frameb_addr; kernel_pages=kernel_blocks/1024+1; - return vmem_new_space_dir(NULL); + return vmem_new_space_dir(NULL,false); } diff --git a/newlib/syscalls.c b/newlib/syscalls.c index 3cd1f95..532f8b5 100644 --- a/newlib/syscalls.c +++ b/newlib/syscalls.c @@ -74,6 +74,11 @@ int _fork(void) return syscall(SYSCALL_FORK,0,0,0); } +int _clone(void) +{ + return syscall(SYSCALL_CLONE,0,0,0); +} + int _getpid(void) { return syscall(SYSCALL_GETPID,0,0,0); diff --git a/userspace/err.c b/userspace/err.c index 7a33e69..8e5d819 100644 --- a/userspace/err.c +++ b/userspace/err.c @@ -1,6 +1,6 @@ #include <stdio.h> -int main() +int main(int argc, char **argv) { char buf[]="This is a line written to stderr.\n"; int l=fwrite(buf,sizeof(char),strlen(buf),stderr); // write stderr; diff --git a/userspace/snake2.c b/userspace/snake2.c new file mode 100644 index 0000000..78be50d --- /dev/null +++ b/userspace/snake2.c @@ -0,0 +1,55 @@ +#include <stdio.h> + +int data4[100]; + +// syscall will be move to newlib? +#define SYSCALL_CLONE 83 + +int _clone(void) +{ + return syscall(SYSCALL_CLONE,0,0,0); +} + +static char lastc='d'; + +int main() +{ + printf("setvbuf returned %i\n",setvbuf(stdin,NULL,_IONBF,0)); + printf("setvbuf returned %i\n",setvbuf(stdout,NULL,_IONBF,0)); + + printf("\033c"); + printf("\033HFOOL-SNAKE"); + //printf("\033d\033d\033dFOOL-SNAKE"); + printf("\033d"); + char snake[]="FOOLSNAKESFOOL"; + + int thr=_clone(); + if(thr==0) + { + uint64_t x=0; + + while(1) + { + for(int i=0;i<10000000;i++); + + x++; + if(lastc=='d')printf("\033f"); + if(lastc=='a')printf("\033b"); + if(lastc=='w')printf("\033u"); + if(lastc=='s')printf("\033d"); + + printf("\033[0;%im\033b%c",31+(uint8_t)(x%6),snake[x%10]); + + } + + } + else + { + while(1) + { + char c=fgetc(stdin); + lastc=c; + } + } + +} |
