#include "scheduler.h" #include "kernel.h" #include "gdt.h" #include "log.h" #include "compositor.h" #include "smp.h" #include "mem.h" #include "fs/elf.h" #include "asm_x86.h" #include "asm_task.h" #include "asm_usermode.h" #include "kmalloc.h" #include "e1000.h" #include "vmem.h" #include "spinlock.h" #include "ringbuffer.h" #include "keyboard.h" #include "mouse.h" #include "syscalls.h" #include "fs/ext2.h" #include "lib/string/string.h" #define NO_TASK 0xffffffff static volatile uint32_t pid=0; // holds next pid, to be assigned to a process. static 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]; static volatile uint32_t last_task[SMP_MAX_PROC]; // last non ring1 task // we hold this stuff per cpu static volatile struct task_list_struct { volatile bool active; // is this slot used (Y/N) volatile uint32_t pid; // process id volatile uint32_t parent; // parent process id volatile uint32_t esp; // stack pointer of the task volatile uint32_t esp0; // tss.esp0 volatile struct pdirectory *vmem; // number of virtual memory table volatile uint32_t brk; // memory brk pos volatile bool try; // try to process syscall volatile bool syscall; // syscall not processed yet volatile uint32_t eax; // syscall details volatile uint32_t ebx; volatile uint32_t ecx; volatile uint32_t edx; volatile bool thread; // is this a light thread? volatile char name[255]; }task_list[SMP_MAX_PROC][MAX_TASKS]; // init tasks // volatile void scheduler_init(uint32_t cpu, void *dir) { for(int i=0;i [%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); 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; } volatile uint32_t task_get_brk(uint32_t pid) { uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t idx=task_idx(pid); return task_list[cpu][idx].brk; } volatile void task_set_brk(uint32_t pid, uint32_t brk) { uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t idx=task_idx(pid); task_list[cpu][idx].brk=brk; } volatile uint32_t task_get_current_pid() { uint32_t cpu=smp_get(SMP_APIC_ID); return task_list[cpu][current_task[cpu]].pid; } volatile uint32_t task_get_parent(uint32_t pid) { uint32_t idx=task_idx(pid); uint32_t cpu=smp_get(SMP_APIC_ID); return task_list[cpu][idx].parent; } volatile int task_add_win(uint32_t pid,ringbuffer *r) { uint32_t cpu=smp_get(SMP_APIC_ID); uint32_t idx=task_idx(pid); struct pdirectory *vmem=x86_get_page_directory();//task_list[cpu][idx].vmem; vmem_add_framebuffer(vmem); klog("add win to compositor"); compositor_add_window(vmem,pid,r); 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); uint32_t idx=task_idx(pid); uint32_t *stk=task_list[cpu][idx].esp; task_list[cpu][idx].brk=brk; stk[14]=entry; stk[17]=stack; return 1; } uint32_t task_idx(uint32_t pid) { uint32_t cpu=smp_get(SMP_APIC_ID); for(int i=0;i