Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/mm/sun4v/tsb.c

    re08162b r9d58539  
    4444#include <debug.h>
    4545
     46#define TSB_INDEX_MASK  ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1)
     47
    4648/** Invalidate portion of TSB.
    4749 *
     
    5658void tsb_invalidate(as_t *as, uintptr_t page, size_t pages)
    5759{
    58         tsb_entry_t *tsb;
    5960        size_t i0, i;
    6061        size_t cnt;
     
    6263        ASSERT(as->arch.tsb_description.tsb_base);
    6364       
    64         i0 = (page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK;
     65        i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
     66        ASSERT(i0 < TSB_ENTRY_COUNT);
    6567
    66         if (pages == (size_t) -1 || pages > TSB_ENTRY_COUNT)
     68        if (pages == (size_t) - 1 || (pages) > TSB_ENTRY_COUNT)
    6769                cnt = TSB_ENTRY_COUNT;
    6870        else
    6971                cnt = pages;
    7072       
    71         tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base);
    72         for (i = 0; i < cnt; i++)
    73                 tsb[(i0 + i) & TSB_ENTRY_MASK].data.v = false;
     73        for (i = 0; i < cnt; i++) {
     74                ((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[
     75                        (i0 + i) & (TSB_ENTRY_COUNT - 1)].data.v = false;
     76        }
    7477}
    7578
     
    8285        as_t *as;
    8386        tsb_entry_t *tsb;
    84         tsb_entry_t *tte;
    85         size_t index;
     87        size_t entry;
    8688
    8789        as = t->as;
    88         index = (t->page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK;
    89        
    90         tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base);
    91         tte = &tsb[index];
     90        entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
     91        ASSERT(entry < TSB_ENTRY_COUNT);
     92        tsb = &((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[entry];
    9293
    9394        /*
     
    9798         */
    9899
    99         tte->data.v = false;
     100        tsb->data.v = false;
    100101
    101102        write_barrier();
    102103
    103         tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     104        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    104105
    105         tte->data.value = 0;
    106         tte->data.nfo = false;
    107         tte->data.ra = t->frame >> MMU_FRAME_WIDTH;
    108         tte->data.ie = false;
    109         tte->data.e = false;
    110         tte->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
    111         tte->data.cv = false;
    112         tte->data.p = t->k;     /* p as privileged, k as kernel */
    113         tte->data.x = true;
    114         tte->data.w = false;
    115         tte->data.size = PAGESIZE_8K;
     106        tsb->data.value = 0;
     107        tsb->data.nfo = false;
     108        tsb->data.ra = t->frame >> MMU_FRAME_WIDTH;
     109        tsb->data.ie = false;
     110        tsb->data.e = false;
     111        tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
     112        tsb->data.cv = false;
     113        tsb->data.p = t->k;     /* p as privileged, k as kernel */
     114        tsb->data.x = true;
     115        tsb->data.w = false;
     116        tsb->data.size = PAGESIZE_8K;
    116117       
    117118        write_barrier();
    118119       
    119         tte->data.v = t->p;     /* v as valid, p as present */
     120        tsb->data.v = t->p;     /* v as valid, p as present */
    120121}
    121122
     
    129130        as_t *as;
    130131        tsb_entry_t *tsb;
    131         tsb_entry_t *tte;
    132         size_t index;
     132        size_t entry;
    133133
    134134        as = t->as;
    135         index = (t->page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK;
    136         tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base);
    137         tte = &tsb[index];
     135        entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
     136        ASSERT(entry < TSB_ENTRY_COUNT);
     137        tsb = &((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[entry];
    138138
    139139        /*
     
    143143         */
    144144
    145         tte->data.v = false;
     145        tsb->data.v = false;
    146146
    147147        write_barrier();
    148148
    149         tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     149        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    150150
    151         tte->data.value = 0;
    152         tte->data.nfo = false;
    153         tte->data.ra = t->frame >> MMU_FRAME_WIDTH;
    154         tte->data.ie = false;
    155         tte->data.e = false;
    156         tte->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
     151        tsb->data.value = 0;
     152        tsb->data.nfo = false;
     153        tsb->data.ra = t->frame >> MMU_FRAME_WIDTH;
     154        tsb->data.ie = false;
     155        tsb->data.e = false;
     156        tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
    157157#ifdef CONFIG_VIRT_IDX_DCACHE
    158         tte->data.cv = t->c;
     158        tsb->data.cv = t->c;
    159159#endif /* CONFIG_VIRT_IDX_DCACHE */
    160         tte->data.p = t->k;     /* p as privileged, k as kernel */
    161         tte->data.x = true;
    162         tte->data.w = ro ? false : t->w;
    163         tte->data.size = PAGESIZE_8K;
     160        tsb->data.p = t->k;     /* p as privileged, k as kernel */
     161        tsb->data.x = true;
     162        tsb->data.w = ro ? false : t->w;
     163        tsb->data.size = PAGESIZE_8K;
    164164       
    165165        write_barrier();
    166166       
    167         tte->data.v = t->p;     /* v as valid, p as present */
     167        tsb->data.v = t->p;     /* v as valid, p as present */
    168168}
    169169
Note: See TracChangeset for help on using the changeset viewer.