Kernel processes / multitasking
This commit is contained in:
@ -12,26 +12,42 @@
|
||||
VirtMem VIRT_MEM;
|
||||
|
||||
void vmm_map_kern_page(uint64_t virtaddr, uint64_t physaddr, uint32_t flags) {
|
||||
spinlock_acquire(&VIRT_MEM.spinlock);
|
||||
#if defined(__x86_64__)
|
||||
hal_vmm_map_page(KERNEL_CR3, virtaddr, physaddr, flags);
|
||||
#else
|
||||
# error "arch"
|
||||
#endif
|
||||
spinlock_release(&VIRT_MEM.spinlock);
|
||||
}
|
||||
|
||||
void vmm_unmap_kern_page(uint64_t virtaddr, uint64_t physaddr) {
|
||||
spinlock_acquire(&VIRT_MEM.spinlock);
|
||||
#if defined(__x86_64__)
|
||||
hal_vmm_unmap_page(KERNEL_CR3, virtaddr, physaddr);
|
||||
#else
|
||||
# error "arch"
|
||||
#endif
|
||||
spinlock_release(&VIRT_MEM.spinlock);
|
||||
}
|
||||
|
||||
void vmm_map_kern_range(void *virtstart, void *physstart, size_t size, uint32_t flags) {
|
||||
spinlock_acquire(&VIRT_MEM.spinlock);
|
||||
#if defined(__x86_64__)
|
||||
hal_vmm_map_range(KERNEL_CR3, virtstart, physstart, size, flags);
|
||||
#endif
|
||||
spinlock_release(&VIRT_MEM.spinlock);
|
||||
}
|
||||
|
||||
void vmm_unmap_kern_range(void *virtstart, void *physstart, size_t size, uint32_t flags) {
|
||||
spinlock_acquire(&VIRT_MEM.spinlock);
|
||||
#if defined(__x86_64__)
|
||||
hal_vmm_unmap_range(KERNEL_CR3, virtstart, physstart, size, flags);
|
||||
#endif
|
||||
spinlock_release(&VIRT_MEM.spinlock);
|
||||
}
|
||||
|
||||
void vmm_init(void) {
|
||||
spinlock_init(&VIRT_MEM.spinlock);
|
||||
|
||||
hal_vmm_init();
|
||||
|
||||
|
||||
LOG("vmm", "init\n");
|
||||
}
|
||||
|
||||
|
@ -4,11 +4,21 @@
|
||||
#include <stddef.h>
|
||||
#include "spinlock/spinlock.h"
|
||||
#include "bootinfo/bootinfo.h"
|
||||
#include "compiler/attr.h"
|
||||
|
||||
typedef struct {
|
||||
SpinLock spinlock;
|
||||
} VirtMem;
|
||||
|
||||
typedef struct VasRange {
|
||||
struct VasRange *next;
|
||||
|
||||
uint8_t *virtstart;
|
||||
uint8_t *physstart;
|
||||
size_t size;
|
||||
uint8_t pgflags;
|
||||
} PACKED VasRange;
|
||||
|
||||
extern VirtMem VIRT_MEM;
|
||||
|
||||
void vmm_init(void);
|
||||
|
Reference in New Issue
Block a user