Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/mm/tlb.c

    r1dbc43f r9d58539  
    113113        va = page;
    114114       
    115         rr.word = rr_read(VA2VRN(page));
    116         if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(page))))) {
     115        rr.word = rr_read(VA2VRN(va));
     116        if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) {
    117117                /*
    118118                 * The selected region register does not contain required RID.
     
    122122               
    123123                rr0 = rr;
    124                 rr0.map.rid = ASID2RID(asid, VA2VRN(page));
    125                 rr_write(VA2VRN(page), rr0.word);
     124                rr0.map.rid = ASID2RID(asid, VA2VRN(va));
     125                rr_write(VA2VRN(va), rr0.word);
    126126                srlz_d();
    127127                srlz_i();
     
    139139        case 1: /* cnt 4 - 15 */
    140140                ps = PAGE_WIDTH + 2;
    141                 va &= ~((1UL << ps) - 1);
     141                va &= ~((1 << ps) - 1);
    142142                break;
    143143        case 2: /* cnt 16 - 63 */
    144144                ps = PAGE_WIDTH + 4;
    145                 va &= ~((1UL << ps) - 1);
     145                va &= ~((1 << ps) - 1);
    146146                break;
    147147        case 3: /* cnt 64 - 255 */
    148148                ps = PAGE_WIDTH + 6;
    149                 va &= ~((1UL << ps) - 1);
     149                va &= ~((1 << ps) - 1);
    150150                break;
    151151        case 4: /* cnt 256 - 1023 */
    152152                ps = PAGE_WIDTH + 8;
    153                 va &= ~((1UL << ps) - 1);
     153                va &= ~((1 << ps) - 1);
    154154                break;
    155155        case 5: /* cnt 1024 - 4095 */
    156156                ps = PAGE_WIDTH + 10;
    157                 va &= ~((1UL << ps) - 1);
     157                va &= ~((1 << ps) - 1);
    158158                break;
    159159        case 6: /* cnt 4096 - 16383 */
    160160                ps = PAGE_WIDTH + 12;
    161                 va &= ~((1UL << ps) - 1);
     161                va &= ~((1 << ps) - 1);
    162162                break;
    163163        case 7: /* cnt 16384 - 65535 */
    164164        case 8: /* cnt 65536 - (256K - 1) */
    165165                ps = PAGE_WIDTH + 14;
    166                 va &= ~((1UL << ps) - 1);
     166                va &= ~((1 << ps) - 1);
    167167                break;
    168168        default:
    169169                ps = PAGE_WIDTH + 18;
    170                 va &= ~((1UL << ps) - 1);
     170                va &= ~((1 << ps) - 1);
    171171                break;
    172172        }
    173173       
    174         for (; va < (page + cnt * PAGE_SIZE); va += (1UL << ps))
     174        for (; va < (page + cnt * PAGE_SIZE); va += (1 << ps))
    175175                asm volatile (
    176176                        "ptc.l %[va], %[ps] ;;"
     
    183183       
    184184        if (restore_rr) {
    185                 rr_write(VA2VRN(page), rr.word);
     185                rr_write(VA2VRN(va), rr.word);
    186186                srlz_d();
    187187                srlz_i();
     
    501501                 * Forward the page fault to address space page fault handler.
    502502                 */
    503                 as_page_fault(va, PF_ACCESS_EXEC, istate);
     503                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
     504                        fault_if_from_uspace(istate, "Page fault at %p.",
     505                            (void *) va);
     506                        panic_memtrap(istate, PF_ACCESS_EXEC, va, NULL);
     507                }
    504508        }
    505509}
     
    615619                 * handler.
    616620                 */
    617                 as_page_fault(va, PF_ACCESS_READ, istate);
     621                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
     622                        fault_if_from_uspace(istate, "Page fault at %p.",
     623                            (void *) va);
     624                        panic_memtrap(istate, PF_ACCESS_UNKNOWN, va, NULL);
     625                }
    618626        }
    619627}
     
    659667                dtc_pte_copy(t);
    660668        } else {
    661                 as_page_fault(va, PF_ACCESS_WRITE, istate);
     669                if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
     670                        fault_if_from_uspace(istate, "Page fault at %p.",
     671                            (void *) va);
     672                        panic_memtrap(istate, PF_ACCESS_WRITE, va, NULL);
     673                }
    662674        }
    663675}
     
    688700                itc_pte_copy(t);
    689701        } else {
    690                 as_page_fault(va, PF_ACCESS_EXEC, istate);
     702                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
     703                        fault_if_from_uspace(istate, "Page fault at %p.",
     704                            (void *) va);
     705                        panic_memtrap(istate, PF_ACCESS_EXEC, va, NULL);
     706                }
    691707        }
    692708}
     
    748764        ASSERT((t) && (t->p));
    749765        ASSERT(!t->w);
    750         as_page_fault(va, PF_ACCESS_WRITE, istate);
     766        if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
     767                fault_if_from_uspace(istate, "Page fault at %p.",
     768                    (void *) va);
     769                panic_memtrap(istate, PF_ACCESS_WRITE, va, NULL);
     770        }
    751771}
    752772
     
    779799                        dtc_pte_copy(t);
    780800        } else {
    781                 as_page_fault(va, PF_ACCESS_READ, istate);
     801                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
     802                        fault_if_from_uspace(istate, "Page fault at %p.",
     803                            (void *) va);
     804                        panic_memtrap(istate, PF_ACCESS_UNKNOWN, va, NULL);
     805                }
    782806        }
    783807}
Note: See TracChangeset for help on using the changeset viewer.