Kernel processes / multitasking

This commit is contained in:
2025-08-30 23:47:25 +02:00
parent 60a530b900
commit 0273330cf4
22 changed files with 381 additions and 56 deletions

View File

@ -23,6 +23,10 @@ void hal_init_withmalloc(void);
#if defined(__x86_64__)
# define HAL_PAGE_SIZE 0x1000
# include "x86_64/vmm.h"
# include "x86_64/proc.h"
# include "x86_64/switch.h"
# include "x86_64/paging.h"
# include "x86_64/cpu.h"
#endif
#endif // KERNEL_HAL_HAL_H_

View File

@ -1,13 +1,13 @@
#include <stdint.h>
#include <stddef.h>
uint64_t cpu_rdmsr(uint32_t id) {
uint64_t hal_cpu_rdmsr(uint32_t id) {
uint32_t lo, hi;
asm volatile("rdmsr" : "=m"(lo), "=d"(hi) : "c"(id));
return ((uint64_t)lo) | ((uint64_t)hi << 32);
}
uint64_t cpu_wrmsr(uint32_t id, uint64_t val) {
uint64_t hal_cpu_wrmsr(uint32_t id, uint64_t val) {
uint32_t lo = val & 0xffffffff, hi = (val >> 32) & 0xffffffff;
asm volatile("wrmsr" :: "a"(lo), "d"(hi), "c"(id) : "memory");
return val;

View File

@ -1,7 +1,11 @@
#ifndef HAL_CPU_H_
#define HAL_CPU_H_
uint64_t cpu_rdmsr(uint32_t id);
uint64_t cpu_wrmsr(uint32_t id, uint64_t val);
#define HAL_CPU_FSBASE 0xC0000100
#define HAL_CPU_GSBASE 0xC0000101
#define HAL_CPU_KGSBASE 0xC0000102
uint64_t hal_cpu_rdmsr(uint32_t id);
uint64_t hal_cpu_wrmsr(uint32_t id, uint64_t val);
#endif // HAL_CPU_H_

View File

@ -10,6 +10,7 @@
#include "pic.h"
#include "apic.h"
#include "pit.h"
#include "proc/proc.h"
void hal_intr_disable(void) {
asm volatile("cli");
@ -151,7 +152,7 @@ void intr_dumpframe(IntrStackFrame *frame) {
void intr_handleintr(IntrStackFrame *frame) {
if (frame->trapnum >= 0 && frame->trapnum <= 31) {
// EXCEPTION
kprintf_unsafe("ERROR", "%s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
kprintf_unsafe("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
intr_dumpframe(frame);
hal_hang();
} else if (frame->trapnum >= 32 && frame->trapnum <= 47) {
@ -161,6 +162,8 @@ void intr_handleintr(IntrStackFrame *frame) {
}
io_out8(PIC1_CMD, 0x20);
lapic_write(LAPIC_EOI, 0x00);
proc_sched((void *)frame);
}
}

View File

@ -1,3 +1,5 @@
#include "regs.S"
.extern intr_handleintr
.global intr_vec0
@ -49,38 +51,6 @@
.global intr_vec46
.global intr_vec47
.macro _push_regs
push %rax
push %rcx
push %rdx
push %rsi
push %rdi
push %r8
push %r9
push %r10
push %r11
push %r12
push %r13
push %r14
push %r15
.endm
.macro _pop_regs
pop %r15
pop %r14
pop %r13
pop %r12
pop %r11
pop %r10
pop %r9
pop %r8
pop %rdi
pop %rsi
pop %rdx
pop %rcx
pop %rax
.endm
.macro _vecintr_errorcode_present_save num
pushq $\num
.endm

View File

@ -2,8 +2,3 @@
hal_loadpd:
mov %rdi, %cr3
retq
.global hal_invalpg
hal_invalpg:
invlpg (%rdi)
retq

View File

@ -0,0 +1,6 @@
#ifndef HAL_PAGING_H_
#define HAL_PAGING_H_
void hal_loadpd(PgTable *cr3);
#endif // HAL_PAGING_H_

15
kernel/hal/x86_64/proc.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef HAL_PROC_H_
#define HAL_PROC_H_
#include <stdint.h>
#include "intr.h"
#include "vmm.h"
typedef struct {
uint64_t fsbase;
IntrStackFrame trapframe;
uint8_t *kstack;
PgTable *cr3;
} ProcPlatformData;
#endif // HAL_PROC_H_

31
kernel/hal/x86_64/regs.S Normal file
View File

@ -0,0 +1,31 @@
.macro _push_regs
push %rax
push %rcx
push %rdx
push %rsi
push %rdi
push %r8
push %r9
push %r10
push %r11
push %r12
push %r13
push %r14
push %r15
.endm
.macro _pop_regs
pop %r15
pop %r14
pop %r13
pop %r12
pop %r11
pop %r10
pop %r9
pop %r8
pop %rdi
pop %rsi
pop %rdx
pop %rcx
pop %rax
.endm

View File

@ -0,0 +1,19 @@
#include "regs.S"
siema:
jmp siema
.global hal_switchproc
hal_switchproc:
mov %cr3, %rcx
cmp %rsi, %rcx
je .done
mov %rsi, %cr3
.done:
mov %rdi, %rsp
_pop_regs
add $0x10, %rsp
iretq

View File

@ -0,0 +1,6 @@
#ifndef HAL_SWITCH_H_
#define HAL_SWITCH_H_
extern void hal_switchproc(void *newsp, PgTable *cr3);
#endif // HAL_SWITCH_H_

View File

@ -4,6 +4,7 @@
#include "hal/hal.h"
#include "bootinfo/bootinfo.h"
#include "pmm/pmm.h"
#include "paging.h"
PgTable *KERNEL_CR3 = NULL;
@ -60,6 +61,41 @@ void hal_vmm_unmap_page(PgTable *pml4, uint64_t virtaddr, uint64_t physaddr) {
*pte &= ~HAL_PG_PRESENT;
}
void hal_vmm_map_range(PgTable *cr3, void *virtstart, void *physstart, size_t size, uint32_t flags) {
if (size % HAL_PAGE_SIZE != 0 || (uint64_t)virtstart % HAL_PAGE_SIZE != 0 || (uint64_t)physstart % HAL_PG_PRESENT != 0) {
return;
}
uint8_t *vaddr = virtstart, *paddr = physstart;
for (; vaddr <= ((uint8_t *)virtstart + size); vaddr += HAL_PAGE_SIZE, paddr += HAL_PAGE_SIZE) {
hal_vmm_map_page(cr3, (uint64_t)vaddr, (uint64_t)paddr, flags);
}
}
void hal_vmm_unmap_range(PgTable *cr3, void *virtstart, void *physstart, size_t size, uint32_t flags) {
if (size % HAL_PAGE_SIZE != 0 || (uint64_t)virtstart % HAL_PAGE_SIZE != 0 || (uint64_t)physstart % HAL_PG_PRESENT != 0) {
return;
}
uint8_t *vaddr = virtstart, *paddr = physstart;
for (; vaddr <= ((uint8_t *)virtstart + size); vaddr += HAL_PAGE_SIZE, paddr += HAL_PAGE_SIZE) {
hal_vmm_unmap_page(cr3, (uint64_t)vaddr, (uint64_t)paddr);
}
}
void hal_vmm_map_kern(PgTable *cr3) {
PgTable *kcr3 = BOOT_INFO.hhdm_off + KERNEL_CR3;
for (size_t i = 256; i < 512; i++) {
cr3->ents[i] = kcr3->ents[i];
}
}
void hal_vmm_switch_pd(PgTable *cr3) {
hal_loadpd(cr3);
}
void hal_vmm_init(void) {
KERNEL_CR3 = hal_vmm_current_cr3();
}

View File

@ -41,5 +41,8 @@ extern PgTable *KERNEL_CR3;
void hal_vmm_init(void);
void hal_vmm_unmap_page(PgTable *pml4, uint64_t virtaddr, uint64_t physaddr);
void hal_vmm_map_page(PgTable *pml4, uint64_t virtaddr, uint64_t physaddr, uint32_t flags);
PgTable *hal_vmm_current_cr3(void);
void hal_vmm_map_range(PgTable *cr3, void *virtstart, void *physstart, size_t size, uint32_t flags);
void hal_vmm_unmap_range(PgTable *cr3, void *virtstart, void *physstart, size_t size, uint32_t flags);
#endif // HAL_VMM_H_