Rev 1702 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1702 | Rev 1760 | ||
|---|---|---|---|
| Line 69... | Line 69... | ||
| 69 | * @param flags Flags to be used for mapping. |
69 | * @param flags Flags to be used for mapping. |
| 70 | */ |
70 | */ |
| 71 | void pt_mapping_insert(as_t *as, __address page, __address frame, int flags) |
71 | void pt_mapping_insert(as_t *as, __address page, __address frame, int flags) |
| 72 | { |
72 | { |
| 73 | pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
73 | pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
| 74 | __address newpt; |
74 | pte_t *newpt; |
| 75 | 75 | ||
| 76 | ptl0 = (pte_t *) PA2KA((__address) as->page_table); |
76 | ptl0 = (pte_t *) PA2KA((__address) as->page_table); |
| 77 | 77 | ||
| 78 | if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { |
78 | if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { |
| 79 | newpt = PA2KA(PFN2ADDR(frame_alloc(ONE_FRAME, FRAME_KA))); |
79 | newpt = (pte_t *)frame_alloc(ONE_FRAME, FRAME_KA); |
| 80 | memsetb(newpt, PAGE_SIZE, 0); |
80 | memsetb((__address)newpt, PAGE_SIZE, 0); |
| 81 | SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); |
81 | SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); |
| 82 | SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
82 | SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
| 83 | } |
83 | } |
| 84 | 84 | ||
| 85 | ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
85 | ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
| 86 | 86 | ||
| 87 | if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { |
87 | if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { |
| 88 | newpt = PA2KA(PFN2ADDR(frame_alloc(ONE_FRAME, FRAME_KA))); |
88 | newpt = (pte_t *)frame_alloc(ONE_FRAME, FRAME_KA); |
| 89 | memsetb(newpt, PAGE_SIZE, 0); |
89 | memsetb((__address)newpt, PAGE_SIZE, 0); |
| 90 | SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); |
90 | SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); |
| 91 | SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
91 | SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
| 92 | } |
92 | } |
| 93 | 93 | ||
| 94 | ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
94 | ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
| 95 | 95 | ||
| 96 | if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { |
96 | if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { |
| 97 | newpt = PA2KA(PFN2ADDR(frame_alloc(ONE_FRAME, FRAME_KA))); |
97 | newpt = (pte_t *)frame_alloc(ONE_FRAME, FRAME_KA); |
| 98 | memsetb(newpt, PAGE_SIZE, 0); |
98 | memsetb((__address)newpt, PAGE_SIZE, 0); |
| 99 | SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); |
99 | SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); |
| 100 | SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
100 | SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
| 101 | } |
101 | } |
| 102 | 102 | ||
| 103 | ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
103 | ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
| Line 163... | Line 163... | ||
| 163 | if (empty) { |
163 | if (empty) { |
| 164 | /* |
164 | /* |
| 165 | * PTL3 is empty. |
165 | * PTL3 is empty. |
| 166 | * Release the frame and remove PTL3 pointer from preceding table. |
166 | * Release the frame and remove PTL3 pointer from preceding table. |
| 167 | */ |
167 | */ |
| 168 | frame_free(ADDR2PFN(KA2PA((__address) ptl3))); |
168 | frame_free(KA2PA((__address) ptl3)); |
| 169 | if (PTL2_ENTRIES) |
169 | if (PTL2_ENTRIES) |
| 170 | memsetb((__address) &ptl2[PTL2_INDEX(page)], sizeof(pte_t), 0); |
170 | memsetb((__address) &ptl2[PTL2_INDEX(page)], sizeof(pte_t), 0); |
| 171 | else if (PTL1_ENTRIES) |
171 | else if (PTL1_ENTRIES) |
| 172 | memsetb((__address) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
172 | memsetb((__address) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
| 173 | else |
173 | else |
| Line 192... | Line 192... | ||
| 192 | if (empty) { |
192 | if (empty) { |
| 193 | /* |
193 | /* |
| 194 | * PTL2 is empty. |
194 | * PTL2 is empty. |
| 195 | * Release the frame and remove PTL2 pointer from preceding table. |
195 | * Release the frame and remove PTL2 pointer from preceding table. |
| 196 | */ |
196 | */ |
| 197 | frame_free(ADDR2PFN(KA2PA((__address) ptl2))); |
197 | frame_free(KA2PA((__address) ptl2)); |
| 198 | if (PTL1_ENTRIES) |
198 | if (PTL1_ENTRIES) |
| 199 | memsetb((__address) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
199 | memsetb((__address) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
| 200 | else |
200 | else |
| 201 | memsetb((__address) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
201 | memsetb((__address) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
| 202 | } |
202 | } |
| Line 221... | Line 221... | ||
| 221 | if (empty) { |
221 | if (empty) { |
| 222 | /* |
222 | /* |
| 223 | * PTL1 is empty. |
223 | * PTL1 is empty. |
| 224 | * Release the frame and remove PTL1 pointer from preceding table. |
224 | * Release the frame and remove PTL1 pointer from preceding table. |
| 225 | */ |
225 | */ |
| 226 | frame_free(ADDR2PFN(KA2PA((__address) ptl1))); |
226 | frame_free(KA2PA((__address) ptl1)); |
| 227 | memsetb((__address) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
227 | memsetb((__address) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
| 228 | } |
228 | } |
| 229 | } |
229 | } |
| 230 | 230 | ||
| 231 | } |
231 | } |