summaryrefslogtreecommitdiff
path: root/kernel/scheduler.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-13 03:12:12 +0200
committerMiguel <m.i@gmx.at>2018-09-13 03:12:12 +0200
commitb9f10c8a65a24db1c6a52d9df67230b75fa38d1a (patch)
tree548d1d5d26e422230fd59b75d19fe2ebef3c8d5f /kernel/scheduler.c
parent6a886cb2a4af303fae01b61a2e6590ca22bb4a3e (diff)
inside the scheduler
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);