Ignore:
File:
1 edited

Legend:

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

    r59fb782 r346b12a2  
    4343#include <synch/mutex.h>
    4444#include <print.h>
     45#include <log.h>
    4546#include <debug.h>
    4647#include <align.h>
     
    4849#include <symtab.h>
    4950
    50 #define PFN_SHIFT       12
    51 #define VPN_SHIFT       12
    52 #define ADDR2VPN(a)     ((a) >> VPN_SHIFT)
    53 #define ADDR2VPN2(a)    (ADDR2VPN((a)) >> 1)
    54 #define VPN2ADDR(vpn)   ((vpn) << VPN_SHIFT)
    55 #define VPN22ADDR(vpn2) (VPN2ADDR(vpn2) << 1)
    56 #define PFN2ADDR(pfn)   ((pfn) << PFN_SHIFT)
    57 
    58 #define BANK_SELECT_BIT(a)      (((a) >> PAGE_WIDTH) & 1)
    59        
     51#define PFN_SHIFT  12
     52#define VPN_SHIFT  12
     53
     54#define ADDR2HI_VPN(a)   ((a) >> VPN_SHIFT)
     55#define ADDR2HI_VPN2(a)  (ADDR2HI_VPN((a)) >> 1)
     56
     57#define HI_VPN2ADDR(vpn)    ((vpn) << VPN_SHIFT)
     58#define HI_VPN22ADDR(vpn2)  (HI_VPN2ADDR(vpn2) << 1)
     59
     60#define LO_PFN2ADDR(pfn)  ((pfn) << PFN_SHIFT)
     61
     62#define BANK_SELECT_BIT(a)  (((a) >> PAGE_WIDTH) & 1)
    6063
    6164/** Initialize TLB.
     
    9497        entry_lo_t lo;
    9598        uintptr_t badvaddr;
    96         pte_t *pte;
     99        pte_t pte;
    97100       
    98101        badvaddr = cp0_badvaddr_read();
    99102
    100         pte = page_mapping_find(AS, badvaddr, true);
    101         if (pte && pte->p) {
     103        bool found = page_mapping_find(AS, badvaddr, true, &pte);
     104        if (found && pte.p) {
    102105                /*
    103106                 * Record access to PTE.
    104107                 */
    105                 pte->a = 1;
    106 
    107                 tlb_prepare_entry_lo(&lo, pte->g, pte->p, pte->d,
    108                     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
     113                page_mapping_update(AS, badvaddr, true, &pte);
    109114
    110115                /*
     
    135140        tlb_index_t index;
    136141        uintptr_t badvaddr;
    137         pte_t *pte;
     142        pte_t pte;
    138143
    139144        /*
     
    159164        badvaddr = cp0_badvaddr_read();
    160165
    161         pte = page_mapping_find(AS, badvaddr, true);
    162         if (pte && pte->p) {
     166        bool found = page_mapping_find(AS, badvaddr, true, &pte);
     167        if (found && pte.p) {
    163168                /*
    164169                 * Read the faulting TLB entry.
     
    169174                 * Record access to PTE.
    170175                 */
    171                 pte->a = 1;
    172 
    173                 tlb_prepare_entry_lo(&lo, pte->g, pte->p, pte->d,
    174                     pte->cacheable, pte->pfn);
     176                pte.a = 1;
     177
     178                tlb_prepare_entry_lo(&lo, pte.g, pte.p, pte.d,
     179                    pte.cacheable, pte.pfn);
     180
     181                page_mapping_update(AS, badvaddr, true, &pte);
    175182
    176183                /*
     
    197204        tlb_index_t index;
    198205        uintptr_t badvaddr;
    199         pte_t *pte;
     206        pte_t pte;
    200207
    201208        badvaddr = cp0_badvaddr_read();
     
    215222         */
    216223        if (index.p) {
    217                 printf("%s: TLBP failed in exception handler (badvaddr=%#"
     224                log(LF_ARCH, LVL_WARN, "%s: TLBP failed in exception handler (badvaddr=%#"
    218225                    PRIxn ", ASID=%d).\n", __func__, badvaddr,
    219226                    AS ? AS->asid : -1);
     
    221228        }
    222229
    223         pte = page_mapping_find(AS, badvaddr, true);
    224         if (pte && pte->p && pte->w) {
     230        bool found = page_mapping_find(AS, badvaddr, true, &pte);
     231        if (found && pte.p && pte.w) {
    225232                /*
    226233                 * Read the faulting TLB entry.
     
    231238                 * Record access and write to PTE.
    232239                 */
    233                 pte->a = 1;
    234                 pte->d = 1;
    235 
    236                 tlb_prepare_entry_lo(&lo, pte->g, pte->p, pte->w,
    237                     pte->cacheable, pte->pfn);
     240                pte.a = 1;
     241                pte.d = 1;
     242
     243                tlb_prepare_entry_lo(&lo, pte.g, pte.p, pte.w,
     244                    pte.cacheable, pte.pfn);
     245
     246                page_mapping_update(AS, badvaddr, true, &pte);
    238247
    239248                /*
     
    266275{
    267276        hi->value = 0;
    268         hi->vpn2 = ADDR2VPN2(ALIGN_DOWN(addr, PAGE_SIZE));
     277        hi->vpn2 = ADDR2HI_VPN2(ALIGN_DOWN(addr, PAGE_SIZE));
    269278        hi->asid = asid;
    270279}
     
    295304               
    296305                printf("%-4u %-6u %0#10x %-#6x  %1u%1u%1u%1u  %0#10x\n",
    297                     i, hi.asid, VPN22ADDR(hi.vpn2), mask.mask,
    298                     lo0.g, lo0.v, lo0.d, lo0.c, PFN2ADDR(lo0.pfn));
     306                    i, hi.asid, HI_VPN22ADDR(hi.vpn2), mask.mask,
     307                    lo0.g, lo0.v, lo0.d, lo0.c, LO_PFN2ADDR(lo0.pfn));
    299308                printf("                               %1u%1u%1u%1u  %0#10x\n",
    300                     lo1.g, lo1.v, lo1.d, lo1.c, PFN2ADDR(lo1.pfn));
     309                    lo1.g, lo1.v, lo1.d, lo1.c, LO_PFN2ADDR(lo1.pfn));
    301310        }
    302311       
Note: See TracChangeset for help on using the changeset viewer.