VMX: change msr emulation to pass in the vm trapframe
[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 #pragma once
8
9 #include <arch/ros/mmu64.h>
10
11 static inline bool kpte_is_present(kpte_t *kpte)
12 {
13         return *kpte & PTE_P ? TRUE : FALSE;
14 }
15
16 static inline bool kpte_is_unmapped(kpte_t *kpte)
17 {
18         return *kpte == 0;
19 }
20
21 static inline bool kpte_is_mapped(kpte_t *kpte)
22 {
23         return *kpte != 0;
24 }
25
26 static inline bool kpte_is_paged_out(kpte_t *kpte)
27 {
28         return *kpte != 0;
29 }
30
31 static inline bool kpte_is_dirty(kpte_t *kpte)
32 {
33         return *kpte & PTE_D ? TRUE : FALSE;
34 }
35
36 static inline bool kpte_is_accessed(kpte_t *kpte)
37 {
38         return *kpte & PTE_A ? TRUE : FALSE;
39 }
40
41 static inline bool kpte_is_jumbo(kpte_t *kpte)
42 {
43         return *kpte & PTE_PS ? TRUE : FALSE;
44 }
45
46 static inline physaddr_t kpte_get_paddr(kpte_t *kpte)
47 {
48         return (physaddr_t)*kpte & ~(PGSIZE - 1);
49 }
50
51 /* Returns the PTE in an unsigned long, for debugging mostly. */
52 static inline unsigned long kpte_print(kpte_t *kpte)
53 {
54         return *kpte;
55 }
56
57 static inline void kpte_write(kpte_t *kpte, physaddr_t pa, int settings)
58 {
59         assert(!PGOFF(pa));
60         /* The arch-bits like PTE_D, PTE_PS, etc are all in the native KPT format */
61         *kpte = build_kpte(pa, settings);
62 }
63
64 static inline void kpte_clear_present(kpte_t *kpte)
65 {
66         *kpte &= ~PTE_P;
67 }
68
69 static inline void kpte_clear(kpte_t *kpte)
70 {
71         *kpte = 0;
72 }
73
74 static inline bool kpte_has_perm_ur(kpte_t *kpte)
75 {
76         return (*kpte & PTE_USER_RO) == PTE_USER_RO;
77 }
78
79 static inline bool kpte_has_perm_urw(kpte_t *kpte)
80 {
81         return (*kpte & PTE_USER_RW) == PTE_USER_RW;
82 }
83
84 static inline int kpte_get_settings(kpte_t *kpte)
85 {
86         return *kpte & 0xfff;
87 }
88
89 static inline void kpte_replace_perm(kpte_t *kpte, int perm)
90 {
91         *kpte = (*kpte & ~PTE_PERM) | perm;
92 }