Rev 2007 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2007 | Rev 2017 | ||
---|---|---|---|
Line 74... | Line 74... | ||
74 | #define SET_PTL0_ADDRESS_ARCH(ptl0) { \ |
74 | #define SET_PTL0_ADDRESS_ARCH(ptl0) { \ |
75 | mmuext_op_t mmu_ext; \ |
75 | mmuext_op_t mmu_ext; \ |
76 | \ |
76 | \ |
77 | mmu_ext.cmd = MMUEXT_NEW_BASEPTR; \ |
77 | mmu_ext.cmd = MMUEXT_NEW_BASEPTR; \ |
78 | mmu_ext.mfn = ADDR2PFN(PA2MA(ptl0)); \ |
78 | mmu_ext.mfn = ADDR2PFN(PA2MA(ptl0)); \ |
79 | xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF); \ |
79 | ASSERT(xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF) == 0); \ |
80 | } |
80 | } |
81 | 81 | ||
82 | #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) { \ |
82 | #define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) { \ |
- | 83 | mmuext_op_t mmu_ext; \ |
|
- | 84 | \ |
|
- | 85 | mmu_ext.cmd = MMUEXT_PIN_L1_TABLE; \ |
|
- | 86 | mmu_ext.mfn = ADDR2PFN(PA2MA(a)); \ |
|
- | 87 | ASSERT(xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF) == 0); \ |
|
- | 88 | \ |
|
83 | mmu_update_t update; \ |
89 | mmu_update_t update; \ |
84 | \ |
90 | \ |
85 | update.ptr = PA2MA(KA2PA(&((pte_t *) (ptl0))[(i)])); \ |
91 | update.ptr = PA2MA(KA2PA(&((pte_t *) (ptl0))[(i)])); \ |
86 | update.val = PA2MA(a) | 0x0003; \ |
92 | update.val = PA2MA(a); \ |
87 | xen_mmu_update(&update, 1, NULL, DOMID_SELF); \ |
93 | ASSERT(xen_mmu_update(&update, 1, NULL, DOMID_SELF) == 0); \ |
88 | } |
94 | } |
- | 95 | ||
89 | #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
96 | #define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
90 | #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
97 | #define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
91 | #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) (((pte_t *) (ptl3))[(i)].frame_address = PA2MA(a) >> 12) |
98 | #define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) { \ |
- | 99 | mmu_update_t update; \ |
|
- | 100 | \ |
|
- | 101 | update.ptr = PA2MA(KA2PA(&((pte_t *) (ptl3))[(i)])); \ |
|
- | 102 | update.val = PA2MA(a); \ |
|
- | 103 | ASSERT(xen_mmu_update(&update, 1, NULL, DOMID_SELF) == 0); \ |
|
- | 104 | } |
|
92 | 105 | ||
93 | #define GET_PTL1_FLAGS_ARCH(ptl0, i) get_pt_flags((pte_t *) (ptl0), (index_t)(i)) |
106 | #define GET_PTL1_FLAGS_ARCH(ptl0, i) get_pt_flags((pte_t *) (ptl0), (index_t)(i)) |
94 | #define GET_PTL2_FLAGS_ARCH(ptl1, i) PAGE_PRESENT |
107 | #define GET_PTL2_FLAGS_ARCH(ptl1, i) PAGE_PRESENT |
95 | #define GET_PTL3_FLAGS_ARCH(ptl2, i) PAGE_PRESENT |
108 | #define GET_PTL3_FLAGS_ARCH(ptl2, i) PAGE_PRESENT |
96 | #define GET_FRAME_FLAGS_ARCH(ptl3, i) get_pt_flags((pte_t *) (ptl3), (index_t)(i)) |
109 | #define GET_FRAME_FLAGS_ARCH(ptl3, i) get_pt_flags((pte_t *) (ptl3), (index_t)(i)) |
Line 194... | Line 207... | ||
194 | ); |
207 | ); |
195 | } |
208 | } |
196 | 209 | ||
197 | static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
210 | static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
198 | { |
211 | { |
199 | pte_t *p = &pt[i]; |
212 | pte_t p = pt[i]; |
200 | 213 | ||
201 | p->page_cache_disable = !(flags & PAGE_CACHEABLE); |
214 | p.page_cache_disable = !(flags & PAGE_CACHEABLE); |
202 | p->present = !(flags & PAGE_NOT_PRESENT); |
215 | p.present = !(flags & PAGE_NOT_PRESENT); |
203 | p->uaccessible = (flags & PAGE_USER) != 0; |
216 | p.uaccessible = (flags & PAGE_USER) != 0; |
204 | p->writeable = (flags & PAGE_WRITE) != 0; |
217 | p.writeable = (flags & PAGE_WRITE) != 0; |
205 | p->global = (flags & PAGE_GLOBAL) != 0; |
218 | p.global = (flags & PAGE_GLOBAL) != 0; |
206 | 219 | ||
207 | /* |
220 | /* |
208 | * Ensure that there is at least one bit set even if the present bit is cleared. |
221 | * Ensure that there is at least one bit set even if the present bit is cleared. |
209 | */ |
222 | */ |
210 | p->soft_valid = true; |
223 | p.soft_valid = true; |
- | 224 | ||
- | 225 | mmu_update_t update; |
|
- | 226 | ||
- | 227 | update.ptr = PA2MA(KA2PA(&(pt[i]))); |
|
- | 228 | update.pte = p; |
|
- | 229 | xen_mmu_update(&update, 1, NULL, DOMID_SELF); |
|
211 | } |
230 | } |
212 | 231 | ||
213 | extern void page_arch_init(void); |
232 | extern void page_arch_init(void); |
214 | extern void page_fault(int n, istate_t *istate); |
233 | extern void page_fault(int n, istate_t *istate); |
215 | 234 |