Changeset 68656282 in mainline


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.

Location:
arch/sparc64
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/include/mm/tlb.h

    rb6fba84 r68656282  
    112112                unsigned asi : 8;       /**< ASI. */
    113113                unsigned tm : 1;        /**< TLB miss. */
    114                 unsigned : 3;
    115                 unsigned ft : 5;        /**< Fault type. */
     114                unsigned : 1;
     115                unsigned ft : 7;        /**< Fault type. */
    116116                unsigned e : 1;         /**< Side-effect bit. */
    117117                unsigned ct : 2;        /**< Context Register selection. */
     
    119119                unsigned w : 1;         /**< Write bit. */
    120120                unsigned ow : 1;        /**< Overwrite bit. */
    121                 unsigned fv : 1;        /**< Fayult Valid bit. */
     121                unsigned fv : 1;        /**< Fault Valid bit. */
    122122        } __attribute__ ((packed));
    123123};
     
    262262}
    263263
     264/** Read IMMU TLB Tag Access Register.
     265 *
     266 * @return Current value of IMMU TLB Tag Access Register.
     267 */
     268static inline __u64 itlb_tag_access_read(void)
     269{
     270        return asi_u64_read(ASI_IMMU, VA_IMMU_TAG_ACCESS);
     271}
     272
    264273/** Write DMMU TLB Tag Access Register.
    265274 *
     
    271280        flush();
    272281}
     282
     283/** Read DMMU TLB Tag Access Register.
     284 *
     285 * @return Current value of DMMU TLB Tag Access Register.
     286 */
     287static inline __u64 dtlb_tag_access_read(void)
     288{
     289        return asi_u64_read(ASI_DMMU, VA_DMMU_TAG_ACCESS);
     290}
     291
    273292
    274293/** Write IMMU TLB Data in Register.
  • 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.