Boot framework rework (#45)
[lunaix-os.git] / lunaix-os / arch / x86 / includes / sys / mm / pt_def64.h
1 #ifdef CONFIG_ARCH_X86_64
2 #ifndef __LUNAIX_PT_DEF64_H
3 #define __LUNAIX_PT_DEF64_H
4
5 #include <lunaix/types.h>
6
7 #define _PTW_LEVEL          4
8
9
10 // Note: we set VMS_SIZE = VMS_MASK as it is impossible
11 //       to express 4Gi in 32bit unsigned integer
12
13 #define _PAGE_BASE_SHIFT    12
14
15 #define _PAGE_BASE_SIZE     ( 1UL << _PAGE_BASE_SHIFT )
16 #define _PAGE_BASE_MASK     ( (_PAGE_BASE_SIZE - 1) & 0x000fffffffffffffUL )
17
18 #define _PAGE_LEVEL_SHIFT   9
19 #define _PAGE_LEVEL_SIZE    ( 1UL << _PAGE_LEVEL_SHIFT )
20 #define _PAGE_LEVEL_MASK    ( _PAGE_LEVEL_SIZE - 1 )
21 #define _PAGE_Ln_SIZE(n)    ( 1UL << (_PAGE_BASE_SHIFT + _PAGE_LEVEL_SHIFT * (_PTW_LEVEL - (n) - 1)) )
22
23 #define VMS_BITS            48
24 #define PMS_BITS            52
25
26 #define VMS_SIZE            ( 1UL << VMS_BITS)
27 #define VMS_MASK            ( VMS_SIZE - 1 )
28 #define PMS_SIZE            ( 1UL << PMS_BITS )
29 #define PMS_MASK            ( PMS_SIZE - 1 )
30
31 /* General size of a LnT huge page */
32
33 #define L0T_SIZE            _PAGE_Ln_SIZE(0)
34 #define L1T_SIZE            _PAGE_Ln_SIZE(1)
35 #define L2T_SIZE            _PAGE_Ln_SIZE(2)
36 #define L3T_SIZE            _PAGE_Ln_SIZE(3)
37 #define LFT_SIZE            _PAGE_Ln_SIZE(3)
38
39
40 struct __pte {
41     unsigned long val;
42 } align(8);
43
44 #define _PTE_P                  (1UL << 0)
45 #define _PTE_W                  (1UL << 1)
46 #define _PTE_U                  (1UL << 2)
47 #define _PTE_WT                 (1UL << 3)
48 #define _PTE_CD                 (1UL << 4)
49 #define _PTE_A                  (1UL << 5)
50 #define _PTE_D                  (1UL << 6)
51 #define _PTE_PS                 (1UL << 7)
52 #define _PTE_PAT                (1UL << 7)
53 #define _PTE_G                  (1UL << 8)
54 #define _PTE_NX                 (1UL << 63)
55 #define _PTE_X                  (0)
56 #define _PTE_R                  (0)
57
58 #define __MEMGUARD               0xf0f0f0f0f0f0f0f0UL
59
60 typedef unsigned long pte_attr_t;
61 typedef unsigned long pfn_t;
62
63 // always do sign extend on x86_64
64
65 #define __index(va)             ( (va) & VMS_MASK )
66 #define __vaddr(va)             \
67         ( (__index(va) ^ ((VMS_MASK + 1) >> 1)) - ((VMS_MASK + 1) >> 1) )
68 #define __paddr(pa)             ( (pa) & PMS_MASK )
69
70 #endif /* __LUNAIX_PT_DEF64_H */
71 #endif