Big code refactor, get rid of HAL entirely
This commit is contained in:
65
kernel/vmm/vmm.h
Normal file
65
kernel/vmm/vmm.h
Normal file
@ -0,0 +1,65 @@
|
||||
#ifndef VMM_VMM_H_
|
||||
#define VMM_VMM_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include "compiler/attr.h"
|
||||
|
||||
#define VMM_PAGE_SIZE 0x1000
|
||||
|
||||
#define VIRT(X) ((void *)(BOOT_INFO.hhdm_off + (uint64_t)(X)))
|
||||
|
||||
typedef struct VasRange {
|
||||
struct VasRange *next;
|
||||
|
||||
uint8_t *virtstart;
|
||||
uint8_t *physstart;
|
||||
size_t size;
|
||||
uint8_t pgflags;
|
||||
} PACKED VasRange;
|
||||
|
||||
enum {
|
||||
VMM_PG_PRESENT = 1<<0,
|
||||
VMM_PG_RW = 1<<1,
|
||||
VMM_PG_USER = 1<<2,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint16_t pml4;
|
||||
uint16_t pml3;
|
||||
uint16_t pml2;
|
||||
uint16_t pml1;
|
||||
} PACKED PgIndex;
|
||||
|
||||
typedef struct {
|
||||
bool present: 1;
|
||||
bool rw: 1;
|
||||
bool user: 1;
|
||||
bool writethrough: 1;
|
||||
bool cachedisabled: 1;
|
||||
bool accessed: 1;
|
||||
bool dirty: 1;
|
||||
bool hugepage: 1;
|
||||
bool global: 1;
|
||||
uint8_t avail: 3;
|
||||
uint64_t addr: 40;
|
||||
uint16_t osdef: 11;
|
||||
bool nx: 1;
|
||||
} PACKED Pte;
|
||||
|
||||
typedef struct {
|
||||
Pte ents[512];
|
||||
} PACKED PgTable;
|
||||
|
||||
extern uint64_t KERNEL_CR3;
|
||||
|
||||
void vmm_init(void);
|
||||
void vmm_unmap_page(uint64_t cr3phys, uint64_t virtaddr);
|
||||
void vmm_map_page(uint64_t cr3phys, uint64_t virtaddr, uint64_t physaddr, uint32_t flags);
|
||||
uint64_t vmm_current_cr3(void);
|
||||
void vmm_map_range(uint64_t cr3phys, void *virtstart, void *physstart, size_t size, uint32_t flags);
|
||||
void vmm_unmap_range(uint64_t cr3phys, void *virtstart, void *physstart, size_t size);
|
||||
uint64_t vmm_userproc_pml4_phys(void);
|
||||
|
||||
#endif // VMM_VMM_H_
|
||||
Reference in New Issue
Block a user