summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal/paging.h
blob: 754ac99e2f3f12fed14e94ca0d1fadcd4217b398 (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
#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 ign_0 : 2;
        uint8_t r : 1;
        uint64_t paddr : 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_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)

uintptr_t paging_get_pml4(void);
void paging_pml4_init(void);

#endif