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(); |