tlb.hh revision 5242
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
34120Sgblack@eecs.umich.edu * All rights reserved.
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms,
64120Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the
74120Sgblack@eecs.umich.edu * following conditions are met:
84120Sgblack@eecs.umich.edu *
94120Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any
104120Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary
114120Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use.  Illustrative
124120Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study,
134120Sgblack@eecs.umich.edu * teaching, education and corporate research & development.
144120Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for
154120Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for
164120Sgblack@eecs.umich.edu * commercial advantage.
174120Sgblack@eecs.umich.edu *
184120Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be
194120Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact:
204120Sgblack@eecs.umich.edu *     Director of Intellectual Property Licensing
214120Sgblack@eecs.umich.edu *     Office of Strategy and Technology
224120Sgblack@eecs.umich.edu *     Hewlett-Packard Company
234120Sgblack@eecs.umich.edu *     1501 Page Mill Road
244120Sgblack@eecs.umich.edu *     Palo Alto, California  94304
254120Sgblack@eecs.umich.edu *
264120Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice,
274120Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer.  Redistributions
284120Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of
294120Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or
304120Sgblack@eecs.umich.edu * other materials provided with the distribution.  Neither the name of
314120Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
324120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
334120Sgblack@eecs.umich.edu * this software without specific prior written permission.  No right of
344120Sgblack@eecs.umich.edu * sublicense is granted herewith.  Derivatives of the software and
354120Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for
364120Sgblack@eecs.umich.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
374120Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of
384120Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions;
394120Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright
404120Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where
414120Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below.
424120Sgblack@eecs.umich.edu *
434120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
444120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
454120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
464120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
474120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
484120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
494120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
504120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
514120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
524120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
534120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
544120Sgblack@eecs.umich.edu *
554120Sgblack@eecs.umich.edu * Authors: Gabe Black
564120Sgblack@eecs.umich.edu */
574120Sgblack@eecs.umich.edu
584120Sgblack@eecs.umich.edu#ifndef __ARCH_X86_TLB_HH__
594120Sgblack@eecs.umich.edu#define __ARCH_X86_TLB_HH__
604120Sgblack@eecs.umich.edu
615124Sgblack@eecs.umich.edu#include <list>
625237Sgblack@eecs.umich.edu#include <vector>
635236Sgblack@eecs.umich.edu#include <string>
645124Sgblack@eecs.umich.edu
655124Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh"
665124Sgblack@eecs.umich.edu#include "arch/x86/segmentregs.hh"
675086Sgblack@eecs.umich.edu#include "config/full_system.hh"
685236Sgblack@eecs.umich.edu#include "mem/mem_object.hh"
695086Sgblack@eecs.umich.edu#include "mem/request.hh"
705086Sgblack@eecs.umich.edu#include "params/X86DTB.hh"
715086Sgblack@eecs.umich.edu#include "params/X86ITB.hh"
725086Sgblack@eecs.umich.edu#include "sim/faults.hh"
735086Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
745086Sgblack@eecs.umich.edu
755086Sgblack@eecs.umich.educlass ThreadContext;
765086Sgblack@eecs.umich.educlass Packet;
775086Sgblack@eecs.umich.edu
785086Sgblack@eecs.umich.edunamespace X86ISA
795086Sgblack@eecs.umich.edu{
805118Sgblack@eecs.umich.edu    static const unsigned StoreCheck = 1 << NUM_SEGMENTREGS;
815118Sgblack@eecs.umich.edu
825236Sgblack@eecs.umich.edu    class TLB;
835236Sgblack@eecs.umich.edu
845236Sgblack@eecs.umich.edu    class TLB : public MemObject
855086Sgblack@eecs.umich.edu    {
865124Sgblack@eecs.umich.edu      protected:
875124Sgblack@eecs.umich.edu        friend class FakeITLBFault;
885124Sgblack@eecs.umich.edu        friend class FakeDTLBFault;
895236Sgblack@eecs.umich.edu
905236Sgblack@eecs.umich.edu        System * sys;
915236Sgblack@eecs.umich.edu
925237Sgblack@eecs.umich.edu        bool allowNX;
935237Sgblack@eecs.umich.edu
945124Sgblack@eecs.umich.edu      public:
955124Sgblack@eecs.umich.edu        typedef X86TLBParams Params;
965124Sgblack@eecs.umich.edu        TLB(const Params *p);
975086Sgblack@eecs.umich.edu
985124Sgblack@eecs.umich.edu        void dumpAll();
995124Sgblack@eecs.umich.edu
1005124Sgblack@eecs.umich.edu        TlbEntry *lookup(Addr va, bool update_lru = true);
1015124Sgblack@eecs.umich.edu
1025236Sgblack@eecs.umich.edu#if FULL_SYSTEM
1035236Sgblack@eecs.umich.edu      protected:
1045236Sgblack@eecs.umich.edu        class Walker
1055236Sgblack@eecs.umich.edu        {
1065236Sgblack@eecs.umich.edu          public:
1075236Sgblack@eecs.umich.edu            enum State {
1085236Sgblack@eecs.umich.edu                Ready,
1095236Sgblack@eecs.umich.edu                Waiting,
1105236Sgblack@eecs.umich.edu                LongPML4,
1115236Sgblack@eecs.umich.edu                LongPDP,
1125236Sgblack@eecs.umich.edu                LongPD,
1135236Sgblack@eecs.umich.edu                LongPTE,
1145236Sgblack@eecs.umich.edu                PAEPDP,
1155236Sgblack@eecs.umich.edu                PAEPD,
1165236Sgblack@eecs.umich.edu                PAEPTE,
1175236Sgblack@eecs.umich.edu                PSEPD,
1185236Sgblack@eecs.umich.edu                PD,
1195236Sgblack@eecs.umich.edu                PTE
1205236Sgblack@eecs.umich.edu            };
1215236Sgblack@eecs.umich.edu
1225237Sgblack@eecs.umich.edu            // Act on the current state and determine what to do next. read
1235237Sgblack@eecs.umich.edu            // should be the packet that just came back from a read and write
1245237Sgblack@eecs.umich.edu            // should be NULL. When the function returns, read is either NULL
1255237Sgblack@eecs.umich.edu            // if the machine is finished, or points to a packet to initiate
1265237Sgblack@eecs.umich.edu            // the next read. If any write is required to update an "accessed"
1275237Sgblack@eecs.umich.edu            // bit, write will point to a packet to do the write. Otherwise it
1285237Sgblack@eecs.umich.edu            // will be NULL.
1295237Sgblack@eecs.umich.edu            void doNext(PacketPtr &read, PacketPtr &write);
1305236Sgblack@eecs.umich.edu
1315236Sgblack@eecs.umich.edu            // Kick off the state machine.
1325237Sgblack@eecs.umich.edu            void start(ThreadContext * _tc, Addr vaddr);
1335236Sgblack@eecs.umich.edu
1345236Sgblack@eecs.umich.edu          protected:
1355236Sgblack@eecs.umich.edu            friend class TLB;
1365236Sgblack@eecs.umich.edu
1375237Sgblack@eecs.umich.edu            /*
1385237Sgblack@eecs.umich.edu             * State having to do with sending packets.
1395237Sgblack@eecs.umich.edu             */
1405237Sgblack@eecs.umich.edu            PacketPtr read;
1415237Sgblack@eecs.umich.edu            std::vector<PacketPtr> writes;
1425237Sgblack@eecs.umich.edu
1435237Sgblack@eecs.umich.edu            // How many memory operations are in flight.
1445237Sgblack@eecs.umich.edu            unsigned inflight;
1455237Sgblack@eecs.umich.edu
1465237Sgblack@eecs.umich.edu            bool retrying;
1475237Sgblack@eecs.umich.edu
1485237Sgblack@eecs.umich.edu            /*
1495237Sgblack@eecs.umich.edu             * Functions for dealing with packets.
1505237Sgblack@eecs.umich.edu             */
1515237Sgblack@eecs.umich.edu            bool recvTiming(PacketPtr pkt);
1525237Sgblack@eecs.umich.edu            void recvRetry();
1535237Sgblack@eecs.umich.edu
1545237Sgblack@eecs.umich.edu            void sendPackets();
1555237Sgblack@eecs.umich.edu
1565237Sgblack@eecs.umich.edu            /*
1575237Sgblack@eecs.umich.edu             * Port for accessing memory
1585237Sgblack@eecs.umich.edu             */
1595236Sgblack@eecs.umich.edu            class WalkerPort : public Port
1605236Sgblack@eecs.umich.edu            {
1615236Sgblack@eecs.umich.edu              public:
1625236Sgblack@eecs.umich.edu                WalkerPort(const std::string &_name, Walker * _walker) :
1635236Sgblack@eecs.umich.edu                      Port(_name, _walker->tlb), walker(_walker),
1645237Sgblack@eecs.umich.edu                      snoopRangeSent(false)
1655236Sgblack@eecs.umich.edu                {}
1665236Sgblack@eecs.umich.edu
1675236Sgblack@eecs.umich.edu              protected:
1685236Sgblack@eecs.umich.edu                Walker * walker;
1695236Sgblack@eecs.umich.edu
1705236Sgblack@eecs.umich.edu                bool snoopRangeSent;
1715236Sgblack@eecs.umich.edu
1725236Sgblack@eecs.umich.edu                bool recvTiming(PacketPtr pkt);
1735236Sgblack@eecs.umich.edu                Tick recvAtomic(PacketPtr pkt);
1745236Sgblack@eecs.umich.edu                void recvFunctional(PacketPtr pkt);
1755236Sgblack@eecs.umich.edu                void recvStatusChange(Status status);
1765236Sgblack@eecs.umich.edu                void recvRetry();
1775236Sgblack@eecs.umich.edu                void getDeviceAddressRanges(AddrRangeList &resp,
1785236Sgblack@eecs.umich.edu                        bool &snoop)
1795236Sgblack@eecs.umich.edu                {
1805236Sgblack@eecs.umich.edu                    resp.clear();
1815236Sgblack@eecs.umich.edu                    snoop = true;
1825236Sgblack@eecs.umich.edu                }
1835236Sgblack@eecs.umich.edu            };
1845236Sgblack@eecs.umich.edu
1855236Sgblack@eecs.umich.edu            friend class WalkerPort;
1865236Sgblack@eecs.umich.edu
1875236Sgblack@eecs.umich.edu            WalkerPort port;
1885236Sgblack@eecs.umich.edu
1895237Sgblack@eecs.umich.edu            // The TLB we're supposed to load.
1905236Sgblack@eecs.umich.edu            TLB * tlb;
1915236Sgblack@eecs.umich.edu
1925237Sgblack@eecs.umich.edu            /*
1935237Sgblack@eecs.umich.edu             * State machine state.
1945237Sgblack@eecs.umich.edu             */
1955237Sgblack@eecs.umich.edu            ThreadContext * tc;
1965236Sgblack@eecs.umich.edu            State state;
1975236Sgblack@eecs.umich.edu            State nextState;
1985236Sgblack@eecs.umich.edu            int size;
1995237Sgblack@eecs.umich.edu            bool enableNX;
2005237Sgblack@eecs.umich.edu            TlbEntry entry;
2015236Sgblack@eecs.umich.edu
2025236Sgblack@eecs.umich.edu          public:
2035236Sgblack@eecs.umich.edu            Walker(const std::string &_name, TLB * _tlb) :
2045237Sgblack@eecs.umich.edu                read(NULL), inflight(0), retrying(false),
2055236Sgblack@eecs.umich.edu                port(_name + "-walker_port", this),
2065237Sgblack@eecs.umich.edu                tlb(_tlb),
2075237Sgblack@eecs.umich.edu                tc(NULL), state(Ready), nextState(Ready)
2085236Sgblack@eecs.umich.edu            {
2095236Sgblack@eecs.umich.edu            }
2105236Sgblack@eecs.umich.edu        };
2115236Sgblack@eecs.umich.edu
2125236Sgblack@eecs.umich.edu        Walker walker;
2135237Sgblack@eecs.umich.edu
2145236Sgblack@eecs.umich.edu#endif
2155236Sgblack@eecs.umich.edu
2165237Sgblack@eecs.umich.edu        Port *getPort(const std::string &if_name, int idx = -1);
2175237Sgblack@eecs.umich.edu
2185242Sgblack@eecs.umich.edu      public:
2195242Sgblack@eecs.umich.edu        void invalidateAll();
2205242Sgblack@eecs.umich.edu
2215242Sgblack@eecs.umich.edu        void invalidateNonGlobal();
2225242Sgblack@eecs.umich.edu
2235242Sgblack@eecs.umich.edu        void demapPage(Addr va);
2245242Sgblack@eecs.umich.edu
2255124Sgblack@eecs.umich.edu      protected:
2265124Sgblack@eecs.umich.edu        int size;
2275124Sgblack@eecs.umich.edu
2285124Sgblack@eecs.umich.edu        TlbEntry * tlb;
2295124Sgblack@eecs.umich.edu
2305124Sgblack@eecs.umich.edu        typedef std::list<TlbEntry *> EntryList;
2315124Sgblack@eecs.umich.edu        EntryList freeList;
2325124Sgblack@eecs.umich.edu        EntryList entryList;
2335124Sgblack@eecs.umich.edu
2345124Sgblack@eecs.umich.edu        void insert(Addr vpn, TlbEntry &entry);
2355124Sgblack@eecs.umich.edu
2365140Sgblack@eecs.umich.edu        template<class TlbFault>
2375140Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc,
2385140Sgblack@eecs.umich.edu                bool write, bool execute);
2395140Sgblack@eecs.umich.edu
2405124Sgblack@eecs.umich.edu      public:
2415124Sgblack@eecs.umich.edu        // Checkpointing
2425124Sgblack@eecs.umich.edu        virtual void serialize(std::ostream &os);
2435124Sgblack@eecs.umich.edu        virtual void unserialize(Checkpoint *cp, const std::string &section);
2445086Sgblack@eecs.umich.edu    };
2455086Sgblack@eecs.umich.edu
2465124Sgblack@eecs.umich.edu    class ITB : public TLB
2475124Sgblack@eecs.umich.edu    {
2485124Sgblack@eecs.umich.edu      public:
2495124Sgblack@eecs.umich.edu        typedef X86ITBParams Params;
2505124Sgblack@eecs.umich.edu        ITB(const Params *p) : TLB(p)
2515124Sgblack@eecs.umich.edu        {
2525237Sgblack@eecs.umich.edu            sys = p->system;
2535237Sgblack@eecs.umich.edu            allowNX = false;
2545124Sgblack@eecs.umich.edu        }
2555086Sgblack@eecs.umich.edu
2565124Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc);
2575086Sgblack@eecs.umich.edu
2585124Sgblack@eecs.umich.edu        friend class DTB;
2595124Sgblack@eecs.umich.edu    };
2605086Sgblack@eecs.umich.edu
2615124Sgblack@eecs.umich.edu    class DTB : public TLB
2625086Sgblack@eecs.umich.edu    {
2635124Sgblack@eecs.umich.edu      public:
2645124Sgblack@eecs.umich.edu        typedef X86DTBParams Params;
2655124Sgblack@eecs.umich.edu        DTB(const Params *p) : TLB(p)
2665124Sgblack@eecs.umich.edu        {
2675237Sgblack@eecs.umich.edu            sys = p->system;
2685237Sgblack@eecs.umich.edu            allowNX = true;
2695124Sgblack@eecs.umich.edu        }
2705124Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc, bool write);
2715086Sgblack@eecs.umich.edu#if FULL_SYSTEM
2725124Sgblack@eecs.umich.edu        Tick doMmuRegRead(ThreadContext *tc, Packet *pkt);
2735124Sgblack@eecs.umich.edu        Tick doMmuRegWrite(ThreadContext *tc, Packet *pkt);
2745086Sgblack@eecs.umich.edu#endif
2755086Sgblack@eecs.umich.edu
2765124Sgblack@eecs.umich.edu        // Checkpointing
2775124Sgblack@eecs.umich.edu        virtual void serialize(std::ostream &os);
2785124Sgblack@eecs.umich.edu        virtual void unserialize(Checkpoint *cp, const std::string &section);
2795124Sgblack@eecs.umich.edu    };
2805086Sgblack@eecs.umich.edu}
2815086Sgblack@eecs.umich.edu
2824120Sgblack@eecs.umich.edu#endif // __ARCH_X86_TLB_HH__
283