summaryrefslogtreecommitdiff
path: root/kernel/scheduler.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/scheduler.c')
-rw-r--r--kernel/scheduler.c63
1 files changed, 23 insertions, 40 deletions
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);