diff options
| -rw-r--r-- | kernel/kernel.h | 1 | ||||
| -rw-r--r-- | kernel/scheduler.c | 63 | ||||
| -rw-r--r-- | kernel/syscalls.c | 29 | ||||
| -rw-r--r-- | userspace/foolshell.c | 1 | ||||
| -rw-r--r-- | userspace/init.c | 6 |
5 files changed, 50 insertions, 50 deletions
diff --git a/kernel/kernel.h b/kernel/kernel.h index 9fc9601..7198c74 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -36,6 +36,7 @@ REFERENCES #define NUMBER_SPINLOCKS 16 #define SPINLOCK_LOG 0 #define SPINLOCK_ALLOC 1 +#define SPINLOCK_PID 2 #define S1(x) #x #define S2(x) S1(x) diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 985b3bf..541eb15 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -12,12 +12,24 @@ #include "kmalloc.h" #include "vmem.h" +#include "spinlock.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" #define NO_TASK 0xffffffff +static volatile uint32_t pid=1; + +uint32_t nextPID() +{ + spinlock_spin(SPINLOCK_PID); + uint32_t ret=pid; + pid++; + spinlock_release(SPINLOCK_PID); + return ret; +} + // we hold this stuff per cpu static volatile uint32_t current_task[SMP_MAX_PROC]; @@ -56,6 +68,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir) // this is our main kernel task at slot 0 (per cpu) task_list[cpu][0].parent=0; + task_list[cpu][0].pid=nextPID(); task_list[cpu][0].active=true; task_list[cpu][0].wait=false; task_list[cpu][0].vmem=dir; @@ -66,6 +79,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir) // this is our main kernel task at slot 0 (per cpu) task_list[cpu][1].parent=0; + task_list[cpu][1].pid=nextPID(); task_list[cpu][1].active=true; task_list[cpu][1].wait=false; task_list[cpu][1].vmem=dir; @@ -159,7 +173,9 @@ volatile int add_task(uint32_t parent,uint32_t vmem) { if(task_list[cpu][i].active!=true) { - task_list[cpu][i].parent=parent; + task_list[cpu][i].pid=nextPID(); + + task_list[cpu][i].parent=task_list[cpu][parent].pid; task_list[cpu][i].vmem=vmem; task_list[cpu][i].esp = kballoc(4)+2*4096; // center @@ -211,29 +227,19 @@ void task_syscall_worker() task_list[cpu][0].vmem=task_list[cpu][i].vmem; // switch syscall worker to pagedir of calling userprog x86_set_page_directory(task_list[cpu][0].vmem); - if(task_list[cpu][i].eax==SYSCALL_WAIT) - { - continue; - } - - if(task_list[cpu][i].eax==SYSCALL_READ) - { - uint32_t ok= chk_syscall_read( - task_list[cpu][i].edx, - task_list[cpu][i].ecx, - task_list[cpu][i].ebx - ); - if(!ok)continue; - } - nowork=false; - uint32_t ret= syscall_generic(task_list[cpu][i].eax, + uint32_t ret = syscall_generic(task_list[cpu][i].eax, task_list[cpu][i].edx, task_list[cpu][i].ecx, task_list[cpu][i].ebx, i); + if(task_list[cpu][i].eax==SYSCALL_WAIT) + { + continue; + } + uint32_t *stack=task_list[cpu][i].esp; stack[12]=0x1; stack[13]=ret; @@ -261,29 +267,6 @@ volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t return 1; } -//TODO: free vmem too! -//TODO: notify waiting parent when child finished; -volatile uint32_t task_exit(uint32_t pid) -{ - uint32_t cpu=smp_get(SMP_APIC_ID); - task_list[cpu][pid].active=false; - int parent_pid=task_list[cpu][pid].parent; - if(task_list[cpu][parent_pid].wait&&task_list[cpu][parent_pid].eax==SYSCALL_WAIT) - task_list[cpu][parent_pid].wait=false; - klog("[%d] exit", pid); -// vmem_free_dir(task_list[cpu][pid].vmem); - return 1; -} - -volatile uint32_t task_wait(uint32_t pid) -{ - uint32_t cpu=smp_get(SMP_APIC_ID); - klog("[%d] wait", pid); - task_list[cpu][pid].wait=true; - task_list[cpu][pid].eax=SYSCALL_WAIT; - return 1; -} - volatile uint32_t task_fork(uint32_t pid) { uint32_t cpu=smp_get(SMP_APIC_ID); diff --git a/kernel/syscalls.c b/kernel/syscalls.c index f092a75..8246df8 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -331,6 +331,27 @@ int syscall_open(char *name, int flags, int mode) return next_fd-1; } +uint32_t syscall_fork(int pid) +{ + return task_fork(pid); + +} +uint32_t syscall_clone(int pid) +{ + return task_clone(pid); +} + +uint32_t syscall_wait(int pid) +{ + fixme("implement syscall_wait"); + return 0; +} + +uint32_t syscall_exit(int pid) +{ + fixme("free allll mem"); + return 0; +} //newcomers // @@ -380,15 +401,15 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint { switch(nr){ case SYSCALL_EXIT : - return task_exit(pid); + return syscall_exit(pid); case SYSCALL_CLOSE : return syscall_close(p1,p2,p3); case SYSCALL_EXECVE : return syscall_execve(p1,p2,p3,pid); case SYSCALL_FORK : - return task_fork(pid); + return syscall_fork(pid); case SYSCALL_CLONE : - return task_clone(pid); + return syscall_clone(pid); case SYSCALL_GETPID : // return syscall_getpid(p1,p2,p3); return -1; @@ -418,7 +439,7 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint // return syscall_unlink(p1,p2,p3); return -1; case SYSCALL_WAIT : - return task_wait(pid); + return syscall_wait(pid); case SYSCALL_WRITE : return syscall_write(p1,p2,p3); case SYSCALL_GETTIMEOFDAY: diff --git a/userspace/foolshell.c b/userspace/foolshell.c index 09d6d32..984cc4f 100644 --- a/userspace/foolshell.c +++ b/userspace/foolshell.c @@ -273,5 +273,4 @@ int process(char *buf) } return 0; - } diff --git a/userspace/init.c b/userspace/init.c index b27dc8d..e04e7ce 100644 --- a/userspace/init.c +++ b/userspace/init.c @@ -10,16 +10,13 @@ int main(int argc, char **argv) time_t ltime; time(<ime); - printf("fool-init: starting...\n"); printf("fool-init: current time: %s", ctime(<ime)); - printf("fool-init: spawning a Fool's Shell\n"); // loop forever and spawn shells if the top-shell exits while(1) { int pid=_fork(); - printf("fool-init forked / pid: %i\n",pid); int status; if(pid==0) @@ -31,8 +28,7 @@ int main(int argc, char **argv) // wait until our child process state changes (exits) // and respawn SHELL - //_wait(&status); - while(1)printf("."); + _wait(&status); printf("fool-init: catched exit of process %d.\n",pid); printf("fool-init: respawning a Fools Shell\n"); |
