Changeset dabe6333 in mainline for arch/amd64/src/interrupt.c
- Timestamp:
- 2006-03-16T15:56:40Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1ee9ced
- Parents:
- 37e7d2b9
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/interrupt.c
r37e7d2b9 rdabe6333 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 190 void page_fault(int n, istate_t *istate) 106 191 {
Note:
See TracChangeset
for help on using the changeset viewer.