tlb.cc revision 7399
16019Shines@cs.fsu.edu/* 27093Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited 37093Sgblack@eecs.umich.edu * All rights reserved 47093Sgblack@eecs.umich.edu * 57093Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 67093Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 77093Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 87093Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 97093Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 107093Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 117093Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 127093Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137093Sgblack@eecs.umich.edu * 146019Shines@cs.fsu.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 156019Shines@cs.fsu.edu * All rights reserved. 166019Shines@cs.fsu.edu * 176019Shines@cs.fsu.edu * Redistribution and use in source and binary forms, with or without 186019Shines@cs.fsu.edu * modification, are permitted provided that the following conditions are 196019Shines@cs.fsu.edu * met: redistributions of source code must retain the above copyright 206019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer; 216019Shines@cs.fsu.edu * redistributions in binary form must reproduce the above copyright 226019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer in the 236019Shines@cs.fsu.edu * documentation and/or other materials provided with the distribution; 246019Shines@cs.fsu.edu * neither the name of the copyright holders nor the names of its 256019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from 266019Shines@cs.fsu.edu * this software without specific prior written permission. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 296019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 306019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 316019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 326019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 336019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 346019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 356019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 366019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 376019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 386019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 396019Shines@cs.fsu.edu * 407399SAli.Saidi@ARM.com * Authors: Ali Saidi 417399SAli.Saidi@ARM.com * Nathan Binkert 426019Shines@cs.fsu.edu * Steve Reinhardt 436019Shines@cs.fsu.edu */ 446019Shines@cs.fsu.edu 456019Shines@cs.fsu.edu#include <string> 466019Shines@cs.fsu.edu#include <vector> 476019Shines@cs.fsu.edu 486116Snate@binkert.org#include "arch/arm/faults.hh" 496019Shines@cs.fsu.edu#include "arch/arm/pagetable.hh" 506019Shines@cs.fsu.edu#include "arch/arm/tlb.hh" 516019Shines@cs.fsu.edu#include "arch/arm/utility.hh" 526019Shines@cs.fsu.edu#include "base/inifile.hh" 536019Shines@cs.fsu.edu#include "base/str.hh" 546019Shines@cs.fsu.edu#include "base/trace.hh" 556019Shines@cs.fsu.edu#include "cpu/thread_context.hh" 566116Snate@binkert.org#include "mem/page_table.hh" 576116Snate@binkert.org#include "params/ArmTLB.hh" 586019Shines@cs.fsu.edu#include "sim/process.hh" 596019Shines@cs.fsu.edu 606019Shines@cs.fsu.edu 616019Shines@cs.fsu.eduusing namespace std; 626019Shines@cs.fsu.eduusing namespace ArmISA; 636019Shines@cs.fsu.edu 646019Shines@cs.fsu.eduTLB::TLB(const Params *p) 656019Shines@cs.fsu.edu : BaseTLB(p), size(p->size), nlu(0) 666019Shines@cs.fsu.edu{ 676019Shines@cs.fsu.edu table = new ArmISA::PTE[size]; 686019Shines@cs.fsu.edu memset(table, 0, sizeof(ArmISA::PTE[size])); 697399SAli.Saidi@ARM.com 706019Shines@cs.fsu.edu} 716019Shines@cs.fsu.edu 726019Shines@cs.fsu.eduTLB::~TLB() 736019Shines@cs.fsu.edu{ 746019Shines@cs.fsu.edu if (table) 756019Shines@cs.fsu.edu delete [] table; 766019Shines@cs.fsu.edu} 776019Shines@cs.fsu.edu 786019Shines@cs.fsu.eduArmISA::PTE * 796019Shines@cs.fsu.eduTLB::lookup(Addr vpn, uint8_t asn) const 806019Shines@cs.fsu.edu{ 817399SAli.Saidi@ARM.com panic("lookup() not implemented for ARM\n"); 826019Shines@cs.fsu.edu} 836019Shines@cs.fsu.edu 846019Shines@cs.fsu.edu// insert a new TLB entry 856019Shines@cs.fsu.eduvoid 866019Shines@cs.fsu.eduTLB::insert(Addr addr, ArmISA::PTE &pte) 876019Shines@cs.fsu.edu{ 886019Shines@cs.fsu.edu fatal("TLB Insert not yet implemented\n"); 896019Shines@cs.fsu.edu} 906019Shines@cs.fsu.edu 916019Shines@cs.fsu.eduvoid 926019Shines@cs.fsu.eduTLB::flushAll() 936019Shines@cs.fsu.edu{ 946019Shines@cs.fsu.edu DPRINTF(TLB, "flushAll\n"); 956019Shines@cs.fsu.edu memset(table, 0, sizeof(ArmISA::PTE[size])); 966019Shines@cs.fsu.edu lookupTable.clear(); 976019Shines@cs.fsu.edu nlu = 0; 986019Shines@cs.fsu.edu} 996019Shines@cs.fsu.edu 1006019Shines@cs.fsu.eduvoid 1016019Shines@cs.fsu.eduTLB::serialize(ostream &os) 1026019Shines@cs.fsu.edu{ 1036019Shines@cs.fsu.edu SERIALIZE_SCALAR(size); 1046019Shines@cs.fsu.edu SERIALIZE_SCALAR(nlu); 1056019Shines@cs.fsu.edu 1066019Shines@cs.fsu.edu for (int i = 0; i < size; i++) { 1076019Shines@cs.fsu.edu nameOut(os, csprintf("%s.PTE%d", name(), i)); 1086019Shines@cs.fsu.edu table[i].serialize(os); 1096019Shines@cs.fsu.edu } 1106019Shines@cs.fsu.edu} 1116019Shines@cs.fsu.edu 1126019Shines@cs.fsu.eduvoid 1136019Shines@cs.fsu.eduTLB::unserialize(Checkpoint *cp, const string §ion) 1146019Shines@cs.fsu.edu{ 1156019Shines@cs.fsu.edu UNSERIALIZE_SCALAR(size); 1166019Shines@cs.fsu.edu UNSERIALIZE_SCALAR(nlu); 1176019Shines@cs.fsu.edu 1187399SAli.Saidi@ARM.com panic("Need to properly unserialize TLB\n"); 1196019Shines@cs.fsu.edu for (int i = 0; i < size; i++) { 1206019Shines@cs.fsu.edu table[i].unserialize(cp, csprintf("%s.PTE%d", section, i)); 1216019Shines@cs.fsu.edu } 1226019Shines@cs.fsu.edu} 1236019Shines@cs.fsu.edu 1246019Shines@cs.fsu.eduvoid 1256019Shines@cs.fsu.eduTLB::regStats() 1266019Shines@cs.fsu.edu{ 1276019Shines@cs.fsu.edu read_hits 1286019Shines@cs.fsu.edu .name(name() + ".read_hits") 1296019Shines@cs.fsu.edu .desc("DTB read hits") 1306019Shines@cs.fsu.edu ; 1316019Shines@cs.fsu.edu 1326019Shines@cs.fsu.edu read_misses 1336019Shines@cs.fsu.edu .name(name() + ".read_misses") 1346019Shines@cs.fsu.edu .desc("DTB read misses") 1356019Shines@cs.fsu.edu ; 1366019Shines@cs.fsu.edu 1376019Shines@cs.fsu.edu 1386019Shines@cs.fsu.edu read_accesses 1396019Shines@cs.fsu.edu .name(name() + ".read_accesses") 1406019Shines@cs.fsu.edu .desc("DTB read accesses") 1416019Shines@cs.fsu.edu ; 1426019Shines@cs.fsu.edu 1436019Shines@cs.fsu.edu write_hits 1446019Shines@cs.fsu.edu .name(name() + ".write_hits") 1456019Shines@cs.fsu.edu .desc("DTB write hits") 1466019Shines@cs.fsu.edu ; 1476019Shines@cs.fsu.edu 1486019Shines@cs.fsu.edu write_misses 1496019Shines@cs.fsu.edu .name(name() + ".write_misses") 1506019Shines@cs.fsu.edu .desc("DTB write misses") 1516019Shines@cs.fsu.edu ; 1526019Shines@cs.fsu.edu 1536019Shines@cs.fsu.edu 1546019Shines@cs.fsu.edu write_accesses 1556019Shines@cs.fsu.edu .name(name() + ".write_accesses") 1566019Shines@cs.fsu.edu .desc("DTB write accesses") 1576019Shines@cs.fsu.edu ; 1586019Shines@cs.fsu.edu 1596019Shines@cs.fsu.edu hits 1606019Shines@cs.fsu.edu .name(name() + ".hits") 1616019Shines@cs.fsu.edu .desc("DTB hits") 1626019Shines@cs.fsu.edu ; 1636019Shines@cs.fsu.edu 1646019Shines@cs.fsu.edu misses 1656019Shines@cs.fsu.edu .name(name() + ".misses") 1666019Shines@cs.fsu.edu .desc("DTB misses") 1676019Shines@cs.fsu.edu ; 1686019Shines@cs.fsu.edu 1696019Shines@cs.fsu.edu invalids 1706019Shines@cs.fsu.edu .name(name() + ".invalids") 1716019Shines@cs.fsu.edu .desc("DTB access violations") 1726019Shines@cs.fsu.edu ; 1736019Shines@cs.fsu.edu 1746019Shines@cs.fsu.edu accesses 1756019Shines@cs.fsu.edu .name(name() + ".accesses") 1766019Shines@cs.fsu.edu .desc("DTB accesses") 1776019Shines@cs.fsu.edu ; 1786019Shines@cs.fsu.edu 1796019Shines@cs.fsu.edu hits = read_hits + write_hits; 1806019Shines@cs.fsu.edu misses = read_misses + write_misses; 1816019Shines@cs.fsu.edu accesses = read_accesses + write_accesses; 1826019Shines@cs.fsu.edu} 1836019Shines@cs.fsu.edu 1846019Shines@cs.fsu.eduFault 1856116Snate@binkert.orgTLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode) 1866019Shines@cs.fsu.edu{ 1877093Sgblack@eecs.umich.edu Addr vaddr = req->getVaddr() & ~PcModeMask; 1887294Sgblack@eecs.umich.edu SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR); 1897294Sgblack@eecs.umich.edu uint32_t flags = req->getFlags(); 1907294Sgblack@eecs.umich.edu 1917294Sgblack@eecs.umich.edu if (mode != Execute) { 1927294Sgblack@eecs.umich.edu assert(flags & MustBeOne); 1937294Sgblack@eecs.umich.edu 1947294Sgblack@eecs.umich.edu if (sctlr.a || (flags & AllowUnaligned) == 0) { 1957294Sgblack@eecs.umich.edu if ((vaddr & flags & AlignmentMask) != 0) { 1967362Sgblack@eecs.umich.edu return new DataAbort(vaddr, (mode == Write), 0, 1977362Sgblack@eecs.umich.edu ArmFault::AlignmentFault); 1987294Sgblack@eecs.umich.edu } 1997294Sgblack@eecs.umich.edu } 2007294Sgblack@eecs.umich.edu } 2016019Shines@cs.fsu.edu#if !FULL_SYSTEM 2026019Shines@cs.fsu.edu Process * p = tc->getProcessPtr(); 2036019Shines@cs.fsu.edu 2047093Sgblack@eecs.umich.edu Addr paddr; 2057093Sgblack@eecs.umich.edu if (!p->pTable->translate(vaddr, paddr)) 2067093Sgblack@eecs.umich.edu return Fault(new GenericPageTableFault(vaddr)); 2077093Sgblack@eecs.umich.edu req->setPaddr(paddr); 2086019Shines@cs.fsu.edu 2096019Shines@cs.fsu.edu return NoFault; 2106019Shines@cs.fsu.edu#else 2116757SAli.Saidi@ARM.com if (!sctlr.m) { 2127093Sgblack@eecs.umich.edu req->setPaddr(vaddr); 2136757SAli.Saidi@ARM.com return NoFault; 2146757SAli.Saidi@ARM.com } 2157301Sgblack@eecs.umich.edu warn_once("MPU translation not implemented\n"); 2167301Sgblack@eecs.umich.edu req->setPaddr(vaddr); 2176757SAli.Saidi@ARM.com return NoFault; 2186757SAli.Saidi@ARM.com 2196757SAli.Saidi@ARM.com 2206019Shines@cs.fsu.edu#endif 2216019Shines@cs.fsu.edu} 2226019Shines@cs.fsu.edu 2236020Sgblack@eecs.umich.eduvoid 2246116Snate@binkert.orgTLB::translateTiming(RequestPtr req, ThreadContext *tc, 2256116Snate@binkert.org Translation *translation, Mode mode) 2266020Sgblack@eecs.umich.edu{ 2276020Sgblack@eecs.umich.edu assert(translation); 2286116Snate@binkert.org translation->finish(translateAtomic(req, tc, mode), req, tc, mode); 2296020Sgblack@eecs.umich.edu} 2306020Sgblack@eecs.umich.edu 2316116Snate@binkert.orgArmISA::TLB * 2326116Snate@binkert.orgArmTLBParams::create() 2336019Shines@cs.fsu.edu{ 2346116Snate@binkert.org return new ArmISA::TLB(this); 2356019Shines@cs.fsu.edu} 236