pagetable_walker.hh revision 5245
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 885245Sgblack@eecs.umich.edu // Act on the current state and determine what to do next. read 895245Sgblack@eecs.umich.edu // 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 945245Sgblack@eecs.umich.edu // will be NULL. 955245Sgblack@eecs.umich.edu void doNext(PacketPtr &read, PacketPtr &write); 965245Sgblack@eecs.umich.edu 975245Sgblack@eecs.umich.edu // Kick off the state machine. 985245Sgblack@eecs.umich.edu void start(ThreadContext * _tc, Addr vaddr); 995245Sgblack@eecs.umich.edu 1005245Sgblack@eecs.umich.edu protected: 1015245Sgblack@eecs.umich.edu 1025245Sgblack@eecs.umich.edu /* 1035245Sgblack@eecs.umich.edu * State having to do with sending packets. 1045245Sgblack@eecs.umich.edu */ 1055245Sgblack@eecs.umich.edu PacketPtr read; 1065245Sgblack@eecs.umich.edu std::vector<PacketPtr> writes; 1075245Sgblack@eecs.umich.edu 1085245Sgblack@eecs.umich.edu // How many memory operations are in flight. 1095245Sgblack@eecs.umich.edu unsigned inflight; 1105245Sgblack@eecs.umich.edu 1115245Sgblack@eecs.umich.edu bool retrying; 1125245Sgblack@eecs.umich.edu 1135245Sgblack@eecs.umich.edu /* 1145245Sgblack@eecs.umich.edu * Functions for dealing with packets. 1155245Sgblack@eecs.umich.edu */ 1165245Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1175245Sgblack@eecs.umich.edu void recvRetry(); 1185245Sgblack@eecs.umich.edu 1195245Sgblack@eecs.umich.edu void sendPackets(); 1205245Sgblack@eecs.umich.edu 1215245Sgblack@eecs.umich.edu /* 1225245Sgblack@eecs.umich.edu * Port for accessing memory 1235245Sgblack@eecs.umich.edu */ 1245245Sgblack@eecs.umich.edu class WalkerPort : public Port 1255245Sgblack@eecs.umich.edu { 1265245Sgblack@eecs.umich.edu public: 1275245Sgblack@eecs.umich.edu WalkerPort(const std::string &_name, Walker * _walker) : 1285245Sgblack@eecs.umich.edu Port(_name, _walker), walker(_walker), 1295245Sgblack@eecs.umich.edu snoopRangeSent(false) 1305245Sgblack@eecs.umich.edu {} 1315245Sgblack@eecs.umich.edu 1325245Sgblack@eecs.umich.edu protected: 1335245Sgblack@eecs.umich.edu Walker * walker; 1345245Sgblack@eecs.umich.edu 1355245Sgblack@eecs.umich.edu bool snoopRangeSent; 1365245Sgblack@eecs.umich.edu 1375245Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1385245Sgblack@eecs.umich.edu Tick recvAtomic(PacketPtr pkt); 1395245Sgblack@eecs.umich.edu void recvFunctional(PacketPtr pkt); 1405245Sgblack@eecs.umich.edu void recvStatusChange(Status status); 1415245Sgblack@eecs.umich.edu void recvRetry(); 1425245Sgblack@eecs.umich.edu void getDeviceAddressRanges(AddrRangeList &resp, 1435245Sgblack@eecs.umich.edu bool &snoop) 1445245Sgblack@eecs.umich.edu { 1455245Sgblack@eecs.umich.edu resp.clear(); 1465245Sgblack@eecs.umich.edu snoop = true; 1475245Sgblack@eecs.umich.edu } 1485245Sgblack@eecs.umich.edu }; 1495245Sgblack@eecs.umich.edu 1505245Sgblack@eecs.umich.edu Port *getPort(const std::string &if_name, int idx = -1); 1515245Sgblack@eecs.umich.edu 1525245Sgblack@eecs.umich.edu friend class WalkerPort; 1535245Sgblack@eecs.umich.edu 1545245Sgblack@eecs.umich.edu WalkerPort port; 1555245Sgblack@eecs.umich.edu 1565245Sgblack@eecs.umich.edu // The TLB we're supposed to load. 1575245Sgblack@eecs.umich.edu TLB * tlb; 1585245Sgblack@eecs.umich.edu System * sys; 1595245Sgblack@eecs.umich.edu 1605245Sgblack@eecs.umich.edu /* 1615245Sgblack@eecs.umich.edu * State machine state. 1625245Sgblack@eecs.umich.edu */ 1635245Sgblack@eecs.umich.edu ThreadContext * tc; 1645245Sgblack@eecs.umich.edu State state; 1655245Sgblack@eecs.umich.edu State nextState; 1665245Sgblack@eecs.umich.edu int size; 1675245Sgblack@eecs.umich.edu bool enableNX; 1685245Sgblack@eecs.umich.edu TlbEntry entry; 1695245Sgblack@eecs.umich.edu 1705245Sgblack@eecs.umich.edu public: 1715245Sgblack@eecs.umich.edu 1725245Sgblack@eecs.umich.edu void setTLB(TLB * _tlb) 1735245Sgblack@eecs.umich.edu { 1745245Sgblack@eecs.umich.edu tlb = _tlb; 1755245Sgblack@eecs.umich.edu } 1765245Sgblack@eecs.umich.edu 1775245Sgblack@eecs.umich.edu typedef X86PagetableWalkerParams Params; 1785245Sgblack@eecs.umich.edu 1795245Sgblack@eecs.umich.edu Walker(const Params *params) : 1805245Sgblack@eecs.umich.edu MemObject(params), 1815245Sgblack@eecs.umich.edu read(NULL), inflight(0), retrying(false), 1825245Sgblack@eecs.umich.edu port(name() + ".port", this), 1835245Sgblack@eecs.umich.edu tlb(NULL), sys(params->system), 1845245Sgblack@eecs.umich.edu tc(NULL), state(Ready), nextState(Ready) 1855245Sgblack@eecs.umich.edu { 1865245Sgblack@eecs.umich.edu } 1875245Sgblack@eecs.umich.edu }; 1885245Sgblack@eecs.umich.edu} 1895245Sgblack@eecs.umich.edu#endif // __ARCH_X86_PAGE_TABLE_WALKER_HH__ 190