tlb.cc revision 5242
14997Sgblack@eecs.umich.edu/*
24997Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
34997Sgblack@eecs.umich.edu * All rights reserved.
44997Sgblack@eecs.umich.edu *
54997Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms,
64997Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the
74997Sgblack@eecs.umich.edu * following conditions are met:
84997Sgblack@eecs.umich.edu *
94997Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any
104997Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary
114997Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use.  Illustrative
124997Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study,
134997Sgblack@eecs.umich.edu * teaching, education and corporate research & development.
144997Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for
154997Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for
164997Sgblack@eecs.umich.edu * commercial advantage.
174997Sgblack@eecs.umich.edu *
184997Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be
194997Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact:
204997Sgblack@eecs.umich.edu *     Director of Intellectual Property Licensing
214997Sgblack@eecs.umich.edu *     Office of Strategy and Technology
224997Sgblack@eecs.umich.edu *     Hewlett-Packard Company
234997Sgblack@eecs.umich.edu *     1501 Page Mill Road
244997Sgblack@eecs.umich.edu *     Palo Alto, California  94304
254997Sgblack@eecs.umich.edu *
264997Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice,
274997Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer.  Redistributions
284997Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of
294997Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or
304997Sgblack@eecs.umich.edu * other materials provided with the distribution.  Neither the name of
314997Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
324997Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
334997Sgblack@eecs.umich.edu * this software without specific prior written permission.  No right of
344997Sgblack@eecs.umich.edu * sublicense is granted herewith.  Derivatives of the software and
354997Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for
364997Sgblack@eecs.umich.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
374997Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of
384997Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions;
394997Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright
404997Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where
414997Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below.
424997Sgblack@eecs.umich.edu *
434997Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
444997Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
454997Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
464997Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
474997Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
484997Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
494997Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
504997Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
514997Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
524997Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
534997Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
544997Sgblack@eecs.umich.edu *
554997Sgblack@eecs.umich.edu * Authors: Gabe Black
564997Sgblack@eecs.umich.edu */
574997Sgblack@eecs.umich.edu
584997Sgblack@eecs.umich.edu#include <cstring>
594997Sgblack@eecs.umich.edu
605086Sgblack@eecs.umich.edu#include "config/full_system.hh"
615086Sgblack@eecs.umich.edu
625124Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh"
635086Sgblack@eecs.umich.edu#include "arch/x86/tlb.hh"
645149Sgblack@eecs.umich.edu#include "arch/x86/x86_traits.hh"
655086Sgblack@eecs.umich.edu#include "base/bitfield.hh"
665086Sgblack@eecs.umich.edu#include "base/trace.hh"
675237Sgblack@eecs.umich.edu#include "config/full_system.hh"
685086Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
695086Sgblack@eecs.umich.edu#include "cpu/base.hh"
705086Sgblack@eecs.umich.edu#include "mem/packet_access.hh"
715086Sgblack@eecs.umich.edu#include "mem/request.hh"
725086Sgblack@eecs.umich.edu#include "sim/system.hh"
735086Sgblack@eecs.umich.edu
745086Sgblack@eecs.umich.edunamespace X86ISA {
755086Sgblack@eecs.umich.edu
765237Sgblack@eecs.umich.edu#if FULL_SYSTEM
775236Sgblack@eecs.umich.eduTLB::TLB(const Params *p) : MemObject(p), walker(name(), this), size(p->size)
785237Sgblack@eecs.umich.edu#else
795237Sgblack@eecs.umich.eduTLB::TLB(const Params *p) : MemObject(p), size(p->size)
805237Sgblack@eecs.umich.edu#endif
815124Sgblack@eecs.umich.edu{
825124Sgblack@eecs.umich.edu    tlb = new TlbEntry[size];
835124Sgblack@eecs.umich.edu    std::memset(tlb, 0, sizeof(TlbEntry) * size);
845124Sgblack@eecs.umich.edu
855124Sgblack@eecs.umich.edu    for (int x = 0; x < size; x++)
865124Sgblack@eecs.umich.edu        freeList.push_back(&tlb[x]);
875124Sgblack@eecs.umich.edu}
885124Sgblack@eecs.umich.edu
895237Sgblack@eecs.umich.edu#if FULL_SYSTEM
905237Sgblack@eecs.umich.edu
915237Sgblack@eecs.umich.edu// Unfortunately, the placement of the base field in a page table entry is
925237Sgblack@eecs.umich.edu// very erratic and would make a mess here. It might be moved here at some
935237Sgblack@eecs.umich.edu// point in the future.
945237Sgblack@eecs.umich.eduBitUnion64(PageTableEntry)
955237Sgblack@eecs.umich.edu    Bitfield<63> nx;
965237Sgblack@eecs.umich.edu    Bitfield<11, 9> avl;
975237Sgblack@eecs.umich.edu    Bitfield<8> g;
985237Sgblack@eecs.umich.edu    Bitfield<7> ps;
995237Sgblack@eecs.umich.edu    Bitfield<6> d;
1005237Sgblack@eecs.umich.edu    Bitfield<5> a;
1015237Sgblack@eecs.umich.edu    Bitfield<4> pcd;
1025237Sgblack@eecs.umich.edu    Bitfield<3> pwt;
1035237Sgblack@eecs.umich.edu    Bitfield<2> u;
1045237Sgblack@eecs.umich.edu    Bitfield<1> w;
1055237Sgblack@eecs.umich.edu    Bitfield<0> p;
1065237Sgblack@eecs.umich.eduEndBitUnion(PageTableEntry)
1075237Sgblack@eecs.umich.edu
1085237Sgblack@eecs.umich.eduvoid
1095237Sgblack@eecs.umich.eduTLB::Walker::doNext(PacketPtr &read, PacketPtr &write)
1105236Sgblack@eecs.umich.edu{
1115236Sgblack@eecs.umich.edu    assert(state != Ready && state != Waiting);
1125236Sgblack@eecs.umich.edu    write = NULL;
1135237Sgblack@eecs.umich.edu    PageTableEntry pte;
1145237Sgblack@eecs.umich.edu    if (size == 8)
1155237Sgblack@eecs.umich.edu        pte = read->get<uint64_t>();
1165237Sgblack@eecs.umich.edu    else
1175237Sgblack@eecs.umich.edu        pte = read->get<uint32_t>();
1185237Sgblack@eecs.umich.edu    VAddr vaddr = entry.vaddr;
1195237Sgblack@eecs.umich.edu    bool uncacheable = pte.pcd;
1205237Sgblack@eecs.umich.edu    Addr nextRead = 0;
1215237Sgblack@eecs.umich.edu    bool doWrite = false;
1225237Sgblack@eecs.umich.edu    bool badNX = pte.nx && (!tlb->allowNX || !enableNX);
1235236Sgblack@eecs.umich.edu    switch(state) {
1245236Sgblack@eecs.umich.edu      case LongPML4:
1255237Sgblack@eecs.umich.edu        nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl3 * size;
1265237Sgblack@eecs.umich.edu        doWrite = !pte.a;
1275237Sgblack@eecs.umich.edu        pte.a = 1;
1285237Sgblack@eecs.umich.edu        entry.writable = pte.w;
1295237Sgblack@eecs.umich.edu        entry.user = pte.u;
1305237Sgblack@eecs.umich.edu        if (badNX)
1315237Sgblack@eecs.umich.edu            panic("NX violation!\n");
1325237Sgblack@eecs.umich.edu        entry.noExec = pte.nx;
1335237Sgblack@eecs.umich.edu        if (!pte.p)
1345237Sgblack@eecs.umich.edu            panic("Page not present!\n");
1355236Sgblack@eecs.umich.edu        nextState = LongPDP;
1365236Sgblack@eecs.umich.edu        break;
1375236Sgblack@eecs.umich.edu      case LongPDP:
1385237Sgblack@eecs.umich.edu        nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl2 * size;
1395237Sgblack@eecs.umich.edu        doWrite = !pte.a;
1405237Sgblack@eecs.umich.edu        pte.a = 1;
1415237Sgblack@eecs.umich.edu        entry.writable = entry.writable && pte.w;
1425237Sgblack@eecs.umich.edu        entry.user = entry.user && pte.u;
1435237Sgblack@eecs.umich.edu        if (badNX)
1445237Sgblack@eecs.umich.edu            panic("NX violation!\n");
1455237Sgblack@eecs.umich.edu        if (!pte.p)
1465237Sgblack@eecs.umich.edu            panic("Page not present!\n");
1475236Sgblack@eecs.umich.edu        nextState = LongPD;
1485236Sgblack@eecs.umich.edu        break;
1495236Sgblack@eecs.umich.edu      case LongPD:
1505237Sgblack@eecs.umich.edu        doWrite = !pte.a;
1515237Sgblack@eecs.umich.edu        pte.a = 1;
1525237Sgblack@eecs.umich.edu        entry.writable = entry.writable && pte.w;
1535237Sgblack@eecs.umich.edu        entry.user = entry.user && pte.u;
1545237Sgblack@eecs.umich.edu        if (badNX)
1555237Sgblack@eecs.umich.edu            panic("NX violation!\n");
1565237Sgblack@eecs.umich.edu        if (!pte.p)
1575237Sgblack@eecs.umich.edu            panic("Page not present!\n");
1585237Sgblack@eecs.umich.edu        if (!pte.ps) {
1595237Sgblack@eecs.umich.edu            // 4 KB page
1605237Sgblack@eecs.umich.edu            entry.size = 4 * (1 << 10);
1615237Sgblack@eecs.umich.edu            nextRead =
1625237Sgblack@eecs.umich.edu                ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl1 * size;
1635237Sgblack@eecs.umich.edu            nextState = LongPTE;
1645237Sgblack@eecs.umich.edu            break;
1655237Sgblack@eecs.umich.edu        } else {
1665237Sgblack@eecs.umich.edu            // 2 MB page
1675237Sgblack@eecs.umich.edu            entry.size = 2 * (1 << 20);
1685237Sgblack@eecs.umich.edu            entry.paddr = (uint64_t)pte & (mask(31) << 21);
1695237Sgblack@eecs.umich.edu            entry.uncacheable = uncacheable;
1705237Sgblack@eecs.umich.edu            entry.global = pte.g;
1715237Sgblack@eecs.umich.edu            entry.patBit = bits(pte, 12);
1725237Sgblack@eecs.umich.edu            entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
1735237Sgblack@eecs.umich.edu            tlb->insert(entry.vaddr, entry);
1745237Sgblack@eecs.umich.edu            nextState = Ready;
1755237Sgblack@eecs.umich.edu            delete read->req;
1765237Sgblack@eecs.umich.edu            delete read;
1775237Sgblack@eecs.umich.edu            read = NULL;
1785237Sgblack@eecs.umich.edu            return;
1795237Sgblack@eecs.umich.edu        }
1805236Sgblack@eecs.umich.edu      case LongPTE:
1815237Sgblack@eecs.umich.edu        doWrite = !pte.a;
1825237Sgblack@eecs.umich.edu        pte.a = 1;
1835237Sgblack@eecs.umich.edu        entry.writable = entry.writable && pte.w;
1845237Sgblack@eecs.umich.edu        entry.user = entry.user && pte.u;
1855237Sgblack@eecs.umich.edu        if (badNX)
1865237Sgblack@eecs.umich.edu            panic("NX violation!\n");
1875237Sgblack@eecs.umich.edu        if (!pte.p)
1885237Sgblack@eecs.umich.edu            panic("Page not present!\n");
1895237Sgblack@eecs.umich.edu        entry.paddr = (uint64_t)pte & (mask(40) << 12);
1905237Sgblack@eecs.umich.edu        entry.uncacheable = uncacheable;
1915237Sgblack@eecs.umich.edu        entry.global = pte.g;
1925237Sgblack@eecs.umich.edu        entry.patBit = bits(pte, 12);
1935237Sgblack@eecs.umich.edu        entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
1945237Sgblack@eecs.umich.edu        tlb->insert(entry.vaddr, entry);
1955236Sgblack@eecs.umich.edu        nextState = Ready;
1965237Sgblack@eecs.umich.edu        delete read->req;
1975237Sgblack@eecs.umich.edu        delete read;
1985237Sgblack@eecs.umich.edu        read = NULL;
1995237Sgblack@eecs.umich.edu        return;
2005236Sgblack@eecs.umich.edu      case PAEPDP:
2015237Sgblack@eecs.umich.edu        nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.pael2 * size;
2025237Sgblack@eecs.umich.edu        if (!pte.p)
2035237Sgblack@eecs.umich.edu            panic("Page not present!\n");
2045236Sgblack@eecs.umich.edu        nextState = PAEPD;
2055236Sgblack@eecs.umich.edu        break;
2065236Sgblack@eecs.umich.edu      case PAEPD:
2075237Sgblack@eecs.umich.edu        doWrite = !pte.a;
2085237Sgblack@eecs.umich.edu        pte.a = 1;
2095237Sgblack@eecs.umich.edu        entry.writable = pte.w;
2105237Sgblack@eecs.umich.edu        entry.user = pte.u;
2115237Sgblack@eecs.umich.edu        if (badNX)
2125237Sgblack@eecs.umich.edu            panic("NX violation!\n");
2135237Sgblack@eecs.umich.edu        if (!pte.p)
2145237Sgblack@eecs.umich.edu            panic("Page not present!\n");
2155237Sgblack@eecs.umich.edu        if (!pte.ps) {
2165237Sgblack@eecs.umich.edu            // 4 KB page
2175237Sgblack@eecs.umich.edu            entry.size = 4 * (1 << 10);
2185237Sgblack@eecs.umich.edu            nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.pael1 * size;
2195237Sgblack@eecs.umich.edu            nextState = PAEPTE;
2205237Sgblack@eecs.umich.edu            break;
2215237Sgblack@eecs.umich.edu        } else {
2225237Sgblack@eecs.umich.edu            // 2 MB page
2235237Sgblack@eecs.umich.edu            entry.size = 2 * (1 << 20);
2245237Sgblack@eecs.umich.edu            entry.paddr = (uint64_t)pte & (mask(31) << 21);
2255237Sgblack@eecs.umich.edu            entry.uncacheable = uncacheable;
2265237Sgblack@eecs.umich.edu            entry.global = pte.g;
2275237Sgblack@eecs.umich.edu            entry.patBit = bits(pte, 12);
2285237Sgblack@eecs.umich.edu            entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
2295237Sgblack@eecs.umich.edu            tlb->insert(entry.vaddr, entry);
2305237Sgblack@eecs.umich.edu            nextState = Ready;
2315237Sgblack@eecs.umich.edu            delete read->req;
2325237Sgblack@eecs.umich.edu            delete read;
2335237Sgblack@eecs.umich.edu            read = NULL;
2345237Sgblack@eecs.umich.edu            return;
2355237Sgblack@eecs.umich.edu        }
2365237Sgblack@eecs.umich.edu      case PAEPTE:
2375237Sgblack@eecs.umich.edu        doWrite = !pte.a;
2385237Sgblack@eecs.umich.edu        pte.a = 1;
2395237Sgblack@eecs.umich.edu        entry.writable = entry.writable && pte.w;
2405237Sgblack@eecs.umich.edu        entry.user = entry.user && pte.u;
2415237Sgblack@eecs.umich.edu        if (badNX)
2425237Sgblack@eecs.umich.edu            panic("NX violation!\n");
2435237Sgblack@eecs.umich.edu        if (!pte.p)
2445237Sgblack@eecs.umich.edu            panic("Page not present!\n");
2455237Sgblack@eecs.umich.edu        entry.paddr = (uint64_t)pte & (mask(40) << 12);
2465237Sgblack@eecs.umich.edu        entry.uncacheable = uncacheable;
2475237Sgblack@eecs.umich.edu        entry.global = pte.g;
2485237Sgblack@eecs.umich.edu        entry.patBit = bits(pte, 7);
2495237Sgblack@eecs.umich.edu        entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
2505237Sgblack@eecs.umich.edu        tlb->insert(entry.vaddr, entry);
2515237Sgblack@eecs.umich.edu        nextState = Ready;
2525237Sgblack@eecs.umich.edu        delete read->req;
2535237Sgblack@eecs.umich.edu        delete read;
2545237Sgblack@eecs.umich.edu        read = NULL;
2555237Sgblack@eecs.umich.edu        return;
2565237Sgblack@eecs.umich.edu      case PSEPD:
2575237Sgblack@eecs.umich.edu        doWrite = !pte.a;
2585237Sgblack@eecs.umich.edu        pte.a = 1;
2595237Sgblack@eecs.umich.edu        entry.writable = pte.w;
2605237Sgblack@eecs.umich.edu        entry.user = pte.u;
2615237Sgblack@eecs.umich.edu        if (!pte.p)
2625237Sgblack@eecs.umich.edu            panic("Page not present!\n");
2635237Sgblack@eecs.umich.edu        if (!pte.ps) {
2645237Sgblack@eecs.umich.edu            // 4 KB page
2655237Sgblack@eecs.umich.edu            entry.size = 4 * (1 << 10);
2665237Sgblack@eecs.umich.edu            nextRead =
2675237Sgblack@eecs.umich.edu                ((uint64_t)pte & (mask(20) << 12)) + vaddr.norml2 * size;
2685237Sgblack@eecs.umich.edu            nextState = PTE;
2695237Sgblack@eecs.umich.edu            break;
2705237Sgblack@eecs.umich.edu        } else {
2715237Sgblack@eecs.umich.edu            // 4 MB page
2725237Sgblack@eecs.umich.edu            entry.size = 4 * (1 << 20);
2735237Sgblack@eecs.umich.edu            entry.paddr = bits(pte, 20, 13) << 32 | bits(pte, 31, 22) << 22;
2745237Sgblack@eecs.umich.edu            entry.uncacheable = uncacheable;
2755237Sgblack@eecs.umich.edu            entry.global = pte.g;
2765237Sgblack@eecs.umich.edu            entry.patBit = bits(pte, 12);
2775237Sgblack@eecs.umich.edu            entry.vaddr = entry.vaddr & ~((4 * (1 << 20)) - 1);
2785237Sgblack@eecs.umich.edu            tlb->insert(entry.vaddr, entry);
2795237Sgblack@eecs.umich.edu            nextState = Ready;
2805237Sgblack@eecs.umich.edu            delete read->req;
2815237Sgblack@eecs.umich.edu            delete read;
2825237Sgblack@eecs.umich.edu            read = NULL;
2835237Sgblack@eecs.umich.edu            return;
2845237Sgblack@eecs.umich.edu        }
2855237Sgblack@eecs.umich.edu      case PD:
2865237Sgblack@eecs.umich.edu        doWrite = !pte.a;
2875237Sgblack@eecs.umich.edu        pte.a = 1;
2885237Sgblack@eecs.umich.edu        entry.writable = pte.w;
2895237Sgblack@eecs.umich.edu        entry.user = pte.u;
2905237Sgblack@eecs.umich.edu        if (!pte.p)
2915237Sgblack@eecs.umich.edu            panic("Page not present!\n");
2925237Sgblack@eecs.umich.edu        // 4 KB page
2935237Sgblack@eecs.umich.edu        entry.size = 4 * (1 << 10);
2945237Sgblack@eecs.umich.edu        nextRead = ((uint64_t)pte & (mask(20) << 12)) + vaddr.norml2 * size;
2955237Sgblack@eecs.umich.edu        nextState = PTE;
2965236Sgblack@eecs.umich.edu        break;
2975236Sgblack@eecs.umich.edu        nextState = PTE;
2985236Sgblack@eecs.umich.edu        break;
2995236Sgblack@eecs.umich.edu      case PTE:
3005237Sgblack@eecs.umich.edu        doWrite = !pte.a;
3015237Sgblack@eecs.umich.edu        pte.a = 1;
3025237Sgblack@eecs.umich.edu        entry.writable = pte.w;
3035237Sgblack@eecs.umich.edu        entry.user = pte.u;
3045237Sgblack@eecs.umich.edu        if (!pte.p)
3055237Sgblack@eecs.umich.edu            panic("Page not present!\n");
3065237Sgblack@eecs.umich.edu        entry.paddr = (uint64_t)pte & (mask(20) << 12);
3075237Sgblack@eecs.umich.edu        entry.uncacheable = uncacheable;
3085237Sgblack@eecs.umich.edu        entry.global = pte.g;
3095237Sgblack@eecs.umich.edu        entry.patBit = bits(pte, 7);
3105237Sgblack@eecs.umich.edu        entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
3115237Sgblack@eecs.umich.edu        tlb->insert(entry.vaddr, entry);
3125236Sgblack@eecs.umich.edu        nextState = Ready;
3135237Sgblack@eecs.umich.edu        delete read->req;
3145237Sgblack@eecs.umich.edu        delete read;
3155237Sgblack@eecs.umich.edu        read = NULL;
3165237Sgblack@eecs.umich.edu        return;
3175236Sgblack@eecs.umich.edu      default:
3185236Sgblack@eecs.umich.edu        panic("Unknown page table walker state %d!\n");
3195236Sgblack@eecs.umich.edu    }
3205237Sgblack@eecs.umich.edu    PacketPtr oldRead = read;
3215237Sgblack@eecs.umich.edu    //If we didn't return, we're setting up another read.
3225237Sgblack@eecs.umich.edu    uint32_t flags = oldRead->req->getFlags();
3235237Sgblack@eecs.umich.edu    if (uncacheable)
3245237Sgblack@eecs.umich.edu        flags |= UNCACHEABLE;
3255237Sgblack@eecs.umich.edu    else
3265237Sgblack@eecs.umich.edu        flags &= ~UNCACHEABLE;
3275237Sgblack@eecs.umich.edu    RequestPtr request =
3285237Sgblack@eecs.umich.edu        new Request(nextRead, oldRead->getSize(), flags);
3295237Sgblack@eecs.umich.edu    read = new Packet(request, MemCmd::ReadExReq, Packet::Broadcast);
3305237Sgblack@eecs.umich.edu    read->allocate();
3315237Sgblack@eecs.umich.edu    //If we need to write, adjust the read packet to write the modified value
3325237Sgblack@eecs.umich.edu    //back to memory.
3335237Sgblack@eecs.umich.edu    if (doWrite) {
3345237Sgblack@eecs.umich.edu        write = oldRead;
3355237Sgblack@eecs.umich.edu        write->set<uint64_t>(pte);
3365237Sgblack@eecs.umich.edu        write->cmd = MemCmd::WriteReq;
3375237Sgblack@eecs.umich.edu        write->setDest(Packet::Broadcast);
3385237Sgblack@eecs.umich.edu    } else {
3395237Sgblack@eecs.umich.edu        write = NULL;
3405237Sgblack@eecs.umich.edu        delete oldRead->req;
3415237Sgblack@eecs.umich.edu        delete oldRead;
3425237Sgblack@eecs.umich.edu    }
3435236Sgblack@eecs.umich.edu}
3445236Sgblack@eecs.umich.edu
3455236Sgblack@eecs.umich.eduvoid
3465237Sgblack@eecs.umich.eduTLB::Walker::start(ThreadContext * _tc, Addr vaddr)
3475236Sgblack@eecs.umich.edu{
3485237Sgblack@eecs.umich.edu    assert(state == Ready);
3495237Sgblack@eecs.umich.edu    assert(!tc);
3505237Sgblack@eecs.umich.edu    tc = _tc;
3515237Sgblack@eecs.umich.edu
3525237Sgblack@eecs.umich.edu    VAddr addr = vaddr;
3535237Sgblack@eecs.umich.edu
3545237Sgblack@eecs.umich.edu    //Figure out what we're doing.
3555237Sgblack@eecs.umich.edu    CR3 cr3 = tc->readMiscRegNoEffect(MISCREG_CR3);
3565237Sgblack@eecs.umich.edu    Addr top = 0;
3575237Sgblack@eecs.umich.edu    // Check if we're in long mode or not
3585237Sgblack@eecs.umich.edu    Efer efer = tc->readMiscRegNoEffect(MISCREG_EFER);
3595237Sgblack@eecs.umich.edu    size = 8;
3605237Sgblack@eecs.umich.edu    if (efer.lma) {
3615237Sgblack@eecs.umich.edu        // Do long mode.
3625237Sgblack@eecs.umich.edu        state = LongPML4;
3635237Sgblack@eecs.umich.edu        top = (cr3.longPdtb << 12) + addr.longl4 * size;
3645237Sgblack@eecs.umich.edu    } else {
3655237Sgblack@eecs.umich.edu        // We're in some flavor of legacy mode.
3665237Sgblack@eecs.umich.edu        CR4 cr4 = tc->readMiscRegNoEffect(MISCREG_CR4);
3675237Sgblack@eecs.umich.edu        if (cr4.pae) {
3685237Sgblack@eecs.umich.edu            // Do legacy PAE.
3695237Sgblack@eecs.umich.edu            state = PAEPDP;
3705237Sgblack@eecs.umich.edu            top = (cr3.paePdtb << 5) + addr.pael3 * size;
3715237Sgblack@eecs.umich.edu        } else {
3725237Sgblack@eecs.umich.edu            size = 4;
3735237Sgblack@eecs.umich.edu            top = (cr3.pdtb << 12) + addr.norml2 * size;
3745237Sgblack@eecs.umich.edu            if (cr4.pse) {
3755237Sgblack@eecs.umich.edu                // Do legacy PSE.
3765237Sgblack@eecs.umich.edu                state = PSEPD;
3775237Sgblack@eecs.umich.edu            } else {
3785237Sgblack@eecs.umich.edu                // Do legacy non PSE.
3795237Sgblack@eecs.umich.edu                state = PD;
3805237Sgblack@eecs.umich.edu            }
3815237Sgblack@eecs.umich.edu        }
3825237Sgblack@eecs.umich.edu    }
3835242Sgblack@eecs.umich.edu
3845237Sgblack@eecs.umich.edu    nextState = Ready;
3855237Sgblack@eecs.umich.edu    entry.vaddr = vaddr;
3865237Sgblack@eecs.umich.edu
3875237Sgblack@eecs.umich.edu    enableNX = efer.nxe;
3885237Sgblack@eecs.umich.edu
3895237Sgblack@eecs.umich.edu    RequestPtr request =
3905237Sgblack@eecs.umich.edu        new Request(top, size, PHYSICAL | cr3.pcd ? UNCACHEABLE : 0);
3915237Sgblack@eecs.umich.edu    read = new Packet(request, MemCmd::ReadExReq, Packet::Broadcast);
3925237Sgblack@eecs.umich.edu    read->allocate();
3935237Sgblack@eecs.umich.edu    Enums::MemoryMode memMode = tlb->sys->getMemoryMode();
3945237Sgblack@eecs.umich.edu    if (memMode == Enums::timing) {
3955237Sgblack@eecs.umich.edu        tc->suspend();
3965237Sgblack@eecs.umich.edu        port.sendTiming(read);
3975237Sgblack@eecs.umich.edu    } else if (memMode == Enums::atomic) {
3985237Sgblack@eecs.umich.edu        do {
3995237Sgblack@eecs.umich.edu            port.sendAtomic(read);
4005237Sgblack@eecs.umich.edu            PacketPtr write = NULL;
4015237Sgblack@eecs.umich.edu            doNext(read, write);
4025237Sgblack@eecs.umich.edu            state = nextState;
4035237Sgblack@eecs.umich.edu            nextState = Ready;
4045237Sgblack@eecs.umich.edu            if (write)
4055237Sgblack@eecs.umich.edu                port.sendAtomic(write);
4065237Sgblack@eecs.umich.edu        } while(read);
4075237Sgblack@eecs.umich.edu        tc = NULL;
4085237Sgblack@eecs.umich.edu        state = Ready;
4095237Sgblack@eecs.umich.edu        nextState = Waiting;
4105237Sgblack@eecs.umich.edu    } else {
4115237Sgblack@eecs.umich.edu        panic("Unrecognized memory system mode.\n");
4125237Sgblack@eecs.umich.edu    }
4135236Sgblack@eecs.umich.edu}
4145236Sgblack@eecs.umich.edu
4155236Sgblack@eecs.umich.edubool
4165236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvTiming(PacketPtr pkt)
4175236Sgblack@eecs.umich.edu{
4185237Sgblack@eecs.umich.edu    return walker->recvTiming(pkt);
4195237Sgblack@eecs.umich.edu}
4205237Sgblack@eecs.umich.edu
4215237Sgblack@eecs.umich.edubool
4225237Sgblack@eecs.umich.eduTLB::Walker::recvTiming(PacketPtr pkt)
4235237Sgblack@eecs.umich.edu{
4245237Sgblack@eecs.umich.edu    inflight--;
4255236Sgblack@eecs.umich.edu    if (pkt->isResponse() && !pkt->wasNacked()) {
4265236Sgblack@eecs.umich.edu        if (pkt->isRead()) {
4275237Sgblack@eecs.umich.edu            assert(inflight);
4285237Sgblack@eecs.umich.edu            assert(state == Waiting);
4295237Sgblack@eecs.umich.edu            assert(!read);
4305237Sgblack@eecs.umich.edu            state = nextState;
4315237Sgblack@eecs.umich.edu            nextState = Ready;
4325237Sgblack@eecs.umich.edu            PacketPtr write = NULL;
4335237Sgblack@eecs.umich.edu            doNext(pkt, write);
4345237Sgblack@eecs.umich.edu            state = Waiting;
4355237Sgblack@eecs.umich.edu            read = pkt;
4365236Sgblack@eecs.umich.edu            if (write) {
4375236Sgblack@eecs.umich.edu                writes.push_back(write);
4385236Sgblack@eecs.umich.edu            }
4395237Sgblack@eecs.umich.edu            sendPackets();
4405236Sgblack@eecs.umich.edu        } else {
4415237Sgblack@eecs.umich.edu            sendPackets();
4425237Sgblack@eecs.umich.edu        }
4435237Sgblack@eecs.umich.edu        if (inflight == 0 && read == NULL && writes.size() == 0) {
4445237Sgblack@eecs.umich.edu            tc->activate(0);
4455237Sgblack@eecs.umich.edu            tc = NULL;
4465237Sgblack@eecs.umich.edu            state = Ready;
4475237Sgblack@eecs.umich.edu            nextState = Waiting;
4485236Sgblack@eecs.umich.edu        }
4495236Sgblack@eecs.umich.edu    } else if (pkt->wasNacked()) {
4505236Sgblack@eecs.umich.edu        pkt->reinitNacked();
4515237Sgblack@eecs.umich.edu        if (!port.sendTiming(pkt)) {
4525237Sgblack@eecs.umich.edu            retrying = true;
4535236Sgblack@eecs.umich.edu            if (pkt->isWrite()) {
4545237Sgblack@eecs.umich.edu                writes.push_back(pkt);
4555237Sgblack@eecs.umich.edu            } else {
4565237Sgblack@eecs.umich.edu                assert(!read);
4575237Sgblack@eecs.umich.edu                read = pkt;
4585236Sgblack@eecs.umich.edu            }
4595237Sgblack@eecs.umich.edu        } else {
4605237Sgblack@eecs.umich.edu            inflight++;
4615236Sgblack@eecs.umich.edu        }
4625236Sgblack@eecs.umich.edu    }
4635236Sgblack@eecs.umich.edu    return true;
4645236Sgblack@eecs.umich.edu}
4655236Sgblack@eecs.umich.edu
4665236Sgblack@eecs.umich.eduTick
4675236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvAtomic(PacketPtr pkt)
4685236Sgblack@eecs.umich.edu{
4695236Sgblack@eecs.umich.edu    return 0;
4705236Sgblack@eecs.umich.edu}
4715236Sgblack@eecs.umich.edu
4725236Sgblack@eecs.umich.eduvoid
4735236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvFunctional(PacketPtr pkt)
4745236Sgblack@eecs.umich.edu{
4755236Sgblack@eecs.umich.edu    return;
4765236Sgblack@eecs.umich.edu}
4775236Sgblack@eecs.umich.edu
4785236Sgblack@eecs.umich.eduvoid
4795236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvStatusChange(Status status)
4805236Sgblack@eecs.umich.edu{
4815236Sgblack@eecs.umich.edu    if (status == RangeChange) {
4825236Sgblack@eecs.umich.edu        if (!snoopRangeSent) {
4835236Sgblack@eecs.umich.edu            snoopRangeSent = true;
4845236Sgblack@eecs.umich.edu            sendStatusChange(Port::RangeChange);
4855236Sgblack@eecs.umich.edu        }
4865236Sgblack@eecs.umich.edu        return;
4875236Sgblack@eecs.umich.edu    }
4885236Sgblack@eecs.umich.edu
4895236Sgblack@eecs.umich.edu    panic("Unexpected recvStatusChange.\n");
4905236Sgblack@eecs.umich.edu}
4915236Sgblack@eecs.umich.edu
4925236Sgblack@eecs.umich.eduvoid
4935236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvRetry()
4945236Sgblack@eecs.umich.edu{
4955237Sgblack@eecs.umich.edu    walker->recvRetry();
4965237Sgblack@eecs.umich.edu}
4975237Sgblack@eecs.umich.edu
4985237Sgblack@eecs.umich.eduvoid
4995237Sgblack@eecs.umich.eduTLB::Walker::recvRetry()
5005237Sgblack@eecs.umich.edu{
5015236Sgblack@eecs.umich.edu    retrying = false;
5025237Sgblack@eecs.umich.edu    sendPackets();
5035237Sgblack@eecs.umich.edu}
5045237Sgblack@eecs.umich.edu
5055237Sgblack@eecs.umich.eduvoid
5065237Sgblack@eecs.umich.eduTLB::Walker::sendPackets()
5075237Sgblack@eecs.umich.edu{
5085237Sgblack@eecs.umich.edu    //If we're already waiting for the port to become available, just return.
5095237Sgblack@eecs.umich.edu    if (retrying)
5105237Sgblack@eecs.umich.edu        return;
5115237Sgblack@eecs.umich.edu
5125237Sgblack@eecs.umich.edu    //Reads always have priority
5135237Sgblack@eecs.umich.edu    if (read) {
5145237Sgblack@eecs.umich.edu        if (!port.sendTiming(read)) {
5155237Sgblack@eecs.umich.edu            retrying = true;
5165237Sgblack@eecs.umich.edu            return;
5175237Sgblack@eecs.umich.edu        } else {
5185237Sgblack@eecs.umich.edu            inflight++;
5195237Sgblack@eecs.umich.edu            delete read->req;
5205237Sgblack@eecs.umich.edu            delete read;
5215237Sgblack@eecs.umich.edu            read = NULL;
5225237Sgblack@eecs.umich.edu        }
5235237Sgblack@eecs.umich.edu    }
5245237Sgblack@eecs.umich.edu    //Send off as many of the writes as we can.
5255237Sgblack@eecs.umich.edu    while (writes.size()) {
5265237Sgblack@eecs.umich.edu        PacketPtr write = writes.back();
5275237Sgblack@eecs.umich.edu        if (!port.sendTiming(write)) {
5285237Sgblack@eecs.umich.edu            retrying = true;
5295237Sgblack@eecs.umich.edu            return;
5305237Sgblack@eecs.umich.edu        } else {
5315237Sgblack@eecs.umich.edu            inflight++;
5325237Sgblack@eecs.umich.edu            delete write->req;
5335237Sgblack@eecs.umich.edu            delete write;
5345237Sgblack@eecs.umich.edu            writes.pop_back();
5355237Sgblack@eecs.umich.edu        }
5365236Sgblack@eecs.umich.edu    }
5375236Sgblack@eecs.umich.edu}
5385236Sgblack@eecs.umich.edu
5395236Sgblack@eecs.umich.eduPort *
5405236Sgblack@eecs.umich.eduTLB::getPort(const std::string &if_name, int idx)
5415236Sgblack@eecs.umich.edu{
5425236Sgblack@eecs.umich.edu    if (if_name == "walker_port")
5435236Sgblack@eecs.umich.edu        return &walker.port;
5445236Sgblack@eecs.umich.edu    else
5455236Sgblack@eecs.umich.edu        panic("No tlb port named %s!\n", if_name);
5465236Sgblack@eecs.umich.edu}
5475236Sgblack@eecs.umich.edu
5485237Sgblack@eecs.umich.edu#else
5495237Sgblack@eecs.umich.edu
5505237Sgblack@eecs.umich.eduPort *
5515237Sgblack@eecs.umich.eduTLB::getPort(const std::string &if_name, int idx)
5525237Sgblack@eecs.umich.edu{
5535237Sgblack@eecs.umich.edu    panic("No tlb ports in se!\n", if_name);
5545237Sgblack@eecs.umich.edu}
5555237Sgblack@eecs.umich.edu
5565237Sgblack@eecs.umich.edu#endif
5575237Sgblack@eecs.umich.edu
5585124Sgblack@eecs.umich.eduvoid
5595124Sgblack@eecs.umich.eduTLB::insert(Addr vpn, TlbEntry &entry)
5605124Sgblack@eecs.umich.edu{
5615124Sgblack@eecs.umich.edu    //TODO Deal with conflicting entries
5625124Sgblack@eecs.umich.edu
5635124Sgblack@eecs.umich.edu    TlbEntry *newEntry = NULL;
5645124Sgblack@eecs.umich.edu    if (!freeList.empty()) {
5655124Sgblack@eecs.umich.edu        newEntry = freeList.front();
5665124Sgblack@eecs.umich.edu        freeList.pop_front();
5675124Sgblack@eecs.umich.edu    } else {
5685124Sgblack@eecs.umich.edu        newEntry = entryList.back();
5695124Sgblack@eecs.umich.edu        entryList.pop_back();
5705124Sgblack@eecs.umich.edu    }
5715124Sgblack@eecs.umich.edu    *newEntry = entry;
5725124Sgblack@eecs.umich.edu    newEntry->vaddr = vpn;
5735124Sgblack@eecs.umich.edu    entryList.push_front(newEntry);
5745124Sgblack@eecs.umich.edu}
5755124Sgblack@eecs.umich.edu
5765124Sgblack@eecs.umich.eduTlbEntry *
5775124Sgblack@eecs.umich.eduTLB::lookup(Addr va, bool update_lru)
5785124Sgblack@eecs.umich.edu{
5795124Sgblack@eecs.umich.edu    //TODO make this smarter at some point
5805124Sgblack@eecs.umich.edu    EntryList::iterator entry;
5815124Sgblack@eecs.umich.edu    for (entry = entryList.begin(); entry != entryList.end(); entry++) {
5825124Sgblack@eecs.umich.edu        if ((*entry)->vaddr <= va && (*entry)->vaddr + (*entry)->size > va) {
5835124Sgblack@eecs.umich.edu            DPRINTF(TLB, "Matched vaddr %#x to entry starting at %#x "
5845124Sgblack@eecs.umich.edu                    "with size %#x.\n", va, (*entry)->vaddr, (*entry)->size);
5855124Sgblack@eecs.umich.edu            TlbEntry *e = *entry;
5865124Sgblack@eecs.umich.edu            if (update_lru) {
5875124Sgblack@eecs.umich.edu                entryList.erase(entry);
5885124Sgblack@eecs.umich.edu                entryList.push_front(e);
5895124Sgblack@eecs.umich.edu            }
5905124Sgblack@eecs.umich.edu            return e;
5915124Sgblack@eecs.umich.edu        }
5925124Sgblack@eecs.umich.edu    }
5935124Sgblack@eecs.umich.edu    return NULL;
5945124Sgblack@eecs.umich.edu}
5955124Sgblack@eecs.umich.edu
5965124Sgblack@eecs.umich.eduvoid
5975124Sgblack@eecs.umich.eduTLB::invalidateAll()
5985124Sgblack@eecs.umich.edu{
5995242Sgblack@eecs.umich.edu    DPRINTF(TLB, "Invalidating all entries.\n");
6005242Sgblack@eecs.umich.edu    while (!entryList.empty()) {
6015242Sgblack@eecs.umich.edu        TlbEntry *entry = entryList.front();
6025242Sgblack@eecs.umich.edu        entryList.pop_front();
6035242Sgblack@eecs.umich.edu        freeList.push_back(entry);
6045242Sgblack@eecs.umich.edu    }
6055124Sgblack@eecs.umich.edu}
6065124Sgblack@eecs.umich.edu
6075124Sgblack@eecs.umich.eduvoid
6085124Sgblack@eecs.umich.eduTLB::invalidateNonGlobal()
6095124Sgblack@eecs.umich.edu{
6105242Sgblack@eecs.umich.edu    DPRINTF(TLB, "Invalidating all non global entries.\n");
6115242Sgblack@eecs.umich.edu    EntryList::iterator entryIt;
6125242Sgblack@eecs.umich.edu    for (entryIt = entryList.begin(); entryIt != entryList.end();) {
6135242Sgblack@eecs.umich.edu        if (!(*entryIt)->global) {
6145242Sgblack@eecs.umich.edu            freeList.push_back(*entryIt);
6155242Sgblack@eecs.umich.edu            entryList.erase(entryIt++);
6165242Sgblack@eecs.umich.edu        } else {
6175242Sgblack@eecs.umich.edu            entryIt++;
6185242Sgblack@eecs.umich.edu        }
6195242Sgblack@eecs.umich.edu    }
6205124Sgblack@eecs.umich.edu}
6215124Sgblack@eecs.umich.edu
6225124Sgblack@eecs.umich.eduvoid
6235124Sgblack@eecs.umich.eduTLB::demapPage(Addr va)
6245086Sgblack@eecs.umich.edu{
6255086Sgblack@eecs.umich.edu}
6265086Sgblack@eecs.umich.edu
6275140Sgblack@eecs.umich.edutemplate<class TlbFault>
6285086Sgblack@eecs.umich.eduFault
6295140Sgblack@eecs.umich.eduTLB::translate(RequestPtr &req, ThreadContext *tc, bool write, bool execute)
6305086Sgblack@eecs.umich.edu{
6315124Sgblack@eecs.umich.edu    Addr vaddr = req->getVaddr();
6325140Sgblack@eecs.umich.edu    DPRINTF(TLB, "Translating vaddr %#x.\n", vaddr);
6335124Sgblack@eecs.umich.edu    uint32_t flags = req->getFlags();
6345124Sgblack@eecs.umich.edu    bool storeCheck = flags & StoreCheck;
6355140Sgblack@eecs.umich.edu
6365149Sgblack@eecs.umich.edu    int seg = flags & mask(3);
6375124Sgblack@eecs.umich.edu
6385124Sgblack@eecs.umich.edu    //XXX Junk code to surpress the warning
6395149Sgblack@eecs.umich.edu    if (storeCheck);
6405149Sgblack@eecs.umich.edu
6415149Sgblack@eecs.umich.edu    // If this is true, we're dealing with a request to read an internal
6425149Sgblack@eecs.umich.edu    // value.
6435232Sgblack@eecs.umich.edu    if (seg == SEGMENT_REG_INT) {
6445149Sgblack@eecs.umich.edu        Addr prefix = vaddr & IntAddrPrefixMask;
6455149Sgblack@eecs.umich.edu        if (prefix == IntAddrPrefixCPUID) {
6465149Sgblack@eecs.umich.edu            panic("CPUID memory space not yet implemented!\n");
6475149Sgblack@eecs.umich.edu        } else if (prefix == IntAddrPrefixMSR) {
6485149Sgblack@eecs.umich.edu            req->setMmapedIpr(true);
6495149Sgblack@eecs.umich.edu            Addr regNum = 0;
6505149Sgblack@eecs.umich.edu            switch (vaddr & ~IntAddrPrefixMask) {
6515149Sgblack@eecs.umich.edu              case 0x10:
6525149Sgblack@eecs.umich.edu                regNum = MISCREG_TSC;
6535149Sgblack@eecs.umich.edu                break;
6545149Sgblack@eecs.umich.edu              case 0xFE:
6555149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRRCAP;
6565149Sgblack@eecs.umich.edu                break;
6575149Sgblack@eecs.umich.edu              case 0x174:
6585149Sgblack@eecs.umich.edu                regNum = MISCREG_SYSENTER_CS;
6595149Sgblack@eecs.umich.edu                break;
6605149Sgblack@eecs.umich.edu              case 0x175:
6615149Sgblack@eecs.umich.edu                regNum = MISCREG_SYSENTER_ESP;
6625149Sgblack@eecs.umich.edu                break;
6635149Sgblack@eecs.umich.edu              case 0x176:
6645149Sgblack@eecs.umich.edu                regNum = MISCREG_SYSENTER_EIP;
6655149Sgblack@eecs.umich.edu                break;
6665149Sgblack@eecs.umich.edu              case 0x179:
6675149Sgblack@eecs.umich.edu                regNum = MISCREG_MCG_CAP;
6685149Sgblack@eecs.umich.edu                break;
6695149Sgblack@eecs.umich.edu              case 0x17A:
6705149Sgblack@eecs.umich.edu                regNum = MISCREG_MCG_STATUS;
6715149Sgblack@eecs.umich.edu                break;
6725149Sgblack@eecs.umich.edu              case 0x17B:
6735149Sgblack@eecs.umich.edu                regNum = MISCREG_MCG_CTL;
6745149Sgblack@eecs.umich.edu                break;
6755149Sgblack@eecs.umich.edu              case 0x1D9:
6765149Sgblack@eecs.umich.edu                regNum = MISCREG_DEBUG_CTL_MSR;
6775149Sgblack@eecs.umich.edu                break;
6785149Sgblack@eecs.umich.edu              case 0x1DB:
6795149Sgblack@eecs.umich.edu                regNum = MISCREG_LAST_BRANCH_FROM_IP;
6805149Sgblack@eecs.umich.edu                break;
6815149Sgblack@eecs.umich.edu              case 0x1DC:
6825149Sgblack@eecs.umich.edu                regNum = MISCREG_LAST_BRANCH_TO_IP;
6835149Sgblack@eecs.umich.edu                break;
6845149Sgblack@eecs.umich.edu              case 0x1DD:
6855149Sgblack@eecs.umich.edu                regNum = MISCREG_LAST_EXCEPTION_FROM_IP;
6865149Sgblack@eecs.umich.edu                break;
6875149Sgblack@eecs.umich.edu              case 0x1DE:
6885149Sgblack@eecs.umich.edu                regNum = MISCREG_LAST_EXCEPTION_TO_IP;
6895149Sgblack@eecs.umich.edu                break;
6905149Sgblack@eecs.umich.edu              case 0x200:
6915149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_0;
6925149Sgblack@eecs.umich.edu                break;
6935149Sgblack@eecs.umich.edu              case 0x201:
6945149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_0;
6955149Sgblack@eecs.umich.edu                break;
6965149Sgblack@eecs.umich.edu              case 0x202:
6975149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_1;
6985149Sgblack@eecs.umich.edu                break;
6995149Sgblack@eecs.umich.edu              case 0x203:
7005149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_1;
7015149Sgblack@eecs.umich.edu                break;
7025149Sgblack@eecs.umich.edu              case 0x204:
7035149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_2;
7045149Sgblack@eecs.umich.edu                break;
7055149Sgblack@eecs.umich.edu              case 0x205:
7065149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_2;
7075149Sgblack@eecs.umich.edu                break;
7085149Sgblack@eecs.umich.edu              case 0x206:
7095149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_3;
7105149Sgblack@eecs.umich.edu                break;
7115149Sgblack@eecs.umich.edu              case 0x207:
7125149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_3;
7135149Sgblack@eecs.umich.edu                break;
7145149Sgblack@eecs.umich.edu              case 0x208:
7155149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_4;
7165149Sgblack@eecs.umich.edu                break;
7175149Sgblack@eecs.umich.edu              case 0x209:
7185149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_4;
7195149Sgblack@eecs.umich.edu                break;
7205149Sgblack@eecs.umich.edu              case 0x20A:
7215149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_5;
7225149Sgblack@eecs.umich.edu                break;
7235149Sgblack@eecs.umich.edu              case 0x20B:
7245149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_5;
7255149Sgblack@eecs.umich.edu                break;
7265149Sgblack@eecs.umich.edu              case 0x20C:
7275149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_6;
7285149Sgblack@eecs.umich.edu                break;
7295149Sgblack@eecs.umich.edu              case 0x20D:
7305149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_6;
7315149Sgblack@eecs.umich.edu                break;
7325149Sgblack@eecs.umich.edu              case 0x20E:
7335149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_BASE_7;
7345149Sgblack@eecs.umich.edu                break;
7355149Sgblack@eecs.umich.edu              case 0x20F:
7365149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_PHYS_MASK_7;
7375149Sgblack@eecs.umich.edu                break;
7385149Sgblack@eecs.umich.edu              case 0x250:
7395149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_64K_00000;
7405149Sgblack@eecs.umich.edu                break;
7415149Sgblack@eecs.umich.edu              case 0x258:
7425149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_16K_80000;
7435149Sgblack@eecs.umich.edu                break;
7445149Sgblack@eecs.umich.edu              case 0x259:
7455149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_16K_A0000;
7465149Sgblack@eecs.umich.edu                break;
7475149Sgblack@eecs.umich.edu              case 0x268:
7485149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_C0000;
7495149Sgblack@eecs.umich.edu                break;
7505149Sgblack@eecs.umich.edu              case 0x269:
7515149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_C8000;
7525149Sgblack@eecs.umich.edu                break;
7535149Sgblack@eecs.umich.edu              case 0x26A:
7545149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_D0000;
7555149Sgblack@eecs.umich.edu                break;
7565149Sgblack@eecs.umich.edu              case 0x26B:
7575149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_D8000;
7585149Sgblack@eecs.umich.edu                break;
7595149Sgblack@eecs.umich.edu              case 0x26C:
7605149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_E0000;
7615149Sgblack@eecs.umich.edu                break;
7625149Sgblack@eecs.umich.edu              case 0x26D:
7635149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_E8000;
7645149Sgblack@eecs.umich.edu                break;
7655149Sgblack@eecs.umich.edu              case 0x26E:
7665149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_F0000;
7675149Sgblack@eecs.umich.edu                break;
7685149Sgblack@eecs.umich.edu              case 0x26F:
7695149Sgblack@eecs.umich.edu                regNum = MISCREG_MTRR_FIX_4K_F8000;
7705149Sgblack@eecs.umich.edu                break;
7715149Sgblack@eecs.umich.edu              case 0x277:
7725149Sgblack@eecs.umich.edu                regNum = MISCREG_PAT;
7735149Sgblack@eecs.umich.edu                break;
7745149Sgblack@eecs.umich.edu              case 0x2FF:
7755149Sgblack@eecs.umich.edu                regNum = MISCREG_DEF_TYPE;
7765149Sgblack@eecs.umich.edu                break;
7775149Sgblack@eecs.umich.edu              case 0x400:
7785149Sgblack@eecs.umich.edu                regNum = MISCREG_MC0_CTL;
7795149Sgblack@eecs.umich.edu                break;
7805149Sgblack@eecs.umich.edu              case 0x404:
7815149Sgblack@eecs.umich.edu                regNum = MISCREG_MC1_CTL;
7825149Sgblack@eecs.umich.edu                break;
7835149Sgblack@eecs.umich.edu              case 0x408:
7845149Sgblack@eecs.umich.edu                regNum = MISCREG_MC2_CTL;
7855149Sgblack@eecs.umich.edu                break;
7865149Sgblack@eecs.umich.edu              case 0x40C:
7875149Sgblack@eecs.umich.edu                regNum = MISCREG_MC3_CTL;
7885149Sgblack@eecs.umich.edu                break;
7895149Sgblack@eecs.umich.edu              case 0x410:
7905149Sgblack@eecs.umich.edu                regNum = MISCREG_MC4_CTL;
7915149Sgblack@eecs.umich.edu                break;
7925149Sgblack@eecs.umich.edu              case 0x401:
7935149Sgblack@eecs.umich.edu                regNum = MISCREG_MC0_STATUS;
7945149Sgblack@eecs.umich.edu                break;
7955149Sgblack@eecs.umich.edu              case 0x405:
7965149Sgblack@eecs.umich.edu                regNum = MISCREG_MC1_STATUS;
7975149Sgblack@eecs.umich.edu                break;
7985149Sgblack@eecs.umich.edu              case 0x409:
7995149Sgblack@eecs.umich.edu                regNum = MISCREG_MC2_STATUS;
8005149Sgblack@eecs.umich.edu                break;
8015149Sgblack@eecs.umich.edu              case 0x40D:
8025149Sgblack@eecs.umich.edu                regNum = MISCREG_MC3_STATUS;
8035149Sgblack@eecs.umich.edu                break;
8045149Sgblack@eecs.umich.edu              case 0x411:
8055149Sgblack@eecs.umich.edu                regNum = MISCREG_MC4_STATUS;
8065149Sgblack@eecs.umich.edu                break;
8075149Sgblack@eecs.umich.edu              case 0x402:
8085149Sgblack@eecs.umich.edu                regNum = MISCREG_MC0_ADDR;
8095149Sgblack@eecs.umich.edu                break;
8105149Sgblack@eecs.umich.edu              case 0x406:
8115149Sgblack@eecs.umich.edu                regNum = MISCREG_MC1_ADDR;
8125149Sgblack@eecs.umich.edu                break;
8135149Sgblack@eecs.umich.edu              case 0x40A:
8145149Sgblack@eecs.umich.edu                regNum = MISCREG_MC2_ADDR;
8155149Sgblack@eecs.umich.edu                break;
8165149Sgblack@eecs.umich.edu              case 0x40E:
8175149Sgblack@eecs.umich.edu                regNum = MISCREG_MC3_ADDR;
8185149Sgblack@eecs.umich.edu                break;
8195149Sgblack@eecs.umich.edu              case 0x412:
8205149Sgblack@eecs.umich.edu                regNum = MISCREG_MC4_ADDR;
8215149Sgblack@eecs.umich.edu                break;
8225149Sgblack@eecs.umich.edu              case 0x403:
8235149Sgblack@eecs.umich.edu                regNum = MISCREG_MC0_MISC;
8245149Sgblack@eecs.umich.edu                break;
8255149Sgblack@eecs.umich.edu              case 0x407:
8265149Sgblack@eecs.umich.edu                regNum = MISCREG_MC1_MISC;
8275149Sgblack@eecs.umich.edu                break;
8285149Sgblack@eecs.umich.edu              case 0x40B:
8295149Sgblack@eecs.umich.edu                regNum = MISCREG_MC2_MISC;
8305149Sgblack@eecs.umich.edu                break;
8315149Sgblack@eecs.umich.edu              case 0x40F:
8325149Sgblack@eecs.umich.edu                regNum = MISCREG_MC3_MISC;
8335149Sgblack@eecs.umich.edu                break;
8345149Sgblack@eecs.umich.edu              case 0x413:
8355149Sgblack@eecs.umich.edu                regNum = MISCREG_MC4_MISC;
8365149Sgblack@eecs.umich.edu                break;
8375149Sgblack@eecs.umich.edu              case 0xC0000080:
8385149Sgblack@eecs.umich.edu                regNum = MISCREG_EFER;
8395149Sgblack@eecs.umich.edu                break;
8405149Sgblack@eecs.umich.edu              case 0xC0000081:
8415149Sgblack@eecs.umich.edu                regNum = MISCREG_STAR;
8425149Sgblack@eecs.umich.edu                break;
8435149Sgblack@eecs.umich.edu              case 0xC0000082:
8445149Sgblack@eecs.umich.edu                regNum = MISCREG_LSTAR;
8455149Sgblack@eecs.umich.edu                break;
8465149Sgblack@eecs.umich.edu              case 0xC0000083:
8475149Sgblack@eecs.umich.edu                regNum = MISCREG_CSTAR;
8485149Sgblack@eecs.umich.edu                break;
8495149Sgblack@eecs.umich.edu              case 0xC0000084:
8505149Sgblack@eecs.umich.edu                regNum = MISCREG_SF_MASK;
8515149Sgblack@eecs.umich.edu                break;
8525149Sgblack@eecs.umich.edu              case 0xC0000100:
8535149Sgblack@eecs.umich.edu                regNum = MISCREG_FS_BASE;
8545149Sgblack@eecs.umich.edu                break;
8555149Sgblack@eecs.umich.edu              case 0xC0000101:
8565149Sgblack@eecs.umich.edu                regNum = MISCREG_GS_BASE;
8575149Sgblack@eecs.umich.edu                break;
8585149Sgblack@eecs.umich.edu              case 0xC0000102:
8595149Sgblack@eecs.umich.edu                regNum = MISCREG_KERNEL_GS_BASE;
8605149Sgblack@eecs.umich.edu                break;
8615149Sgblack@eecs.umich.edu              case 0xC0000103:
8625149Sgblack@eecs.umich.edu                regNum = MISCREG_TSC_AUX;
8635149Sgblack@eecs.umich.edu                break;
8645149Sgblack@eecs.umich.edu              case 0xC0010000:
8655149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_SEL0;
8665149Sgblack@eecs.umich.edu                break;
8675149Sgblack@eecs.umich.edu              case 0xC0010001:
8685149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_SEL1;
8695149Sgblack@eecs.umich.edu                break;
8705149Sgblack@eecs.umich.edu              case 0xC0010002:
8715149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_SEL2;
8725149Sgblack@eecs.umich.edu                break;
8735149Sgblack@eecs.umich.edu              case 0xC0010003:
8745149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_SEL3;
8755149Sgblack@eecs.umich.edu                break;
8765149Sgblack@eecs.umich.edu              case 0xC0010004:
8775149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_CTR0;
8785149Sgblack@eecs.umich.edu                break;
8795149Sgblack@eecs.umich.edu              case 0xC0010005:
8805149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_CTR1;
8815149Sgblack@eecs.umich.edu                break;
8825149Sgblack@eecs.umich.edu              case 0xC0010006:
8835149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_CTR2;
8845149Sgblack@eecs.umich.edu                break;
8855149Sgblack@eecs.umich.edu              case 0xC0010007:
8865149Sgblack@eecs.umich.edu                regNum = MISCREG_PERF_EVT_CTR3;
8875149Sgblack@eecs.umich.edu                break;
8885149Sgblack@eecs.umich.edu              case 0xC0010010:
8895149Sgblack@eecs.umich.edu                regNum = MISCREG_SYSCFG;
8905149Sgblack@eecs.umich.edu                break;
8915149Sgblack@eecs.umich.edu              case 0xC0010016:
8925149Sgblack@eecs.umich.edu                regNum = MISCREG_IORR_BASE0;
8935149Sgblack@eecs.umich.edu                break;
8945149Sgblack@eecs.umich.edu              case 0xC0010017:
8955149Sgblack@eecs.umich.edu                regNum = MISCREG_IORR_BASE1;
8965149Sgblack@eecs.umich.edu                break;
8975149Sgblack@eecs.umich.edu              case 0xC0010018:
8985149Sgblack@eecs.umich.edu                regNum = MISCREG_IORR_MASK0;
8995149Sgblack@eecs.umich.edu                break;
9005149Sgblack@eecs.umich.edu              case 0xC0010019:
9015149Sgblack@eecs.umich.edu                regNum = MISCREG_IORR_MASK1;
9025149Sgblack@eecs.umich.edu                break;
9035149Sgblack@eecs.umich.edu              case 0xC001001A:
9045149Sgblack@eecs.umich.edu                regNum = MISCREG_TOP_MEM;
9055149Sgblack@eecs.umich.edu                break;
9065149Sgblack@eecs.umich.edu              case 0xC001001D:
9075149Sgblack@eecs.umich.edu                regNum = MISCREG_TOP_MEM2;
9085149Sgblack@eecs.umich.edu                break;
9095149Sgblack@eecs.umich.edu              case 0xC0010114:
9105149Sgblack@eecs.umich.edu                regNum = MISCREG_VM_CR;
9115149Sgblack@eecs.umich.edu                break;
9125149Sgblack@eecs.umich.edu              case 0xC0010115:
9135149Sgblack@eecs.umich.edu                regNum = MISCREG_IGNNE;
9145149Sgblack@eecs.umich.edu                break;
9155149Sgblack@eecs.umich.edu              case 0xC0010116:
9165149Sgblack@eecs.umich.edu                regNum = MISCREG_SMM_CTL;
9175149Sgblack@eecs.umich.edu                break;
9185149Sgblack@eecs.umich.edu              case 0xC0010117:
9195149Sgblack@eecs.umich.edu                regNum = MISCREG_VM_HSAVE_PA;
9205149Sgblack@eecs.umich.edu                break;
9215149Sgblack@eecs.umich.edu              default:
9225149Sgblack@eecs.umich.edu                return new GeneralProtection(0);
9235149Sgblack@eecs.umich.edu            }
9245149Sgblack@eecs.umich.edu            //The index is multiplied by the size of a MiscReg so that
9255149Sgblack@eecs.umich.edu            //any memory dependence calculations will not see these as
9265149Sgblack@eecs.umich.edu            //overlapping.
9275149Sgblack@eecs.umich.edu            req->setPaddr(regNum * sizeof(MiscReg));
9285149Sgblack@eecs.umich.edu            return NoFault;
9295149Sgblack@eecs.umich.edu        } else {
9305149Sgblack@eecs.umich.edu            panic("Access to unrecognized internal address space %#x.\n",
9315149Sgblack@eecs.umich.edu                    prefix);
9325149Sgblack@eecs.umich.edu        }
9335149Sgblack@eecs.umich.edu    }
9345124Sgblack@eecs.umich.edu
9355140Sgblack@eecs.umich.edu    // Get cr0. This will tell us how to do translation. We'll assume it was
9365140Sgblack@eecs.umich.edu    // verified to be correct and consistent when set.
9375140Sgblack@eecs.umich.edu    CR0 cr0 = tc->readMiscRegNoEffect(MISCREG_CR0);
9385140Sgblack@eecs.umich.edu
9395140Sgblack@eecs.umich.edu    // If protected mode has been enabled...
9405140Sgblack@eecs.umich.edu    if (cr0.pe) {
9415237Sgblack@eecs.umich.edu        DPRINTF(TLB, "In protected mode.\n");
9425140Sgblack@eecs.umich.edu        Efer efer = tc->readMiscRegNoEffect(MISCREG_EFER);
9435140Sgblack@eecs.umich.edu        SegAttr csAttr = tc->readMiscRegNoEffect(MISCREG_CS_ATTR);
9445140Sgblack@eecs.umich.edu        // If we're not in 64-bit mode, do protection/limit checks
9455140Sgblack@eecs.umich.edu        if (!efer.lma || !csAttr.longMode) {
9465237Sgblack@eecs.umich.edu            DPRINTF(TLB, "Not in long mode. Checking segment protection.\n");
9475140Sgblack@eecs.umich.edu            SegAttr attr = tc->readMiscRegNoEffect(MISCREG_SEG_ATTR(seg));
9485140Sgblack@eecs.umich.edu            if (!attr.writable && write)
9495140Sgblack@eecs.umich.edu                return new GeneralProtection(0);
9505140Sgblack@eecs.umich.edu            if (!attr.readable && !write && !execute)
9515140Sgblack@eecs.umich.edu                return new GeneralProtection(0);
9525140Sgblack@eecs.umich.edu            Addr base = tc->readMiscRegNoEffect(MISCREG_SEG_BASE(seg));
9535140Sgblack@eecs.umich.edu            Addr limit = tc->readMiscRegNoEffect(MISCREG_SEG_LIMIT(seg));
9545140Sgblack@eecs.umich.edu            if (!attr.expandDown) {
9555237Sgblack@eecs.umich.edu                DPRINTF(TLB, "Checking an expand down segment.\n");
9565140Sgblack@eecs.umich.edu                // We don't have to worry about the access going around the
9575140Sgblack@eecs.umich.edu                // end of memory because accesses will be broken up into
9585140Sgblack@eecs.umich.edu                // pieces at boundaries aligned on sizes smaller than an
9595140Sgblack@eecs.umich.edu                // entire address space. We do have to worry about the limit
9605140Sgblack@eecs.umich.edu                // being less than the base.
9615140Sgblack@eecs.umich.edu                if (limit < base) {
9625140Sgblack@eecs.umich.edu                    if (limit < vaddr + req->getSize() && vaddr < base)
9635140Sgblack@eecs.umich.edu                        return new GeneralProtection(0);
9645140Sgblack@eecs.umich.edu                } else {
9655140Sgblack@eecs.umich.edu                    if (limit < vaddr + req->getSize())
9665140Sgblack@eecs.umich.edu                        return new GeneralProtection(0);
9675140Sgblack@eecs.umich.edu                }
9685140Sgblack@eecs.umich.edu            } else {
9695140Sgblack@eecs.umich.edu                if (limit < base) {
9705140Sgblack@eecs.umich.edu                    if (vaddr <= limit || vaddr + req->getSize() >= base)
9715140Sgblack@eecs.umich.edu                        return new GeneralProtection(0);
9725140Sgblack@eecs.umich.edu                } else {
9735140Sgblack@eecs.umich.edu                    if (vaddr <= limit && vaddr + req->getSize() >= base)
9745140Sgblack@eecs.umich.edu                        return new GeneralProtection(0);
9755140Sgblack@eecs.umich.edu                }
9765140Sgblack@eecs.umich.edu            }
9775140Sgblack@eecs.umich.edu        }
9785140Sgblack@eecs.umich.edu        // If paging is enabled, do the translation.
9795140Sgblack@eecs.umich.edu        if (cr0.pg) {
9805237Sgblack@eecs.umich.edu            DPRINTF(TLB, "Paging enabled.\n");
9815140Sgblack@eecs.umich.edu            // The vaddr already has the segment base applied.
9825140Sgblack@eecs.umich.edu            TlbEntry *entry = lookup(vaddr);
9835140Sgblack@eecs.umich.edu            if (!entry) {
9845140Sgblack@eecs.umich.edu                return new TlbFault(vaddr);
9855140Sgblack@eecs.umich.edu            } else {
9865140Sgblack@eecs.umich.edu                // Do paging protection checks.
9875237Sgblack@eecs.umich.edu                DPRINTF(TLB, "Entry found with paddr %#x, doing protection checks.\n", entry->paddr);
9885237Sgblack@eecs.umich.edu                Addr paddr = entry->paddr | (vaddr & (entry->size-1));
9895237Sgblack@eecs.umich.edu                DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, paddr);
9905140Sgblack@eecs.umich.edu                req->setPaddr(paddr);
9915140Sgblack@eecs.umich.edu            }
9925140Sgblack@eecs.umich.edu        } else {
9935140Sgblack@eecs.umich.edu            //Use the address which already has segmentation applied.
9945237Sgblack@eecs.umich.edu            DPRINTF(TLB, "Paging disabled.\n");
9955237Sgblack@eecs.umich.edu            DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, vaddr);
9965140Sgblack@eecs.umich.edu            req->setPaddr(vaddr);
9975140Sgblack@eecs.umich.edu        }
9985124Sgblack@eecs.umich.edu    } else {
9995140Sgblack@eecs.umich.edu        // Real mode
10005237Sgblack@eecs.umich.edu        DPRINTF(TLB, "In real mode.\n");
10015237Sgblack@eecs.umich.edu        DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, vaddr);
10025140Sgblack@eecs.umich.edu        req->setPaddr(vaddr);
10035124Sgblack@eecs.umich.edu    }
10045086Sgblack@eecs.umich.edu    return NoFault;
10055086Sgblack@eecs.umich.edu};
10065086Sgblack@eecs.umich.edu
10075140Sgblack@eecs.umich.eduFault
10085140Sgblack@eecs.umich.eduDTB::translate(RequestPtr &req, ThreadContext *tc, bool write)
10095140Sgblack@eecs.umich.edu{
10105140Sgblack@eecs.umich.edu    return TLB::translate<FakeDTLBFault>(req, tc, write, false);
10115140Sgblack@eecs.umich.edu}
10125140Sgblack@eecs.umich.edu
10135140Sgblack@eecs.umich.eduFault
10145140Sgblack@eecs.umich.eduITB::translate(RequestPtr &req, ThreadContext *tc)
10155140Sgblack@eecs.umich.edu{
10165140Sgblack@eecs.umich.edu    return TLB::translate<FakeITLBFault>(req, tc, false, true);
10175140Sgblack@eecs.umich.edu}
10185140Sgblack@eecs.umich.edu
10195086Sgblack@eecs.umich.edu#if FULL_SYSTEM
10205086Sgblack@eecs.umich.edu
10215086Sgblack@eecs.umich.eduTick
10225086Sgblack@eecs.umich.eduDTB::doMmuRegRead(ThreadContext *tc, Packet *pkt)
10235086Sgblack@eecs.umich.edu{
10245100Ssaidi@eecs.umich.edu    return tc->getCpuPtr()->ticks(1);
10255086Sgblack@eecs.umich.edu}
10265086Sgblack@eecs.umich.edu
10275086Sgblack@eecs.umich.eduTick
10285086Sgblack@eecs.umich.eduDTB::doMmuRegWrite(ThreadContext *tc, Packet *pkt)
10295086Sgblack@eecs.umich.edu{
10305100Ssaidi@eecs.umich.edu    return tc->getCpuPtr()->ticks(1);
10315086Sgblack@eecs.umich.edu}
10325086Sgblack@eecs.umich.edu
10335086Sgblack@eecs.umich.edu#endif
10345086Sgblack@eecs.umich.edu
10355086Sgblack@eecs.umich.eduvoid
10365086Sgblack@eecs.umich.eduTLB::serialize(std::ostream &os)
10375086Sgblack@eecs.umich.edu{
10385086Sgblack@eecs.umich.edu}
10395086Sgblack@eecs.umich.edu
10405086Sgblack@eecs.umich.eduvoid
10415086Sgblack@eecs.umich.eduTLB::unserialize(Checkpoint *cp, const std::string &section)
10425086Sgblack@eecs.umich.edu{
10435086Sgblack@eecs.umich.edu}
10445086Sgblack@eecs.umich.edu
10455086Sgblack@eecs.umich.eduvoid
10465086Sgblack@eecs.umich.eduDTB::serialize(std::ostream &os)
10475086Sgblack@eecs.umich.edu{
10485086Sgblack@eecs.umich.edu    TLB::serialize(os);
10495086Sgblack@eecs.umich.edu}
10505086Sgblack@eecs.umich.edu
10515086Sgblack@eecs.umich.eduvoid
10525086Sgblack@eecs.umich.eduDTB::unserialize(Checkpoint *cp, const std::string &section)
10535086Sgblack@eecs.umich.edu{
10545086Sgblack@eecs.umich.edu    TLB::unserialize(cp, section);
10555086Sgblack@eecs.umich.edu}
10565086Sgblack@eecs.umich.edu
10575086Sgblack@eecs.umich.edu/* end namespace X86ISA */ }
10585086Sgblack@eecs.umich.edu
10594997Sgblack@eecs.umich.eduX86ISA::ITB *
10604997Sgblack@eecs.umich.eduX86ITBParams::create()
10614997Sgblack@eecs.umich.edu{
10625038Sgblack@eecs.umich.edu    return new X86ISA::ITB(this);
10634997Sgblack@eecs.umich.edu}
10644997Sgblack@eecs.umich.edu
10654997Sgblack@eecs.umich.eduX86ISA::DTB *
10664997Sgblack@eecs.umich.eduX86DTBParams::create()
10674997Sgblack@eecs.umich.edu{
10685038Sgblack@eecs.umich.edu    return new X86ISA::DTB(this);
10694997Sgblack@eecs.umich.edu}
1070