Ignore:
File:
1 edited

Legend:

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

    r8c2214e r74cbac7d  
    11/*
    22 * Copyright (c) 2006 Jakub Jermar
    3  * Copyright (c) 2009 Pavel Rimsky
    43 * All rights reserved.
    54 *
     
    3534
    3635#include <arch/mm/tsb.h>
    37 #include <arch/mm/pagesize.h>
    3836#include <arch/mm/tlb.h>
    3937#include <arch/mm/page.h>
     
    5149 * portions of both TSBs are invalidated at a time.
    5250 *
    53  * @param as    Address space.
    54  * @param page  First page to invalidate in TSB.
    55  * @param pages Number of pages to invalidate. Value of (count_t) -1 means the
    56  *              whole TSB.
     51 * @param as Address space.
     52 * @param page First page to invalidate in TSB.
     53 * @param pages Number of pages to invalidate. Value of (size_t) -1 means the
     54 *      whole TSB.
    5755 */
    5856void tsb_invalidate(as_t *as, uintptr_t page, size_t pages)
    5957{
    60         size_t i0, i;
     58        size_t i0;
     59        size_t i;
    6160        size_t cnt;
    6261       
    63         ASSERT(as->arch.tsb_description.tsb_base);
     62        ASSERT(as->arch.itsb && as->arch.dtsb);
    6463       
    6564        i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
    66         ASSERT(i0 < TSB_ENTRY_COUNT);
     65        ASSERT(i0 < ITSB_ENTRY_COUNT && i0 < DTSB_ENTRY_COUNT);
    6766
    68         if (pages == (size_t) - 1 || (pages) > TSB_ENTRY_COUNT)
    69                 cnt = TSB_ENTRY_COUNT;
     67        if (pages == (size_t) -1 || (pages * 2) > ITSB_ENTRY_COUNT)
     68                cnt = ITSB_ENTRY_COUNT;
    7069        else
    71                 cnt = pages;
     70                cnt = pages * 2;
    7271       
    7372        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;
     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;
    7677        }
    7778}
     
    8081 *
    8182 * @param t     Software PTE.
     83 * @param index Zero if lower 8K-subpage, one if higher 8K subpage.
    8284 */
    83 void itsb_pte_copy(pte_t *t)
     85void itsb_pte_copy(pte_t *t, size_t index)
    8486{
     87#if 0
    8588        as_t *as;
    8689        tsb_entry_t *tsb;
    8790        size_t entry;
    8891
     92        ASSERT(index <= 1);
     93       
    8994        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];
     95        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
     96        ASSERT(entry < ITSB_ENTRY_COUNT);
     97        tsb = &as->arch.itsb[entry];
    9398
    9499        /*
     
    98103         */
    99104
    100         tsb->data.v = false;
     105        tsb->tag.invalid = true;        /* invalidate the entry
     106                                         * (tag target has this
     107                                         * set to 0) */
    101108
    102109        write_barrier();
    103110
     111        tsb->tag.context = as->asid;
     112        /* the shift is bigger than PAGE_WIDTH, do not bother with index  */
    104113        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    105 
    106114        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;
     115        tsb->data.size = PAGESIZE_8K;
     116        tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
    111117        tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
    112         tsb->data.cv = false;
    113118        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;
     119        tsb->data.v = t->p;     /* v as valid, p as present */
    117120       
    118121        write_barrier();
    119122       
    120         tsb->data.v = t->p;     /* v as valid, p as present */
     123        tsb->tag.invalid = false;       /* mark the entry as valid */
     124#endif
    121125}
    122126
     
    124128 *
    125129 * @param t     Software PTE.
     130 * @param index Zero if lower 8K-subpage, one if higher 8K-subpage.
    126131 * @param ro    If true, the mapping is copied read-only.
    127132 */
    128 void dtsb_pte_copy(pte_t *t, bool ro)
     133void dtsb_pte_copy(pte_t *t, size_t index, bool ro)
    129134{
     135#if 0
    130136        as_t *as;
    131137        tsb_entry_t *tsb;
    132138        size_t entry;
     139       
     140        ASSERT(index <= 1);
    133141
    134142        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];
     143        entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
     144        ASSERT(entry < DTSB_ENTRY_COUNT);
     145        tsb = &as->arch.dtsb[entry];
    138146
    139147        /*
     
    143151         */
    144152
    145         tsb->data.v = false;
     153        tsb->tag.invalid = true;        /* invalidate the entry
     154                                         * (tag target has this
     155                                         * set to 0) */
    146156
    147157        write_barrier();
    148158
     159        tsb->tag.context = as->asid;
     160        /* the shift is bigger than PAGE_WIDTH, do not bother with index */
    149161        tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
    150 
    151162        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 */
     163        tsb->data.size = PAGESIZE_8K;
     164        tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
     165        tsb->data.cp = t->c;
    157166#ifdef CONFIG_VIRT_IDX_DCACHE
    158167        tsb->data.cv = t->c;
    159168#endif /* CONFIG_VIRT_IDX_DCACHE */
    160         tsb->data.p = t->k;     /* p as privileged, k as kernel */
    161         tsb->data.x = true;
     169        tsb->data.p = t->k;             /* p as privileged */
    162170        tsb->data.w = ro ? false : t->w;
    163         tsb->data.size = PAGESIZE_8K;
     171        tsb->data.v = t->p;
    164172       
    165173        write_barrier();
    166174       
    167         tsb->data.v = t->p;     /* v as valid, p as present */
     175        tsb->tag.invalid = false;       /* mark the entry as valid */
     176#endif
    168177}
    169178
    170179/** @}
    171180 */
     181
Note: See TracChangeset for help on using the changeset viewer.