pagetable_walker.hh revision 5897
15245Sgblack@eecs.umich.edu/* 25245Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company 35245Sgblack@eecs.umich.edu * All rights reserved. 45245Sgblack@eecs.umich.edu * 55245Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms, 65245Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the 75245Sgblack@eecs.umich.edu * following conditions are met: 85245Sgblack@eecs.umich.edu * 95245Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any 105245Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary 115245Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use. Illustrative 125245Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study, 135245Sgblack@eecs.umich.edu * teaching, education and corporate research & development. 145245Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for 155245Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for 165245Sgblack@eecs.umich.edu * commercial advantage. 175245Sgblack@eecs.umich.edu * 185245Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be 195245Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact: 205245Sgblack@eecs.umich.edu * Director of Intellectual Property Licensing 215245Sgblack@eecs.umich.edu * Office of Strategy and Technology 225245Sgblack@eecs.umich.edu * Hewlett-Packard Company 235245Sgblack@eecs.umich.edu * 1501 Page Mill Road 245245Sgblack@eecs.umich.edu * Palo Alto, California 94304 255245Sgblack@eecs.umich.edu * 265245Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice, 275245Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer. Redistributions 285245Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of 295245Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or 305245Sgblack@eecs.umich.edu * other materials provided with the distribution. Neither the name of 315245Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 325245Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 335245Sgblack@eecs.umich.edu * this software without specific prior written permission. No right of 345245Sgblack@eecs.umich.edu * sublicense is granted herewith. Derivatives of the software and 355245Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for 365245Sgblack@eecs.umich.edu * Non-Commercial Uses. Derivatives of the software may be shared with 375245Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of 385245Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions; 395245Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright 405245Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where 415245Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below. 425245Sgblack@eecs.umich.edu * 435245Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 445245Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 455245Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 465245Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 475245Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 485245Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 495245Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 505245Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 515245Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 525245Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 535245Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 545245Sgblack@eecs.umich.edu * 555245Sgblack@eecs.umich.edu * Authors: Gabe Black 565245Sgblack@eecs.umich.edu */ 575245Sgblack@eecs.umich.edu 585245Sgblack@eecs.umich.edu#ifndef __ARCH_X86_PAGE_TABLE_WALKER_HH__ 595245Sgblack@eecs.umich.edu#define __ARCH_X86_PAGE_TABLE_WALKER_HH__ 605245Sgblack@eecs.umich.edu 615245Sgblack@eecs.umich.edu#include <vector> 625245Sgblack@eecs.umich.edu 635245Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh" 645245Sgblack@eecs.umich.edu#include "arch/x86/tlb.hh" 655245Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 665245Sgblack@eecs.umich.edu#include "mem/packet.hh" 675245Sgblack@eecs.umich.edu#include "params/X86PagetableWalker.hh" 685245Sgblack@eecs.umich.edu#include "sim/host.hh" 695245Sgblack@eecs.umich.edu 705245Sgblack@eecs.umich.educlass ThreadContext; 715245Sgblack@eecs.umich.edu 725245Sgblack@eecs.umich.edunamespace X86ISA 735245Sgblack@eecs.umich.edu{ 745245Sgblack@eecs.umich.edu class Walker : public MemObject 755245Sgblack@eecs.umich.edu { 765245Sgblack@eecs.umich.edu public: 775245Sgblack@eecs.umich.edu enum State { 785245Sgblack@eecs.umich.edu Ready, 795245Sgblack@eecs.umich.edu Waiting, 805245Sgblack@eecs.umich.edu // Long mode 815245Sgblack@eecs.umich.edu LongPML4, LongPDP, LongPD, LongPTE, 825245Sgblack@eecs.umich.edu // PAE legacy mode 835245Sgblack@eecs.umich.edu PAEPDP, PAEPD, PAEPTE, 845245Sgblack@eecs.umich.edu // Non PAE legacy mode with and without PSE 855245Sgblack@eecs.umich.edu PSEPD, PD, PTE 865245Sgblack@eecs.umich.edu }; 875245Sgblack@eecs.umich.edu 885897Sgblack@eecs.umich.edu // Act on the current state and determine what to do next. The global 895897Sgblack@eecs.umich.edu // read should be the packet that just came back from a read and write 905245Sgblack@eecs.umich.edu // should be NULL. When the function returns, read is either NULL 915245Sgblack@eecs.umich.edu // if the machine is finished, or points to a packet to initiate 925245Sgblack@eecs.umich.edu // the next read. If any write is required to update an "accessed" 935245Sgblack@eecs.umich.edu // bit, write will point to a packet to do the write. Otherwise it 945895Sgblack@eecs.umich.edu // will be NULL. The return value is whatever fault was incurred 955895Sgblack@eecs.umich.edu // during this stage of the lookup. 965897Sgblack@eecs.umich.edu Fault doNext(PacketPtr &write); 975245Sgblack@eecs.umich.edu 985245Sgblack@eecs.umich.edu // Kick off the state machine. 995895Sgblack@eecs.umich.edu Fault start(ThreadContext * _tc, BaseTLB::Translation *translation, 1005895Sgblack@eecs.umich.edu RequestPtr req, bool write, bool execute); 1015895Sgblack@eecs.umich.edu // Clean up after the state machine. 1025895Sgblack@eecs.umich.edu void 1035895Sgblack@eecs.umich.edu stop() 1045895Sgblack@eecs.umich.edu { 1055895Sgblack@eecs.umich.edu nextState = Ready; 1065895Sgblack@eecs.umich.edu delete read->req; 1075895Sgblack@eecs.umich.edu delete read; 1085895Sgblack@eecs.umich.edu read = NULL; 1095895Sgblack@eecs.umich.edu } 1105245Sgblack@eecs.umich.edu 1115245Sgblack@eecs.umich.edu protected: 1125245Sgblack@eecs.umich.edu 1135245Sgblack@eecs.umich.edu /* 1145245Sgblack@eecs.umich.edu * State having to do with sending packets. 1155245Sgblack@eecs.umich.edu */ 1165245Sgblack@eecs.umich.edu PacketPtr read; 1175245Sgblack@eecs.umich.edu std::vector<PacketPtr> writes; 1185245Sgblack@eecs.umich.edu 1195245Sgblack@eecs.umich.edu // How many memory operations are in flight. 1205245Sgblack@eecs.umich.edu unsigned inflight; 1215245Sgblack@eecs.umich.edu 1225245Sgblack@eecs.umich.edu bool retrying; 1235245Sgblack@eecs.umich.edu 1245245Sgblack@eecs.umich.edu /* 1255895Sgblack@eecs.umich.edu * The fault, if any, that's waiting to be delivered in timing mode. 1265895Sgblack@eecs.umich.edu */ 1275895Sgblack@eecs.umich.edu Fault timingFault; 1285895Sgblack@eecs.umich.edu 1295895Sgblack@eecs.umich.edu /* 1305245Sgblack@eecs.umich.edu * Functions for dealing with packets. 1315245Sgblack@eecs.umich.edu */ 1325245Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1335245Sgblack@eecs.umich.edu void recvRetry(); 1345245Sgblack@eecs.umich.edu 1355245Sgblack@eecs.umich.edu void sendPackets(); 1365245Sgblack@eecs.umich.edu 1375245Sgblack@eecs.umich.edu /* 1385245Sgblack@eecs.umich.edu * Port for accessing memory 1395245Sgblack@eecs.umich.edu */ 1405245Sgblack@eecs.umich.edu class WalkerPort : public Port 1415245Sgblack@eecs.umich.edu { 1425245Sgblack@eecs.umich.edu public: 1435245Sgblack@eecs.umich.edu WalkerPort(const std::string &_name, Walker * _walker) : 1445245Sgblack@eecs.umich.edu Port(_name, _walker), walker(_walker), 1455245Sgblack@eecs.umich.edu snoopRangeSent(false) 1465245Sgblack@eecs.umich.edu {} 1475245Sgblack@eecs.umich.edu 1485245Sgblack@eecs.umich.edu protected: 1495245Sgblack@eecs.umich.edu Walker * walker; 1505245Sgblack@eecs.umich.edu 1515245Sgblack@eecs.umich.edu bool snoopRangeSent; 1525245Sgblack@eecs.umich.edu 1535245Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1545245Sgblack@eecs.umich.edu Tick recvAtomic(PacketPtr pkt); 1555245Sgblack@eecs.umich.edu void recvFunctional(PacketPtr pkt); 1565245Sgblack@eecs.umich.edu void recvStatusChange(Status status); 1575245Sgblack@eecs.umich.edu void recvRetry(); 1585245Sgblack@eecs.umich.edu void getDeviceAddressRanges(AddrRangeList &resp, 1595245Sgblack@eecs.umich.edu bool &snoop) 1605245Sgblack@eecs.umich.edu { 1615245Sgblack@eecs.umich.edu resp.clear(); 1625245Sgblack@eecs.umich.edu snoop = true; 1635245Sgblack@eecs.umich.edu } 1645245Sgblack@eecs.umich.edu }; 1655245Sgblack@eecs.umich.edu 1665245Sgblack@eecs.umich.edu Port *getPort(const std::string &if_name, int idx = -1); 1675245Sgblack@eecs.umich.edu 1685245Sgblack@eecs.umich.edu friend class WalkerPort; 1695245Sgblack@eecs.umich.edu 1705245Sgblack@eecs.umich.edu WalkerPort port; 1715245Sgblack@eecs.umich.edu 1725245Sgblack@eecs.umich.edu // The TLB we're supposed to load. 1735245Sgblack@eecs.umich.edu TLB * tlb; 1745245Sgblack@eecs.umich.edu System * sys; 1755895Sgblack@eecs.umich.edu BaseTLB::Translation * translation; 1765245Sgblack@eecs.umich.edu 1775245Sgblack@eecs.umich.edu /* 1785245Sgblack@eecs.umich.edu * State machine state. 1795245Sgblack@eecs.umich.edu */ 1805245Sgblack@eecs.umich.edu ThreadContext * tc; 1815895Sgblack@eecs.umich.edu RequestPtr req; 1825245Sgblack@eecs.umich.edu State state; 1835245Sgblack@eecs.umich.edu State nextState; 1845245Sgblack@eecs.umich.edu int size; 1855245Sgblack@eecs.umich.edu bool enableNX; 1865895Sgblack@eecs.umich.edu bool write, execute, user; 1875245Sgblack@eecs.umich.edu TlbEntry entry; 1885881Sgblack@eecs.umich.edu 1895881Sgblack@eecs.umich.edu Fault pageFault(bool present); 1905245Sgblack@eecs.umich.edu 1915245Sgblack@eecs.umich.edu public: 1925245Sgblack@eecs.umich.edu 1935245Sgblack@eecs.umich.edu void setTLB(TLB * _tlb) 1945245Sgblack@eecs.umich.edu { 1955245Sgblack@eecs.umich.edu tlb = _tlb; 1965245Sgblack@eecs.umich.edu } 1975245Sgblack@eecs.umich.edu 1985245Sgblack@eecs.umich.edu typedef X86PagetableWalkerParams Params; 1995245Sgblack@eecs.umich.edu 2005245Sgblack@eecs.umich.edu Walker(const Params *params) : 2015245Sgblack@eecs.umich.edu MemObject(params), 2025245Sgblack@eecs.umich.edu read(NULL), inflight(0), retrying(false), 2035245Sgblack@eecs.umich.edu port(name() + ".port", this), 2045245Sgblack@eecs.umich.edu tlb(NULL), sys(params->system), 2055245Sgblack@eecs.umich.edu tc(NULL), state(Ready), nextState(Ready) 2065245Sgblack@eecs.umich.edu { 2075245Sgblack@eecs.umich.edu } 2085245Sgblack@eecs.umich.edu }; 2095245Sgblack@eecs.umich.edu} 2105245Sgblack@eecs.umich.edu#endif // __ARCH_X86_PAGE_TABLE_WALKER_HH__ 211