pagetable_walker.hh revision 5245
17396Sgblack@eecs.umich.edu/* 27396Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company 37396Sgblack@eecs.umich.edu * All rights reserved. 47396Sgblack@eecs.umich.edu * 57396Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms, 67396Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the 77396Sgblack@eecs.umich.edu * following conditions are met: 87396Sgblack@eecs.umich.edu * 97396Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any 107396Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary 117396Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use. Illustrative 127396Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study, 137396Sgblack@eecs.umich.edu * teaching, education and corporate research & development. 147396Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for 157396Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for 167396Sgblack@eecs.umich.edu * commercial advantage. 177396Sgblack@eecs.umich.edu * 187396Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be 197396Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact: 207396Sgblack@eecs.umich.edu * Director of Intellectual Property Licensing 217396Sgblack@eecs.umich.edu * Office of Strategy and Technology 227396Sgblack@eecs.umich.edu * Hewlett-Packard Company 237396Sgblack@eecs.umich.edu * 1501 Page Mill Road 247396Sgblack@eecs.umich.edu * Palo Alto, California 94304 257396Sgblack@eecs.umich.edu * 267396Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice, 277396Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer. Redistributions 287396Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of 297396Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or 307396Sgblack@eecs.umich.edu * other materials provided with the distribution. Neither the name of 317396Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 327396Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 337396Sgblack@eecs.umich.edu * this software without specific prior written permission. No right of 347396Sgblack@eecs.umich.edu * sublicense is granted herewith. Derivatives of the software and 357396Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for 367396Sgblack@eecs.umich.edu * Non-Commercial Uses. Derivatives of the software may be shared with 377396Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of 387396Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions; 397396Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright 407396Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where 417396Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below. 427434Sgblack@eecs.umich.edu * 437434Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 447434Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 457434Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 467434Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 477434Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 487396Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 497396Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 507396Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 517396Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 527396Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 537396Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 547396Sgblack@eecs.umich.edu * 557396Sgblack@eecs.umich.edu * Authors: Gabe Black 567396Sgblack@eecs.umich.edu */ 577396Sgblack@eecs.umich.edu 587396Sgblack@eecs.umich.edu#ifndef __ARCH_X86_PAGE_TABLE_WALKER_HH__ 597396Sgblack@eecs.umich.edu#define __ARCH_X86_PAGE_TABLE_WALKER_HH__ 607396Sgblack@eecs.umich.edu 617396Sgblack@eecs.umich.edu#include <vector> 627396Sgblack@eecs.umich.edu 637396Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh" 647396Sgblack@eecs.umich.edu#include "arch/x86/tlb.hh" 657396Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 667396Sgblack@eecs.umich.edu#include "mem/packet.hh" 677396Sgblack@eecs.umich.edu#include "params/X86PagetableWalker.hh" 687396Sgblack@eecs.umich.edu#include "sim/host.hh" 697396Sgblack@eecs.umich.edu 707396Sgblack@eecs.umich.educlass ThreadContext; 717396Sgblack@eecs.umich.edu 727396Sgblack@eecs.umich.edunamespace X86ISA 737396Sgblack@eecs.umich.edu{ 747396Sgblack@eecs.umich.edu class Walker : public MemObject 757396Sgblack@eecs.umich.edu { 767396Sgblack@eecs.umich.edu public: 777396Sgblack@eecs.umich.edu enum State { 787396Sgblack@eecs.umich.edu Ready, 797396Sgblack@eecs.umich.edu Waiting, 807396Sgblack@eecs.umich.edu // Long mode 817396Sgblack@eecs.umich.edu LongPML4, LongPDP, LongPD, LongPTE, 827396Sgblack@eecs.umich.edu // PAE legacy mode 837396Sgblack@eecs.umich.edu PAEPDP, PAEPD, PAEPTE, 847396Sgblack@eecs.umich.edu // Non PAE legacy mode with and without PSE 857396Sgblack@eecs.umich.edu PSEPD, PD, PTE 867396Sgblack@eecs.umich.edu }; 877396Sgblack@eecs.umich.edu 887396Sgblack@eecs.umich.edu // Act on the current state and determine what to do next. read 897396Sgblack@eecs.umich.edu // should be the packet that just came back from a read and write 907396Sgblack@eecs.umich.edu // should be NULL. When the function returns, read is either NULL 917396Sgblack@eecs.umich.edu // if the machine is finished, or points to a packet to initiate 927396Sgblack@eecs.umich.edu // the next read. If any write is required to update an "accessed" 937430Sgblack@eecs.umich.edu // bit, write will point to a packet to do the write. Otherwise it 947639Sgblack@eecs.umich.edu // will be NULL. 957639Sgblack@eecs.umich.edu void doNext(PacketPtr &read, PacketPtr &write); 967639Sgblack@eecs.umich.edu 977639Sgblack@eecs.umich.edu // Kick off the state machine. 987639Sgblack@eecs.umich.edu void start(ThreadContext * _tc, Addr vaddr); 997639Sgblack@eecs.umich.edu 1007639Sgblack@eecs.umich.edu protected: 1017639Sgblack@eecs.umich.edu 1027639Sgblack@eecs.umich.edu /* 1037639Sgblack@eecs.umich.edu * State having to do with sending packets. 1047639Sgblack@eecs.umich.edu */ 1057639Sgblack@eecs.umich.edu PacketPtr read; 1067639Sgblack@eecs.umich.edu std::vector<PacketPtr> writes; 1077639Sgblack@eecs.umich.edu 1087430Sgblack@eecs.umich.edu // How many memory operations are in flight. 1097430Sgblack@eecs.umich.edu unsigned inflight; 1107430Sgblack@eecs.umich.edu 1117430Sgblack@eecs.umich.edu bool retrying; 1127430Sgblack@eecs.umich.edu 1137430Sgblack@eecs.umich.edu /* 1147430Sgblack@eecs.umich.edu * Functions for dealing with packets. 1157430Sgblack@eecs.umich.edu */ 1167430Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1177430Sgblack@eecs.umich.edu void recvRetry(); 1187430Sgblack@eecs.umich.edu 1197430Sgblack@eecs.umich.edu void sendPackets(); 1207430Sgblack@eecs.umich.edu 1217430Sgblack@eecs.umich.edu /* 1227430Sgblack@eecs.umich.edu * Port for accessing memory 1237430Sgblack@eecs.umich.edu */ 1247430Sgblack@eecs.umich.edu class WalkerPort : public Port 1257430Sgblack@eecs.umich.edu { 1267430Sgblack@eecs.umich.edu public: 1277430Sgblack@eecs.umich.edu WalkerPort(const std::string &_name, Walker * _walker) : 1287430Sgblack@eecs.umich.edu Port(_name, _walker), walker(_walker), 1297430Sgblack@eecs.umich.edu snoopRangeSent(false) 1307430Sgblack@eecs.umich.edu {} 1317430Sgblack@eecs.umich.edu 1327430Sgblack@eecs.umich.edu protected: 1337430Sgblack@eecs.umich.edu Walker * walker; 1347639Sgblack@eecs.umich.edu 1357430Sgblack@eecs.umich.edu bool snoopRangeSent; 1367430Sgblack@eecs.umich.edu 1377430Sgblack@eecs.umich.edu bool recvTiming(PacketPtr pkt); 1387430Sgblack@eecs.umich.edu Tick recvAtomic(PacketPtr pkt); 1397430Sgblack@eecs.umich.edu void recvFunctional(PacketPtr pkt); 1407430Sgblack@eecs.umich.edu void recvStatusChange(Status status); 1417430Sgblack@eecs.umich.edu void recvRetry(); 1427430Sgblack@eecs.umich.edu void getDeviceAddressRanges(AddrRangeList &resp, 1437430Sgblack@eecs.umich.edu bool &snoop) 1447430Sgblack@eecs.umich.edu { 1457430Sgblack@eecs.umich.edu resp.clear(); 1467430Sgblack@eecs.umich.edu snoop = true; 1477430Sgblack@eecs.umich.edu } 1487430Sgblack@eecs.umich.edu }; 1497430Sgblack@eecs.umich.edu 1507430Sgblack@eecs.umich.edu Port *getPort(const std::string &if_name, int idx = -1); 1517639Sgblack@eecs.umich.edu 1527430Sgblack@eecs.umich.edu friend class WalkerPort; 1537430Sgblack@eecs.umich.edu 1547430Sgblack@eecs.umich.edu WalkerPort port; 1557430Sgblack@eecs.umich.edu 1567430Sgblack@eecs.umich.edu // The TLB we're supposed to load. 1577430Sgblack@eecs.umich.edu TLB * tlb; 1587430Sgblack@eecs.umich.edu System * sys; 1597639Sgblack@eecs.umich.edu 1607430Sgblack@eecs.umich.edu /* 1617430Sgblack@eecs.umich.edu * State machine state. 1627430Sgblack@eecs.umich.edu */ 1637430Sgblack@eecs.umich.edu ThreadContext * tc; 1647430Sgblack@eecs.umich.edu State state; 1657430Sgblack@eecs.umich.edu State nextState; 1667430Sgblack@eecs.umich.edu int size; 1677639Sgblack@eecs.umich.edu bool enableNX; 1687430Sgblack@eecs.umich.edu TlbEntry entry; 1697430Sgblack@eecs.umich.edu 1707430Sgblack@eecs.umich.edu public: 1717430Sgblack@eecs.umich.edu 1727639Sgblack@eecs.umich.edu void setTLB(TLB * _tlb) 1737430Sgblack@eecs.umich.edu { 1747430Sgblack@eecs.umich.edu tlb = _tlb; 1757430Sgblack@eecs.umich.edu } 1767430Sgblack@eecs.umich.edu 1777430Sgblack@eecs.umich.edu typedef X86PagetableWalkerParams Params; 1787430Sgblack@eecs.umich.edu 1797430Sgblack@eecs.umich.edu Walker(const Params *params) : 1807430Sgblack@eecs.umich.edu MemObject(params), 1817430Sgblack@eecs.umich.edu read(NULL), inflight(0), retrying(false), 1827430Sgblack@eecs.umich.edu port(name() + ".port", this), 1837639Sgblack@eecs.umich.edu tlb(NULL), sys(params->system), 1847430Sgblack@eecs.umich.edu tc(NULL), state(Ready), nextState(Ready) 1857639Sgblack@eecs.umich.edu { 1867430Sgblack@eecs.umich.edu } 1877430Sgblack@eecs.umich.edu }; 1887430Sgblack@eecs.umich.edu} 1897639Sgblack@eecs.umich.edu#endif // __ARCH_X86_PAGE_TABLE_WALKER_HH__ 1907430Sgblack@eecs.umich.edu