Rev 1735 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1735 | Rev 1780 | ||
---|---|---|---|
Line 60... | Line 60... | ||
60 | #define PTL1_ADDR(ptl0, page) ((pte_t *)PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page)))) |
60 | #define PTL1_ADDR(ptl0, page) ((pte_t *)PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page)))) |
61 | #define PTL2_ADDR(ptl1, page) ((pte_t *)PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page)))) |
61 | #define PTL2_ADDR(ptl1, page) ((pte_t *)PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page)))) |
62 | #define PTL3_ADDR(ptl2, page) ((pte_t *)PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page)))) |
62 | #define PTL3_ADDR(ptl2, page) ((pte_t *)PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page)))) |
63 | 63 | ||
64 | #define SETUP_PTL1(ptl0, page, tgt) { \ |
64 | #define SETUP_PTL1(ptl0, page, tgt) { \ |
65 | SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
65 | SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
66 | SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
66 | SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
67 | } |
67 | } |
68 | #define SETUP_PTL2(ptl1, page, tgt) { \ |
68 | #define SETUP_PTL2(ptl1, page, tgt) { \ |
69 | SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
69 | SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
70 | SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
70 | SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
71 | } |
71 | } |
72 | #define SETUP_PTL3(ptl2, page, tgt) { \ |
72 | #define SETUP_PTL3(ptl2, page, tgt) { \ |
73 | SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
73 | SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
74 | SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
74 | SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
75 | } |
75 | } |
76 | #define SETUP_FRAME(ptl3, page, tgt) { \ |
76 | #define SETUP_FRAME(ptl3, page, tgt) { \ |
77 | SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
77 | SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
78 | SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
78 | SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
79 | } |
79 | } |
80 | 80 | ||
81 | 81 | ||
82 | void page_arch_init(void) |
82 | void page_arch_init(void) |
83 | { |
83 | { |
84 | __address cur; |
84 | uintptr_t cur; |
85 | int i; |
85 | int i; |
86 | int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL; |
86 | int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL; |
87 | 87 | ||
88 | if (config.cpu_active == 1) { |
88 | if (config.cpu_active == 1) { |
89 | page_mapping_operations = &pt_mapping_operations; |
89 | page_mapping_operations = &pt_mapping_operations; |
Line 107... | Line 107... | ||
107 | page_mapping_insert(AS_KERNEL, PA2KA_CODE(KA2PA(cur)), KA2PA(cur), identity_flags); |
107 | page_mapping_insert(AS_KERNEL, PA2KA_CODE(KA2PA(cur)), KA2PA(cur), identity_flags); |
108 | } |
108 | } |
109 | } |
109 | } |
110 | 110 | ||
111 | exc_register(14, "page_fault", (iroutine)page_fault); |
111 | exc_register(14, "page_fault", (iroutine)page_fault); |
112 | write_cr3((__address) AS_KERNEL->page_table); |
112 | write_cr3((uintptr_t) AS_KERNEL->page_table); |
113 | } |
113 | } |
114 | else { |
114 | else { |
115 | write_cr3((__address) AS_KERNEL->page_table); |
115 | write_cr3((uintptr_t) AS_KERNEL->page_table); |
116 | } |
116 | } |
117 | } |
117 | } |
118 | 118 | ||
119 | 119 | ||
120 | /** Identity page mapper |
120 | /** Identity page mapper |
Line 123... | Line 123... | ||
123 | * is initializaed. This thing clears page table and fills in the specific |
123 | * is initializaed. This thing clears page table and fills in the specific |
124 | * items. |
124 | * items. |
125 | */ |
125 | */ |
126 | void ident_page_fault(int n, istate_t *istate) |
126 | void ident_page_fault(int n, istate_t *istate) |
127 | { |
127 | { |
128 | __address page; |
128 | uintptr_t page; |
129 | static __address oldpage = 0; |
129 | static uintptr_t oldpage = 0; |
130 | pte_t *aptl_1, *aptl_2, *aptl_3; |
130 | pte_t *aptl_1, *aptl_2, *aptl_3; |
131 | 131 | ||
132 | page = read_cr2(); |
132 | page = read_cr2(); |
133 | if (oldpage) { |
133 | if (oldpage) { |
134 | /* Unmap old address */ |
134 | /* Unmap old address */ |
Line 171... | Line 171... | ||
171 | } |
171 | } |
172 | 172 | ||
173 | 173 | ||
174 | void page_fault(int n, istate_t *istate) |
174 | void page_fault(int n, istate_t *istate) |
175 | { |
175 | { |
176 | __address page; |
176 | uintptr_t page; |
177 | pf_access_t access; |
177 | pf_access_t access; |
178 | 178 | ||
179 | page = read_cr2(); |
179 | page = read_cr2(); |
180 | 180 | ||
181 | if (istate->error_word & PFERR_CODE_RSVD) |
181 | if (istate->error_word & PFERR_CODE_RSVD) |
Line 196... | Line 196... | ||
196 | panic("page fault\n"); |
196 | panic("page fault\n"); |
197 | } |
197 | } |
198 | } |
198 | } |
199 | 199 | ||
200 | 200 | ||
201 | __address hw_map(__address physaddr, size_t size) |
201 | uintptr_t hw_map(uintptr_t physaddr, size_t size) |
202 | { |
202 | { |
203 | if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
203 | if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
204 | panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
204 | panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
205 | 205 | ||
206 | __address virtaddr = PA2KA(last_frame); |
206 | uintptr_t virtaddr = PA2KA(last_frame); |
207 | pfn_t i; |
207 | pfn_t i; |
208 | for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
208 | for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
209 | page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE); |
209 | page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE); |
210 | 210 | ||
211 | last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
211 | last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |