diff options
Diffstat (limited to 'kernel/scheduler.c')
| -rw-r--r-- | kernel/scheduler.c | 57 |
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); |
