tlb.hh revision 5236
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>
625236Sgblack@eecs.umich.edu#include <string>
635124Sgblack@eecs.umich.edu
645124Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh"
655124Sgblack@eecs.umich.edu#include "arch/x86/segmentregs.hh"
665086Sgblack@eecs.umich.edu#include "config/full_system.hh"
675236Sgblack@eecs.umich.edu#include "mem/mem_object.hh"
685086Sgblack@eecs.umich.edu#include "mem/request.hh"
695086Sgblack@eecs.umich.edu#include "params/X86DTB.hh"
705086Sgblack@eecs.umich.edu#include "params/X86ITB.hh"
715086Sgblack@eecs.umich.edu#include "sim/faults.hh"
725086Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
735086Sgblack@eecs.umich.edu
745086Sgblack@eecs.umich.educlass ThreadContext;
755086Sgblack@eecs.umich.educlass Packet;
765086Sgblack@eecs.umich.edu
775086Sgblack@eecs.umich.edunamespace X86ISA
785086Sgblack@eecs.umich.edu{
795118Sgblack@eecs.umich.edu    static const unsigned StoreCheck = 1 << NUM_SEGMENTREGS;
805118Sgblack@eecs.umich.edu
815236Sgblack@eecs.umich.edu    class TLB;
825236Sgblack@eecs.umich.edu
835236Sgblack@eecs.umich.edu    class TLB : public MemObject
845086Sgblack@eecs.umich.edu    {
855124Sgblack@eecs.umich.edu      protected:
865124Sgblack@eecs.umich.edu        friend class FakeITLBFault;
875124Sgblack@eecs.umich.edu        friend class FakeDTLBFault;
885236Sgblack@eecs.umich.edu
895236Sgblack@eecs.umich.edu        System * sys;
905236Sgblack@eecs.umich.edu
915124Sgblack@eecs.umich.edu      public:
925124Sgblack@eecs.umich.edu        typedef X86TLBParams Params;
935124Sgblack@eecs.umich.edu        TLB(const Params *p);
945086Sgblack@eecs.umich.edu
955124Sgblack@eecs.umich.edu        void dumpAll();
965124Sgblack@eecs.umich.edu
975124Sgblack@eecs.umich.edu        TlbEntry *lookup(Addr va, bool update_lru = true);
985124Sgblack@eecs.umich.edu
995236Sgblack@eecs.umich.edu#if FULL_SYSTEM
1005236Sgblack@eecs.umich.edu      protected:
1015236Sgblack@eecs.umich.edu        class Walker
1025236Sgblack@eecs.umich.edu        {
1035236Sgblack@eecs.umich.edu          public:
1045236Sgblack@eecs.umich.edu            enum State {
1055236Sgblack@eecs.umich.edu                Ready,
1065236Sgblack@eecs.umich.edu                Waiting,
1075236Sgblack@eecs.umich.edu                LongPML4,
1085236Sgblack@eecs.umich.edu                LongPDP,
1095236Sgblack@eecs.umich.edu                LongPD,
1105236Sgblack@eecs.umich.edu                LongPTE,
1115236Sgblack@eecs.umich.edu                PAEPDP,
1125236Sgblack@eecs.umich.edu                PAEPD,
1135236Sgblack@eecs.umich.edu                PAEPTE,
1145236Sgblack@eecs.umich.edu                PSEPD,
1155236Sgblack@eecs.umich.edu                PD,
1165236Sgblack@eecs.umich.edu                PTE
1175236Sgblack@eecs.umich.edu            };
1185236Sgblack@eecs.umich.edu
1195236Sgblack@eecs.umich.edu            // Act on the current state and determine what to do next. If the
1205236Sgblack@eecs.umich.edu            // walker has finished updating the TLB, this will return false.
1215236Sgblack@eecs.umich.edu            bool doNext(PacketPtr read, PacketPtr &write);
1225236Sgblack@eecs.umich.edu
1235236Sgblack@eecs.umich.edu            // This does an actual load to feed the walker. If we're in
1245236Sgblack@eecs.umich.edu            // atomic mode, this will drive the state machine itself until
1255236Sgblack@eecs.umich.edu            // the TLB is filled. If we're in timing mode, the port getting
1265236Sgblack@eecs.umich.edu            // a reply will drive the machine using this function which will
1275236Sgblack@eecs.umich.edu            // return after starting the memory operation.
1285236Sgblack@eecs.umich.edu            void doMemory(Addr addr);
1295236Sgblack@eecs.umich.edu
1305236Sgblack@eecs.umich.edu            // Kick off the state machine.
1315236Sgblack@eecs.umich.edu            void start(bool _uncachable, Addr _vaddr, Addr cr3, State next)
1325236Sgblack@eecs.umich.edu            {
1335236Sgblack@eecs.umich.edu                assert(state == Ready);
1345236Sgblack@eecs.umich.edu                state = Waiting;
1355236Sgblack@eecs.umich.edu                nextState = next;
1365236Sgblack@eecs.umich.edu                // If PAE isn't being used, entries are 4 bytes. Otherwise
1375236Sgblack@eecs.umich.edu                // they're 8.
1385236Sgblack@eecs.umich.edu                if (next == PSEPD || next == PD || next == PTE)
1395236Sgblack@eecs.umich.edu                    size = 4;
1405236Sgblack@eecs.umich.edu                else
1415236Sgblack@eecs.umich.edu                    size = 8;
1425236Sgblack@eecs.umich.edu                vaddr = _vaddr;
1435236Sgblack@eecs.umich.edu                uncachable = _uncacheable;
1445236Sgblack@eecs.umich.edu                buildPacket(cr3);
1455236Sgblack@eecs.umich.edu                if (state == Enums::timing) {
1465236Sgblack@eecs.umich.edu                    port->sendTiming(&packet);
1475236Sgblack@eecs.umich.edu                } else if (state == Enums::atomic) {
1485236Sgblack@eecs.umich.edu                    port->sendAtomic(&packet);
1495236Sgblack@eecs.umich.edu                    Addr addr;
1505236Sgblack@eecs.umich.edu                    while(doNext(packet.get<uint64_t>(), addr)) {
1515236Sgblack@eecs.umich.edu                        buildPacket(addr);
1525236Sgblack@eecs.umich.edu                        port->sendAtomic(&packet);
1535236Sgblack@eecs.umich.edu                    }
1545236Sgblack@eecs.umich.edu                } else {
1555236Sgblack@eecs.umich.edu                    panic("Unrecognized memory system mode.\n");
1565236Sgblack@eecs.umich.edu                }
1575236Sgblack@eecs.umich.edu            };
1585236Sgblack@eecs.umich.edu
1595236Sgblack@eecs.umich.edu          protected:
1605236Sgblack@eecs.umich.edu            friend class TLB;
1615236Sgblack@eecs.umich.edu
1625236Sgblack@eecs.umich.edu            class WalkerPort : public Port
1635236Sgblack@eecs.umich.edu            {
1645236Sgblack@eecs.umich.edu              public:
1655236Sgblack@eecs.umich.edu                WalkerPort(const std::string &_name, Walker * _walker) :
1665236Sgblack@eecs.umich.edu                      Port(_name, _walker->tlb), walker(_walker),
1675236Sgblack@eecs.umich.edu                      packet(NULL), snoopRangeSent(false), retrying(false)
1685236Sgblack@eecs.umich.edu                {}
1695236Sgblack@eecs.umich.edu
1705236Sgblack@eecs.umich.edu              protected:
1715236Sgblack@eecs.umich.edu                Walker * walker;
1725236Sgblack@eecs.umich.edu
1735236Sgblack@eecs.umich.edu                PacketPtr packet;
1745236Sgblack@eecs.umich.edu                vector<PacketPtr> writes;
1755236Sgblack@eecs.umich.edu
1765236Sgblack@eecs.umich.edu                bool snoopRangeSent;
1775236Sgblack@eecs.umich.edu                bool retrying;
1785236Sgblack@eecs.umich.edu
1795236Sgblack@eecs.umich.edu                bool recvTiming(PacketPtr pkt);
1805236Sgblack@eecs.umich.edu                Tick recvAtomic(PacketPtr pkt);
1815236Sgblack@eecs.umich.edu                void recvFunctional(PacketPtr pkt);
1825236Sgblack@eecs.umich.edu                void recvStatusChange(Status status);
1835236Sgblack@eecs.umich.edu                void recvRetry();
1845236Sgblack@eecs.umich.edu                void getDeviceAddressRanges(AddrRangeList &resp,
1855236Sgblack@eecs.umich.edu                        bool &snoop)
1865236Sgblack@eecs.umich.edu                {
1875236Sgblack@eecs.umich.edu                    resp.clear();
1885236Sgblack@eecs.umich.edu                    snoop = true;
1895236Sgblack@eecs.umich.edu                }
1905236Sgblack@eecs.umich.edu
1915236Sgblack@eecs.umich.edu              public:
1925236Sgblack@eecs.umich.edu                bool sendTiming(PacketPtr pkt)
1935236Sgblack@eecs.umich.edu                {
1945236Sgblack@eecs.umich.edu                    retrying = !Port::sendTiming(pkt);
1955236Sgblack@eecs.umich.edu                    return !retrying;
1965236Sgblack@eecs.umich.edu                }
1975236Sgblack@eecs.umich.edu
1985236Sgblack@eecs.umich.edu                bool blocked() { return retrying; }
1995236Sgblack@eecs.umich.edu            };
2005236Sgblack@eecs.umich.edu
2015236Sgblack@eecs.umich.edu            friend class WalkerPort;
2025236Sgblack@eecs.umich.edu
2035236Sgblack@eecs.umich.edu            WalkerPort port;
2045236Sgblack@eecs.umich.edu
2055236Sgblack@eecs.umich.edu            Packet packet;
2065236Sgblack@eecs.umich.edu            Request request;
2075236Sgblack@eecs.umich.edu
2085236Sgblack@eecs.umich.edu            TLB * tlb;
2095236Sgblack@eecs.umich.edu
2105236Sgblack@eecs.umich.edu            State state;
2115236Sgblack@eecs.umich.edu            State nextState;
2125236Sgblack@eecs.umich.edu            int size;
2135236Sgblack@eecs.umich.edu
2145236Sgblack@eecs.umich.edu            Addr vaddr;
2155236Sgblack@eecs.umich.edu
2165236Sgblack@eecs.umich.edu          public:
2175236Sgblack@eecs.umich.edu            Walker(const std::string &_name, TLB * _tlb) :
2185236Sgblack@eecs.umich.edu                port(_name + "-walker_port", this),
2195236Sgblack@eecs.umich.edu                packet(&request, ReadExReq, Broadcast),
2205236Sgblack@eecs.umich.edu                tlb(_tlb), state(Ready), nextState(Ready)
2215236Sgblack@eecs.umich.edu            {
2225236Sgblack@eecs.umich.edu            }
2235236Sgblack@eecs.umich.edu
2245236Sgblack@eecs.umich.edu
2255236Sgblack@eecs.umich.edu        };
2265236Sgblack@eecs.umich.edu
2275236Sgblack@eecs.umich.edu        Walker walker;
2285236Sgblack@eecs.umich.edu#endif
2295236Sgblack@eecs.umich.edu
2305124Sgblack@eecs.umich.edu      protected:
2315124Sgblack@eecs.umich.edu        int size;
2325124Sgblack@eecs.umich.edu
2335124Sgblack@eecs.umich.edu        TlbEntry * tlb;
2345124Sgblack@eecs.umich.edu
2355124Sgblack@eecs.umich.edu        typedef std::list<TlbEntry *> EntryList;
2365124Sgblack@eecs.umich.edu        EntryList freeList;
2375124Sgblack@eecs.umich.edu        EntryList entryList;
2385124Sgblack@eecs.umich.edu
2395236Sgblack@eecs.umich.edu        Port *getPort(const std::string &if_name, int idx = -1);
2405236Sgblack@eecs.umich.edu
2415124Sgblack@eecs.umich.edu        void insert(Addr vpn, TlbEntry &entry);
2425124Sgblack@eecs.umich.edu
2435124Sgblack@eecs.umich.edu        void invalidateAll();
2445124Sgblack@eecs.umich.edu
2455124Sgblack@eecs.umich.edu        void invalidateNonGlobal();
2465124Sgblack@eecs.umich.edu
2475124Sgblack@eecs.umich.edu        void demapPage(Addr va);
2485124Sgblack@eecs.umich.edu
2495140Sgblack@eecs.umich.edu        template<class TlbFault>
2505140Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc,
2515140Sgblack@eecs.umich.edu                bool write, bool execute);
2525140Sgblack@eecs.umich.edu
2535124Sgblack@eecs.umich.edu      public:
2545124Sgblack@eecs.umich.edu        // Checkpointing
2555124Sgblack@eecs.umich.edu        virtual void serialize(std::ostream &os);
2565124Sgblack@eecs.umich.edu        virtual void unserialize(Checkpoint *cp, const std::string &section);
2575086Sgblack@eecs.umich.edu    };
2585086Sgblack@eecs.umich.edu
2595124Sgblack@eecs.umich.edu    class ITB : public TLB
2605124Sgblack@eecs.umich.edu    {
2615124Sgblack@eecs.umich.edu      public:
2625124Sgblack@eecs.umich.edu        typedef X86ITBParams Params;
2635124Sgblack@eecs.umich.edu        ITB(const Params *p) : TLB(p)
2645124Sgblack@eecs.umich.edu        {
2655124Sgblack@eecs.umich.edu        }
2665086Sgblack@eecs.umich.edu
2675124Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc);
2685086Sgblack@eecs.umich.edu
2695124Sgblack@eecs.umich.edu        friend class DTB;
2705124Sgblack@eecs.umich.edu    };
2715086Sgblack@eecs.umich.edu
2725124Sgblack@eecs.umich.edu    class DTB : public TLB
2735086Sgblack@eecs.umich.edu    {
2745124Sgblack@eecs.umich.edu      public:
2755124Sgblack@eecs.umich.edu        typedef X86DTBParams Params;
2765124Sgblack@eecs.umich.edu        DTB(const Params *p) : TLB(p)
2775124Sgblack@eecs.umich.edu        {
2785124Sgblack@eecs.umich.edu        }
2795124Sgblack@eecs.umich.edu        Fault translate(RequestPtr &req, ThreadContext *tc, bool write);
2805086Sgblack@eecs.umich.edu#if FULL_SYSTEM
2815124Sgblack@eecs.umich.edu        Tick doMmuRegRead(ThreadContext *tc, Packet *pkt);
2825124Sgblack@eecs.umich.edu        Tick doMmuRegWrite(ThreadContext *tc, Packet *pkt);
2835086Sgblack@eecs.umich.edu#endif
2845086Sgblack@eecs.umich.edu
2855124Sgblack@eecs.umich.edu        // Checkpointing
2865124Sgblack@eecs.umich.edu        virtual void serialize(std::ostream &os);
2875124Sgblack@eecs.umich.edu        virtual void unserialize(Checkpoint *cp, const std::string &section);
2885124Sgblack@eecs.umich.edu    };
2895086Sgblack@eecs.umich.edu}
2905086Sgblack@eecs.umich.edu
2914120Sgblack@eecs.umich.edu#endif // __ARCH_X86_TLB_HH__
292