summaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/cpu/registers.c32
-rw-r--r--kernel/src/scheduler/process.c38
-rw-r--r--kernel/src/scheduler/scheduler.c7
-rw-r--r--kernel/src/scheduler/switch_process.S113
4 files changed, 158 insertions, 32 deletions
diff --git a/kernel/src/cpu/registers.c b/kernel/src/cpu/registers.c
deleted file mode 100644
index 997d4af..0000000
--- a/kernel/src/cpu/registers.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <types.h>
-#include <libk/stdio.h>
-#include <registers.h>
-
-
-void print_reg(registers_t* registers)
-{
- printf("printing registers:");
- printf("rax: %x", registers->rax);
- printf("rbx: %x", registers->rbx);
- printf("rcx: %x", registers->rcx);
- printf("rdx: %x", registers->rdx);
- printf("rsi: %x", registers->rsi);
- printf("rdi: %x", registers->rdi);
- printf("rsp: %x", registers->rsp);
- printf("rbp: %x", registers->rbp);
- printf("r8: %x", registers->r8);
- printf("r9: %x", registers->r9);
- printf("r10: %x", registers->r10);
- printf("r11: %x", registers->r11);
- printf("r12: %x", registers->r12);
- printf("r13: %x", registers->r13);
- printf("r14: %x", registers->r14);
- printf("r15: %x", registers->r15);
- printf("rip: %x", registers->rip);
- printf("cs: %x", registers->cs);
- printf("ds: %x", registers->ds);
- printf("ss: %x", registers->ss);
- printf("es: %x", registers->es);
- printf("fs: %x", registers->fs);
- printf("gs: %x", registers->gs);
-}
diff --git a/kernel/src/scheduler/process.c b/kernel/src/scheduler/process.c
new file mode 100644
index 0000000..a8de836
--- /dev/null
+++ b/kernel/src/scheduler/process.c
@@ -0,0 +1,38 @@
+#include <types.h>
+#include <registers.h>
+#include <heap.h>
+#include <process.h>
+
+process_t process_list;
+process_t current_process;
+
+void create_process(uint64_t rip, uint64_t param1, uint64_t param2)
+{
+ process_t* process = (process_t*)kalloc(sizeof(process_t));
+ registers_t regs = process->registers;
+ regs.rax = 0;
+ regs.rbx = 0;
+ regs.rcx = 0;
+ regs.rdx = 0;
+ regs.rsi = 0;
+ regs.rdi = 0;
+ regs.rsp = 0;
+ regs.rbp = 0;
+ regs.r8 = 0;
+ regs.r9 = 0;
+ regs.r10 = 0;
+ regs.r11 = 0;
+ regs.r12 = 0;
+ regs.r13 = 0;
+ regs.r14 = 0;
+ regs.r15 = 0;
+ regs.rflags = 0;
+
+ uint64_t stack_size = 4*4096;
+ regs.rsp = (uint64_t)kalloc(4*4096) + stack_size - 8;
+ regs.rip = rip;
+ regs.rdi = param1;
+ regs.rsi = param2;
+ process->status = STATUS_READY;
+ process->time_using_cpu = 0;
+}
diff --git a/kernel/src/scheduler/scheduler.c b/kernel/src/scheduler/scheduler.c
new file mode 100644
index 0000000..000d20c
--- /dev/null
+++ b/kernel/src/scheduler/scheduler.c
@@ -0,0 +1,7 @@
+#include <types.h>
+#include <scheduler.h>
+
+void schedule(void)
+{
+
+}
diff --git a/kernel/src/scheduler/switch_process.S b/kernel/src/scheduler/switch_process.S
new file mode 100644
index 0000000..7209d37
--- /dev/null
+++ b/kernel/src/scheduler/switch_process.S
@@ -0,0 +1,113 @@
+.extern current_process
+.extern schedule
+
+.text
+
+.set RAX, 0x0
+.set RBX, 0x8
+.set RCX, 0x10
+.set RDX, 0x18
+.set RSI, 0x20
+.set RDI, 0x28
+.set RSP, 0x30
+.set RBP, 0x38
+.set R8, 0x40
+.set R9, 0x48
+.set R10, 0x50
+.set R11, 0x58
+.set R12, 0x60
+.set R13, 0x68
+.set R14, 0x70
+.set R15, 0x78
+.set RIP, 0x80
+.set RFLAGS, 0x88
+.set CR3, 0x90
+.set CS, 0x98
+.set DS, 0x9c
+.set SS, 0x100
+.set ES, 0x104
+.set FS, 0x108
+.set GS, 0x10c
+
+.macro save_regs
+ mov %rax, RAX(%rsp)
+ mov %rbx, RBX(%rsp)
+ mov %rax, RAX(%rsp)
+ mov %rbx, RBX(%rsp)
+ mov %rcx, RCX(%rsp)
+ mov %rdx, RDX(%rsp)
+ mov %rsi, RSI(%rsp)
+ mov %rdi, RDI(%rsp)
+# mov %rsp, RSP(%rsp)
+ mov %rbp, RBP(%rsp)
+ mov %r8, R8(%rsp)
+ mov %r9, R9(%rsp)
+ mov %r10, R10(%rsp)
+ mov %r11, R11(%rsp)
+ mov %r12, R12(%rsp)
+ mov %r13, R13(%rsp)
+ mov %r14, R14(%rsp)
+ mov %r15, R15(%rsp)
+# mov %rip, RIP(%rsp)
+
+ pushfq
+ pop %rax
+ mov %rax, RFLAGS(%rsp)
+
+# mov %cr3, CR3(%rsp)
+ mov %cs, CS(%rsp)
+ mov %ds, DS(%rsp)
+ mov %ss, SS(%rsp)
+ mov %es, ES(%rsp)
+ mov %fs, FS(%rsp)
+ mov %gs, GS(%rsp)
+.endm
+
+.macro restore_regs
+ mov RBX(%rsp), %rbx
+ mov RAX(%rsp), %rax
+ mov RBX(%rsp), %rbx
+ mov RCX(%rsp), %rcx
+ mov RDX(%rsp), %rdx
+ mov RSI(%rsp), %rsi
+ mov RDI(%rsp), %rdi
+# mov RSP(%rsp), %rsp
+ mov RBP(%rsp), %rbp
+ mov R8(%rsp), %r8
+ mov R9(%rsp), %r9
+ mov R10(%rsp), %r10
+ mov R11(%rsp), %r11
+ mov R12(%rsp), %r12
+ mov R13(%rsp), %r13
+ mov R14(%rsp), %r14
+ mov R15(%rsp), %r15
+# mov RIP(%rsp), %rip
+
+ mov RFLAGS(%rsp), %rax
+ push %rax
+ popfq
+
+ mov RAX(%rsp), %rax
+
+# mov CR3(%rsp), %cr3
+ mov CS(%rsp), %cs
+ mov DS(%rsp), %ds
+ mov SS(%rsp), %ss
+ mov ES(%rsp), %es
+ mov FS(%rsp), %fs
+ mov GS(%rsp), %gs
+.endm
+
+
+.global switch_process
+switch_process:
+ # save current process context
+ mov current_process, %rsp
+ save_regs
+
+ # get which process is next
+ call schedule
+
+ # restore next process context
+ mov current_process, %rsp
+ restore_regs