summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--kernel/Makefile3
-rw-r--r--kernel/include/process.h25
-rw-r--r--kernel/include/registers.h31
-rw-r--r--kernel/include/scheduler.h6
-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
9 files changed, 224 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index 6dfc304..00afb99 100644
--- a/Makefile
+++ b/Makefile
@@ -8,9 +8,9 @@ OBJDUMP = $(ARCH)objcopy
OBJCOPY = $(ARCH)objdump
W := -Wall -Werror -Wextra -Wshadow -Wpointer-arith -Wcast-align
-W += -Wwrite-strings
-W += -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
-W += -Wstrict-prototypes
+#W := -pedantic -Wmissing-prototypes -Wmissing-declarations
+W += -Wwrite-strings -Wredundant-decls -Wnested-externs -Winline -Wno-long-long
+W += -Wconversion -Wstrict-prototypes
WNO := -Wno-error=unused-parameter -Wno-error=unused-variable
WNO += -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter
WNO += -Wno-error=infinite-recursion
diff --git a/kernel/Makefile b/kernel/Makefile
index bf5b008..b895ecf 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -35,6 +35,9 @@ OBJS = \
src/sys/syscall.o \
src/sys/userspace_asm.o \
src/sys/userspace.o \
+ src/scheduler/scheduler.o \
+ src/scheduler/switch_process.o \
+ src/scheduler/process.o \
all: kernel.bin
diff --git a/kernel/include/process.h b/kernel/include/process.h
new file mode 100644
index 0000000..7e8f59d
--- /dev/null
+++ b/kernel/include/process.h
@@ -0,0 +1,25 @@
+#ifndef PROCESS_H
+#define PROCESS_H
+
+#include <registers.h>
+#include <libk/list.h>
+
+#define STATUS_READY 0
+#define STATUS_RUNNING 1
+#define STATUS_WAITING 2
+
+struct process_t {
+ registers_t registers;
+ list_t* next;
+ uint32_t status;
+ uint32_t pid;
+ uint32_t time_using_cpu;
+};
+typedef struct process_t process_t;
+
+extern process_t process_list;
+extern process_t current_process;
+
+void create_process(uint64_t rip, uint64_t param1, uint64_t param2);
+
+#endif
diff --git a/kernel/include/registers.h b/kernel/include/registers.h
index a0c0949..373e557 100644
--- a/kernel/include/registers.h
+++ b/kernel/include/registers.h
@@ -3,6 +3,32 @@
#include <types.h>
+#define RAX 0x0
+#define RBX 0x8
+#define RCX 0x10
+#define RDX 0x18
+#define RSI 0x20
+#define RDI 0x28
+#define RSP 0x30
+#define RBP 0x38
+#define R8 0x40
+#define R9 0x48
+#define R10 0x50
+#define R11 0x58
+#define R12 0x60
+#define R13 0x68
+#define R14 0x70
+#define R15 0x78
+#define RIP 0x80
+#define RFLAGS 0x88
+#define CR3 0x90
+#define CS 0x98
+#define DS 0x9c
+#define SS 0x100
+#define ES 0x104
+#define FS 0x108
+#define GS 0x10c
+
struct registers_t {
uint64_t rax;
uint64_t rbx;
@@ -21,14 +47,15 @@ struct registers_t {
uint64_t r14;
uint64_t r15;
uint64_t rip;
+ uint64_t rflags;
+ uint64_t cr3;
uint16_t cs;
uint16_t ds;
uint16_t ss;
uint16_t es;
uint16_t fs;
uint16_t gs;
-};
+} __attribute__((packed, aligned(8)));
typedef struct registers_t registers_t;
-
#endif
diff --git a/kernel/include/scheduler.h b/kernel/include/scheduler.h
new file mode 100644
index 0000000..2f751f0
--- /dev/null
+++ b/kernel/include/scheduler.h
@@ -0,0 +1,6 @@
+#ifndef SCHEDULER_H
+#define SCHEDULER_H
+
+void scheduler(void);
+
+#endif
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