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