tlb.cc revision 5237
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 } 3835237Sgblack@eecs.umich.edu nextState = Ready; 3845237Sgblack@eecs.umich.edu entry.vaddr = vaddr; 3855237Sgblack@eecs.umich.edu 3865237Sgblack@eecs.umich.edu enableNX = efer.nxe; 3875237Sgblack@eecs.umich.edu 3885237Sgblack@eecs.umich.edu RequestPtr request = 3895237Sgblack@eecs.umich.edu new Request(top, size, PHYSICAL | cr3.pcd ? UNCACHEABLE : 0); 3905237Sgblack@eecs.umich.edu read = new Packet(request, MemCmd::ReadExReq, Packet::Broadcast); 3915237Sgblack@eecs.umich.edu read->allocate(); 3925237Sgblack@eecs.umich.edu Enums::MemoryMode memMode = tlb->sys->getMemoryMode(); 3935237Sgblack@eecs.umich.edu if (memMode == Enums::timing) { 3945237Sgblack@eecs.umich.edu tc->suspend(); 3955237Sgblack@eecs.umich.edu port.sendTiming(read); 3965237Sgblack@eecs.umich.edu } else if (memMode == Enums::atomic) { 3975237Sgblack@eecs.umich.edu do { 3985237Sgblack@eecs.umich.edu port.sendAtomic(read); 3995237Sgblack@eecs.umich.edu PacketPtr write = NULL; 4005237Sgblack@eecs.umich.edu doNext(read, write); 4015237Sgblack@eecs.umich.edu state = nextState; 4025237Sgblack@eecs.umich.edu nextState = Ready; 4035237Sgblack@eecs.umich.edu if (write) 4045237Sgblack@eecs.umich.edu port.sendAtomic(write); 4055237Sgblack@eecs.umich.edu } while(read); 4065237Sgblack@eecs.umich.edu tc = NULL; 4075237Sgblack@eecs.umich.edu state = Ready; 4085237Sgblack@eecs.umich.edu nextState = Waiting; 4095237Sgblack@eecs.umich.edu } else { 4105237Sgblack@eecs.umich.edu panic("Unrecognized memory system mode.\n"); 4115237Sgblack@eecs.umich.edu } 4125236Sgblack@eecs.umich.edu} 4135236Sgblack@eecs.umich.edu 4145236Sgblack@eecs.umich.edubool 4155236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvTiming(PacketPtr pkt) 4165236Sgblack@eecs.umich.edu{ 4175237Sgblack@eecs.umich.edu return walker->recvTiming(pkt); 4185237Sgblack@eecs.umich.edu} 4195237Sgblack@eecs.umich.edu 4205237Sgblack@eecs.umich.edubool 4215237Sgblack@eecs.umich.eduTLB::Walker::recvTiming(PacketPtr pkt) 4225237Sgblack@eecs.umich.edu{ 4235237Sgblack@eecs.umich.edu inflight--; 4245236Sgblack@eecs.umich.edu if (pkt->isResponse() && !pkt->wasNacked()) { 4255236Sgblack@eecs.umich.edu if (pkt->isRead()) { 4265237Sgblack@eecs.umich.edu assert(inflight); 4275237Sgblack@eecs.umich.edu assert(state == Waiting); 4285237Sgblack@eecs.umich.edu assert(!read); 4295237Sgblack@eecs.umich.edu state = nextState; 4305237Sgblack@eecs.umich.edu nextState = Ready; 4315237Sgblack@eecs.umich.edu PacketPtr write = NULL; 4325237Sgblack@eecs.umich.edu doNext(pkt, write); 4335237Sgblack@eecs.umich.edu state = Waiting; 4345237Sgblack@eecs.umich.edu read = pkt; 4355236Sgblack@eecs.umich.edu if (write) { 4365236Sgblack@eecs.umich.edu writes.push_back(write); 4375236Sgblack@eecs.umich.edu } 4385237Sgblack@eecs.umich.edu sendPackets(); 4395236Sgblack@eecs.umich.edu } else { 4405237Sgblack@eecs.umich.edu sendPackets(); 4415237Sgblack@eecs.umich.edu } 4425237Sgblack@eecs.umich.edu if (inflight == 0 && read == NULL && writes.size() == 0) { 4435237Sgblack@eecs.umich.edu tc->activate(0); 4445237Sgblack@eecs.umich.edu tc = NULL; 4455237Sgblack@eecs.umich.edu state = Ready; 4465237Sgblack@eecs.umich.edu nextState = Waiting; 4475236Sgblack@eecs.umich.edu } 4485236Sgblack@eecs.umich.edu } else if (pkt->wasNacked()) { 4495236Sgblack@eecs.umich.edu pkt->reinitNacked(); 4505237Sgblack@eecs.umich.edu if (!port.sendTiming(pkt)) { 4515237Sgblack@eecs.umich.edu retrying = true; 4525236Sgblack@eecs.umich.edu if (pkt->isWrite()) { 4535237Sgblack@eecs.umich.edu writes.push_back(pkt); 4545237Sgblack@eecs.umich.edu } else { 4555237Sgblack@eecs.umich.edu assert(!read); 4565237Sgblack@eecs.umich.edu read = pkt; 4575236Sgblack@eecs.umich.edu } 4585237Sgblack@eecs.umich.edu } else { 4595237Sgblack@eecs.umich.edu inflight++; 4605236Sgblack@eecs.umich.edu } 4615236Sgblack@eecs.umich.edu } 4625236Sgblack@eecs.umich.edu return true; 4635236Sgblack@eecs.umich.edu} 4645236Sgblack@eecs.umich.edu 4655236Sgblack@eecs.umich.eduTick 4665236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvAtomic(PacketPtr pkt) 4675236Sgblack@eecs.umich.edu{ 4685236Sgblack@eecs.umich.edu return 0; 4695236Sgblack@eecs.umich.edu} 4705236Sgblack@eecs.umich.edu 4715236Sgblack@eecs.umich.eduvoid 4725236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvFunctional(PacketPtr pkt) 4735236Sgblack@eecs.umich.edu{ 4745236Sgblack@eecs.umich.edu return; 4755236Sgblack@eecs.umich.edu} 4765236Sgblack@eecs.umich.edu 4775236Sgblack@eecs.umich.eduvoid 4785236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvStatusChange(Status status) 4795236Sgblack@eecs.umich.edu{ 4805236Sgblack@eecs.umich.edu if (status == RangeChange) { 4815236Sgblack@eecs.umich.edu if (!snoopRangeSent) { 4825236Sgblack@eecs.umich.edu snoopRangeSent = true; 4835236Sgblack@eecs.umich.edu sendStatusChange(Port::RangeChange); 4845236Sgblack@eecs.umich.edu } 4855236Sgblack@eecs.umich.edu return; 4865236Sgblack@eecs.umich.edu } 4875236Sgblack@eecs.umich.edu 4885236Sgblack@eecs.umich.edu panic("Unexpected recvStatusChange.\n"); 4895236Sgblack@eecs.umich.edu} 4905236Sgblack@eecs.umich.edu 4915236Sgblack@eecs.umich.eduvoid 4925236Sgblack@eecs.umich.eduTLB::Walker::WalkerPort::recvRetry() 4935236Sgblack@eecs.umich.edu{ 4945237Sgblack@eecs.umich.edu walker->recvRetry(); 4955237Sgblack@eecs.umich.edu} 4965237Sgblack@eecs.umich.edu 4975237Sgblack@eecs.umich.eduvoid 4985237Sgblack@eecs.umich.eduTLB::Walker::recvRetry() 4995237Sgblack@eecs.umich.edu{ 5005236Sgblack@eecs.umich.edu retrying = false; 5015237Sgblack@eecs.umich.edu sendPackets(); 5025237Sgblack@eecs.umich.edu} 5035237Sgblack@eecs.umich.edu 5045237Sgblack@eecs.umich.eduvoid 5055237Sgblack@eecs.umich.eduTLB::Walker::sendPackets() 5065237Sgblack@eecs.umich.edu{ 5075237Sgblack@eecs.umich.edu //If we're already waiting for the port to become available, just return. 5085237Sgblack@eecs.umich.edu if (retrying) 5095237Sgblack@eecs.umich.edu return; 5105237Sgblack@eecs.umich.edu 5115237Sgblack@eecs.umich.edu //Reads always have priority 5125237Sgblack@eecs.umich.edu if (read) { 5135237Sgblack@eecs.umich.edu if (!port.sendTiming(read)) { 5145237Sgblack@eecs.umich.edu retrying = true; 5155237Sgblack@eecs.umich.edu return; 5165237Sgblack@eecs.umich.edu } else { 5175237Sgblack@eecs.umich.edu inflight++; 5185237Sgblack@eecs.umich.edu delete read->req; 5195237Sgblack@eecs.umich.edu delete read; 5205237Sgblack@eecs.umich.edu read = NULL; 5215237Sgblack@eecs.umich.edu } 5225237Sgblack@eecs.umich.edu } 5235237Sgblack@eecs.umich.edu //Send off as many of the writes as we can. 5245237Sgblack@eecs.umich.edu while (writes.size()) { 5255237Sgblack@eecs.umich.edu PacketPtr write = writes.back(); 5265237Sgblack@eecs.umich.edu if (!port.sendTiming(write)) { 5275237Sgblack@eecs.umich.edu retrying = true; 5285237Sgblack@eecs.umich.edu return; 5295237Sgblack@eecs.umich.edu } else { 5305237Sgblack@eecs.umich.edu inflight++; 5315237Sgblack@eecs.umich.edu delete write->req; 5325237Sgblack@eecs.umich.edu delete write; 5335237Sgblack@eecs.umich.edu writes.pop_back(); 5345237Sgblack@eecs.umich.edu } 5355236Sgblack@eecs.umich.edu } 5365236Sgblack@eecs.umich.edu} 5375236Sgblack@eecs.umich.edu 5385236Sgblack@eecs.umich.eduPort * 5395236Sgblack@eecs.umich.eduTLB::getPort(const std::string &if_name, int idx) 5405236Sgblack@eecs.umich.edu{ 5415236Sgblack@eecs.umich.edu if (if_name == "walker_port") 5425236Sgblack@eecs.umich.edu return &walker.port; 5435236Sgblack@eecs.umich.edu else 5445236Sgblack@eecs.umich.edu panic("No tlb port named %s!\n", if_name); 5455236Sgblack@eecs.umich.edu} 5465236Sgblack@eecs.umich.edu 5475237Sgblack@eecs.umich.edu#else 5485237Sgblack@eecs.umich.edu 5495237Sgblack@eecs.umich.eduPort * 5505237Sgblack@eecs.umich.eduTLB::getPort(const std::string &if_name, int idx) 5515237Sgblack@eecs.umich.edu{ 5525237Sgblack@eecs.umich.edu panic("No tlb ports in se!\n", if_name); 5535237Sgblack@eecs.umich.edu} 5545237Sgblack@eecs.umich.edu 5555237Sgblack@eecs.umich.edu#endif 5565237Sgblack@eecs.umich.edu 5575124Sgblack@eecs.umich.eduvoid 5585124Sgblack@eecs.umich.eduTLB::insert(Addr vpn, TlbEntry &entry) 5595124Sgblack@eecs.umich.edu{ 5605124Sgblack@eecs.umich.edu //TODO Deal with conflicting entries 5615124Sgblack@eecs.umich.edu 5625124Sgblack@eecs.umich.edu TlbEntry *newEntry = NULL; 5635124Sgblack@eecs.umich.edu if (!freeList.empty()) { 5645124Sgblack@eecs.umich.edu newEntry = freeList.front(); 5655124Sgblack@eecs.umich.edu freeList.pop_front(); 5665124Sgblack@eecs.umich.edu } else { 5675124Sgblack@eecs.umich.edu newEntry = entryList.back(); 5685124Sgblack@eecs.umich.edu entryList.pop_back(); 5695124Sgblack@eecs.umich.edu } 5705124Sgblack@eecs.umich.edu *newEntry = entry; 5715124Sgblack@eecs.umich.edu newEntry->vaddr = vpn; 5725124Sgblack@eecs.umich.edu entryList.push_front(newEntry); 5735124Sgblack@eecs.umich.edu} 5745124Sgblack@eecs.umich.edu 5755124Sgblack@eecs.umich.eduTlbEntry * 5765124Sgblack@eecs.umich.eduTLB::lookup(Addr va, bool update_lru) 5775124Sgblack@eecs.umich.edu{ 5785124Sgblack@eecs.umich.edu //TODO make this smarter at some point 5795124Sgblack@eecs.umich.edu EntryList::iterator entry; 5805124Sgblack@eecs.umich.edu for (entry = entryList.begin(); entry != entryList.end(); entry++) { 5815124Sgblack@eecs.umich.edu if ((*entry)->vaddr <= va && (*entry)->vaddr + (*entry)->size > va) { 5825124Sgblack@eecs.umich.edu DPRINTF(TLB, "Matched vaddr %#x to entry starting at %#x " 5835124Sgblack@eecs.umich.edu "with size %#x.\n", va, (*entry)->vaddr, (*entry)->size); 5845124Sgblack@eecs.umich.edu TlbEntry *e = *entry; 5855124Sgblack@eecs.umich.edu if (update_lru) { 5865124Sgblack@eecs.umich.edu entryList.erase(entry); 5875124Sgblack@eecs.umich.edu entryList.push_front(e); 5885124Sgblack@eecs.umich.edu } 5895124Sgblack@eecs.umich.edu return e; 5905124Sgblack@eecs.umich.edu } 5915124Sgblack@eecs.umich.edu } 5925124Sgblack@eecs.umich.edu return NULL; 5935124Sgblack@eecs.umich.edu} 5945124Sgblack@eecs.umich.edu 5955124Sgblack@eecs.umich.eduvoid 5965124Sgblack@eecs.umich.eduTLB::invalidateAll() 5975124Sgblack@eecs.umich.edu{ 5985124Sgblack@eecs.umich.edu} 5995124Sgblack@eecs.umich.edu 6005124Sgblack@eecs.umich.eduvoid 6015124Sgblack@eecs.umich.eduTLB::invalidateNonGlobal() 6025124Sgblack@eecs.umich.edu{ 6035124Sgblack@eecs.umich.edu} 6045124Sgblack@eecs.umich.edu 6055124Sgblack@eecs.umich.eduvoid 6065124Sgblack@eecs.umich.eduTLB::demapPage(Addr va) 6075086Sgblack@eecs.umich.edu{ 6085086Sgblack@eecs.umich.edu} 6095086Sgblack@eecs.umich.edu 6105140Sgblack@eecs.umich.edutemplate<class TlbFault> 6115086Sgblack@eecs.umich.eduFault 6125140Sgblack@eecs.umich.eduTLB::translate(RequestPtr &req, ThreadContext *tc, bool write, bool execute) 6135086Sgblack@eecs.umich.edu{ 6145124Sgblack@eecs.umich.edu Addr vaddr = req->getVaddr(); 6155140Sgblack@eecs.umich.edu DPRINTF(TLB, "Translating vaddr %#x.\n", vaddr); 6165124Sgblack@eecs.umich.edu uint32_t flags = req->getFlags(); 6175124Sgblack@eecs.umich.edu bool storeCheck = flags & StoreCheck; 6185140Sgblack@eecs.umich.edu 6195149Sgblack@eecs.umich.edu int seg = flags & mask(3); 6205124Sgblack@eecs.umich.edu 6215124Sgblack@eecs.umich.edu //XXX Junk code to surpress the warning 6225149Sgblack@eecs.umich.edu if (storeCheck); 6235149Sgblack@eecs.umich.edu 6245149Sgblack@eecs.umich.edu // If this is true, we're dealing with a request to read an internal 6255149Sgblack@eecs.umich.edu // value. 6265232Sgblack@eecs.umich.edu if (seg == SEGMENT_REG_INT) { 6275149Sgblack@eecs.umich.edu Addr prefix = vaddr & IntAddrPrefixMask; 6285149Sgblack@eecs.umich.edu if (prefix == IntAddrPrefixCPUID) { 6295149Sgblack@eecs.umich.edu panic("CPUID memory space not yet implemented!\n"); 6305149Sgblack@eecs.umich.edu } else if (prefix == IntAddrPrefixMSR) { 6315149Sgblack@eecs.umich.edu req->setMmapedIpr(true); 6325149Sgblack@eecs.umich.edu Addr regNum = 0; 6335149Sgblack@eecs.umich.edu switch (vaddr & ~IntAddrPrefixMask) { 6345149Sgblack@eecs.umich.edu case 0x10: 6355149Sgblack@eecs.umich.edu regNum = MISCREG_TSC; 6365149Sgblack@eecs.umich.edu break; 6375149Sgblack@eecs.umich.edu case 0xFE: 6385149Sgblack@eecs.umich.edu regNum = MISCREG_MTRRCAP; 6395149Sgblack@eecs.umich.edu break; 6405149Sgblack@eecs.umich.edu case 0x174: 6415149Sgblack@eecs.umich.edu regNum = MISCREG_SYSENTER_CS; 6425149Sgblack@eecs.umich.edu break; 6435149Sgblack@eecs.umich.edu case 0x175: 6445149Sgblack@eecs.umich.edu regNum = MISCREG_SYSENTER_ESP; 6455149Sgblack@eecs.umich.edu break; 6465149Sgblack@eecs.umich.edu case 0x176: 6475149Sgblack@eecs.umich.edu regNum = MISCREG_SYSENTER_EIP; 6485149Sgblack@eecs.umich.edu break; 6495149Sgblack@eecs.umich.edu case 0x179: 6505149Sgblack@eecs.umich.edu regNum = MISCREG_MCG_CAP; 6515149Sgblack@eecs.umich.edu break; 6525149Sgblack@eecs.umich.edu case 0x17A: 6535149Sgblack@eecs.umich.edu regNum = MISCREG_MCG_STATUS; 6545149Sgblack@eecs.umich.edu break; 6555149Sgblack@eecs.umich.edu case 0x17B: 6565149Sgblack@eecs.umich.edu regNum = MISCREG_MCG_CTL; 6575149Sgblack@eecs.umich.edu break; 6585149Sgblack@eecs.umich.edu case 0x1D9: 6595149Sgblack@eecs.umich.edu regNum = MISCREG_DEBUG_CTL_MSR; 6605149Sgblack@eecs.umich.edu break; 6615149Sgblack@eecs.umich.edu case 0x1DB: 6625149Sgblack@eecs.umich.edu regNum = MISCREG_LAST_BRANCH_FROM_IP; 6635149Sgblack@eecs.umich.edu break; 6645149Sgblack@eecs.umich.edu case 0x1DC: 6655149Sgblack@eecs.umich.edu regNum = MISCREG_LAST_BRANCH_TO_IP; 6665149Sgblack@eecs.umich.edu break; 6675149Sgblack@eecs.umich.edu case 0x1DD: 6685149Sgblack@eecs.umich.edu regNum = MISCREG_LAST_EXCEPTION_FROM_IP; 6695149Sgblack@eecs.umich.edu break; 6705149Sgblack@eecs.umich.edu case 0x1DE: 6715149Sgblack@eecs.umich.edu regNum = MISCREG_LAST_EXCEPTION_TO_IP; 6725149Sgblack@eecs.umich.edu break; 6735149Sgblack@eecs.umich.edu case 0x200: 6745149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_0; 6755149Sgblack@eecs.umich.edu break; 6765149Sgblack@eecs.umich.edu case 0x201: 6775149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_0; 6785149Sgblack@eecs.umich.edu break; 6795149Sgblack@eecs.umich.edu case 0x202: 6805149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_1; 6815149Sgblack@eecs.umich.edu break; 6825149Sgblack@eecs.umich.edu case 0x203: 6835149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_1; 6845149Sgblack@eecs.umich.edu break; 6855149Sgblack@eecs.umich.edu case 0x204: 6865149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_2; 6875149Sgblack@eecs.umich.edu break; 6885149Sgblack@eecs.umich.edu case 0x205: 6895149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_2; 6905149Sgblack@eecs.umich.edu break; 6915149Sgblack@eecs.umich.edu case 0x206: 6925149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_3; 6935149Sgblack@eecs.umich.edu break; 6945149Sgblack@eecs.umich.edu case 0x207: 6955149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_3; 6965149Sgblack@eecs.umich.edu break; 6975149Sgblack@eecs.umich.edu case 0x208: 6985149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_4; 6995149Sgblack@eecs.umich.edu break; 7005149Sgblack@eecs.umich.edu case 0x209: 7015149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_4; 7025149Sgblack@eecs.umich.edu break; 7035149Sgblack@eecs.umich.edu case 0x20A: 7045149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_5; 7055149Sgblack@eecs.umich.edu break; 7065149Sgblack@eecs.umich.edu case 0x20B: 7075149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_5; 7085149Sgblack@eecs.umich.edu break; 7095149Sgblack@eecs.umich.edu case 0x20C: 7105149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_6; 7115149Sgblack@eecs.umich.edu break; 7125149Sgblack@eecs.umich.edu case 0x20D: 7135149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_6; 7145149Sgblack@eecs.umich.edu break; 7155149Sgblack@eecs.umich.edu case 0x20E: 7165149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_BASE_7; 7175149Sgblack@eecs.umich.edu break; 7185149Sgblack@eecs.umich.edu case 0x20F: 7195149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_PHYS_MASK_7; 7205149Sgblack@eecs.umich.edu break; 7215149Sgblack@eecs.umich.edu case 0x250: 7225149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_64K_00000; 7235149Sgblack@eecs.umich.edu break; 7245149Sgblack@eecs.umich.edu case 0x258: 7255149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_16K_80000; 7265149Sgblack@eecs.umich.edu break; 7275149Sgblack@eecs.umich.edu case 0x259: 7285149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_16K_A0000; 7295149Sgblack@eecs.umich.edu break; 7305149Sgblack@eecs.umich.edu case 0x268: 7315149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_C0000; 7325149Sgblack@eecs.umich.edu break; 7335149Sgblack@eecs.umich.edu case 0x269: 7345149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_C8000; 7355149Sgblack@eecs.umich.edu break; 7365149Sgblack@eecs.umich.edu case 0x26A: 7375149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_D0000; 7385149Sgblack@eecs.umich.edu break; 7395149Sgblack@eecs.umich.edu case 0x26B: 7405149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_D8000; 7415149Sgblack@eecs.umich.edu break; 7425149Sgblack@eecs.umich.edu case 0x26C: 7435149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_E0000; 7445149Sgblack@eecs.umich.edu break; 7455149Sgblack@eecs.umich.edu case 0x26D: 7465149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_E8000; 7475149Sgblack@eecs.umich.edu break; 7485149Sgblack@eecs.umich.edu case 0x26E: 7495149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_F0000; 7505149Sgblack@eecs.umich.edu break; 7515149Sgblack@eecs.umich.edu case 0x26F: 7525149Sgblack@eecs.umich.edu regNum = MISCREG_MTRR_FIX_4K_F8000; 7535149Sgblack@eecs.umich.edu break; 7545149Sgblack@eecs.umich.edu case 0x277: 7555149Sgblack@eecs.umich.edu regNum = MISCREG_PAT; 7565149Sgblack@eecs.umich.edu break; 7575149Sgblack@eecs.umich.edu case 0x2FF: 7585149Sgblack@eecs.umich.edu regNum = MISCREG_DEF_TYPE; 7595149Sgblack@eecs.umich.edu break; 7605149Sgblack@eecs.umich.edu case 0x400: 7615149Sgblack@eecs.umich.edu regNum = MISCREG_MC0_CTL; 7625149Sgblack@eecs.umich.edu break; 7635149Sgblack@eecs.umich.edu case 0x404: 7645149Sgblack@eecs.umich.edu regNum = MISCREG_MC1_CTL; 7655149Sgblack@eecs.umich.edu break; 7665149Sgblack@eecs.umich.edu case 0x408: 7675149Sgblack@eecs.umich.edu regNum = MISCREG_MC2_CTL; 7685149Sgblack@eecs.umich.edu break; 7695149Sgblack@eecs.umich.edu case 0x40C: 7705149Sgblack@eecs.umich.edu regNum = MISCREG_MC3_CTL; 7715149Sgblack@eecs.umich.edu break; 7725149Sgblack@eecs.umich.edu case 0x410: 7735149Sgblack@eecs.umich.edu regNum = MISCREG_MC4_CTL; 7745149Sgblack@eecs.umich.edu break; 7755149Sgblack@eecs.umich.edu case 0x401: 7765149Sgblack@eecs.umich.edu regNum = MISCREG_MC0_STATUS; 7775149Sgblack@eecs.umich.edu break; 7785149Sgblack@eecs.umich.edu case 0x405: 7795149Sgblack@eecs.umich.edu regNum = MISCREG_MC1_STATUS; 7805149Sgblack@eecs.umich.edu break; 7815149Sgblack@eecs.umich.edu case 0x409: 7825149Sgblack@eecs.umich.edu regNum = MISCREG_MC2_STATUS; 7835149Sgblack@eecs.umich.edu break; 7845149Sgblack@eecs.umich.edu case 0x40D: 7855149Sgblack@eecs.umich.edu regNum = MISCREG_MC3_STATUS; 7865149Sgblack@eecs.umich.edu break; 7875149Sgblack@eecs.umich.edu case 0x411: 7885149Sgblack@eecs.umich.edu regNum = MISCREG_MC4_STATUS; 7895149Sgblack@eecs.umich.edu break; 7905149Sgblack@eecs.umich.edu case 0x402: 7915149Sgblack@eecs.umich.edu regNum = MISCREG_MC0_ADDR; 7925149Sgblack@eecs.umich.edu break; 7935149Sgblack@eecs.umich.edu case 0x406: 7945149Sgblack@eecs.umich.edu regNum = MISCREG_MC1_ADDR; 7955149Sgblack@eecs.umich.edu break; 7965149Sgblack@eecs.umich.edu case 0x40A: 7975149Sgblack@eecs.umich.edu regNum = MISCREG_MC2_ADDR; 7985149Sgblack@eecs.umich.edu break; 7995149Sgblack@eecs.umich.edu case 0x40E: 8005149Sgblack@eecs.umich.edu regNum = MISCREG_MC3_ADDR; 8015149Sgblack@eecs.umich.edu break; 8025149Sgblack@eecs.umich.edu case 0x412: 8035149Sgblack@eecs.umich.edu regNum = MISCREG_MC4_ADDR; 8045149Sgblack@eecs.umich.edu break; 8055149Sgblack@eecs.umich.edu case 0x403: 8065149Sgblack@eecs.umich.edu regNum = MISCREG_MC0_MISC; 8075149Sgblack@eecs.umich.edu break; 8085149Sgblack@eecs.umich.edu case 0x407: 8095149Sgblack@eecs.umich.edu regNum = MISCREG_MC1_MISC; 8105149Sgblack@eecs.umich.edu break; 8115149Sgblack@eecs.umich.edu case 0x40B: 8125149Sgblack@eecs.umich.edu regNum = MISCREG_MC2_MISC; 8135149Sgblack@eecs.umich.edu break; 8145149Sgblack@eecs.umich.edu case 0x40F: 8155149Sgblack@eecs.umich.edu regNum = MISCREG_MC3_MISC; 8165149Sgblack@eecs.umich.edu break; 8175149Sgblack@eecs.umich.edu case 0x413: 8185149Sgblack@eecs.umich.edu regNum = MISCREG_MC4_MISC; 8195149Sgblack@eecs.umich.edu break; 8205149Sgblack@eecs.umich.edu case 0xC0000080: 8215149Sgblack@eecs.umich.edu regNum = MISCREG_EFER; 8225149Sgblack@eecs.umich.edu break; 8235149Sgblack@eecs.umich.edu case 0xC0000081: 8245149Sgblack@eecs.umich.edu regNum = MISCREG_STAR; 8255149Sgblack@eecs.umich.edu break; 8265149Sgblack@eecs.umich.edu case 0xC0000082: 8275149Sgblack@eecs.umich.edu regNum = MISCREG_LSTAR; 8285149Sgblack@eecs.umich.edu break; 8295149Sgblack@eecs.umich.edu case 0xC0000083: 8305149Sgblack@eecs.umich.edu regNum = MISCREG_CSTAR; 8315149Sgblack@eecs.umich.edu break; 8325149Sgblack@eecs.umich.edu case 0xC0000084: 8335149Sgblack@eecs.umich.edu regNum = MISCREG_SF_MASK; 8345149Sgblack@eecs.umich.edu break; 8355149Sgblack@eecs.umich.edu case 0xC0000100: 8365149Sgblack@eecs.umich.edu regNum = MISCREG_FS_BASE; 8375149Sgblack@eecs.umich.edu break; 8385149Sgblack@eecs.umich.edu case 0xC0000101: 8395149Sgblack@eecs.umich.edu regNum = MISCREG_GS_BASE; 8405149Sgblack@eecs.umich.edu break; 8415149Sgblack@eecs.umich.edu case 0xC0000102: 8425149Sgblack@eecs.umich.edu regNum = MISCREG_KERNEL_GS_BASE; 8435149Sgblack@eecs.umich.edu break; 8445149Sgblack@eecs.umich.edu case 0xC0000103: 8455149Sgblack@eecs.umich.edu regNum = MISCREG_TSC_AUX; 8465149Sgblack@eecs.umich.edu break; 8475149Sgblack@eecs.umich.edu case 0xC0010000: 8485149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_SEL0; 8495149Sgblack@eecs.umich.edu break; 8505149Sgblack@eecs.umich.edu case 0xC0010001: 8515149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_SEL1; 8525149Sgblack@eecs.umich.edu break; 8535149Sgblack@eecs.umich.edu case 0xC0010002: 8545149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_SEL2; 8555149Sgblack@eecs.umich.edu break; 8565149Sgblack@eecs.umich.edu case 0xC0010003: 8575149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_SEL3; 8585149Sgblack@eecs.umich.edu break; 8595149Sgblack@eecs.umich.edu case 0xC0010004: 8605149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_CTR0; 8615149Sgblack@eecs.umich.edu break; 8625149Sgblack@eecs.umich.edu case 0xC0010005: 8635149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_CTR1; 8645149Sgblack@eecs.umich.edu break; 8655149Sgblack@eecs.umich.edu case 0xC0010006: 8665149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_CTR2; 8675149Sgblack@eecs.umich.edu break; 8685149Sgblack@eecs.umich.edu case 0xC0010007: 8695149Sgblack@eecs.umich.edu regNum = MISCREG_PERF_EVT_CTR3; 8705149Sgblack@eecs.umich.edu break; 8715149Sgblack@eecs.umich.edu case 0xC0010010: 8725149Sgblack@eecs.umich.edu regNum = MISCREG_SYSCFG; 8735149Sgblack@eecs.umich.edu break; 8745149Sgblack@eecs.umich.edu case 0xC0010016: 8755149Sgblack@eecs.umich.edu regNum = MISCREG_IORR_BASE0; 8765149Sgblack@eecs.umich.edu break; 8775149Sgblack@eecs.umich.edu case 0xC0010017: 8785149Sgblack@eecs.umich.edu regNum = MISCREG_IORR_BASE1; 8795149Sgblack@eecs.umich.edu break; 8805149Sgblack@eecs.umich.edu case 0xC0010018: 8815149Sgblack@eecs.umich.edu regNum = MISCREG_IORR_MASK0; 8825149Sgblack@eecs.umich.edu break; 8835149Sgblack@eecs.umich.edu case 0xC0010019: 8845149Sgblack@eecs.umich.edu regNum = MISCREG_IORR_MASK1; 8855149Sgblack@eecs.umich.edu break; 8865149Sgblack@eecs.umich.edu case 0xC001001A: 8875149Sgblack@eecs.umich.edu regNum = MISCREG_TOP_MEM; 8885149Sgblack@eecs.umich.edu break; 8895149Sgblack@eecs.umich.edu case 0xC001001D: 8905149Sgblack@eecs.umich.edu regNum = MISCREG_TOP_MEM2; 8915149Sgblack@eecs.umich.edu break; 8925149Sgblack@eecs.umich.edu case 0xC0010114: 8935149Sgblack@eecs.umich.edu regNum = MISCREG_VM_CR; 8945149Sgblack@eecs.umich.edu break; 8955149Sgblack@eecs.umich.edu case 0xC0010115: 8965149Sgblack@eecs.umich.edu regNum = MISCREG_IGNNE; 8975149Sgblack@eecs.umich.edu break; 8985149Sgblack@eecs.umich.edu case 0xC0010116: 8995149Sgblack@eecs.umich.edu regNum = MISCREG_SMM_CTL; 9005149Sgblack@eecs.umich.edu break; 9015149Sgblack@eecs.umich.edu case 0xC0010117: 9025149Sgblack@eecs.umich.edu regNum = MISCREG_VM_HSAVE_PA; 9035149Sgblack@eecs.umich.edu break; 9045149Sgblack@eecs.umich.edu default: 9055149Sgblack@eecs.umich.edu return new GeneralProtection(0); 9065149Sgblack@eecs.umich.edu } 9075149Sgblack@eecs.umich.edu //The index is multiplied by the size of a MiscReg so that 9085149Sgblack@eecs.umich.edu //any memory dependence calculations will not see these as 9095149Sgblack@eecs.umich.edu //overlapping. 9105149Sgblack@eecs.umich.edu req->setPaddr(regNum * sizeof(MiscReg)); 9115149Sgblack@eecs.umich.edu return NoFault; 9125149Sgblack@eecs.umich.edu } else { 9135149Sgblack@eecs.umich.edu panic("Access to unrecognized internal address space %#x.\n", 9145149Sgblack@eecs.umich.edu prefix); 9155149Sgblack@eecs.umich.edu } 9165149Sgblack@eecs.umich.edu } 9175124Sgblack@eecs.umich.edu 9185140Sgblack@eecs.umich.edu // Get cr0. This will tell us how to do translation. We'll assume it was 9195140Sgblack@eecs.umich.edu // verified to be correct and consistent when set. 9205140Sgblack@eecs.umich.edu CR0 cr0 = tc->readMiscRegNoEffect(MISCREG_CR0); 9215140Sgblack@eecs.umich.edu 9225140Sgblack@eecs.umich.edu // If protected mode has been enabled... 9235140Sgblack@eecs.umich.edu if (cr0.pe) { 9245237Sgblack@eecs.umich.edu DPRINTF(TLB, "In protected mode.\n"); 9255140Sgblack@eecs.umich.edu Efer efer = tc->readMiscRegNoEffect(MISCREG_EFER); 9265140Sgblack@eecs.umich.edu SegAttr csAttr = tc->readMiscRegNoEffect(MISCREG_CS_ATTR); 9275140Sgblack@eecs.umich.edu // If we're not in 64-bit mode, do protection/limit checks 9285140Sgblack@eecs.umich.edu if (!efer.lma || !csAttr.longMode) { 9295237Sgblack@eecs.umich.edu DPRINTF(TLB, "Not in long mode. Checking segment protection.\n"); 9305140Sgblack@eecs.umich.edu SegAttr attr = tc->readMiscRegNoEffect(MISCREG_SEG_ATTR(seg)); 9315140Sgblack@eecs.umich.edu if (!attr.writable && write) 9325140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9335140Sgblack@eecs.umich.edu if (!attr.readable && !write && !execute) 9345140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9355140Sgblack@eecs.umich.edu Addr base = tc->readMiscRegNoEffect(MISCREG_SEG_BASE(seg)); 9365140Sgblack@eecs.umich.edu Addr limit = tc->readMiscRegNoEffect(MISCREG_SEG_LIMIT(seg)); 9375140Sgblack@eecs.umich.edu if (!attr.expandDown) { 9385237Sgblack@eecs.umich.edu DPRINTF(TLB, "Checking an expand down segment.\n"); 9395140Sgblack@eecs.umich.edu // We don't have to worry about the access going around the 9405140Sgblack@eecs.umich.edu // end of memory because accesses will be broken up into 9415140Sgblack@eecs.umich.edu // pieces at boundaries aligned on sizes smaller than an 9425140Sgblack@eecs.umich.edu // entire address space. We do have to worry about the limit 9435140Sgblack@eecs.umich.edu // being less than the base. 9445140Sgblack@eecs.umich.edu if (limit < base) { 9455140Sgblack@eecs.umich.edu if (limit < vaddr + req->getSize() && vaddr < base) 9465140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9475140Sgblack@eecs.umich.edu } else { 9485140Sgblack@eecs.umich.edu if (limit < vaddr + req->getSize()) 9495140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9505140Sgblack@eecs.umich.edu } 9515140Sgblack@eecs.umich.edu } else { 9525140Sgblack@eecs.umich.edu if (limit < base) { 9535140Sgblack@eecs.umich.edu if (vaddr <= limit || vaddr + req->getSize() >= base) 9545140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9555140Sgblack@eecs.umich.edu } else { 9565140Sgblack@eecs.umich.edu if (vaddr <= limit && vaddr + req->getSize() >= base) 9575140Sgblack@eecs.umich.edu return new GeneralProtection(0); 9585140Sgblack@eecs.umich.edu } 9595140Sgblack@eecs.umich.edu } 9605140Sgblack@eecs.umich.edu } 9615140Sgblack@eecs.umich.edu // If paging is enabled, do the translation. 9625140Sgblack@eecs.umich.edu if (cr0.pg) { 9635237Sgblack@eecs.umich.edu DPRINTF(TLB, "Paging enabled.\n"); 9645140Sgblack@eecs.umich.edu // The vaddr already has the segment base applied. 9655140Sgblack@eecs.umich.edu TlbEntry *entry = lookup(vaddr); 9665140Sgblack@eecs.umich.edu if (!entry) { 9675140Sgblack@eecs.umich.edu return new TlbFault(vaddr); 9685140Sgblack@eecs.umich.edu } else { 9695140Sgblack@eecs.umich.edu // Do paging protection checks. 9705237Sgblack@eecs.umich.edu DPRINTF(TLB, "Entry found with paddr %#x, doing protection checks.\n", entry->paddr); 9715237Sgblack@eecs.umich.edu Addr paddr = entry->paddr | (vaddr & (entry->size-1)); 9725237Sgblack@eecs.umich.edu DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, paddr); 9735140Sgblack@eecs.umich.edu req->setPaddr(paddr); 9745140Sgblack@eecs.umich.edu } 9755140Sgblack@eecs.umich.edu } else { 9765140Sgblack@eecs.umich.edu //Use the address which already has segmentation applied. 9775237Sgblack@eecs.umich.edu DPRINTF(TLB, "Paging disabled.\n"); 9785237Sgblack@eecs.umich.edu DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, vaddr); 9795140Sgblack@eecs.umich.edu req->setPaddr(vaddr); 9805140Sgblack@eecs.umich.edu } 9815124Sgblack@eecs.umich.edu } else { 9825140Sgblack@eecs.umich.edu // Real mode 9835237Sgblack@eecs.umich.edu DPRINTF(TLB, "In real mode.\n"); 9845237Sgblack@eecs.umich.edu DPRINTF(TLB, "Translated %#x -> %#x.\n", vaddr, vaddr); 9855140Sgblack@eecs.umich.edu req->setPaddr(vaddr); 9865124Sgblack@eecs.umich.edu } 9875086Sgblack@eecs.umich.edu return NoFault; 9885086Sgblack@eecs.umich.edu}; 9895086Sgblack@eecs.umich.edu 9905140Sgblack@eecs.umich.eduFault 9915140Sgblack@eecs.umich.eduDTB::translate(RequestPtr &req, ThreadContext *tc, bool write) 9925140Sgblack@eecs.umich.edu{ 9935140Sgblack@eecs.umich.edu return TLB::translate<FakeDTLBFault>(req, tc, write, false); 9945140Sgblack@eecs.umich.edu} 9955140Sgblack@eecs.umich.edu 9965140Sgblack@eecs.umich.eduFault 9975140Sgblack@eecs.umich.eduITB::translate(RequestPtr &req, ThreadContext *tc) 9985140Sgblack@eecs.umich.edu{ 9995140Sgblack@eecs.umich.edu return TLB::translate<FakeITLBFault>(req, tc, false, true); 10005140Sgblack@eecs.umich.edu} 10015140Sgblack@eecs.umich.edu 10025086Sgblack@eecs.umich.edu#if FULL_SYSTEM 10035086Sgblack@eecs.umich.edu 10045086Sgblack@eecs.umich.eduTick 10055086Sgblack@eecs.umich.eduDTB::doMmuRegRead(ThreadContext *tc, Packet *pkt) 10065086Sgblack@eecs.umich.edu{ 10075100Ssaidi@eecs.umich.edu return tc->getCpuPtr()->ticks(1); 10085086Sgblack@eecs.umich.edu} 10095086Sgblack@eecs.umich.edu 10105086Sgblack@eecs.umich.eduTick 10115086Sgblack@eecs.umich.eduDTB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) 10125086Sgblack@eecs.umich.edu{ 10135100Ssaidi@eecs.umich.edu return tc->getCpuPtr()->ticks(1); 10145086Sgblack@eecs.umich.edu} 10155086Sgblack@eecs.umich.edu 10165086Sgblack@eecs.umich.edu#endif 10175086Sgblack@eecs.umich.edu 10185086Sgblack@eecs.umich.eduvoid 10195086Sgblack@eecs.umich.eduTLB::serialize(std::ostream &os) 10205086Sgblack@eecs.umich.edu{ 10215086Sgblack@eecs.umich.edu} 10225086Sgblack@eecs.umich.edu 10235086Sgblack@eecs.umich.eduvoid 10245086Sgblack@eecs.umich.eduTLB::unserialize(Checkpoint *cp, const std::string §ion) 10255086Sgblack@eecs.umich.edu{ 10265086Sgblack@eecs.umich.edu} 10275086Sgblack@eecs.umich.edu 10285086Sgblack@eecs.umich.eduvoid 10295086Sgblack@eecs.umich.eduDTB::serialize(std::ostream &os) 10305086Sgblack@eecs.umich.edu{ 10315086Sgblack@eecs.umich.edu TLB::serialize(os); 10325086Sgblack@eecs.umich.edu} 10335086Sgblack@eecs.umich.edu 10345086Sgblack@eecs.umich.eduvoid 10355086Sgblack@eecs.umich.eduDTB::unserialize(Checkpoint *cp, const std::string §ion) 10365086Sgblack@eecs.umich.edu{ 10375086Sgblack@eecs.umich.edu TLB::unserialize(cp, section); 10385086Sgblack@eecs.umich.edu} 10395086Sgblack@eecs.umich.edu 10405086Sgblack@eecs.umich.edu/* end namespace X86ISA */ } 10415086Sgblack@eecs.umich.edu 10424997Sgblack@eecs.umich.eduX86ISA::ITB * 10434997Sgblack@eecs.umich.eduX86ITBParams::create() 10444997Sgblack@eecs.umich.edu{ 10455038Sgblack@eecs.umich.edu return new X86ISA::ITB(this); 10464997Sgblack@eecs.umich.edu} 10474997Sgblack@eecs.umich.edu 10484997Sgblack@eecs.umich.eduX86ISA::DTB * 10494997Sgblack@eecs.umich.eduX86DTBParams::create() 10504997Sgblack@eecs.umich.edu{ 10515038Sgblack@eecs.umich.edu return new X86ISA::DTB(this); 10524997Sgblack@eecs.umich.edu} 1053