summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-02 03:53:32 +0200
committerMiguel <m.i@gmx.at>2018-09-02 03:53:32 +0200
commitab6b44f5197e4c6c19f225f909035385d37883b4 (patch)
tree2c07e5bc65cf8e19a6433a7c0c5135eabb56a59c
parentc459fab7662eaf45df9994c828065b9fc8d4a8ac (diff)
foolsnake showcasing multithreading and our console
-rw-r--r--kernel/scheduler.c16
-rw-r--r--kernel/syscalls.c2
-rw-r--r--kernel/syscalls.h3
-rw-r--r--kernel/vmem.c14
-rw-r--r--newlib/syscalls.c5
-rw-r--r--userspace/err.c2
-rw-r--r--userspace/snake2.c55
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;
+ }
+ }
+
+}