Changeset dbb6886 in mainline for arch/sparc64/src/mm/tlb.c


Ignore:
Timestamp:
2005-12-13T22:53:26Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8ad925c
Parents:
91ef0d95
Message:

sparc64 work.
Support for TLB Demap operations.
Add tlb_invalidate(), tlb_invalidate_asid() and tlb_invalidate_page() (latter two are broken as they ignore asid).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/src/mm/tlb.c

    r91ef0d95 rdbb6886  
    3030#include <mm/tlb.h>
    3131#include <print.h>
     32#include <arch/types.h>
     33#include <typedefs.h>
    3234
    3335void tlb_arch_init(void)
     
    4749                t.value = itlb_tag_read_read(i);
    4850               
    49                 printf("%d: va=%Q, context=%d, v=%d, size=%d, nfo=%d, ie=%d, soft2=%X, diag=%X, pa=%X, soft=%X, l=%d, cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n",
    50                         i, t.va, t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, d.pa, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g);
     51                printf("%d: vpn=%Q, context=%d, v=%d, size=%d, nfo=%d, ie=%d, soft2=%X, diag=%X, pfn=%X, soft=%X, l=%d, cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n",
     52                        i, t.vpn, t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, d.pfn, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g);
    5153        }
    5254
     
    5658                t.value = dtlb_tag_read_read(i);
    5759               
    58                 printf("%d: va=%Q, context=%d, v=%d, size=%d, nfo=%d, ie=%d, soft2=%X, diag=%X, pa=%X, soft=%X, l=%d, cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n",
    59                         i, t.va, t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, d.pa, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g);
     60                printf("%d: vpn=%Q, context=%d, v=%d, size=%d, nfo=%d, ie=%d, soft2=%X, diag=%X, pfn=%X, soft=%X, l=%d, cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n",
     61                        i, t.vpn, t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, d.pfn, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g);
    6062        }
    6163
    6264}
     65
     66/** Invalidate all unlocked ITLB and DTLB entries. */
     67void tlb_invalidate_all(void)
     68{
     69        int i;
     70        tlb_data_t d;
     71        tlb_tag_read_reg_t t;
     72
     73        for (i = 0; i < ITLB_ENTRY_COUNT; i++) {
     74                d.value = itlb_data_access_read(i);
     75                if (!d.l) {
     76                        printf("invalidating ");
     77                        t.value = itlb_tag_read_read(i);
     78                        d.v = false;
     79                        itlb_tag_access_write(t.value);
     80                        itlb_data_access_write(i, d.value);
     81                }
     82        }
     83       
     84        for (i = 0; i < DTLB_ENTRY_COUNT; i++) {
     85                d.value = dtlb_data_access_read(i);
     86                if (!d.l) {
     87                        t.value = dtlb_tag_read_read(i);
     88                        d.v = false;
     89                        dtlb_tag_access_write(t.value);
     90                        dtlb_data_access_write(i, d.value);
     91                }
     92        }
     93       
     94}
     95
     96/** Invalidate all ITLB and DTLB entries that belong to specified ASID (Context).
     97 *
     98 * @param asid Address Space ID.
     99 */
     100void tlb_invalidate_asid(asid_t asid)
     101{
     102        /* TODO: write asid to some Context register and encode the register in second parameter below. */
     103        itlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_NUCLEUS, 0);
     104        dtlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_NUCLEUS, 0);
     105}
     106
     107/** Invalidate all ITLB and DLTB entries for specified page in specified address space.
     108 *
     109 * @param asid Address Space ID.
     110 * @param page Page which to sweep out from ITLB and DTLB.
     111 */
     112void tlb_invalidate_page(asid_t asid, __address page)
     113{
     114        /* TODO: write asid to some Context register and encode the register in second parameter below. */
     115        itlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, page);
     116        dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, page);
     117}
Note: See TracChangeset for help on using the changeset viewer.