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 /kernel/src | |
| parent | ae5499137e377e08feb523c08b26495e79ed16df (diff) | |
scheduler base
Diffstat (limited to 'kernel/src')
| -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 |
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 |
