diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-12-03 17:47:58 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-12-03 17:47:58 +0100 |
| commit | 0882221263aa14669946f57578d3ee014493f58f (patch) | |
| tree | 2ca87631b3683ba8a7df8621bbb5f053ff8f165f | |
| parent | ae5499137e377e08feb523c08b26495e79ed16df (diff) | |
scheduler base
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | kernel/Makefile | 3 | ||||
| -rw-r--r-- | kernel/include/process.h | 25 | ||||
| -rw-r--r-- | kernel/include/registers.h | 31 | ||||
| -rw-r--r-- | kernel/include/scheduler.h | 6 | ||||
| -rw-r--r-- | kernel/src/cpu/registers.c | 32 | ||||
| -rw-r--r-- | kernel/src/scheduler/process.c | 38 | ||||
| -rw-r--r-- | kernel/src/scheduler/scheduler.c | 7 | ||||
| -rw-r--r-- | kernel/src/scheduler/switch_process.S | 113 |
9 files changed, 224 insertions, 37 deletions
@@ -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 |
