pagetable_walker.hh revision 9701
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 * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 127087Snate@binkert.org * modified or unmodified, in source code or in binary form. 135245Sgblack@eecs.umich.edu * 147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 157087Snate@binkert.org * modification, are permitted provided that the following conditions are 167087Snate@binkert.org * met: redistributions of source code must retain the above copyright 177087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 207087Snate@binkert.org * documentation and/or other materials provided with the distribution; 217087Snate@binkert.org * neither the name of the copyright holders nor the names of its 225245Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 237087Snate@binkert.org * this software without specific prior written permission. 245245Sgblack@eecs.umich.edu * 255245Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 265245Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 275245Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 285245Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 295245Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 305245Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 315245Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 325245Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 335245Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 345245Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 355245Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 365245Sgblack@eecs.umich.edu * 375245Sgblack@eecs.umich.edu * Authors: Gabe Black 385245Sgblack@eecs.umich.edu */ 395245Sgblack@eecs.umich.edu 405245Sgblack@eecs.umich.edu#ifndef __ARCH_X86_PAGE_TABLE_WALKER_HH__ 415245Sgblack@eecs.umich.edu#define __ARCH_X86_PAGE_TABLE_WALKER_HH__ 425245Sgblack@eecs.umich.edu 435245Sgblack@eecs.umich.edu#include <vector> 445245Sgblack@eecs.umich.edu 455245Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh" 465245Sgblack@eecs.umich.edu#include "arch/x86/tlb.hh" 476216Snate@binkert.org#include "base/types.hh" 485245Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 495245Sgblack@eecs.umich.edu#include "mem/packet.hh" 505245Sgblack@eecs.umich.edu#include "params/X86PagetableWalker.hh" 517901Shestness@cs.utexas.edu#include "sim/faults.hh" 528832SAli.Saidi@ARM.com#include "sim/system.hh" 535245Sgblack@eecs.umich.edu 545245Sgblack@eecs.umich.educlass ThreadContext; 555245Sgblack@eecs.umich.edu 565245Sgblack@eecs.umich.edunamespace X86ISA 575245Sgblack@eecs.umich.edu{ 585245Sgblack@eecs.umich.edu class Walker : public MemObject 595245Sgblack@eecs.umich.edu { 605245Sgblack@eecs.umich.edu protected: 617912Shestness@cs.utexas.edu // Port for accessing memory 628922Swilliam.wang@arm.com class WalkerPort : public MasterPort 635245Sgblack@eecs.umich.edu { 645245Sgblack@eecs.umich.edu public: 655245Sgblack@eecs.umich.edu WalkerPort(const std::string &_name, Walker * _walker) : 668922Swilliam.wang@arm.com MasterPort(_name, _walker), walker(_walker) 675245Sgblack@eecs.umich.edu {} 685245Sgblack@eecs.umich.edu 695245Sgblack@eecs.umich.edu protected: 708832SAli.Saidi@ARM.com Walker *walker; 715245Sgblack@eecs.umich.edu 728975Sandreas.hansson@arm.com bool recvTimingResp(PacketPtr pkt); 738948Sandreas.hansson@arm.com 748948Sandreas.hansson@arm.com /** 758948Sandreas.hansson@arm.com * Snooping a coherence request, do nothing. 768948Sandreas.hansson@arm.com */ 778975Sandreas.hansson@arm.com void recvTimingSnoopReq(PacketPtr pkt) { } 788948Sandreas.hansson@arm.com Tick recvAtomicSnoop(PacketPtr pkt) { return 0; } 798948Sandreas.hansson@arm.com void recvFunctionalSnoop(PacketPtr pkt) { } 805245Sgblack@eecs.umich.edu void recvRetry(); 818922Swilliam.wang@arm.com bool isSnooping() const { return true; } 825245Sgblack@eecs.umich.edu }; 835245Sgblack@eecs.umich.edu 847912Shestness@cs.utexas.edu friend class WalkerPort; 857912Shestness@cs.utexas.edu WalkerPort port; 865245Sgblack@eecs.umich.edu 877912Shestness@cs.utexas.edu // State to track each walk of the page table 889044SAli.Saidi@ARM.com class WalkerState 897912Shestness@cs.utexas.edu { 909701Sgedare@rtems.org friend class Walker; 917912Shestness@cs.utexas.edu private: 927912Shestness@cs.utexas.edu enum State { 937912Shestness@cs.utexas.edu Ready, 947912Shestness@cs.utexas.edu Waiting, 957912Shestness@cs.utexas.edu // Long mode 967912Shestness@cs.utexas.edu LongPML4, LongPDP, LongPD, LongPTE, 977912Shestness@cs.utexas.edu // PAE legacy mode 987912Shestness@cs.utexas.edu PAEPDP, PAEPD, PAEPTE, 997912Shestness@cs.utexas.edu // Non PAE legacy mode with and without PSE 1007912Shestness@cs.utexas.edu PSEPD, PD, PTE 1017912Shestness@cs.utexas.edu }; 1025245Sgblack@eecs.umich.edu 1037912Shestness@cs.utexas.edu protected: 1048832SAli.Saidi@ARM.com Walker *walker; 1057912Shestness@cs.utexas.edu ThreadContext *tc; 1067912Shestness@cs.utexas.edu RequestPtr req; 1077912Shestness@cs.utexas.edu State state; 1087912Shestness@cs.utexas.edu State nextState; 1097912Shestness@cs.utexas.edu int dataSize; 1107912Shestness@cs.utexas.edu bool enableNX; 1117912Shestness@cs.utexas.edu unsigned inflight; 1127912Shestness@cs.utexas.edu TlbEntry entry; 1137912Shestness@cs.utexas.edu PacketPtr read; 1147912Shestness@cs.utexas.edu std::vector<PacketPtr> writes; 1157912Shestness@cs.utexas.edu Fault timingFault; 1167912Shestness@cs.utexas.edu TLB::Translation * translation; 1177912Shestness@cs.utexas.edu BaseTLB::Mode mode; 1187912Shestness@cs.utexas.edu bool functional; 1197912Shestness@cs.utexas.edu bool timing; 1207912Shestness@cs.utexas.edu bool retrying; 1217912Shestness@cs.utexas.edu bool started; 1227912Shestness@cs.utexas.edu public: 1237912Shestness@cs.utexas.edu WalkerState(Walker * _walker, BaseTLB::Translation *_translation, 1247912Shestness@cs.utexas.edu RequestPtr _req, bool _isFunctional = false) : 1257912Shestness@cs.utexas.edu walker(_walker), req(_req), state(Ready), 1267912Shestness@cs.utexas.edu nextState(Ready), inflight(0), 1277912Shestness@cs.utexas.edu translation(_translation), 1287912Shestness@cs.utexas.edu functional(_isFunctional), timing(false), 1297912Shestness@cs.utexas.edu retrying(false), started(false) 1307912Shestness@cs.utexas.edu { 1317912Shestness@cs.utexas.edu } 1327912Shestness@cs.utexas.edu void initState(ThreadContext * _tc, BaseTLB::Mode _mode, 1337912Shestness@cs.utexas.edu bool _isTiming = false); 1347912Shestness@cs.utexas.edu Fault startWalk(); 1358953Sgblack@eecs.umich.edu Fault startFunctional(Addr &addr, unsigned &logBytes); 1367912Shestness@cs.utexas.edu bool recvPacket(PacketPtr pkt); 1377912Shestness@cs.utexas.edu bool isRetrying(); 1387912Shestness@cs.utexas.edu bool wasStarted(); 1397912Shestness@cs.utexas.edu bool isTiming(); 1407912Shestness@cs.utexas.edu void retry(); 1417912Shestness@cs.utexas.edu std::string name() const {return walker->name();} 1427912Shestness@cs.utexas.edu 1437912Shestness@cs.utexas.edu private: 1447912Shestness@cs.utexas.edu void setupWalk(Addr vaddr); 1457912Shestness@cs.utexas.edu Fault stepWalk(PacketPtr &write); 1467912Shestness@cs.utexas.edu void sendPackets(); 1477912Shestness@cs.utexas.edu void endWalk(); 1487912Shestness@cs.utexas.edu Fault pageFault(bool present); 1497912Shestness@cs.utexas.edu }; 1507912Shestness@cs.utexas.edu 1517912Shestness@cs.utexas.edu friend class WalkerState; 1527912Shestness@cs.utexas.edu // State for timing and atomic accesses (need multiple per walker in 1537912Shestness@cs.utexas.edu // the case of multiple outstanding requests in timing mode) 1547912Shestness@cs.utexas.edu std::list<WalkerState *> currStates; 1557912Shestness@cs.utexas.edu // State for functional accesses (only need one of these per walker) 1567912Shestness@cs.utexas.edu WalkerState funcState; 1577912Shestness@cs.utexas.edu 1587912Shestness@cs.utexas.edu struct WalkerSenderState : public Packet::SenderState 1597912Shestness@cs.utexas.edu { 1607912Shestness@cs.utexas.edu WalkerState * senderWalk; 1619542Sandreas.hansson@arm.com WalkerSenderState(WalkerState * _senderWalk) : 1629542Sandreas.hansson@arm.com senderWalk(_senderWalk) {} 1637912Shestness@cs.utexas.edu }; 1647912Shestness@cs.utexas.edu 1657912Shestness@cs.utexas.edu public: 1667912Shestness@cs.utexas.edu // Kick off the state machine. 1677912Shestness@cs.utexas.edu Fault start(ThreadContext * _tc, BaseTLB::Translation *translation, 1687912Shestness@cs.utexas.edu RequestPtr req, BaseTLB::Mode mode); 1697912Shestness@cs.utexas.edu Fault startFunctional(ThreadContext * _tc, Addr &addr, 1708953Sgblack@eecs.umich.edu unsigned &logBytes, BaseTLB::Mode mode); 1719294Sandreas.hansson@arm.com BaseMasterPort &getMasterPort(const std::string &if_name, 1729294Sandreas.hansson@arm.com PortID idx = InvalidPortID); 1737912Shestness@cs.utexas.edu 1747912Shestness@cs.utexas.edu protected: 1755245Sgblack@eecs.umich.edu // The TLB we're supposed to load. 1765245Sgblack@eecs.umich.edu TLB * tlb; 1775245Sgblack@eecs.umich.edu System * sys; 1788832SAli.Saidi@ARM.com MasterID masterId; 1795245Sgblack@eecs.umich.edu 1809701Sgedare@rtems.org // The number of outstanding walks that can be squashed per cycle. 1819701Sgedare@rtems.org unsigned numSquashable; 1829701Sgedare@rtems.org 1839701Sgedare@rtems.org // Wrapper for checking for squashes before starting a translation. 1849701Sgedare@rtems.org void startWalkWrapper(); 1859701Sgedare@rtems.org 1867912Shestness@cs.utexas.edu // Functions for dealing with packets. 1878975Sandreas.hansson@arm.com bool recvTimingResp(PacketPtr pkt); 1887912Shestness@cs.utexas.edu void recvRetry(); 1897912Shestness@cs.utexas.edu bool sendTiming(WalkerState * sendingState, PacketPtr pkt); 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 2008832SAli.Saidi@ARM.com const Params * 2018832SAli.Saidi@ARM.com params() const 2028832SAli.Saidi@ARM.com { 2038832SAli.Saidi@ARM.com return static_cast<const Params *>(_params); 2048832SAli.Saidi@ARM.com } 2058832SAli.Saidi@ARM.com 2065245Sgblack@eecs.umich.edu Walker(const Params *params) : 2077912Shestness@cs.utexas.edu MemObject(params), port(name() + ".port", this), 2088832SAli.Saidi@ARM.com funcState(this, NULL, NULL, true), tlb(NULL), sys(params->system), 2099701Sgedare@rtems.org masterId(sys->getMasterId(name())), 2109701Sgedare@rtems.org numSquashable(params->num_squash_per_cycle) 2115245Sgblack@eecs.umich.edu { 2125245Sgblack@eecs.umich.edu } 2135245Sgblack@eecs.umich.edu }; 2145245Sgblack@eecs.umich.edu} 2155245Sgblack@eecs.umich.edu#endif // __ARCH_X86_PAGE_TABLE_WALKER_HH__ 216