tlb.cc revision 12749
111723Sar4jc@virginia.edu/*
211723Sar4jc@virginia.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan
311723Sar4jc@virginia.edu * Copyright (c) 2007 MIPS Technologies, Inc.
411723Sar4jc@virginia.edu * All rights reserved.
511723Sar4jc@virginia.edu *
611723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without
711723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are
811723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright
911723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer;
1011723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright
1111723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the
1211723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution;
1311723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its
1411723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from
1511723Sar4jc@virginia.edu * this software without specific prior written permission.
1611723Sar4jc@virginia.edu *
1711723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1811723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1911723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2011723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2111723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2211723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2311723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2411723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2511723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2611723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2711723Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811723Sar4jc@virginia.edu *
2911723Sar4jc@virginia.edu * Authors: Nathan Binkert
3011723Sar4jc@virginia.edu *          Steve Reinhardt
3111723Sar4jc@virginia.edu *          Jaidev Patwardhan
3211723Sar4jc@virginia.edu *          Zhengxing Li
3311723Sar4jc@virginia.edu *          Deyuan Guo
3411723Sar4jc@virginia.edu */
3511723Sar4jc@virginia.edu
3611723Sar4jc@virginia.edu#include "arch/riscv/tlb.hh"
3711723Sar4jc@virginia.edu
3811723Sar4jc@virginia.edu#include <string>
3911723Sar4jc@virginia.edu#include <vector>
4011723Sar4jc@virginia.edu
4111723Sar4jc@virginia.edu#include "arch/riscv/faults.hh"
4211723Sar4jc@virginia.edu#include "arch/riscv/pagetable.hh"
4311723Sar4jc@virginia.edu#include "arch/riscv/pra_constants.hh"
4411723Sar4jc@virginia.edu#include "arch/riscv/utility.hh"
4511723Sar4jc@virginia.edu#include "base/inifile.hh"
4611723Sar4jc@virginia.edu#include "base/str.hh"
4711723Sar4jc@virginia.edu#include "base/trace.hh"
4811723Sar4jc@virginia.edu#include "cpu/thread_context.hh"
4911723Sar4jc@virginia.edu#include "debug/RiscvTLB.hh"
5011723Sar4jc@virginia.edu#include "debug/TLB.hh"
5111723Sar4jc@virginia.edu#include "mem/page_table.hh"
5211723Sar4jc@virginia.edu#include "params/RiscvTLB.hh"
5311723Sar4jc@virginia.edu#include "sim/full_system.hh"
5411723Sar4jc@virginia.edu#include "sim/process.hh"
5511723Sar4jc@virginia.edu
5611723Sar4jc@virginia.eduusing namespace std;
5711723Sar4jc@virginia.eduusing namespace RiscvISA;
5811723Sar4jc@virginia.edu
5911723Sar4jc@virginia.edu///////////////////////////////////////////////////////////////////////
6011723Sar4jc@virginia.edu//
6111723Sar4jc@virginia.edu//  RISC-V TLB
6211723Sar4jc@virginia.edu//
6311723Sar4jc@virginia.edu
6411723Sar4jc@virginia.eduTLB::TLB(const Params *p)
6511723Sar4jc@virginia.edu    : BaseTLB(p), size(p->size), nlu(0)
6611723Sar4jc@virginia.edu{
6711723Sar4jc@virginia.edu    table = new PTE[size];
6811723Sar4jc@virginia.edu    memset(table, 0, sizeof(PTE[size]));
6911723Sar4jc@virginia.edu    smallPages = 0;
7011723Sar4jc@virginia.edu}
7111723Sar4jc@virginia.edu
7211723Sar4jc@virginia.eduTLB::~TLB()
7311723Sar4jc@virginia.edu{
7411723Sar4jc@virginia.edu    if (table)
7511723Sar4jc@virginia.edu        delete [] table;
7611723Sar4jc@virginia.edu}
7711723Sar4jc@virginia.edu
7811723Sar4jc@virginia.edu// look up an entry in the TLB
7911723Sar4jc@virginia.eduRiscvISA::PTE *
8011723Sar4jc@virginia.eduTLB::lookup(Addr vpn, uint8_t asn) const
8111723Sar4jc@virginia.edu{
8211723Sar4jc@virginia.edu    // assume not found...
8311723Sar4jc@virginia.edu    PTE *retval = nullptr;
8411723Sar4jc@virginia.edu    PageTable::const_iterator i = lookupTable.find(vpn);
8511723Sar4jc@virginia.edu    if (i != lookupTable.end()) {
8611723Sar4jc@virginia.edu        while (i->first == vpn) {
8711723Sar4jc@virginia.edu            int index = i->second;
8811723Sar4jc@virginia.edu            PTE *pte = &table[index];
8911723Sar4jc@virginia.edu
9011723Sar4jc@virginia.edu            /* 1KB TLB Lookup code - from MIPS ARM Volume III - Rev. 2.50 */
9111723Sar4jc@virginia.edu            Addr Mask = pte->Mask;
9211723Sar4jc@virginia.edu            Addr InvMask = ~Mask;
9311723Sar4jc@virginia.edu            Addr VPN  = pte->VPN;
9411723Sar4jc@virginia.edu            if (((vpn & InvMask) == (VPN & InvMask)) &&
9511723Sar4jc@virginia.edu                    (pte->G  || (asn == pte->asid))) {
9611723Sar4jc@virginia.edu                // We have a VPN + ASID Match
9711723Sar4jc@virginia.edu                retval = pte;
9811723Sar4jc@virginia.edu                break;
9911723Sar4jc@virginia.edu            }
10011723Sar4jc@virginia.edu            ++i;
10111723Sar4jc@virginia.edu        }
10211723Sar4jc@virginia.edu    }
10311723Sar4jc@virginia.edu
10411723Sar4jc@virginia.edu    DPRINTF(TLB, "lookup %#x, asn %#x -> %s ppn %#x\n", vpn, (int)asn,
10511723Sar4jc@virginia.edu            retval ? "hit" : "miss", retval ? retval->PFN1 : 0);
10611723Sar4jc@virginia.edu    return retval;
10711723Sar4jc@virginia.edu}
10811723Sar4jc@virginia.edu
10911723Sar4jc@virginia.eduRiscvISA::PTE*
11011723Sar4jc@virginia.eduTLB::getEntry(unsigned Index) const
11111723Sar4jc@virginia.edu{
11211723Sar4jc@virginia.edu    // Make sure that Index is valid
11311723Sar4jc@virginia.edu    assert(Index<size);
11411723Sar4jc@virginia.edu    return &table[Index];
11511723Sar4jc@virginia.edu}
11611723Sar4jc@virginia.edu
11711723Sar4jc@virginia.eduint
11811723Sar4jc@virginia.eduTLB::probeEntry(Addr vpn, uint8_t asn) const
11911723Sar4jc@virginia.edu{
12011723Sar4jc@virginia.edu    // assume not found...
12111723Sar4jc@virginia.edu    int Ind = -1;
12211723Sar4jc@virginia.edu    PageTable::const_iterator i = lookupTable.find(vpn);
12311723Sar4jc@virginia.edu    if (i != lookupTable.end()) {
12411723Sar4jc@virginia.edu        while (i->first == vpn) {
12511723Sar4jc@virginia.edu            int index = i->second;
12611723Sar4jc@virginia.edu            PTE *pte = &table[index];
12711723Sar4jc@virginia.edu
12811723Sar4jc@virginia.edu            /* 1KB TLB Lookup code - from MIPS ARM Volume III - Rev. 2.50 */
12911723Sar4jc@virginia.edu            Addr Mask = pte->Mask;
13011723Sar4jc@virginia.edu            Addr InvMask = ~Mask;
13111723Sar4jc@virginia.edu            Addr VPN = pte->VPN;
13211723Sar4jc@virginia.edu            if (((vpn & InvMask) == (VPN & InvMask)) &&
13311723Sar4jc@virginia.edu                    (pte->G  || (asn == pte->asid))) {
13411723Sar4jc@virginia.edu                // We have a VPN + ASID Match
13511723Sar4jc@virginia.edu                Ind = index;
13611723Sar4jc@virginia.edu                break;
13711723Sar4jc@virginia.edu            }
13811723Sar4jc@virginia.edu            ++i;
13911723Sar4jc@virginia.edu        }
14011723Sar4jc@virginia.edu    }
14111723Sar4jc@virginia.edu    DPRINTF(RiscvTLB,"VPN: %x, asid: %d, Result of TLBP: %d\n",vpn,asn,Ind);
14211723Sar4jc@virginia.edu    return Ind;
14311723Sar4jc@virginia.edu}
14411723Sar4jc@virginia.edu
14511723Sar4jc@virginia.eduinline Fault
14612749Sgiacomo.travaglini@arm.comTLB::checkCacheability(const RequestPtr &req)
14711723Sar4jc@virginia.edu{
14811723Sar4jc@virginia.edu    Addr VAddrUncacheable = 0xA0000000;
14911723Sar4jc@virginia.edu    // In MIPS, cacheability is controlled by certain bits of the virtual
15011723Sar4jc@virginia.edu    // address or by the TLB entry
15111723Sar4jc@virginia.edu    if ((req->getVaddr() & VAddrUncacheable) == VAddrUncacheable) {
15211723Sar4jc@virginia.edu        // mark request as uncacheable
15311723Sar4jc@virginia.edu        req->setFlags(Request::UNCACHEABLE | Request::STRICT_ORDER);
15411723Sar4jc@virginia.edu    }
15511723Sar4jc@virginia.edu    return NoFault;
15611723Sar4jc@virginia.edu}
15711723Sar4jc@virginia.edu
15811723Sar4jc@virginia.eduvoid
15911723Sar4jc@virginia.eduTLB::insertAt(PTE &pte, unsigned Index, int _smallPages)
16011723Sar4jc@virginia.edu{
16111723Sar4jc@virginia.edu    smallPages = _smallPages;
16211723Sar4jc@virginia.edu    if (Index > size) {
16311723Sar4jc@virginia.edu        warn("Attempted to write at index (%d) beyond TLB size (%d)",
16411723Sar4jc@virginia.edu                Index, size);
16511723Sar4jc@virginia.edu    } else {
16611723Sar4jc@virginia.edu        // Update TLB
16711723Sar4jc@virginia.edu        DPRINTF(TLB, "TLB[%d]: %x %x %x %x\n",
16811723Sar4jc@virginia.edu                Index, pte.Mask << 11,
16911723Sar4jc@virginia.edu                ((pte.VPN << 11) | pte.asid),
17011723Sar4jc@virginia.edu                ((pte.PFN0 << 6) | (pte.C0 << 3) |
17111723Sar4jc@virginia.edu                 (pte.D0 << 2) | (pte.V0 <<1) | pte.G),
17211723Sar4jc@virginia.edu                ((pte.PFN1 <<6) | (pte.C1 << 3) |
17311723Sar4jc@virginia.edu                 (pte.D1 << 2) | (pte.V1 <<1) | pte.G));
17411723Sar4jc@virginia.edu        if (table[Index].V0 || table[Index].V1) {
17511723Sar4jc@virginia.edu            // Previous entry is valid
17611723Sar4jc@virginia.edu            PageTable::iterator i = lookupTable.find(table[Index].VPN);
17711723Sar4jc@virginia.edu            lookupTable.erase(i);
17811723Sar4jc@virginia.edu        }
17911723Sar4jc@virginia.edu        table[Index]=pte;
18011723Sar4jc@virginia.edu        // Update fast lookup table
18111723Sar4jc@virginia.edu        lookupTable.insert(make_pair(table[Index].VPN, Index));
18211723Sar4jc@virginia.edu    }
18311723Sar4jc@virginia.edu}
18411723Sar4jc@virginia.edu
18511723Sar4jc@virginia.edu// insert a new TLB entry
18611723Sar4jc@virginia.eduvoid
18711723Sar4jc@virginia.eduTLB::insert(Addr addr, PTE &pte)
18811723Sar4jc@virginia.edu{
18911723Sar4jc@virginia.edu    fatal("TLB Insert not yet implemented\n");
19011723Sar4jc@virginia.edu}
19111723Sar4jc@virginia.edu
19211723Sar4jc@virginia.eduvoid
19311723Sar4jc@virginia.eduTLB::flushAll()
19411723Sar4jc@virginia.edu{
19511723Sar4jc@virginia.edu    DPRINTF(TLB, "flushAll\n");
19611723Sar4jc@virginia.edu    memset(table, 0, sizeof(PTE[size]));
19711723Sar4jc@virginia.edu    lookupTable.clear();
19811723Sar4jc@virginia.edu    nlu = 0;
19911723Sar4jc@virginia.edu}
20011723Sar4jc@virginia.edu
20111723Sar4jc@virginia.eduvoid
20211723Sar4jc@virginia.eduTLB::serialize(CheckpointOut &cp) const
20311723Sar4jc@virginia.edu{
20411723Sar4jc@virginia.edu    SERIALIZE_SCALAR(size);
20511723Sar4jc@virginia.edu    SERIALIZE_SCALAR(nlu);
20611723Sar4jc@virginia.edu
20711723Sar4jc@virginia.edu    for (int i = 0; i < size; i++) {
20811723Sar4jc@virginia.edu        ScopedCheckpointSection sec(cp, csprintf("PTE%d", i));
20911723Sar4jc@virginia.edu        table[i].serialize(cp);
21011723Sar4jc@virginia.edu    }
21111723Sar4jc@virginia.edu}
21211723Sar4jc@virginia.edu
21311723Sar4jc@virginia.eduvoid
21411723Sar4jc@virginia.eduTLB::unserialize(CheckpointIn &cp)
21511723Sar4jc@virginia.edu{
21611723Sar4jc@virginia.edu    UNSERIALIZE_SCALAR(size);
21711723Sar4jc@virginia.edu    UNSERIALIZE_SCALAR(nlu);
21811723Sar4jc@virginia.edu
21911723Sar4jc@virginia.edu    for (int i = 0; i < size; i++) {
22011723Sar4jc@virginia.edu        ScopedCheckpointSection sec(cp, csprintf("PTE%d", i));
22111723Sar4jc@virginia.edu        table[i].unserialize(cp);
22211723Sar4jc@virginia.edu        if (table[i].V0 || table[i].V1) {
22311723Sar4jc@virginia.edu            lookupTable.insert(make_pair(table[i].VPN, i));
22411723Sar4jc@virginia.edu        }
22511723Sar4jc@virginia.edu    }
22611723Sar4jc@virginia.edu}
22711723Sar4jc@virginia.edu
22811723Sar4jc@virginia.eduvoid
22911723Sar4jc@virginia.eduTLB::regStats()
23011723Sar4jc@virginia.edu{
23111723Sar4jc@virginia.edu    BaseTLB::regStats();
23211723Sar4jc@virginia.edu
23311723Sar4jc@virginia.edu    read_hits
23411723Sar4jc@virginia.edu        .name(name() + ".read_hits")
23511723Sar4jc@virginia.edu        .desc("DTB read hits")
23611723Sar4jc@virginia.edu        ;
23711723Sar4jc@virginia.edu
23811723Sar4jc@virginia.edu    read_misses
23911723Sar4jc@virginia.edu        .name(name() + ".read_misses")
24011723Sar4jc@virginia.edu        .desc("DTB read misses")
24111723Sar4jc@virginia.edu        ;
24211723Sar4jc@virginia.edu
24311723Sar4jc@virginia.edu
24411723Sar4jc@virginia.edu    read_accesses
24511723Sar4jc@virginia.edu        .name(name() + ".read_accesses")
24611723Sar4jc@virginia.edu        .desc("DTB read accesses")
24711723Sar4jc@virginia.edu        ;
24811723Sar4jc@virginia.edu
24911723Sar4jc@virginia.edu    write_hits
25011723Sar4jc@virginia.edu        .name(name() + ".write_hits")
25111723Sar4jc@virginia.edu        .desc("DTB write hits")
25211723Sar4jc@virginia.edu        ;
25311723Sar4jc@virginia.edu
25411723Sar4jc@virginia.edu    write_misses
25511723Sar4jc@virginia.edu        .name(name() + ".write_misses")
25611723Sar4jc@virginia.edu        .desc("DTB write misses")
25711723Sar4jc@virginia.edu        ;
25811723Sar4jc@virginia.edu
25911723Sar4jc@virginia.edu
26011723Sar4jc@virginia.edu    write_accesses
26111723Sar4jc@virginia.edu        .name(name() + ".write_accesses")
26211723Sar4jc@virginia.edu        .desc("DTB write accesses")
26311723Sar4jc@virginia.edu        ;
26411723Sar4jc@virginia.edu
26511723Sar4jc@virginia.edu    hits
26611723Sar4jc@virginia.edu        .name(name() + ".hits")
26711723Sar4jc@virginia.edu        .desc("DTB hits")
26811723Sar4jc@virginia.edu        ;
26911723Sar4jc@virginia.edu
27011723Sar4jc@virginia.edu    misses
27111723Sar4jc@virginia.edu        .name(name() + ".misses")
27211723Sar4jc@virginia.edu        .desc("DTB misses")
27311723Sar4jc@virginia.edu        ;
27411723Sar4jc@virginia.edu
27511723Sar4jc@virginia.edu    accesses
27611723Sar4jc@virginia.edu        .name(name() + ".accesses")
27711723Sar4jc@virginia.edu        .desc("DTB accesses")
27811723Sar4jc@virginia.edu        ;
27911723Sar4jc@virginia.edu
28011723Sar4jc@virginia.edu    hits = read_hits + write_hits;
28111723Sar4jc@virginia.edu    misses = read_misses + write_misses;
28211723Sar4jc@virginia.edu    accesses = read_accesses + write_accesses;
28311723Sar4jc@virginia.edu}
28411723Sar4jc@virginia.edu
28511723Sar4jc@virginia.eduFault
28612749Sgiacomo.travaglini@arm.comTLB::translateInst(const RequestPtr &req, ThreadContext *tc)
28711723Sar4jc@virginia.edu{
28811723Sar4jc@virginia.edu    if (FullSystem)
28911723Sar4jc@virginia.edu        panic("translateInst not implemented in RISC-V.\n");
29011723Sar4jc@virginia.edu
29111723Sar4jc@virginia.edu    Process * p = tc->getProcessPtr();
29211723Sar4jc@virginia.edu
29311723Sar4jc@virginia.edu    Fault fault = p->pTable->translate(req);
29411723Sar4jc@virginia.edu    if (fault != NoFault)
29511723Sar4jc@virginia.edu        return fault;
29611723Sar4jc@virginia.edu
29711723Sar4jc@virginia.edu    return NoFault;
29811723Sar4jc@virginia.edu}
29911723Sar4jc@virginia.edu
30011723Sar4jc@virginia.eduFault
30112749Sgiacomo.travaglini@arm.comTLB::translateData(const RequestPtr &req, ThreadContext *tc, bool write)
30211723Sar4jc@virginia.edu{
30311723Sar4jc@virginia.edu    if (FullSystem)
30411723Sar4jc@virginia.edu        panic("translateData not implemented in RISC-V.\n");
30511723Sar4jc@virginia.edu
30611962Sar4jc@virginia.edu    // In the O3 CPU model, sometimes a memory access will be speculatively
30711962Sar4jc@virginia.edu    // executed along a branch that will end up not being taken where the
30811962Sar4jc@virginia.edu    // address is invalid.  In that case, return a fault rather than trying
30911962Sar4jc@virginia.edu    // to translate it (which will cause a panic).  Since RISC-V allows
31011962Sar4jc@virginia.edu    // unaligned memory accesses, this should only happen if the request's
31111962Sar4jc@virginia.edu    // length is long enough to wrap around from the end of the memory to the
31211962Sar4jc@virginia.edu    // start.
31311962Sar4jc@virginia.edu    assert(req->getSize() > 0);
31411962Sar4jc@virginia.edu    if (req->getVaddr() + req->getSize() - 1 < req->getVaddr())
31511962Sar4jc@virginia.edu        return make_shared<GenericPageTableFault>(req->getVaddr());
31611962Sar4jc@virginia.edu
31711723Sar4jc@virginia.edu    Process * p = tc->getProcessPtr();
31811723Sar4jc@virginia.edu
31911723Sar4jc@virginia.edu    Fault fault = p->pTable->translate(req);
32011723Sar4jc@virginia.edu    if (fault != NoFault)
32111723Sar4jc@virginia.edu        return fault;
32211723Sar4jc@virginia.edu
32311723Sar4jc@virginia.edu    return NoFault;
32411723Sar4jc@virginia.edu}
32511723Sar4jc@virginia.edu
32611723Sar4jc@virginia.eduFault
32712749Sgiacomo.travaglini@arm.comTLB::translateAtomic(const RequestPtr &req, ThreadContext *tc, Mode mode)
32811723Sar4jc@virginia.edu{
32911723Sar4jc@virginia.edu    if (mode == Execute)
33011723Sar4jc@virginia.edu        return translateInst(req, tc);
33111723Sar4jc@virginia.edu    else
33211723Sar4jc@virginia.edu        return translateData(req, tc, mode == Write);
33311723Sar4jc@virginia.edu}
33411723Sar4jc@virginia.edu
33511723Sar4jc@virginia.eduvoid
33612749Sgiacomo.travaglini@arm.comTLB::translateTiming(const RequestPtr &req, ThreadContext *tc,
33711723Sar4jc@virginia.edu        Translation *translation, Mode mode)
33811723Sar4jc@virginia.edu{
33911723Sar4jc@virginia.edu    assert(translation);
34011723Sar4jc@virginia.edu    translation->finish(translateAtomic(req, tc, mode), req, tc, mode);
34111723Sar4jc@virginia.edu}
34211723Sar4jc@virginia.edu
34311723Sar4jc@virginia.eduFault
34412749Sgiacomo.travaglini@arm.comTLB::finalizePhysical(const RequestPtr &req,
34512749Sgiacomo.travaglini@arm.com                      ThreadContext *tc, Mode mode) const
34611723Sar4jc@virginia.edu{
34711723Sar4jc@virginia.edu    return NoFault;
34811723Sar4jc@virginia.edu}
34911723Sar4jc@virginia.edu
35011723Sar4jc@virginia.edu
35111723Sar4jc@virginia.eduRiscvISA::PTE &
35211723Sar4jc@virginia.eduTLB::index(bool advance)
35311723Sar4jc@virginia.edu{
35411723Sar4jc@virginia.edu    PTE *pte = &table[nlu];
35511723Sar4jc@virginia.edu
35611723Sar4jc@virginia.edu    if (advance)
35711723Sar4jc@virginia.edu        nextnlu();
35811723Sar4jc@virginia.edu
35911723Sar4jc@virginia.edu    return *pte;
36011723Sar4jc@virginia.edu}
36111723Sar4jc@virginia.edu
36211723Sar4jc@virginia.eduRiscvISA::TLB *
36311723Sar4jc@virginia.eduRiscvTLBParams::create()
36411723Sar4jc@virginia.edu{
36511723Sar4jc@virginia.edu    return new TLB(this);
36611723Sar4jc@virginia.edu}
367