Ignore:
Timestamp:
2016-01-07T13:41:38Z (8 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f4582c6
Parents:
7254df6
Message:

sparc64: TSB needs to be naturally aligned

The ITSB and DTSB on sun4u and the TSB on sun4v are mapped by a single
64K page, so they need to be aligned to 64K. Moreover, the TSB pointer
contruction demands the natural alignment: 32K for ITSB/DTSB on sun4u
and 64K for the unified TSB on sun4v.

The code was also streamlined and made more beautiful.

File:
1 edited

Legend:

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

    r7254df6 re08162b  
    4444#include <debug.h>
    4545
    46 #define TSB_INDEX_MASK  ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1)
    47 
    4846/** Invalidate portion of TSB.
    4947 *
     
    5856void tsb_invalidate(as_t *as, uintptr_t page, size_t pages)
    5957{
     58        tsb_entry_t *tsb;
    6059        size_t i0, i;
    6160        size_t cnt;
     
    6362        ASSERT(as->arch.tsb_description.tsb_base);
    6463       
    65         i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
    66         ASSERT(i0 < TSB_ENTRY_COUNT);
     64        i0 = (page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK;
    6765
    68         if (pages == (size_t) - 1 || (pages) > TSB_ENTRY_COUNT)
     66        if (pages == (size_t) -1 || pages > TSB_ENTRY_COUNT)
    6967                cnt = TSB_ENTRY_COUNT;
    7068        else
    7169                cnt = pages;
    7270       
    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         }
     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;
    7774}
    7875
     
    8582        as_t *as;
    8683        tsb_entry_t *tsb;
    87         size_t entry;
     84        tsb_entry_t *tte;
     85        size_t index;
    8886
    8987        as = t->as;
    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];
     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];
    9392
    9493        /*
     
    9897         */
    9998
    100         tsb->data.v = false;
     99        tte->data.v = false;
    101100
    102101        write_barrier();
    103102
    104         tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     103        tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    105104
    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;
     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;
    117116       
    118117        write_barrier();
    119118       
    120         tsb->data.v = t->p;     /* v as valid, p as present */
     119        tte->data.v = t->p;     /* v as valid, p as present */
    121120}
    122121
     
    130129        as_t *as;
    131130        tsb_entry_t *tsb;
    132         size_t entry;
     131        tsb_entry_t *tte;
     132        size_t index;
    133133
    134134        as = t->as;
    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];
     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];
    138138
    139139        /*
     
    143143         */
    144144
    145         tsb->data.v = false;
     145        tte->data.v = false;
    146146
    147147        write_barrier();
    148148
    149         tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
     149        tte->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    150150
    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 */
     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 */
    157157#ifdef CONFIG_VIRT_IDX_DCACHE
    158         tsb->data.cv = t->c;
     158        tte->data.cv = t->c;
    159159#endif /* CONFIG_VIRT_IDX_DCACHE */
    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;
     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;
    164164       
    165165        write_barrier();
    166166       
    167         tsb->data.v = t->p;     /* v as valid, p as present */
     167        tte->data.v = t->p;     /* v as valid, p as present */
    168168}
    169169
Note: See TracChangeset for help on using the changeset viewer.