Rev 1021 | Rev 1051 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1021 | Rev 1050 | ||
|---|---|---|---|
| Line 100... | Line 100... | ||
| 100 | #else |
100 | #else |
| 101 | panic("fpu fault"); |
101 | panic("fpu fault"); |
| 102 | #endif |
102 | #endif |
| 103 | } |
103 | } |
| 104 | 104 | ||
| - | 105 | ||
| - | 106 | /* Definitions for identic page mapper */ |
|
| - | 107 | pte_t helper_ptl1[512] __attribute__((aligned (PAGE_SIZE))); |
|
| - | 108 | pte_t helper_ptl2[512] __attribute__((aligned (PAGE_SIZE))); |
|
| - | 109 | pte_t helper_ptl3[512] __attribute__((aligned (PAGE_SIZE))); |
|
| - | 110 | extern pte_t ptl_0; /* From boot.S */ |
|
| - | 111 | ||
| - | 112 | #define PTL1_PRESENT(ptl0, page) (!(GET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
|
| - | 113 | #define PTL2_PRESENT(ptl1, page) (!(GET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
|
| - | 114 | #define PTL3_PRESENT(ptl2, page) (!(GET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
|
| - | 115 | ||
| - | 116 | #define PTL1_ADDR(ptl0, page) ((pte_t *)PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page)))) |
|
| - | 117 | #define PTL2_ADDR(ptl1, page) ((pte_t *)PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page)))) |
|
| - | 118 | #define PTL3_ADDR(ptl2, page) ((pte_t *)PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page)))) |
|
| - | 119 | ||
| - | 120 | #define SETUP_PTL1(ptl0, page, tgt) { \ |
|
| - | 121 | SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
|
| - | 122 | SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
|
| - | 123 | } |
|
| - | 124 | #define SETUP_PTL2(ptl1, page, tgt) { \ |
|
| - | 125 | SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
|
| - | 126 | SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
|
| - | 127 | } |
|
| - | 128 | #define SETUP_PTL3(ptl2, page, tgt) { \ |
|
| - | 129 | SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
|
| - | 130 | SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
|
| - | 131 | } |
|
| - | 132 | #define SETUP_FRAME(ptl3, page, tgt) { \ |
|
| - | 133 | SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (__address)KA2PA(tgt)); \ |
|
| - | 134 | SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
|
| - | 135 | } |
|
| - | 136 | ||
| - | 137 | /** Identic page mapper |
|
| - | 138 | * |
|
| - | 139 | * We need to map whole physical memory identically before the page subsystem |
|
| - | 140 | * is initializaed. This thing clears page table and fills in the specific |
|
| - | 141 | * items. |
|
| - | 142 | */ |
|
| - | 143 | void ident_page_fault(int n, istate_t *istate) |
|
| - | 144 | { |
|
| - | 145 | __address page; |
|
| - | 146 | static __address oldpage = 0; |
|
| - | 147 | pte_t *aptl_1, *aptl_2, *aptl_3; |
|
| - | 148 | ||
| - | 149 | page = read_cr2(); |
|
| - | 150 | if (oldpage) { |
|
| - | 151 | /* Unmap old address */ |
|
| - | 152 | aptl_1 = PTL1_ADDR(&ptl_0, oldpage); |
|
| - | 153 | aptl_2 = PTL2_ADDR(aptl_1, oldpage); |
|
| - | 154 | aptl_3 = PTL3_ADDR(aptl_2, oldpage); |
|
| - | 155 | ||
| - | 156 | SET_FRAME_FLAGS_ARCH(aptl_3, PTL3_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
|
| - | 157 | if (aptl_3 == helper_ptl3) |
|
| - | 158 | SET_PTL3_FLAGS_ARCH(aptl_2, PTL2_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
|
| - | 159 | if (aptl_2 == helper_ptl2) |
|
| - | 160 | SET_PTL2_FLAGS_ARCH(aptl_1, PTL1_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
|
| - | 161 | if (aptl_1 == helper_ptl1) |
|
| - | 162 | SET_PTL1_FLAGS_ARCH(&ptl_0, PTL0_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
|
| - | 163 | } |
|
| - | 164 | if (PTL1_PRESENT(&ptl_0, page)) |
|
| - | 165 | aptl_1 = PTL1_ADDR(&ptl_0, page); |
|
| - | 166 | else { |
|
| - | 167 | SETUP_PTL1(&ptl_0, page, helper_ptl1); |
|
| - | 168 | aptl_1 = helper_ptl1; |
|
| - | 169 | } |
|
| - | 170 | ||
| - | 171 | if (PTL2_PRESENT(aptl_1, page)) |
|
| - | 172 | aptl_2 = PTL2_ADDR(aptl_1, page); |
|
| - | 173 | else { |
|
| - | 174 | SETUP_PTL2(aptl_1, page, helper_ptl2); |
|
| - | 175 | aptl_2 = helper_ptl2; |
|
| - | 176 | } |
|
| - | 177 | ||
| - | 178 | if (PTL3_PRESENT(aptl_2, page)) |
|
| - | 179 | aptl_3 = PTL3_ADDR(aptl_2, page); |
|
| - | 180 | else { |
|
| - | 181 | SETUP_PTL3(aptl_2, page, helper_ptl3); |
|
| - | 182 | aptl_3 = helper_ptl3; |
|
| - | 183 | } |
|
| - | 184 | ||
| - | 185 | SETUP_FRAME(aptl_3, page, page); |
|
| - | 186 | ||
| - | 187 | oldpage = page; |
|
| - | 188 | } |
|
| - | 189 | ||
| 105 | void page_fault(int n, istate_t *istate) |
190 | void page_fault(int n, istate_t *istate) |
| 106 | { |
191 | { |
| 107 | __address page; |
192 | __address page; |
| 108 | 193 | ||
| 109 | page = read_cr2(); |
194 | page = read_cr2(); |