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/sun4u/tsb.c

    r7254df6 re08162b  
    4242#include <debug.h>
    4343
    44 #define TSB_INDEX_MASK  ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1)
    45 
    4644/** Invalidate portion of TSB.
    4745 *
     
    6058        size_t cnt;
    6159       
    62         ASSERT(as->arch.itsb && as->arch.dtsb);
     60        ASSERT(as->arch.itsb);
     61        ASSERT(as->arch.dtsb);
    6362       
    64         i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
    65         ASSERT(i0 < ITSB_ENTRY_COUNT && i0 < DTSB_ENTRY_COUNT);
     63        i0 = (page >> MMU_PAGE_WIDTH) & ITSB_ENTRY_MASK;
    6664
    6765        if (pages == (size_t) -1 || (pages * 2) > ITSB_ENTRY_COUNT)
     
    7169       
    7270        for (i = 0; i < cnt; i++) {
    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;
     71                as->arch.itsb[(i0 + i) & ITSB_ENTRY_MASK].tag.invalid = true;
     72                as->arch.dtsb[(i0 + i) & DTSB_ENTRY_MASK].tag.invalid = true;
    7773        }
    7874}
     
    8682{
    8783        as_t *as;
    88         tsb_entry_t *tsb;
     84        tsb_entry_t *tte;
    8985        size_t entry;
    9086
     
    9288       
    9389        as = t->as;
    94         entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
    95         ASSERT(entry < ITSB_ENTRY_COUNT);
    96         tsb = &as->arch.itsb[entry];
     90        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & ITSB_ENTRY_MASK;
     91        tte = &as->arch.itsb[entry];
    9792
    9893        /*
     
    10297         */
    10398
    104         tsb->tag.invalid = true;        /* invalidate the entry
     99        tte->tag.invalid = true;        /* invalidate the entry
    105100                                         * (tag target has this
    106101                                         * set to 0) */
     
    108103        write_barrier();
    109104
    110         tsb->tag.context = as->asid;
     105        tte->tag.context = as->asid;
    111106        /* the shift is bigger than PAGE_WIDTH, do not bother with index  */
    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 */
     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 */
    119114       
    120115        write_barrier();
    121116       
    122         tsb->tag.invalid = false;       /* mark the entry as valid */
     117        tte->tag.invalid = false;       /* mark the entry as valid */
    123118}
    124119
     
    132127{
    133128        as_t *as;
    134         tsb_entry_t *tsb;
     129        tsb_entry_t *tte;
    135130        size_t entry;
    136131       
     
    138133
    139134        as = t->as;
    140         entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
    141         ASSERT(entry < DTSB_ENTRY_COUNT);
    142         tsb = &as->arch.dtsb[entry];
     135        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & DTSB_ENTRY_MASK;
     136        tte = &as->arch.dtsb[entry];
    143137
    144138        /*
     
    148142         */
    149143
    150         tsb->tag.invalid = true;        /* invalidate the entry
     144        tte->tag.invalid = true;        /* invalidate the entry
    151145                                         * (tag target has this
    152146                                         * set to 0) */
     
    154148        write_barrier();
    155149
    156         tsb->tag.context = as->asid;
     150        tte->tag.context = as->asid;
    157151        /* the shift is bigger than PAGE_WIDTH, do not bother with index */
    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;
     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;
    163157#ifdef CONFIG_VIRT_IDX_DCACHE
    164         tsb->data.cv = t->c;
     158        tte->data.cv = t->c;
    165159#endif /* CONFIG_VIRT_IDX_DCACHE */
    166         tsb->data.p = t->k;             /* p as privileged */
    167         tsb->data.w = ro ? false : t->w;
    168         tsb->data.v = t->p;
     160        tte->data.p = t->k;             /* p as privileged */
     161        tte->data.w = ro ? false : t->w;
     162        tte->data.v = t->p;
    169163       
    170164        write_barrier();
    171165       
    172         tsb->tag.invalid = false;       /* mark the entry as valid */
     166        tte->tag.invalid = false;       /* mark the entry as valid */
    173167}
    174168
Note: See TracChangeset for help on using the changeset viewer.