Ignore:
File:
1 edited

Legend:

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

    re08162b r9d58539  
    4242#include <debug.h>
    4343
     44#define TSB_INDEX_MASK  ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1)
     45
    4446/** Invalidate portion of TSB.
    4547 *
     
    5860        size_t cnt;
    5961       
    60         ASSERT(as->arch.itsb);
    61         ASSERT(as->arch.dtsb);
     62        ASSERT(as->arch.itsb && as->arch.dtsb);
    6263       
    63         i0 = (page >> MMU_PAGE_WIDTH) & ITSB_ENTRY_MASK;
     64        i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
     65        ASSERT(i0 < ITSB_ENTRY_COUNT && i0 < DTSB_ENTRY_COUNT);
    6466
    6567        if (pages == (size_t) -1 || (pages * 2) > ITSB_ENTRY_COUNT)
     
    6971       
    7072        for (i = 0; i < cnt; i++) {
    71                 as->arch.itsb[(i0 + i) & ITSB_ENTRY_MASK].tag.invalid = true;
    72                 as->arch.dtsb[(i0 + i) & DTSB_ENTRY_MASK].tag.invalid = true;
     73                as->arch.itsb[(i0 + i) & (ITSB_ENTRY_COUNT - 1)].tag.invalid =
     74                    true;
     75                as->arch.dtsb[(i0 + i) & (DTSB_ENTRY_COUNT - 1)].tag.invalid =
     76                    true;
    7377        }
    7478}
     
    8286{
    8387        as_t *as;
    84         tsb_entry_t *tte;
     88        tsb_entry_t *tsb;
    8589        size_t entry;
    8690
     
    8892       
    8993        as = t->as;
    90         entry = ((t->page >> MMU_PAGE_WIDTH) + index) & ITSB_ENTRY_MASK;
    91         tte = &as->arch.itsb[entry];
     94        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
     95        ASSERT(entry < ITSB_ENTRY_COUNT);
     96        tsb = &as->arch.itsb[entry];
    9297
    9398        /*
     
    97102         */
    98103
    99         tte->tag.invalid = true;        /* invalidate the entry
     104        tsb->tag.invalid = true;        /* invalidate the entry
    100105                                         * (tag target has this
    101106                                         * set to 0) */
     
    103108        write_barrier();
    104109
    105         tte->tag.context = as->asid;
     110        tsb->tag.context = as->asid;
    106111        /* the shift is bigger than PAGE_WIDTH, do not bother with index  */
    107         tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    108         tte->data.value = 0;
    109         tte->data.size = PAGESIZE_8K;
    110         tte->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
    111         tte->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
    112         tte->data.p = t->k;     /* p as privileged, k as kernel */
    113         tte->data.v = t->p;     /* v as valid, p as present */
     112        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     113        tsb->data.value = 0;
     114        tsb->data.size = PAGESIZE_8K;
     115        tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
     116        tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
     117        tsb->data.p = t->k;     /* p as privileged, k as kernel */
     118        tsb->data.v = t->p;     /* v as valid, p as present */
    114119       
    115120        write_barrier();
    116121       
    117         tte->tag.invalid = false;       /* mark the entry as valid */
     122        tsb->tag.invalid = false;       /* mark the entry as valid */
    118123}
    119124
     
    127132{
    128133        as_t *as;
    129         tsb_entry_t *tte;
     134        tsb_entry_t *tsb;
    130135        size_t entry;
    131136       
     
    133138
    134139        as = t->as;
    135         entry = ((t->page >> MMU_PAGE_WIDTH) + index) & DTSB_ENTRY_MASK;
    136         tte = &as->arch.dtsb[entry];
     140        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
     141        ASSERT(entry < DTSB_ENTRY_COUNT);
     142        tsb = &as->arch.dtsb[entry];
    137143
    138144        /*
     
    142148         */
    143149
    144         tte->tag.invalid = true;        /* invalidate the entry
     150        tsb->tag.invalid = true;        /* invalidate the entry
    145151                                         * (tag target has this
    146152                                         * set to 0) */
     
    148154        write_barrier();
    149155
    150         tte->tag.context = as->asid;
     156        tsb->tag.context = as->asid;
    151157        /* the shift is bigger than PAGE_WIDTH, do not bother with index */
    152         tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    153         tte->data.value = 0;
    154         tte->data.size = PAGESIZE_8K;
    155         tte->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
    156         tte->data.cp = t->c;
     158        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     159        tsb->data.value = 0;
     160        tsb->data.size = PAGESIZE_8K;
     161        tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
     162        tsb->data.cp = t->c;
    157163#ifdef CONFIG_VIRT_IDX_DCACHE
    158         tte->data.cv = t->c;
     164        tsb->data.cv = t->c;
    159165#endif /* CONFIG_VIRT_IDX_DCACHE */
    160         tte->data.p = t->k;             /* p as privileged */
    161         tte->data.w = ro ? false : t->w;
    162         tte->data.v = t->p;
     166        tsb->data.p = t->k;             /* p as privileged */
     167        tsb->data.w = ro ? false : t->w;
     168        tsb->data.v = t->p;
    163169       
    164170        write_barrier();
    165171       
    166         tte->tag.invalid = false;       /* mark the entry as valid */
     172        tsb->tag.invalid = false;       /* mark the entry as valid */
    167173}
    168174
Note: See TracChangeset for help on using the changeset viewer.