Changes in kernel/arch/ia64/src/mm/tlb.c [1b20da0:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/mm/tlb.c
r1b20da0 ra35b458 61 61 uintptr_t adr; 62 62 uint32_t count1, count2, stride1, stride2; 63 63 64 64 unsigned int i, j; 65 65 66 66 adr = PAL_PTCE_INFO_BASE(); 67 67 count1 = PAL_PTCE_INFO_COUNT1(); … … 69 69 stride1 = PAL_PTCE_INFO_STRIDE1(); 70 70 stride2 = PAL_PTCE_INFO_STRIDE2(); 71 71 72 72 ipl = interrupts_disable(); 73 73 74 74 for (i = 0; i < count1; i++) { 75 75 for (j = 0; j < count2; j++) { … … 82 82 adr += stride1; 83 83 } 84 84 85 85 interrupts_restore(ipl); 86 86 87 87 srlz_d(); 88 88 srlz_i(); 89 89 90 90 #ifdef CONFIG_VHPT 91 91 vhpt_invalidate_all(); … … 110 110 int b = 0; 111 111 int c = cnt; 112 112 113 113 uintptr_t va; 114 114 va = page; 115 115 116 116 rr.word = rr_read(VA2VRN(page)); 117 117 if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(page))))) { … … 121 121 */ 122 122 region_register_t rr0; 123 123 124 124 rr0 = rr; 125 125 rr0.map.rid = ASID2RID(asid, VA2VRN(page)); … … 128 128 srlz_i(); 129 129 } 130 130 131 131 while (c >>= 1) 132 132 b++; 133 133 b >>= 1; 134 134 uint64_t ps; 135 135 136 136 switch (b) { 137 137 case 0: /* cnt 1 - 3 */ … … 172 172 break; 173 173 } 174 174 175 175 for (; va < (page + cnt * PAGE_SIZE); va += (1UL << ps)) 176 176 asm volatile ( … … 179 179 [ps] "r" (ps << 2) 180 180 ); 181 181 182 182 srlz_d(); 183 183 srlz_i(); 184 184 185 185 if (restore_rr) { 186 186 rr_write(VA2VRN(page), rr.word); … … 229 229 region_register_t rr; 230 230 bool restore_rr = false; 231 231 232 232 rr.word = rr_read(VA2VRN(va)); 233 233 if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) { … … 237 237 */ 238 238 region_register_t rr0; 239 239 240 240 rr0 = rr; 241 241 rr0.map.rid = ASID2RID(asid, VA2VRN(va)); … … 244 244 srlz_i(); 245 245 } 246 246 247 247 asm volatile ( 248 248 "mov r8 = psr ;;\n" … … 264 264 : "p6", "p7", "r8" 265 265 ); 266 266 267 267 if (restore_rr) { 268 268 rr_write(VA2VRN(va), rr.word); … … 316 316 region_register_t rr; 317 317 bool restore_rr = false; 318 318 319 319 rr.word = rr_read(VA2VRN(va)); 320 320 if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) { … … 324 324 */ 325 325 region_register_t rr0; 326 326 327 327 rr0 = rr; 328 328 rr0.map.rid = ASID2RID(asid, VA2VRN(va)); … … 331 331 srlz_i(); 332 332 } 333 333 334 334 asm volatile ( 335 335 "mov r8 = psr ;;\n" … … 352 352 : "p6", "p7", "r8" 353 353 ); 354 354 355 355 if (restore_rr) { 356 356 rr_write(VA2VRN(va), rr.word); … … 373 373 { 374 374 tlb_entry_t entry; 375 375 376 376 entry.word[0] = 0; 377 377 entry.word[1] = 0; 378 378 379 379 entry.p = true; /* present */ 380 380 entry.ma = MA_WRITEBACK; … … 385 385 entry.ppn = frame >> PPN_SHIFT; 386 386 entry.ps = PAGE_WIDTH; 387 387 388 388 if (dtr) 389 389 dtr_mapping_insert(page, ASID_KERNEL, entry, tr); … … 418 418 { 419 419 tlb_entry_t entry; 420 420 421 421 entry.word[0] = 0; 422 422 entry.word[1] = 0; 423 423 424 424 entry.p = t->p; 425 425 entry.ma = t->c ? MA_WRITEBACK : MA_UNCACHEABLE; … … 430 430 entry.ppn = t->frame >> PPN_SHIFT; 431 431 entry.ps = PAGE_WIDTH; 432 432 433 433 dtc_mapping_insert(t->page, t->as->asid, entry); 434 434 435 435 #ifdef CONFIG_VHPT 436 436 vhpt_mapping_insert(t->page, t->as->asid, entry); … … 446 446 { 447 447 tlb_entry_t entry; 448 448 449 449 entry.word[0] = 0; 450 450 entry.word[1] = 0; 451 451 452 452 assert(t->x); 453 453 454 454 entry.p = t->p; 455 455 entry.ma = t->c ? MA_WRITEBACK : MA_UNCACHEABLE; … … 459 459 entry.ppn = t->frame >> PPN_SHIFT; 460 460 entry.ps = PAGE_WIDTH; 461 461 462 462 itc_mapping_insert(t->page, t->as->asid, entry); 463 463 464 464 #ifdef CONFIG_VHPT 465 465 vhpt_mapping_insert(t->page, t->as->asid, entry); … … 486 486 uintptr_t va; 487 487 pte_t t; 488 488 489 489 va = istate->cr_ifa; /* faulting address */ 490 490 491 491 assert(!is_kernel_fault(va)); 492 492 … … 532 532 uint64_t io_page = (va & ((1 << LEGACYIO_PAGE_WIDTH) - 1)) >> 533 533 LEGACYIO_SINGLE_PAGE_WIDTH; 534 534 535 535 if (is_io_page_accessible(io_page)) { 536 536 uint64_t page, frame; 537 537 538 538 page = LEGACYIO_USER_BASE + 539 539 (1 << LEGACYIO_SINGLE_PAGE_WIDTH) * io_page; 540 540 frame = LEGACYIO_PHYS_BASE + 541 541 (1 << LEGACYIO_SINGLE_PAGE_WIDTH) * io_page; 542 542 543 543 tlb_entry_t entry; 544 544 545 545 entry.word[0] = 0; 546 546 entry.word[1] = 0; 547 547 548 548 entry.p = true; /* present */ 549 549 entry.ma = MA_UNCACHEABLE; … … 554 554 entry.ppn = frame >> PPN_SHIFT; 555 555 entry.ps = LEGACYIO_SINGLE_PAGE_WIDTH; 556 556 557 557 dtc_mapping_insert(page, TASK->as->asid, entry); 558 558 return 1; … … 563 563 } 564 564 } 565 565 566 566 return 0; 567 567 } … … 586 586 return; 587 587 } 588 588 589 589 uintptr_t va = istate->cr_ifa; /* faulting address */ 590 590 as_t *as = AS; 591 591 592 592 if (is_kernel_fault(va)) { 593 593 if (va < end_of_identity) { … … 601 601 } 602 602 } 603 604 603 604 605 605 pte_t t; 606 606 bool found = page_mapping_find(as, va, true, &t); … … 616 616 if (try_memmap_io_insertion(va, istate)) 617 617 return; 618 618 619 619 /* 620 620 * Forward the page fault to the address space page fault … … 649 649 pte_t t; 650 650 as_t *as = AS; 651 651 652 652 va = istate->cr_ifa; /* faulting address */ 653 653 654 654 if (is_kernel_fault(va)) 655 655 as = AS_KERNEL; … … 683 683 uintptr_t va; 684 684 pte_t t; 685 685 686 686 va = istate->cr_ifa; /* faulting address */ 687 687 688 688 assert(!is_kernel_fault(va)); 689 689 690 690 bool found = page_mapping_find(AS, va, true, &t); 691 691 … … 717 717 pte_t t; 718 718 as_t *as = AS; 719 719 720 720 va = istate->cr_ifa; /* faulting address */ 721 721 722 722 if (is_kernel_fault(va)) 723 723 as = AS_KERNEL; … … 755 755 uintptr_t va; 756 756 pte_t t; 757 757 758 758 va = istate->cr_ifa; /* faulting address */ 759 759 760 760 assert(!is_kernel_fault(va)); 761 761 762 762 /* 763 763 * Assume a write to a read-only page. … … 782 782 uintptr_t va; 783 783 pte_t t; 784 784 785 785 va = istate->cr_ifa; /* faulting address */ 786 786 787 787 assert(!is_kernel_fault(va)); 788 788 … … 790 790 791 791 assert(found); 792 792 793 793 if (t.p) { 794 794 /*
Note:
See TracChangeset
for help on using the changeset viewer.