table_walker.hh revision 7728
17404SAli.Saidi@ARM.com/*
27404SAli.Saidi@ARM.com * Copyright (c) 2010 ARM Limited
37404SAli.Saidi@ARM.com * All rights reserved
47404SAli.Saidi@ARM.com *
57404SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall
67404SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual
77404SAli.Saidi@ARM.com * property including but not limited to intellectual property relating
87404SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software
97404SAli.Saidi@ARM.com * licensed hereunder.  You may use the software subject to the license
107404SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated
117404SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software,
127404SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form.
137404SAli.Saidi@ARM.com *
147404SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without
157404SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are
167404SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright
177404SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer;
187404SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright
197404SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the
207404SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution;
217404SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its
227404SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from
237404SAli.Saidi@ARM.com * this software without specific prior written permission.
247404SAli.Saidi@ARM.com *
257404SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267404SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277404SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287404SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297404SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307404SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317404SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327404SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337404SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347404SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357404SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367404SAli.Saidi@ARM.com *
377404SAli.Saidi@ARM.com * Authors: Ali Saidi
387404SAli.Saidi@ARM.com */
397404SAli.Saidi@ARM.com
407404SAli.Saidi@ARM.com#ifndef __ARCH_ARM_TABLE_WALKER_HH__
417404SAli.Saidi@ARM.com#define __ARCH_ARM_TABLE_WALKER_HH__
427404SAli.Saidi@ARM.com
437578Sdam.sunwoo@arm.com#include <list>
447578Sdam.sunwoo@arm.com
457404SAli.Saidi@ARM.com#include "arch/arm/miscregs.hh"
467404SAli.Saidi@ARM.com#include "arch/arm/tlb.hh"
477404SAli.Saidi@ARM.com#include "mem/mem_object.hh"
487404SAli.Saidi@ARM.com#include "mem/request.hh"
497404SAli.Saidi@ARM.com#include "mem/request.hh"
507404SAli.Saidi@ARM.com#include "params/ArmTableWalker.hh"
517404SAli.Saidi@ARM.com#include "sim/eventq.hh"
527678Sgblack@eecs.umich.edu#include "sim/fault.hh"
537404SAli.Saidi@ARM.com
547404SAli.Saidi@ARM.comclass DmaPort;
557404SAli.Saidi@ARM.comclass ThreadContext;
567404SAli.Saidi@ARM.com
577404SAli.Saidi@ARM.comnamespace ArmISA {
587404SAli.Saidi@ARM.comclass Translation;
597404SAli.Saidi@ARM.comclass TLB;
607404SAli.Saidi@ARM.com
617404SAli.Saidi@ARM.comclass TableWalker : public MemObject
627404SAli.Saidi@ARM.com{
637694SAli.Saidi@ARM.com  public:
647404SAli.Saidi@ARM.com    struct L1Descriptor {
657404SAli.Saidi@ARM.com        /** Type of page table entry ARM DDI 0406B: B3-8*/
667404SAli.Saidi@ARM.com        enum EntryType {
677404SAli.Saidi@ARM.com            Ignore,
687404SAli.Saidi@ARM.com            PageTable,
697404SAli.Saidi@ARM.com            Section,
707404SAli.Saidi@ARM.com            Reserved
717404SAli.Saidi@ARM.com        };
727404SAli.Saidi@ARM.com
737436Sdam.sunwoo@arm.com        /** The raw bits of the entry */
747404SAli.Saidi@ARM.com        uint32_t data;
757404SAli.Saidi@ARM.com
767436Sdam.sunwoo@arm.com        /** This entry has been modified (access flag set) and needs to be
777436Sdam.sunwoo@arm.com         * written back to memory */
787436Sdam.sunwoo@arm.com        bool _dirty;
797436Sdam.sunwoo@arm.com
807404SAli.Saidi@ARM.com        EntryType type() const
817404SAli.Saidi@ARM.com        {
827404SAli.Saidi@ARM.com            return (EntryType)(data & 0x3);
837404SAli.Saidi@ARM.com        }
847404SAli.Saidi@ARM.com
857404SAli.Saidi@ARM.com        /** Is the page a Supersection (16MB)?*/
867404SAli.Saidi@ARM.com        bool supersection() const
877404SAli.Saidi@ARM.com        {
887404SAli.Saidi@ARM.com            return bits(data, 18);
897404SAli.Saidi@ARM.com        }
907404SAli.Saidi@ARM.com
917404SAli.Saidi@ARM.com        /** Return the physcal address of the entry, bits in position*/
927404SAli.Saidi@ARM.com        Addr paddr() const
937404SAli.Saidi@ARM.com        {
947404SAli.Saidi@ARM.com            if (supersection())
957404SAli.Saidi@ARM.com                panic("Super sections not implemented\n");
967404SAli.Saidi@ARM.com            return mbits(data, 31,20);
977404SAli.Saidi@ARM.com        }
987694SAli.Saidi@ARM.com        /** Return the physcal address of the entry, bits in position*/
997694SAli.Saidi@ARM.com        Addr paddr(Addr va) const
1007694SAli.Saidi@ARM.com        {
1017694SAli.Saidi@ARM.com            if (supersection())
1027694SAli.Saidi@ARM.com                panic("Super sections not implemented\n");
1037694SAli.Saidi@ARM.com            return mbits(data, 31,20) | mbits(va, 20, 0);
1047694SAli.Saidi@ARM.com        }
1057694SAli.Saidi@ARM.com
1067404SAli.Saidi@ARM.com
1077404SAli.Saidi@ARM.com        /** Return the physical frame, bits shifted right */
1087404SAli.Saidi@ARM.com        Addr pfn() const
1097404SAli.Saidi@ARM.com        {
1107404SAli.Saidi@ARM.com            if (supersection())
1117404SAli.Saidi@ARM.com                panic("Super sections not implemented\n");
1127404SAli.Saidi@ARM.com            return bits(data, 31,20);
1137404SAli.Saidi@ARM.com        }
1147404SAli.Saidi@ARM.com
1157404SAli.Saidi@ARM.com        /** Is the translation global (no asid used)? */
1167404SAli.Saidi@ARM.com        bool global() const
1177404SAli.Saidi@ARM.com        {
1187608SGene.Wu@arm.com            return bits(data, 17);
1197404SAli.Saidi@ARM.com        }
1207404SAli.Saidi@ARM.com
1217404SAli.Saidi@ARM.com        /** Is the translation not allow execution? */
1227404SAli.Saidi@ARM.com        bool xn() const
1237404SAli.Saidi@ARM.com        {
1247608SGene.Wu@arm.com            return bits(data, 4);
1257404SAli.Saidi@ARM.com        }
1267404SAli.Saidi@ARM.com
1277404SAli.Saidi@ARM.com        /** Three bit access protection flags */
1287404SAli.Saidi@ARM.com        uint8_t ap() const
1297404SAli.Saidi@ARM.com        {
1307404SAli.Saidi@ARM.com            return (bits(data, 15) << 2) | bits(data,11,10);
1317404SAli.Saidi@ARM.com        }
1327404SAli.Saidi@ARM.com
1337404SAli.Saidi@ARM.com        /** Domain Client/Manager: ARM DDI 0406B: B3-31 */
1347404SAli.Saidi@ARM.com        uint8_t domain() const
1357404SAli.Saidi@ARM.com        {
1367404SAli.Saidi@ARM.com            return bits(data,8,5);
1377404SAli.Saidi@ARM.com        }
1387404SAli.Saidi@ARM.com
1397404SAli.Saidi@ARM.com        /** Address of L2 descriptor if it exists */
1407404SAli.Saidi@ARM.com        Addr l2Addr() const
1417404SAli.Saidi@ARM.com        {
1427404SAli.Saidi@ARM.com            return mbits(data, 31,10);
1437404SAli.Saidi@ARM.com        }
1447404SAli.Saidi@ARM.com
1457436Sdam.sunwoo@arm.com        /** Memory region attributes: ARM DDI 0406B: B3-32.
1467436Sdam.sunwoo@arm.com         * These bits are largly ignored by M5 and only used to
1477436Sdam.sunwoo@arm.com         * provide the illusion that the memory system cares about
1487436Sdam.sunwoo@arm.com         * anything but cachable vs. uncachable.
1497436Sdam.sunwoo@arm.com         */
1507404SAli.Saidi@ARM.com        uint8_t texcb() const
1517404SAli.Saidi@ARM.com        {
1527406SAli.Saidi@ARM.com            return bits(data, 2) | bits(data,3) << 1 | bits(data, 14, 12) << 2;
1537404SAli.Saidi@ARM.com        }
1547404SAli.Saidi@ARM.com
1557436Sdam.sunwoo@arm.com        /** If the section is shareable. See texcb() comment. */
1567436Sdam.sunwoo@arm.com        bool shareable() const
1577436Sdam.sunwoo@arm.com        {
1587436Sdam.sunwoo@arm.com            return bits(data, 16);
1597436Sdam.sunwoo@arm.com        }
1607436Sdam.sunwoo@arm.com
1617436Sdam.sunwoo@arm.com        /** Set access flag that this entry has been touched. Mark
1627436Sdam.sunwoo@arm.com         * the entry as requiring a writeback, in the future.
1637436Sdam.sunwoo@arm.com         */
1647436Sdam.sunwoo@arm.com        void setAp0()
1657436Sdam.sunwoo@arm.com        {
1667436Sdam.sunwoo@arm.com            data |= 1 << 10;
1677436Sdam.sunwoo@arm.com            _dirty = true;
1687436Sdam.sunwoo@arm.com        }
1697436Sdam.sunwoo@arm.com
1707436Sdam.sunwoo@arm.com        /** This entry needs to be written back to memory */
1717436Sdam.sunwoo@arm.com        bool dirty() const
1727436Sdam.sunwoo@arm.com        {
1737436Sdam.sunwoo@arm.com            return _dirty;
1747436Sdam.sunwoo@arm.com        }
1757404SAli.Saidi@ARM.com    };
1767404SAli.Saidi@ARM.com
1777404SAli.Saidi@ARM.com    /** Level 2 page table descriptor */
1787404SAli.Saidi@ARM.com    struct L2Descriptor {
1797404SAli.Saidi@ARM.com
1807436Sdam.sunwoo@arm.com        /** The raw bits of the entry. */
1817404SAli.Saidi@ARM.com        uint32_t data;
1827404SAli.Saidi@ARM.com
1837436Sdam.sunwoo@arm.com        /** This entry has been modified (access flag set) and needs to be
1847436Sdam.sunwoo@arm.com         * written back to memory */
1857436Sdam.sunwoo@arm.com        bool _dirty;
1867436Sdam.sunwoo@arm.com
1877404SAli.Saidi@ARM.com        /** Is the entry invalid */
1887404SAli.Saidi@ARM.com        bool invalid() const
1897404SAli.Saidi@ARM.com        {
1907404SAli.Saidi@ARM.com            return bits(data, 1,0) == 0;;
1917404SAli.Saidi@ARM.com        }
1927404SAli.Saidi@ARM.com
1937404SAli.Saidi@ARM.com        /** What is the size of the mapping? */
1947404SAli.Saidi@ARM.com        bool large() const
1957404SAli.Saidi@ARM.com        {
1967404SAli.Saidi@ARM.com            return bits(data, 1) == 0;
1977404SAli.Saidi@ARM.com        }
1987404SAli.Saidi@ARM.com
1997404SAli.Saidi@ARM.com        /** Is execution allowed on this mapping? */
2007404SAli.Saidi@ARM.com        bool xn() const
2017404SAli.Saidi@ARM.com        {
2027404SAli.Saidi@ARM.com            return large() ? bits(data, 15) : bits(data, 0);
2037404SAli.Saidi@ARM.com        }
2047404SAli.Saidi@ARM.com
2057404SAli.Saidi@ARM.com        /** Is the translation global (no asid used)? */
2067404SAli.Saidi@ARM.com        bool global() const
2077404SAli.Saidi@ARM.com        {
2087404SAli.Saidi@ARM.com            return !bits(data, 11);
2097404SAli.Saidi@ARM.com        }
2107404SAli.Saidi@ARM.com
2117404SAli.Saidi@ARM.com        /** Three bit access protection flags */
2127404SAli.Saidi@ARM.com        uint8_t ap() const
2137404SAli.Saidi@ARM.com        {
2147404SAli.Saidi@ARM.com           return bits(data, 5, 4) | (bits(data, 9) << 2);
2157404SAli.Saidi@ARM.com        }
2167404SAli.Saidi@ARM.com
2177404SAli.Saidi@ARM.com        /** Memory region attributes: ARM DDI 0406B: B3-32 */
2187404SAli.Saidi@ARM.com        uint8_t texcb() const
2197404SAli.Saidi@ARM.com        {
2207404SAli.Saidi@ARM.com            return large() ?
2217406SAli.Saidi@ARM.com                (bits(data, 2) | (bits(data,3) << 1) | (bits(data, 14, 12) << 2)) :
2227406SAli.Saidi@ARM.com                (bits(data, 2) | (bits(data,3) << 1) | (bits(data, 8, 6) << 2));
2237404SAli.Saidi@ARM.com        }
2247404SAli.Saidi@ARM.com
2257404SAli.Saidi@ARM.com        /** Return the physical frame, bits shifted right */
2267404SAli.Saidi@ARM.com        Addr pfn() const
2277404SAli.Saidi@ARM.com        {
2287404SAli.Saidi@ARM.com            return large() ? bits(data, 31, 16) : bits(data, 31, 12);
2297404SAli.Saidi@ARM.com        }
2307404SAli.Saidi@ARM.com
2317694SAli.Saidi@ARM.com        /** Return complete physical address given a VA */
2327694SAli.Saidi@ARM.com        Addr paddr(Addr va) const
2337694SAli.Saidi@ARM.com        {
2347694SAli.Saidi@ARM.com            if (large())
2357694SAli.Saidi@ARM.com                return mbits(data, 31, 16) | mbits(va, 15, 0);
2367694SAli.Saidi@ARM.com            else
2377694SAli.Saidi@ARM.com                return mbits(data, 31, 12) | mbits(va, 11, 0);
2387694SAli.Saidi@ARM.com        }
2397694SAli.Saidi@ARM.com
2407436Sdam.sunwoo@arm.com        /** If the section is shareable. See texcb() comment. */
2417436Sdam.sunwoo@arm.com        bool shareable() const
2427436Sdam.sunwoo@arm.com        {
2437436Sdam.sunwoo@arm.com            return bits(data, 10);
2447436Sdam.sunwoo@arm.com        }
2457436Sdam.sunwoo@arm.com
2467436Sdam.sunwoo@arm.com        /** Set access flag that this entry has been touched. Mark
2477436Sdam.sunwoo@arm.com         * the entry as requiring a writeback, in the future.
2487436Sdam.sunwoo@arm.com         */
2497436Sdam.sunwoo@arm.com        void setAp0()
2507436Sdam.sunwoo@arm.com        {
2517436Sdam.sunwoo@arm.com            data |= 1 << 4;
2527436Sdam.sunwoo@arm.com            _dirty = true;
2537436Sdam.sunwoo@arm.com        }
2547436Sdam.sunwoo@arm.com
2557436Sdam.sunwoo@arm.com        /** This entry needs to be written back to memory */
2567436Sdam.sunwoo@arm.com        bool dirty() const
2577436Sdam.sunwoo@arm.com        {
2587436Sdam.sunwoo@arm.com            return _dirty;
2597436Sdam.sunwoo@arm.com        }
2607436Sdam.sunwoo@arm.com
2617404SAli.Saidi@ARM.com    };
2627404SAli.Saidi@ARM.com
2637439Sdam.sunwoo@arm.com    struct WalkerState //: public SimObject
2647439Sdam.sunwoo@arm.com    {
2657439Sdam.sunwoo@arm.com        /** Thread context that we're doing the walk for */
2667439Sdam.sunwoo@arm.com        ThreadContext *tc;
2677439Sdam.sunwoo@arm.com
2687439Sdam.sunwoo@arm.com        /** Request that is currently being serviced */
2697439Sdam.sunwoo@arm.com        RequestPtr req;
2707439Sdam.sunwoo@arm.com
2717439Sdam.sunwoo@arm.com        /** Context ID that we're servicing the request under */
2727439Sdam.sunwoo@arm.com        uint8_t contextId;
2737439Sdam.sunwoo@arm.com
2747439Sdam.sunwoo@arm.com        /** Translation state for delayed requests */
2757439Sdam.sunwoo@arm.com        TLB::Translation *transState;
2767439Sdam.sunwoo@arm.com
2777439Sdam.sunwoo@arm.com        /** The fault that we are going to return */
2787439Sdam.sunwoo@arm.com        Fault fault;
2797439Sdam.sunwoo@arm.com
2807439Sdam.sunwoo@arm.com        /** The virtual address that is being translated */
2817439Sdam.sunwoo@arm.com        Addr vaddr;
2827439Sdam.sunwoo@arm.com
2837439Sdam.sunwoo@arm.com        /** Cached copy of the sctlr as it existed when translation began */
2847439Sdam.sunwoo@arm.com        SCTLR sctlr;
2857439Sdam.sunwoo@arm.com
2867439Sdam.sunwoo@arm.com        /** Width of the base address held in TTRB0 */
2877439Sdam.sunwoo@arm.com        uint32_t N;
2887439Sdam.sunwoo@arm.com
2897439Sdam.sunwoo@arm.com        /** If the access is a write */
2907439Sdam.sunwoo@arm.com        bool isWrite;
2917439Sdam.sunwoo@arm.com
2927439Sdam.sunwoo@arm.com        /** If the access is a fetch (for execution, and no-exec) must be checked?*/
2937439Sdam.sunwoo@arm.com        bool isFetch;
2947439Sdam.sunwoo@arm.com
2957439Sdam.sunwoo@arm.com        /** If the mode is timing or atomic */
2967439Sdam.sunwoo@arm.com        bool timing;
2977439Sdam.sunwoo@arm.com
2987439Sdam.sunwoo@arm.com        /** Save mode for use in delayed response */
2997439Sdam.sunwoo@arm.com        BaseTLB::Mode mode;
3007439Sdam.sunwoo@arm.com
3017439Sdam.sunwoo@arm.com        L1Descriptor l1Desc;
3027439Sdam.sunwoo@arm.com        L2Descriptor l2Desc;
3037439Sdam.sunwoo@arm.com
3047439Sdam.sunwoo@arm.com        /** Whether L1/L2 descriptor response is delayed in timing mode */
3057439Sdam.sunwoo@arm.com        bool delayed;
3067439Sdam.sunwoo@arm.com
3077439Sdam.sunwoo@arm.com        TableWalker *tableWalker;
3087439Sdam.sunwoo@arm.com
3097439Sdam.sunwoo@arm.com        void doL1Descriptor();
3107439Sdam.sunwoo@arm.com        void doL2Descriptor();
3117439Sdam.sunwoo@arm.com
3127439Sdam.sunwoo@arm.com        std::string name() const {return tableWalker->name();}
3137439Sdam.sunwoo@arm.com    };
3147439Sdam.sunwoo@arm.com
3157439Sdam.sunwoo@arm.com
3167653Sgene.wu@arm.com    /** Queue of requests that need processing first level translation */
3177653Sgene.wu@arm.com    std::list<WalkerState *> stateQueueL1;
3187653Sgene.wu@arm.com
3197653Sgene.wu@arm.com    /** Queue of requests that have passed first level translation and
3207653Sgene.wu@arm.com     * require an additional level. */
3217653Sgene.wu@arm.com    std::list<WalkerState *> stateQueueL2;
3227439Sdam.sunwoo@arm.com
3237728SAli.Saidi@ARM.com    /** Queue of requests that have passed are waiting because the walker is
3247728SAli.Saidi@ARM.com     * currently busy. */
3257728SAli.Saidi@ARM.com    std::list<WalkerState *> pendingQueue;;
3267728SAli.Saidi@ARM.com
3277728SAli.Saidi@ARM.com
3287404SAli.Saidi@ARM.com    /** Port to issue translation requests from */
3297404SAli.Saidi@ARM.com    DmaPort *port;
3307404SAli.Saidi@ARM.com
3317404SAli.Saidi@ARM.com    /** TLB that is initiating these table walks */
3327404SAli.Saidi@ARM.com    TLB *tlb;
3337404SAli.Saidi@ARM.com
3347404SAli.Saidi@ARM.com    /** Cached copy of the sctlr as it existed when translation began */
3357404SAli.Saidi@ARM.com    SCTLR sctlr;
3367404SAli.Saidi@ARM.com
3377439Sdam.sunwoo@arm.com    WalkerState *currState;
3387437Sdam.sunwoo@arm.com
3397728SAli.Saidi@ARM.com    /** If a timing translation is currently in progress */
3407728SAli.Saidi@ARM.com    bool pending;
3417728SAli.Saidi@ARM.com
3427404SAli.Saidi@ARM.com  public:
3437404SAli.Saidi@ARM.com    typedef ArmTableWalkerParams Params;
3447404SAli.Saidi@ARM.com    TableWalker(const Params *p);
3457404SAli.Saidi@ARM.com    virtual ~TableWalker();
3467404SAli.Saidi@ARM.com
3477404SAli.Saidi@ARM.com    const Params *
3487404SAli.Saidi@ARM.com    params() const
3497404SAli.Saidi@ARM.com    {
3507404SAli.Saidi@ARM.com        return dynamic_cast<const Params *>(_params);
3517404SAli.Saidi@ARM.com    }
3527404SAli.Saidi@ARM.com
3537404SAli.Saidi@ARM.com    virtual unsigned int drain(Event *de) { panic("write me\n"); }
3547404SAli.Saidi@ARM.com    virtual Port *getPort(const std::string &if_name, int idx = -1);
3557404SAli.Saidi@ARM.com
3567404SAli.Saidi@ARM.com    Fault walk(RequestPtr req, ThreadContext *tc, uint8_t cid, TLB::Mode mode,
3577404SAli.Saidi@ARM.com            TLB::Translation *_trans, bool timing);
3587404SAli.Saidi@ARM.com
3597404SAli.Saidi@ARM.com    void setTlb(TLB *_tlb) { tlb = _tlb; }
3607439Sdam.sunwoo@arm.com    void memAttrs(ThreadContext *tc, TlbEntry &te, SCTLR sctlr,
3617439Sdam.sunwoo@arm.com                  uint8_t texcb, bool s);
3627404SAli.Saidi@ARM.com
3637404SAli.Saidi@ARM.com  private:
3647404SAli.Saidi@ARM.com
3657404SAli.Saidi@ARM.com    void doL1Descriptor();
3667437Sdam.sunwoo@arm.com    void doL1DescriptorWrapper();
3677437Sdam.sunwoo@arm.com    EventWrapper<TableWalker, &TableWalker::doL1DescriptorWrapper> doL1DescEvent;
3687404SAli.Saidi@ARM.com
3697404SAli.Saidi@ARM.com    void doL2Descriptor();
3707437Sdam.sunwoo@arm.com    void doL2DescriptorWrapper();
3717437Sdam.sunwoo@arm.com    EventWrapper<TableWalker, &TableWalker::doL2DescriptorWrapper> doL2DescEvent;
3727404SAli.Saidi@ARM.com
3737728SAli.Saidi@ARM.com    Fault processWalk();
3747728SAli.Saidi@ARM.com    void processWalkWrapper();
3757728SAli.Saidi@ARM.com    EventWrapper<TableWalker, &TableWalker::processWalkWrapper> doProcessEvent;
3767404SAli.Saidi@ARM.com
3777728SAli.Saidi@ARM.com    void nextWalk(ThreadContext *tc);
3787404SAli.Saidi@ARM.com};
3797404SAli.Saidi@ARM.com
3807404SAli.Saidi@ARM.com
3817404SAli.Saidi@ARM.com} // namespace ArmISA
3827404SAli.Saidi@ARM.com
3837404SAli.Saidi@ARM.com#endif //__ARCH_ARM_TABLE_WALKER_HH__
3847404SAli.Saidi@ARM.com
385