Pmap ops: perm->settings
[akaros.git] / kern / arch / x86 / kpt.h
1 /* Copyright (c) 2015 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * 64 bit KPT helpers */
6
7 #ifndef ROS_ARCH_KPT_H
8 #define ROS_ARCH_KPT_H
9
10 #include <arch/ros/mmu64.h>
11
12 static inline bool kpte_is_present(kpte_t *kpte)
13 {
14         return *kpte & PTE_P ? TRUE : FALSE;
15 }
16
17 static inline bool kpte_is_unmapped(kpte_t *kpte)
18 {
19         return *kpte == 0;
20 }
21
22 static inline bool kpte_is_mapped(kpte_t *kpte)
23 {
24         return *kpte != 0;
25 }
26
27 static inline bool kpte_is_paged_out(kpte_t *kpte)
28 {
29         return *kpte != 0;
30 }
31
32 static inline bool kpte_is_dirty(kpte_t *kpte)
33 {
34         return *kpte & PTE_D ? TRUE : FALSE;
35 }
36
37 static inline bool kpte_is_accessed(kpte_t *kpte)
38 {
39         return *kpte & PTE_A ? TRUE : FALSE;
40 }
41
42 static inline bool kpte_is_jumbo(kpte_t *kpte)
43 {
44         return *kpte & PTE_PS ? TRUE : FALSE;
45 }
46
47 static inline physaddr_t kpte_get_paddr(kpte_t *kpte)
48 {
49         return (physaddr_t)*kpte & ~(PGSIZE - 1);
50 }
51
52 /* Returns the PTE in an unsigned long, for debugging mostly. */
53 static inline unsigned long kpte_print(kpte_t *kpte)
54 {
55         return *kpte;
56 }
57
58 static inline void kpte_write(kpte_t *kpte, physaddr_t pa, int settings)
59 {
60         assert(!PGOFF(pa));
61         /* The arch-bits like PTE_D, PTE_PS, etc are all in the native KPT format */
62         *kpte = pa | settings;
63 }
64
65 static inline void kpte_clear_present(kpte_t *kpte)
66 {
67         *kpte &= ~PTE_P;
68 }
69
70 static inline void kpte_clear(kpte_t *kpte)
71 {
72         *kpte = 0;
73 }
74
75 static inline bool kpte_has_perm_ur(kpte_t *kpte)
76 {
77         return (*kpte & PTE_USER_RO) == PTE_USER_RO;
78 }
79
80 static inline bool kpte_has_perm_urw(kpte_t *kpte)
81 {
82         return (*kpte & PTE_USER_RW) == PTE_USER_RW;
83 }
84
85 static inline int kpte_get_settings(kpte_t *kpte)
86 {
87         return *kpte & 0xfff;
88 }
89
90 static inline void kpte_replace_perm(kpte_t *kpte, int perm)
91 {
92         *kpte = (*kpte & ~PTE_PERM) | perm;
93 }
94
95 #endif /* ROS_ARCH_KPT_H */