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


Ignore:
Timestamp:
2006-02-24T19:59:57Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
578aebf7
Parents:
b6fba84
Message:

Fixes in sparc64 preliminary TLB miss handler.
Compute and insert identity mapping for kernel on the fly.

File:
1 edited

Legend:

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

    rb6fba84 r68656282  
    3232#include <arch/mm/page.h>
    3333#include <arch/mm/mmu.h>
     34#include <mm/asid.h>
    3435#include <print.h>
    3536#include <arch/types.h>
     
    7576         * We do identity mapping of 4M-page at 4M.
    7677         */
    77         tag.value = 0;
     78        tag.value = ASID_KERNEL;
    7879        tag.vpn = pg.vpn;
    7980
     
    113114        pg.address = 0xc0000000;
    114115
    115         tag.value = 0;
     116        tag.value = ASID_KERNEL;
    116117        tag.vpn = pg.vpn;
    117118
     
    142143void fast_data_access_mmu_miss(void)
    143144{
    144         tlb_sfsr_reg_t status;
    145         __address address, tpc;
     145        tlb_tag_access_reg_t tag;
     146        tlb_data_t data;
     147        __address tpc;
    146148        char *tpc_str;
    147149       
    148         status.value = dtlb_sfsr_read();
    149         address = dtlb_sfar_read();
    150         tpc = tpc_read();
    151         tpc_str = get_symtab_entry(tpc);
    152 
    153         printf("ASI=%B, Context=%s\n", status.asi, context_encoding[status.ct]);
    154         printf("Faulting address: %P\n", dtlb_sfar_read());
    155         printf("TPC=%P, (%s)\n", tpc, tpc_str ? tpc_str : "?");
    156         panic("%s\n", __FUNCTION__);
     150        tag.value = dtlb_tag_access_read();
     151        if (tag.context != ASID_KERNEL || tag.vpn == 0) {
     152                tpc = tpc_read();
     153                tpc_str = get_symtab_entry(tpc);
     154
     155                printf("Faulting page: %P, ASID=%d\n", tag.vpn * PAGE_SIZE, tag.context);
     156                printf("TPC=%P, (%s)\n", tpc, tpc_str ? tpc_str : "?");
     157                panic("%s\n", __FUNCTION__);
     158        }
     159
     160        /*
     161         * Identity map piece of faulting kernel address space.
     162         */
     163        data.value = 0;
     164        data.v = true;
     165        data.size = PAGESIZE_8K;
     166        data.pfn = tag.vpn;
     167        data.l = false;
     168        data.cp = 1;
     169        data.cv = 1;
     170        data.p = true;
     171        data.w = true;
     172        data.g = true;
     173
     174        dtlb_data_in_write(data.value);
    157175}
    158176
Note: See TracChangeset for help on using the changeset viewer.