diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-04 15:30:24 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-04 15:30:24 +0200 |
| commit | 1530a85d5aefcf6497ff2129023e9a0b002603dd (patch) | |
| tree | ea6098d0dcafabba0ffc2f28ea5c136f731996b9 /src/core/scheduler.cc | |
| parent | 64a17f3e0683a0a492a3fed9c4c17a4335d1f421 (diff) | |
Solving many issues: Aligning kernel stack, improve syscall mechanism,
DISABLING RED-ZONE !!!!
Diffstat (limited to 'src/core/scheduler.cc')
| -rw-r--r-- | src/core/scheduler.cc | 75 |
1 files changed, 47 insertions, 28 deletions
diff --git a/src/core/scheduler.cc b/src/core/scheduler.cc index 89c52d1..3516350 100644 --- a/src/core/scheduler.cc +++ b/src/core/scheduler.cc @@ -1,6 +1,7 @@ #include "scheduler.hpp" #include "boucane.hpp" #include "core/apic.hpp" +#include "libs/string.hpp" PROC procs[MAX_TASK]; u32 nproc=0; @@ -9,41 +10,57 @@ char scheduling=0; u32 active_process=0; extern "C" void clock(){ + u64* stack; + asm("mov %%rbp, %0": "=r"(stack)::"rax"); + stack=&stack[2]; + if(show_ticks) print("."); if(scheduling) - schedule(); + schedule(stack); +} + +void tdump(PROC*t){ + printk("ss:%x rsp:%x eflags:%x cs:%x rip:%x\n", + t->registers.ss, + t->registers.rsp, + t->registers.eflags, + t->registers.cs, + t->registers.rip + ); } -void schedule(){ + +void schedule(u64* stack){ // First get a pointer to the first process saved register. // Since this is called by clock(), %rbp contains a pointer // to the clock() %rbp value and then we access to the registers SAVE_REGS in int.S - u64* stack; - asm("mov %%rbp, %%rax;mov (%%rax), %%rbx; add $16, %%rbx; mov %%rbx,%0": "=m"(stack)::"rax","rbx"); // Save current task PROC *t=&procs[active_process]; t->registers.ds=stack[0]; - t->registers.rdi=stack[1]; - t->registers.rsi=stack[2]; - t->registers.rbp=stack[3]; - t->registers.rdx=stack[4]; - t->registers.rcx=stack[5]; - t->registers.rbx=stack[6]; - t->registers.rax=stack[7]; - t->registers.r15=stack[8]; - t->registers.r14=stack[9]; - t->registers.r13=stack[10]; - t->registers.r12=stack[11]; - t->registers.r11=stack[12]; - t->registers.r10=stack[13]; - t->registers.r9=stack[14]; - t->registers.r8=stack[15]; - t->registers.rip=stack[16]; - t->registers.cs=stack[17]; - t->registers.eflags=stack[18]; - t->registers.rsp=stack[19]; - t->registers.ss=stack[20]; + t->registers.fs=stack[1]; + t->registers.es=stack[2]; + t->registers.gs=stack[3]; + t->registers.rdi=stack[4]; + t->registers.rsi=stack[5]; + t->registers.rbp=stack[6]; + t->registers.rdx=stack[7]; + t->registers.rcx=stack[8]; + t->registers.rbx=stack[9]; + t->registers.rax=stack[10]; + t->registers.r15=stack[11]; + t->registers.r14=stack[12]; + t->registers.r13=stack[13]; + t->registers.r12=stack[14]; + t->registers.r11=stack[15]; + t->registers.r10=stack[16]; + t->registers.r9=stack[17]; + t->registers.r8=stack[18]; + t->registers.rip=stack[19]; + t->registers.cs=stack[20]; + t->registers.eflags=stack[21]; + t->registers.rsp=stack[22]; + t->registers.ss=stack[23]; // Goto next task active_process++; @@ -53,6 +70,7 @@ void schedule(){ t=&procs[active_process]; kvar_tss.rsp0=t->registers.rsp0; + // Clock acknownledgement apic_ack(); @@ -69,11 +87,12 @@ void create_task(void* task, u32 size){ printk("Could not create more tasks."); return; } - PROC *t=&procs[nproc]; + memset(t, 0, sizeof(PROC)); t->id=nproc; t->pid=nproc; t->size=size; + t->registers.eflags=0x246; u32 npages=size%4096 ? size/4096 + 1 : size/4096; // Note that paging_create_task() allocate 2 more pages (one for the user stack and @@ -85,7 +104,7 @@ void create_task(void* task, u32 size){ t->registers.rip=TASK_VMA; t->registers.cs=0x1B; // 0x18 and 0x3 privilege t->registers.ds=0x23; // 0x20 and 0x3 privilege - t->registers.ss=0; // Always 0 in long-mode + t->registers.ss=0x23; // Load task using lpml4(t->pml4); @@ -96,14 +115,14 @@ void create_task(void* task, u32 size){ } void scheduler_start(){ + cli(); scheduling=1; active_process=0; PROC *t=&procs[active_process]; kvar_tss.rsp0=t->registers.rsp0; asm( - "cli \n\t" "mov %0, %%rdi \n\t" "jmp switch \n\t" - :: "r" (t) + :: "a" (t) ); }
\ No newline at end of file |
