pagetable_walker.hh revision 6216
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 *
55245Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms,
65245Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the
75245Sgblack@eecs.umich.edu * following conditions are met:
85245Sgblack@eecs.umich.edu *
95245Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any
105245Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary
115245Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use.  Illustrative
125245Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study,
135245Sgblack@eecs.umich.edu * teaching, education and corporate research & development.
145245Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for
155245Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for
165245Sgblack@eecs.umich.edu * commercial advantage.
175245Sgblack@eecs.umich.edu *
185245Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be
195245Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact:
205245Sgblack@eecs.umich.edu *     Director of Intellectual Property Licensing
215245Sgblack@eecs.umich.edu *     Office of Strategy and Technology
225245Sgblack@eecs.umich.edu *     Hewlett-Packard Company
235245Sgblack@eecs.umich.edu *     1501 Page Mill Road
245245Sgblack@eecs.umich.edu *     Palo Alto, California  94304
255245Sgblack@eecs.umich.edu *
265245Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice,
275245Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer.  Redistributions
285245Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of
295245Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or
305245Sgblack@eecs.umich.edu * other materials provided with the distribution.  Neither the name of
315245Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
325245Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
335245Sgblack@eecs.umich.edu * this software without specific prior written permission.  No right of
345245Sgblack@eecs.umich.edu * sublicense is granted herewith.  Derivatives of the software and
355245Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for
365245Sgblack@eecs.umich.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
375245Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of
385245Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions;
395245Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright
405245Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where
415245Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below.
425245Sgblack@eecs.umich.edu *
435245Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
445245Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
455245Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
465245Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
475245Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
485245Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
495245Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
505245Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
515245Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
525245Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
535245Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
545245Sgblack@eecs.umich.edu *
555245Sgblack@eecs.umich.edu * Authors: Gabe Black
565245Sgblack@eecs.umich.edu */
575245Sgblack@eecs.umich.edu
585245Sgblack@eecs.umich.edu#ifndef __ARCH_X86_PAGE_TABLE_WALKER_HH__
595245Sgblack@eecs.umich.edu#define __ARCH_X86_PAGE_TABLE_WALKER_HH__
605245Sgblack@eecs.umich.edu
615245Sgblack@eecs.umich.edu#include <vector>
625245Sgblack@eecs.umich.edu
635245Sgblack@eecs.umich.edu#include "arch/x86/pagetable.hh"
645245Sgblack@eecs.umich.edu#include "arch/x86/tlb.hh"
656216Snate@binkert.org#include "base/types.hh"
665245Sgblack@eecs.umich.edu#include "mem/mem_object.hh"
675245Sgblack@eecs.umich.edu#include "mem/packet.hh"
685245Sgblack@eecs.umich.edu#include "params/X86PagetableWalker.hh"
695245Sgblack@eecs.umich.edu
705245Sgblack@eecs.umich.educlass ThreadContext;
715245Sgblack@eecs.umich.edu
725245Sgblack@eecs.umich.edunamespace X86ISA
735245Sgblack@eecs.umich.edu{
745245Sgblack@eecs.umich.edu    class Walker : public MemObject
755245Sgblack@eecs.umich.edu    {
765245Sgblack@eecs.umich.edu      public:
775245Sgblack@eecs.umich.edu        enum State {
785245Sgblack@eecs.umich.edu            Ready,
795245Sgblack@eecs.umich.edu            Waiting,
805245Sgblack@eecs.umich.edu            // Long mode
815245Sgblack@eecs.umich.edu            LongPML4, LongPDP, LongPD, LongPTE,
825245Sgblack@eecs.umich.edu            // PAE legacy mode
835245Sgblack@eecs.umich.edu            PAEPDP, PAEPD, PAEPTE,
845245Sgblack@eecs.umich.edu            // Non PAE legacy mode with and without PSE
855245Sgblack@eecs.umich.edu            PSEPD, PD, PTE
865245Sgblack@eecs.umich.edu        };
875245Sgblack@eecs.umich.edu
885897Sgblack@eecs.umich.edu        // Act on the current state and determine what to do next. The global
895897Sgblack@eecs.umich.edu        // read should be the packet that just came back from a read and write
905245Sgblack@eecs.umich.edu        // should be NULL. When the function returns, read is either NULL
915245Sgblack@eecs.umich.edu        // if the machine is finished, or points to a packet to initiate
925245Sgblack@eecs.umich.edu        // the next read. If any write is required to update an "accessed"
935245Sgblack@eecs.umich.edu        // bit, write will point to a packet to do the write. Otherwise it
945895Sgblack@eecs.umich.edu        // will be NULL. The return value is whatever fault was incurred
955895Sgblack@eecs.umich.edu        // during this stage of the lookup.
965897Sgblack@eecs.umich.edu        Fault doNext(PacketPtr &write);
975245Sgblack@eecs.umich.edu
985245Sgblack@eecs.umich.edu        // Kick off the state machine.
995895Sgblack@eecs.umich.edu        Fault start(ThreadContext * _tc, BaseTLB::Translation *translation,
1006023Snate@binkert.org                RequestPtr req, BaseTLB::Mode mode);
1015895Sgblack@eecs.umich.edu        // Clean up after the state machine.
1025895Sgblack@eecs.umich.edu        void
1035895Sgblack@eecs.umich.edu        stop()
1045895Sgblack@eecs.umich.edu        {
1055895Sgblack@eecs.umich.edu            nextState = Ready;
1065895Sgblack@eecs.umich.edu            delete read->req;
1075895Sgblack@eecs.umich.edu            delete read;
1085895Sgblack@eecs.umich.edu            read = NULL;
1095895Sgblack@eecs.umich.edu        }
1105245Sgblack@eecs.umich.edu
1115245Sgblack@eecs.umich.edu      protected:
1125245Sgblack@eecs.umich.edu
1135245Sgblack@eecs.umich.edu        /*
1145245Sgblack@eecs.umich.edu         * State having to do with sending packets.
1155245Sgblack@eecs.umich.edu         */
1165245Sgblack@eecs.umich.edu        PacketPtr read;
1175245Sgblack@eecs.umich.edu        std::vector<PacketPtr> writes;
1185245Sgblack@eecs.umich.edu
1195245Sgblack@eecs.umich.edu        // How many memory operations are in flight.
1205245Sgblack@eecs.umich.edu        unsigned inflight;
1215245Sgblack@eecs.umich.edu
1225245Sgblack@eecs.umich.edu        bool retrying;
1235245Sgblack@eecs.umich.edu
1245245Sgblack@eecs.umich.edu        /*
1255895Sgblack@eecs.umich.edu         * The fault, if any, that's waiting to be delivered in timing mode.
1265895Sgblack@eecs.umich.edu         */
1275895Sgblack@eecs.umich.edu        Fault timingFault;
1285895Sgblack@eecs.umich.edu
1295895Sgblack@eecs.umich.edu        /*
1305245Sgblack@eecs.umich.edu         * Functions for dealing with packets.
1315245Sgblack@eecs.umich.edu         */
1325245Sgblack@eecs.umich.edu        bool recvTiming(PacketPtr pkt);
1335245Sgblack@eecs.umich.edu        void recvRetry();
1345245Sgblack@eecs.umich.edu
1355245Sgblack@eecs.umich.edu        void sendPackets();
1365245Sgblack@eecs.umich.edu
1375245Sgblack@eecs.umich.edu        /*
1385245Sgblack@eecs.umich.edu         * Port for accessing memory
1395245Sgblack@eecs.umich.edu         */
1405245Sgblack@eecs.umich.edu        class WalkerPort : public Port
1415245Sgblack@eecs.umich.edu        {
1425245Sgblack@eecs.umich.edu          public:
1435245Sgblack@eecs.umich.edu            WalkerPort(const std::string &_name, Walker * _walker) :
1445245Sgblack@eecs.umich.edu                  Port(_name, _walker), walker(_walker),
1455245Sgblack@eecs.umich.edu                  snoopRangeSent(false)
1465245Sgblack@eecs.umich.edu            {}
1475245Sgblack@eecs.umich.edu
1485245Sgblack@eecs.umich.edu          protected:
1495245Sgblack@eecs.umich.edu            Walker * walker;
1505245Sgblack@eecs.umich.edu
1515245Sgblack@eecs.umich.edu            bool snoopRangeSent;
1525245Sgblack@eecs.umich.edu
1535245Sgblack@eecs.umich.edu            bool recvTiming(PacketPtr pkt);
1545245Sgblack@eecs.umich.edu            Tick recvAtomic(PacketPtr pkt);
1555245Sgblack@eecs.umich.edu            void recvFunctional(PacketPtr pkt);
1565245Sgblack@eecs.umich.edu            void recvStatusChange(Status status);
1575245Sgblack@eecs.umich.edu            void recvRetry();
1585245Sgblack@eecs.umich.edu            void getDeviceAddressRanges(AddrRangeList &resp,
1595245Sgblack@eecs.umich.edu                    bool &snoop)
1605245Sgblack@eecs.umich.edu            {
1615245Sgblack@eecs.umich.edu                resp.clear();
1625245Sgblack@eecs.umich.edu                snoop = true;
1635245Sgblack@eecs.umich.edu            }
1645245Sgblack@eecs.umich.edu        };
1655245Sgblack@eecs.umich.edu
1665245Sgblack@eecs.umich.edu        Port *getPort(const std::string &if_name, int idx = -1);
1675245Sgblack@eecs.umich.edu
1685245Sgblack@eecs.umich.edu        friend class WalkerPort;
1695245Sgblack@eecs.umich.edu
1705245Sgblack@eecs.umich.edu        WalkerPort port;
1715245Sgblack@eecs.umich.edu
1725245Sgblack@eecs.umich.edu        // The TLB we're supposed to load.
1735245Sgblack@eecs.umich.edu        TLB * tlb;
1745245Sgblack@eecs.umich.edu        System * sys;
1755895Sgblack@eecs.umich.edu        BaseTLB::Translation * translation;
1765245Sgblack@eecs.umich.edu
1775245Sgblack@eecs.umich.edu        /*
1785245Sgblack@eecs.umich.edu         * State machine state.
1795245Sgblack@eecs.umich.edu         */
1805245Sgblack@eecs.umich.edu        ThreadContext * tc;
1815895Sgblack@eecs.umich.edu        RequestPtr req;
1825245Sgblack@eecs.umich.edu        State state;
1835245Sgblack@eecs.umich.edu        State nextState;
1845245Sgblack@eecs.umich.edu        int size;
1855245Sgblack@eecs.umich.edu        bool enableNX;
1866023Snate@binkert.org        BaseTLB::Mode mode;
1876023Snate@binkert.org        bool user;
1885245Sgblack@eecs.umich.edu        TlbEntry entry;
1895881Sgblack@eecs.umich.edu
1905881Sgblack@eecs.umich.edu        Fault pageFault(bool present);
1915245Sgblack@eecs.umich.edu
1925245Sgblack@eecs.umich.edu      public:
1935245Sgblack@eecs.umich.edu
1945245Sgblack@eecs.umich.edu        void setTLB(TLB * _tlb)
1955245Sgblack@eecs.umich.edu        {
1965245Sgblack@eecs.umich.edu            tlb = _tlb;
1975245Sgblack@eecs.umich.edu        }
1985245Sgblack@eecs.umich.edu
1995245Sgblack@eecs.umich.edu        typedef X86PagetableWalkerParams Params;
2005245Sgblack@eecs.umich.edu
2015245Sgblack@eecs.umich.edu        Walker(const Params *params) :
2025245Sgblack@eecs.umich.edu            MemObject(params),
2035245Sgblack@eecs.umich.edu            read(NULL), inflight(0), retrying(false),
2045245Sgblack@eecs.umich.edu            port(name() + ".port", this),
2055245Sgblack@eecs.umich.edu            tlb(NULL), sys(params->system),
2065245Sgblack@eecs.umich.edu            tc(NULL), state(Ready), nextState(Ready)
2075245Sgblack@eecs.umich.edu        {
2085245Sgblack@eecs.umich.edu        }
2095245Sgblack@eecs.umich.edu    };
2105245Sgblack@eecs.umich.edu}
2115245Sgblack@eecs.umich.edu#endif // __ARCH_X86_PAGE_TABLE_WALKER_HH__
212