Changeset 38dc82d in mainline for kernel/arch
- Timestamp:
- 2016-08-31T14:16:45Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 346b12a2
- Parents:
- dc05a9a
- Location:
- kernel/arch
- Files:
-
- 5 edited
-
ia64/src/mm/tlb.c (modified) (13 diffs)
-
mips32/src/mm/tlb.c (modified) (7 diffs)
-
ppc32/src/mm/pht.c (modified) (3 diffs)
-
sparc64/src/mm/sun4u/tlb.c (modified) (6 diffs)
-
sparc64/src/mm/sun4v/tlb.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/mm/tlb.c
rdc05a9a r38dc82d 484 484 { 485 485 uintptr_t va; 486 pte_t *t;486 pte_t t; 487 487 488 488 va = istate->cr_ifa; /* faulting address */ … … 490 490 ASSERT(!is_kernel_fault(va)); 491 491 492 t = page_mapping_find(AS, va, true);493 if ( t) {492 bool found = page_mapping_find(AS, va, true, &t); 493 if (found) { 494 494 /* 495 495 * The mapping was found in software page hash table. 496 496 * Insert it into data translation cache. 497 497 */ 498 itc_pte_copy( t);498 itc_pte_copy(&t); 499 499 } else { 500 500 /* … … 600 600 601 601 602 pte_t *entry = page_mapping_find(as, va, true); 603 if (entry) { 602 pte_t t; 603 bool found = page_mapping_find(as, va, true, &t); 604 if (found) { 604 605 /* 605 606 * The mapping was found in the software page hash table. 606 607 * Insert it into data translation cache. 607 608 */ 608 dtc_pte_copy( entry);609 dtc_pte_copy(&t); 609 610 } else { 610 611 if (try_memmap_io_insertion(va, istate)) … … 641 642 { 642 643 uintptr_t va; 643 pte_t *t;644 pte_t t; 644 645 as_t *as = AS; 645 646 … … 649 650 as = AS_KERNEL; 650 651 651 t = page_mapping_find(as, va, true); 652 ASSERT((t) && (t->p)); 653 if ((t) && (t->p) && (t->w)) { 652 bool found = page_mapping_find(as, va, true, &t); 653 654 ASSERT(found); 655 ASSERT(t.p); 656 657 if (found && t.p && t.w) { 654 658 /* 655 659 * Update the Dirty bit in page tables and reinsert 656 660 * the mapping into DTC. 657 661 */ 658 t ->d = true;659 dtc_pte_copy( t);662 t.d = true; 663 dtc_pte_copy(&t); 660 664 } else { 661 665 as_page_fault(va, PF_ACCESS_WRITE, istate); … … 672 676 { 673 677 uintptr_t va; 674 pte_t *t;678 pte_t t; 675 679 676 680 va = istate->cr_ifa; /* faulting address */ … … 678 682 ASSERT(!is_kernel_fault(va)); 679 683 680 t = page_mapping_find(AS, va, true); 681 ASSERT((t) && (t->p)); 682 if ((t) && (t->p) && (t->x)) { 684 bool found = page_mapping_find(AS, va, true, &t); 685 686 ASSERT(found); 687 ASSERT(t.p); 688 689 if (found && t.p && t.x) { 683 690 /* 684 691 * Update the Accessed bit in page tables and reinsert 685 692 * the mapping into ITC. 686 693 */ 687 t ->a = true;688 itc_pte_copy( t);694 t.a = true; 695 itc_pte_copy(&t); 689 696 } else { 690 697 as_page_fault(va, PF_ACCESS_EXEC, istate); … … 701 708 { 702 709 uintptr_t va; 703 pte_t *t;710 pte_t t; 704 711 as_t *as = AS; 705 712 … … 709 716 as = AS_KERNEL; 710 717 711 t = page_mapping_find(as, va, true); 712 ASSERT((t) && (t->p)); 713 if ((t) && (t->p)) { 718 bool found = page_mapping_find(as, va, true, &t); 719 720 ASSERT(found); 721 ASSERT(t.p); 722 723 if (found && t.p) { 714 724 /* 715 725 * Update the Accessed bit in page tables and reinsert 716 726 * the mapping into DTC. 717 727 */ 718 t ->a = true;719 dtc_pte_copy( t);728 t.a = true; 729 dtc_pte_copy(&t); 720 730 } else { 721 731 if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { … … 736 746 { 737 747 uintptr_t va; 738 pte_t *t;748 pte_t t; 739 749 740 750 va = istate->cr_ifa; /* faulting address */ … … 745 755 * Assume a write to a read-only page. 746 756 */ 747 t = page_mapping_find(AS, va, true); 748 ASSERT((t) && (t->p)); 749 ASSERT(!t->w); 757 bool found = page_mapping_find(AS, va, true, &t); 758 759 ASSERT(found); 760 ASSERT(t.p); 761 ASSERT(!t.w); 762 750 763 as_page_fault(va, PF_ACCESS_WRITE, istate); 751 764 } … … 760 773 { 761 774 uintptr_t va; 762 pte_t *t;775 pte_t t; 763 776 764 777 va = istate->cr_ifa; /* faulting address */ … … 766 779 ASSERT(!is_kernel_fault(va)); 767 780 768 t = page_mapping_find(AS, va, true); 769 ASSERT(t); 770 771 if (t->p) { 781 bool found = page_mapping_find(AS, va, true, &t); 782 783 ASSERT(found); 784 785 if (t.p) { 772 786 /* 773 787 * If the Present bit is set in page hash table, just copy it 774 788 * and update ITC/DTC. 775 789 */ 776 if (t ->x)777 itc_pte_copy( t);790 if (t.x) 791 itc_pte_copy(&t); 778 792 else 779 dtc_pte_copy( t);793 dtc_pte_copy(&t); 780 794 } else { 781 795 as_page_fault(va, PF_ACCESS_READ, istate); -
kernel/arch/mips32/src/mm/tlb.c
rdc05a9a r38dc82d 97 97 entry_lo_t lo; 98 98 uintptr_t badvaddr; 99 pte_t *pte;99 pte_t pte; 100 100 101 101 badvaddr = cp0_badvaddr_read(); 102 102 103 pte = page_mapping_find(AS, badvaddr, true);104 if ( pte && pte->p) {103 bool found = page_mapping_find(AS, badvaddr, true, &pte); 104 if (found && pte.p) { 105 105 /* 106 106 * Record access to PTE. 107 107 */ 108 pte ->a = 1;109 110 tlb_prepare_entry_lo(&lo, pte ->g, pte->p, pte->d,111 pte ->cacheable, pte->pfn);108 pte.a = 1; 109 110 tlb_prepare_entry_lo(&lo, pte.g, pte.p, pte.d, 111 pte.cacheable, pte.pfn); 112 112 113 113 /* … … 138 138 tlb_index_t index; 139 139 uintptr_t badvaddr; 140 pte_t *pte;140 pte_t pte; 141 141 142 142 /* … … 162 162 badvaddr = cp0_badvaddr_read(); 163 163 164 pte = page_mapping_find(AS, badvaddr, true);165 if ( pte && pte->p) {164 bool found = page_mapping_find(AS, badvaddr, true, &pte); 165 if (found && pte.p) { 166 166 /* 167 167 * Read the faulting TLB entry. … … 172 172 * Record access to PTE. 173 173 */ 174 pte ->a = 1;175 176 tlb_prepare_entry_lo(&lo, pte ->g, pte->p, pte->d,177 pte ->cacheable, pte->pfn);174 pte.a = 1; 175 176 tlb_prepare_entry_lo(&lo, pte.g, pte.p, pte.d, 177 pte.cacheable, pte.pfn); 178 178 179 179 /* … … 200 200 tlb_index_t index; 201 201 uintptr_t badvaddr; 202 pte_t *pte;202 pte_t pte; 203 203 204 204 badvaddr = cp0_badvaddr_read(); … … 224 224 } 225 225 226 pte = page_mapping_find(AS, badvaddr, true);227 if ( pte && pte->p && pte->w) {226 bool found = page_mapping_find(AS, badvaddr, true, &pte); 227 if (found && pte.p && pte.w) { 228 228 /* 229 229 * Read the faulting TLB entry. … … 234 234 * Record access and write to PTE. 235 235 */ 236 pte ->a = 1;237 pte ->d = 1;238 239 tlb_prepare_entry_lo(&lo, pte ->g, pte->p, pte->w,240 pte ->cacheable, pte->pfn);236 pte.a = 1; 237 pte.d = 1; 238 239 tlb_prepare_entry_lo(&lo, pte.g, pte.p, pte.w, 240 pte.cacheable, pte.pfn); 241 241 242 242 /* -
kernel/arch/ppc32/src/mm/pht.c
rdc05a9a r38dc82d 49 49 * @param access Access mode that caused the fault. 50 50 * @param istate Pointer to interrupted state. 51 * 52 * @return PTE on success, NULL otherwise. 53 * 54 */ 55 static pte_t *find_mapping_and_check(as_t *as, uintptr_t badvaddr, int access, 56 istate_t *istate) 51 * @param[out] pte Structure that will receive a copy of the found PTE. 52 * 53 * @return True if the mapping was found, false otherwise. 54 * 55 */ 56 static bool find_mapping_and_check(as_t *as, uintptr_t badvaddr, int access, 57 istate_t *istate, pte_t *pte) 57 58 { 58 59 /* 59 60 * Check if the mapping exists in page tables. 60 61 */ 61 pte_t *pte = page_mapping_find(as, badvaddr, true);62 if ( (pte) && (pte->present)) {62 bool found = page_mapping_find(as, badvaddr, true, pte); 63 if (found && pte->present) { 63 64 /* 64 65 * Mapping found in page tables. 65 66 * Immediately succeed. 66 67 */ 67 return pte;68 return true; 68 69 } 69 70 /* … … 76 77 * The mapping ought to be in place. 77 78 */ 78 pte = page_mapping_find(as, badvaddr, true); 79 ASSERT((pte) && (pte->present)); 80 return pte; 81 } 82 83 return NULL; 79 found = page_mapping_find(as, badvaddr, true, pte); 80 81 ASSERT(found); 82 ASSERT(pte->present); 83 84 return found; 85 } 86 87 return false; 84 88 } 85 89 … … 182 186 badvaddr = istate->pc; 183 187 184 pte_t *pte = find_mapping_and_check(AS, badvaddr, 185 PF_ACCESS_READ /* FIXME */, istate); 186 187 if (pte) { 188 pte_t pte; 189 bool found = find_mapping_and_check(AS, badvaddr, 190 PF_ACCESS_READ /* FIXME */, istate, &pte); 191 192 if (found) { 188 193 /* Record access to PTE */ 189 pte ->accessed = 1;190 pht_insert(badvaddr, pte);194 pte.accessed = 1; 195 pht_insert(badvaddr, &pte); 191 196 } 192 197 } -
kernel/arch/sparc64/src/mm/sun4u/tlb.c
rdc05a9a r38dc82d 197 197 { 198 198 size_t index = (istate->tpc >> MMU_PAGE_WIDTH) % MMU_PAGES_PER_PAGE; 199 pte_t *t;200 201 t = page_mapping_find(AS, istate->tpc, true);202 if ( t && PTE_EXECUTABLE(t)) {199 pte_t t; 200 201 bool found = page_mapping_find(AS, istate->tpc, true, &t); 202 if (found && PTE_EXECUTABLE(&t)) { 203 203 /* 204 204 * The mapping was found in the software page hash table. 205 205 * Insert it into ITLB. 206 206 */ 207 t ->a = true;208 itlb_pte_copy( t, index);207 t.a = true; 208 itlb_pte_copy(&t, index); 209 209 #ifdef CONFIG_TSB 210 itsb_pte_copy( t, index);210 itsb_pte_copy(&t, index); 211 211 #endif 212 212 } else { … … 233 233 uintptr_t page_16k; 234 234 size_t index; 235 pte_t *t;235 pte_t t; 236 236 as_t *as = AS; 237 237 … … 253 253 } 254 254 255 t = page_mapping_find(as, page_16k, true);256 if ( t) {255 bool found = page_mapping_find(as, page_16k, true, &t); 256 if (found) { 257 257 /* 258 258 * The mapping was found in the software page hash table. 259 259 * Insert it into DTLB. 260 260 */ 261 t ->a = true;262 dtlb_pte_copy( t, index, true);261 t.a = true; 262 dtlb_pte_copy(&t, index, true); 263 263 #ifdef CONFIG_TSB 264 dtsb_pte_copy( t, index, true);264 dtsb_pte_copy(&t, index, true); 265 265 #endif 266 266 } else { … … 283 283 uintptr_t page_16k; 284 284 size_t index; 285 pte_t *t;285 pte_t t; 286 286 as_t *as = AS; 287 287 … … 293 293 as = AS_KERNEL; 294 294 295 t = page_mapping_find(as, page_16k, true);296 if ( t && PTE_WRITABLE(t)) {295 bool found = page_mapping_find(as, page_16k, true, &t); 296 if (found && PTE_WRITABLE(&t)) { 297 297 /* 298 298 * The mapping was found in the software page hash table and is … … 300 300 * into DTLB. 301 301 */ 302 t ->a = true;303 t ->d = true;302 t.a = true; 303 t.d = true; 304 304 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_SECONDARY, 305 305 page_16k + index * MMU_PAGE_SIZE); 306 dtlb_pte_copy( t, index, false);306 dtlb_pte_copy(&t, index, false); 307 307 #ifdef CONFIG_TSB 308 dtsb_pte_copy( t, index, false);308 dtsb_pte_copy(&t, index, false); 309 309 #endif 310 310 } else { -
kernel/arch/sparc64/src/mm/sun4v/tlb.c
rdc05a9a r38dc82d 211 211 { 212 212 uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE); 213 pte_t *t; 214 215 t = page_mapping_find(AS, va, true); 216 217 if (t && PTE_EXECUTABLE(t)) { 213 pte_t t; 214 215 bool found = page_mapping_find(AS, va, true, &t); 216 if (found && PTE_EXECUTABLE(&t)) { 218 217 /* 219 218 * The mapping was found in the software page hash table. 220 219 * Insert it into ITLB. 221 220 */ 222 t ->a = true;223 itlb_pte_copy( t);221 t.a = true; 222 itlb_pte_copy(&t); 224 223 #ifdef CONFIG_TSB 225 itsb_pte_copy( t);224 itsb_pte_copy(&t); 226 225 #endif 227 226 } else { … … 244 243 void fast_data_access_mmu_miss(unsigned int tt, istate_t *istate) 245 244 { 246 pte_t *t;245 pte_t t; 247 246 uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access); 248 247 uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access); … … 261 260 } 262 261 263 t = page_mapping_find(as, va, true);264 if ( t) {262 bool found = page_mapping_find(as, va, true, &t); 263 if (found) { 265 264 /* 266 265 * The mapping was found in the software page hash table. 267 266 * Insert it into DTLB. 268 267 */ 269 t ->a = true;270 dtlb_pte_copy( t, true);268 t.a = true; 269 dtlb_pte_copy(&t, true); 271 270 #ifdef CONFIG_TSB 272 dtsb_pte_copy( t, true);271 dtsb_pte_copy(&t, true); 273 272 #endif 274 273 } else { … … 288 287 void fast_data_access_protection(unsigned int tt, istate_t *istate) 289 288 { 290 pte_t *t;289 pte_t t; 291 290 uintptr_t va = DMISS_ADDRESS(istate->tlb_tag_access); 292 291 uint16_t ctx = DMISS_CONTEXT(istate->tlb_tag_access); … … 296 295 as = AS_KERNEL; 297 296 298 t = page_mapping_find(as, va, true);299 if ( t && PTE_WRITABLE(t)) {297 bool found = page_mapping_find(as, va, true, &t); 298 if (found && PTE_WRITABLE(&t)) { 300 299 /* 301 300 * The mapping was found in the software page hash table and is … … 303 302 * into DTLB. 304 303 */ 305 t ->a = true;306 t ->d = true;304 t.a = true; 305 t.d = true; 307 306 mmu_demap_page(va, ctx, MMU_FLAG_DTLB); 308 dtlb_pte_copy( t, false);307 dtlb_pte_copy(&t, false); 309 308 #ifdef CONFIG_TSB 310 dtsb_pte_copy( t, false);309 dtsb_pte_copy(&t, false); 311 310 #endif 312 311 } else {
Note:
See TracChangeset
for help on using the changeset viewer.
