64 lines
1.6 KiB
C
64 lines
1.6 KiB
C
#ifndef _PAGETABLE_H_
|
|
#define _PAGETABLE_H_
|
|
|
|
#include "../types.h"
|
|
|
|
#define KERNEL_MEMORY_BORDER 0x4000000
|
|
|
|
typedef struct {
|
|
uint8_t present:1 = 0;
|
|
uint8_t write:1 = 0;
|
|
uint8_t user:1 = 0;
|
|
uint8_t pwt:1 = 0;
|
|
uint8_t cache_disable:1 = 0;
|
|
uint8_t accessed:1 = 0;
|
|
uint8_t dirty:1 = 0;
|
|
uint8_t pat:1 = 0;
|
|
uint8_t rsvd_0:4 = 0;
|
|
uint64_t address:39 = 0;
|
|
uint16_t rsvd_1:10 = 0;
|
|
uint8_t execute_disable:1 = 0;
|
|
} __attribute__((__packed__)) pagetable_entry_t;
|
|
|
|
typedef struct {
|
|
pagetable_entry_t entries[512];
|
|
} pagetable_t;
|
|
|
|
//typedef struct {
|
|
// uint8_t present:1 = 0;
|
|
// uint8_t write:1 = 0;
|
|
// uint8_t user:1 = 0;
|
|
// uint8_t pwt:1 = 0;
|
|
// uint8_t cache_disable:1 = 0;
|
|
// uint8_t accessed:1 = 0;
|
|
// uint8_t rsvd_0:6 = 0;
|
|
// uint64_t address:39 = 0;
|
|
// uint16_t rsvd_1:10 = 0;
|
|
// uint8_t execute_disable:1 = 0;
|
|
//} __attribute__((__packed__)) pagedirectory_entry_t;
|
|
|
|
typedef struct {
|
|
alignas(4096) pagetable_t l4;
|
|
alignas(4096) pagetable_t l3;
|
|
alignas(4096) pagetable_t l2;
|
|
//pagetable_t l1_kernel;
|
|
alignas(4096) pagetable_t l2_apic;
|
|
alignas(4096) pagetable_t ioapic;
|
|
alignas(4096) pagetable_t lapic;
|
|
} four_lvl_paging_t;
|
|
|
|
void write_identity_map(pagetable_t* identity_table, uint64_t size);
|
|
void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_identity);
|
|
void load_cr3(void* cr3_value);
|
|
void map_pageframe(four_lvl_paging_t* table, uintptr_t phys, uintptr_t virt);
|
|
|
|
//typedef struct {
|
|
// same
|
|
//} pagedirectory_pointertable_entry_t;
|
|
|
|
//typedef struct {
|
|
// same
|
|
//} PML4_entry_t;
|
|
|
|
#endif
|