summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel.h1
-rw-r--r--kernel/scheduler.c63
-rw-r--r--kernel/syscalls.c29
-rw-r--r--userspace/foolshell.c1
-rw-r--r--userspace/init.c6
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(&ltime);
- printf("fool-init: starting...\n");
printf("fool-init: current time: %s", ctime(&ltime));
- 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");