summaryrefslogtreecommitdiff
path: root/kernel/scheduler.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-10-01 23:22:03 +0200
committerMiguel <m.i@gmx.at>2018-10-01 23:22:03 +0200
commita455cd5af26bf8731e7c981a9421b16ab34dae6f (patch)
tree140b184bf306cef258ba6e7965a78b3eecb598b9 /kernel/scheduler.c
parentb518f39803eaaf0b25b95baf951b12ef4d5a727e (diff)
fukkin scheduler
Diffstat (limited to 'kernel/scheduler.c')
-rw-r--r--kernel/scheduler.c57
1 files changed, 50 insertions, 7 deletions
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index fa32ebc..a4e3743 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -20,6 +20,7 @@
#include "mouse.h"
#include "syscalls.h"
#include "fs/ext2.h"
+#include "lib/string/string.h"
#define NO_TASK 0xffffffff
@@ -59,6 +60,8 @@ static volatile struct task_list_struct
volatile uint32_t edx;
volatile bool thread; // is this a light thread?
+
+ volatile char name[255];
}task_list[SMP_MAX_PROC][MAX_TASKS];
@@ -84,6 +87,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir)
task_list[cpu][0].vmem=dir;
task_list[cpu][0].esp = VMEM_CPU_STACK_TOP-0x200-8;
task_list[cpu][0].esp0 = 0; // esp0 not needed by kernel space tasks
+ strcpy(task_list[cpu][0].name,"kernel_worker");
fd_init_std_streams(task_list[cpu][0].pid,0);
// this will go to userspace
@@ -95,6 +99,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir)
task_list[cpu][1].vmem=dir;
task_list[cpu][1].esp = kballoc(4)+4*4096-0x200-8; // 4 pages stack & prealign
task_list[cpu][1].esp0 =kballoc(4)+4*4096; // esp0 not needed by kernel space tasks
+ strcpy(task_list[cpu][1].name,"init");
fd_init_std_streams(task_list[cpu][1].pid,0);
@@ -107,6 +112,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir)
task_list[cpu][2].vmem=dir;
task_list[cpu][2].esp = kballoc(4)+4*4096-0x200-8; // 4 pages stack & prealign
task_list[cpu][2].esp0 =kballoc(4)+4*4096; // esp0 not needed by kernel space tasks
+ strcpy(task_list[cpu][2].name,"idle process");
fd_init_std_streams(task_list[cpu][2].pid,0);
// stacks
@@ -117,14 +123,21 @@ volatile void scheduler_init(uint32_t cpu, void *dir)
static uint32_t scheduler_schedule(uint32_t idx)
{
+
uint32_t cpu=smp_get(SMP_APIC_ID);
+
if(task_list[cpu][idx].active && !task_list[cpu][idx].syscall)
{
if(current_task[cpu]!=0)last_task[cpu]=current_task[cpu];
+ if(current_task[cpu]==idx)return task_list[cpu][idx].esp;
+
current_task[cpu]=idx;
- klog("%d",idx);
- // klog("%d idx %d",last_task[cpu],current_task[cpu]);
+ //klog("idx %d",idx);
+ //klog("name: %s",task_list[cpu][idx].name);
+
+ //klog("cpu %d / idx %d / pid %d / name: %5s",cpu,idx,task_list[cpu][idx].pid,task_list[cpu][idx].name);
+ //klog("%d idx %d",last_task[cpu],current_task[cpu]);
install_tss(cpu,task_list[cpu][idx].esp0);
x86_set_page_directory(task_list[cpu][idx].vmem);
@@ -211,7 +224,10 @@ void scheduler_func()
if(current_task[cpu]==2)
while(1)
{
- while(1)asm("hlt"); // sleeper task
+ uint64_t t0=x86_rdtscp();
+ asm("hlt"); // sleeper task
+ uint64_t t1=x86_rdtscp();
+ klog("slept: l:%d h:%d",(t1-t0));
}
if(current_task[cpu]==1)
@@ -274,6 +290,8 @@ volatile int add_task(uint32_t parent_pid,uint32_t vmem, bool thread, char *name
first=false;
}
+ strcpy(task_list[cpu][i].name,name);
+
return task_list[cpu][i].pid;
}
}
@@ -306,22 +324,27 @@ void scheduler_wake_all()
*/
void task_syscall_worker()
{
+ static uint32_t c=0;
/// TODO: cross check all cpus!
uint32_t cpu=smp_get(SMP_APIC_ID);
while(1)
{
bool wake=false;
+ bool wake_mouse=false;
//TODO: would be enough only to lock during ringbuffer acces!?
x86_cli(); // disable temporarily mouse/kb/timer interrupts.
wake|=keyboard_worker();
- wake|=mouse_worker();
+ wake_mouse|=mouse_worker();
x86_sti();
+ if(wake_mouse)compositor_swap_buffers();
+
if(wake)scheduler_wake_all();
- if(cpu==0)compositor_swap_buffers();
+
+ //if(cpu==0)compositor_swap_buffers();
for(int i=0;i<MAX_TASKS;i++)
{
@@ -405,16 +428,25 @@ volatile uint32_t task_fork(uint32_t pid)
{
uint32_t idx=task_runs(pid);
uint32_t cpu=smp_get(SMP_APIC_ID);
- int ret=add_task(pid,vmem_new_space_dir(task_list[cpu][idx].vmem,false),false);
+ char *name=task_list[cpu][idx].name;
+ int ret=add_task(pid,vmem_new_space_dir(task_list[cpu][idx].vmem,false),false,name);
klog("[%d] forked -> [%d]", pid, ret);
return ret;
}
+void task_set_name(uint32_t pid, char *name)
+{
+ uint32_t idx=task_runs(pid);
+ uint32_t cpu=smp_get(SMP_APIC_ID);
+ strcpy(task_list[cpu][idx].name,name);
+}
+
volatile uint32_t task_clone(uint32_t pid)
{
uint32_t idx=task_runs(pid);
uint32_t cpu=smp_get(SMP_APIC_ID);
- int ret=add_task(pid,vmem_new_space_dir(task_list[cpu][idx].vmem,true),true);
+ char *name=task_list[cpu][idx].name;
+ int ret=add_task(pid,vmem_new_space_dir(task_list[cpu][idx].vmem,true),true,name);
klog("[%d] cloned -> [%d]", pid, ret);
return ret;
}
@@ -446,6 +478,17 @@ volatile uint32_t task_get_parent(uint32_t pid)
return task_list[cpu][idx].parent;
}
+volatile int task_add_win(uint32_t pid)
+{
+ uint32_t cpu=smp_get(SMP_APIC_ID);
+ uint32_t idx=task_idx(pid);
+
+ struct pdirectory *vmem=task_list[cpu][idx].vmem;
+ vmem_add_framebuffer(vmem);
+ compositor_add_window(vmem);
+ return 0;
+}
+
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack,uint32_t brk)
{
uint32_t cpu=smp_get(SMP_APIC_ID);