Kernel processes / multitasking
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user