blob: 6edac0cd1ec09758e9ddc7a266ed842cb0f5aea1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include "api/syscall.h"
#ifndef _JOVE_x86_64_HAL_PAGING_H
#define _JOVE_x86_64_HAL_PAGING_H 1
#include "jove.h"
#include <stdint.h>
typedef union page_table_entry
{
struct {
uint8_t p : 1;
uint8_t rw : 1;
uint8_t u : 1;
uint8_t pwt : 1;
uint8_t pcd : 1;
uint8_t a : 1;
uint8_t d : 1;
uint8_t ps : 1;
uint8_t g : 1;
uint8_t mapping_type : 2;
uint8_t r : 1;
uint64_t pfn : 35;
uint8_t ign_1 : 4;
uint8_t pkey : 4;
uint8_t xd : 1;
};
uint64_t value;
} PACKED page_t;
#define PAGE_PRESENT 0b1
#define PAGE_WRITEABLE 0b10
#define PAGE_USER 0b100
#define PAGE_WRITETHROUGH 0b1000
#define PAGE_CACHEDISABLE 0b10000
#define PAGE_ACCESSED 0b100000
#define PAGE_DIRTY 0b1000000
#define PAGE_PS 0b10000000
#define PAGE_GLOBAL 0b100000000
#define PAGE_SHL_TYPE 9
#define PAGE_XD (1ULL << 63)
extern void *_kernel_physptr;
#define PMLI_SHL(l) (12 + (l * 9))
#define PMLI_MASK(l) (~0xFFFFULL << PMLI_SHL(l))
#define PML4I(v) (((v) >> 39) & 0x1FF)
#define PML3I(v) (((v) >> 30) & 0x1FF)
#define PML2I(v) (((v) >> 21) & 0x1FF)
#define PML1I(v) (((v) >> 12) & 0x1FF)
#define IDENT_VIRT_BASE 0xFFFF800000000000ULL
#define KERNEL_VIRT_BASE 0xFFFFFFFF80000000ULL
#define KPTR_TOPHYS(v) (((uintptr_t)v) - KERNEL_VIRT_BASE + (uintptr_t)_kernel_physptr)
int pagedir_map_frame(page_t *pml4, uintptr_t pptr, uintptr_t vptr, uintmax_t flags);
int pagedir_map_table(page_t *pml4, uintptr_t pptr, uintptr_t vptr);
uintptr_t paging_get_pml4(void);
void paging_pml4_init(void);
#endif
|