aboutsummaryrefslogtreecommitdiff
path: root/src/core/scheduler.cc
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-05-04 15:30:24 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-05-04 15:30:24 +0200
commit1530a85d5aefcf6497ff2129023e9a0b002603dd (patch)
treeea6098d0dcafabba0ffc2f28ea5c136f731996b9 /src/core/scheduler.cc
parent64a17f3e0683a0a492a3fed9c4c17a4335d1f421 (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.cc75
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