tlb.hh revision 13892
110751SAndreas.Sandberg@ARM.com/*
210751SAndreas.Sandberg@ARM.com * Copyright (c) 2011 ARM Limited
310751SAndreas.Sandberg@ARM.com * All rights reserved.
410751SAndreas.Sandberg@ARM.com *
510751SAndreas.Sandberg@ARM.com * The license below extends only to copyright in the software and shall
610751SAndreas.Sandberg@ARM.com * not be construed as granting a license to any other intellectual
710751SAndreas.Sandberg@ARM.com * property including but not limited to intellectual property relating
810751SAndreas.Sandberg@ARM.com * to a hardware implementation of the functionality of the software
910751SAndreas.Sandberg@ARM.com * licensed hereunder.  You may use the software subject to the license
1010751SAndreas.Sandberg@ARM.com * terms below provided that you ensure that this notice is replicated
1110751SAndreas.Sandberg@ARM.com * unmodified and in its entirety in all distributions of the software,
1210751SAndreas.Sandberg@ARM.com * modified or unmodified, in source code or in binary form.
1310751SAndreas.Sandberg@ARM.com *
1410751SAndreas.Sandberg@ARM.com * Copyright (c) 2006 The Regents of The University of Michigan
1510751SAndreas.Sandberg@ARM.com * All rights reserved.
1610751SAndreas.Sandberg@ARM.com *
1710751SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without
1810751SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are
1910751SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright
2010751SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer;
2110751SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright
2210751SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the
2310751SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution;
2410751SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its
2510751SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from
2610751SAndreas.Sandberg@ARM.com * this software without specific prior written permission.
2710751SAndreas.Sandberg@ARM.com *
2810751SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2910751SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3010751SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3110751SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3210751SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3310751SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3410751SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3510751SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3610751SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3710751SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3810751SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3910751SAndreas.Sandberg@ARM.com *
4010751SAndreas.Sandberg@ARM.com * Authors: Gabe Black
4110751SAndreas.Sandberg@ARM.com */
4210751SAndreas.Sandberg@ARM.com
4310751SAndreas.Sandberg@ARM.com#ifndef __ARCH_GENERIC_TLB_HH__
4410751SAndreas.Sandberg@ARM.com#define __ARCH_GENERIC_TLB_HH__
4510751SAndreas.Sandberg@ARM.com
4610751SAndreas.Sandberg@ARM.com#include "base/logging.hh"
4710751SAndreas.Sandberg@ARM.com#include "mem/request.hh"
4810751SAndreas.Sandberg@ARM.com#include "sim/sim_object.hh"
4910751SAndreas.Sandberg@ARM.com
5010751SAndreas.Sandberg@ARM.comclass ThreadContext;
5110751SAndreas.Sandberg@ARM.comclass BaseMasterPort;
5210751SAndreas.Sandberg@ARM.com
5310751SAndreas.Sandberg@ARM.comclass BaseTLB : public SimObject
5410751SAndreas.Sandberg@ARM.com{
5510751SAndreas.Sandberg@ARM.com  protected:
5610751SAndreas.Sandberg@ARM.com    BaseTLB(const Params *p) : SimObject(p) {}
5710751SAndreas.Sandberg@ARM.com
5810751SAndreas.Sandberg@ARM.com  public:
5910751SAndreas.Sandberg@ARM.com
6010751SAndreas.Sandberg@ARM.com    enum Mode { Read, Write, Execute };
6110751SAndreas.Sandberg@ARM.com
6210751SAndreas.Sandberg@ARM.com    class Translation
6310751SAndreas.Sandberg@ARM.com    {
6410751SAndreas.Sandberg@ARM.com      public:
6510751SAndreas.Sandberg@ARM.com        virtual ~Translation()
6610751SAndreas.Sandberg@ARM.com        {}
6710751SAndreas.Sandberg@ARM.com
6810751SAndreas.Sandberg@ARM.com        /**
6910751SAndreas.Sandberg@ARM.com         * Signal that the translation has been delayed due to a hw page table
7010751SAndreas.Sandberg@ARM.com         * walk.
7110751SAndreas.Sandberg@ARM.com         */
7210751SAndreas.Sandberg@ARM.com        virtual void markDelayed() = 0;
7310751SAndreas.Sandberg@ARM.com
7410751SAndreas.Sandberg@ARM.com        /*
7510751SAndreas.Sandberg@ARM.com         * The memory for this object may be dynamically allocated, and it may
7610751SAndreas.Sandberg@ARM.com         * be responsible for cleaning itself up which will happen in this
7710751SAndreas.Sandberg@ARM.com         * function. Once it's called, the object is no longer valid.
7810751SAndreas.Sandberg@ARM.com         */
7910751SAndreas.Sandberg@ARM.com        virtual void finish(const Fault &fault, const RequestPtr &req,
8010751SAndreas.Sandberg@ARM.com                            ThreadContext *tc, Mode mode) = 0;
8110751SAndreas.Sandberg@ARM.com
8210751SAndreas.Sandberg@ARM.com        /** This function is used by the page table walker to determine if it
8310751SAndreas.Sandberg@ARM.com         * should translate the a pending request or if the underlying request
8410751SAndreas.Sandberg@ARM.com         * has been squashed.
8510751SAndreas.Sandberg@ARM.com         * @ return Is the instruction that requested this translation squashed?
8610751SAndreas.Sandberg@ARM.com         */
8710751SAndreas.Sandberg@ARM.com        virtual bool squashed() const { return false; }
8810751SAndreas.Sandberg@ARM.com    };
8910751SAndreas.Sandberg@ARM.com
9010751SAndreas.Sandberg@ARM.com  public:
9110751SAndreas.Sandberg@ARM.com    virtual void demapPage(Addr vaddr, uint64_t asn) = 0;
9210751SAndreas.Sandberg@ARM.com
9310751SAndreas.Sandberg@ARM.com    virtual Fault translateAtomic(
9410751SAndreas.Sandberg@ARM.com            const RequestPtr &req, ThreadContext *tc, Mode mode) = 0;
9510751SAndreas.Sandberg@ARM.com    virtual void translateTiming(
9610751SAndreas.Sandberg@ARM.com            const RequestPtr &req, ThreadContext *tc,
9710751SAndreas.Sandberg@ARM.com            Translation *translation, Mode mode) = 0;
9810751SAndreas.Sandberg@ARM.com    virtual Fault
9910751SAndreas.Sandberg@ARM.com    translateFunctional(const RequestPtr &req, ThreadContext *tc, Mode mode)
10010751SAndreas.Sandberg@ARM.com    {
10110751SAndreas.Sandberg@ARM.com        panic("Not implemented.\n");
10210751SAndreas.Sandberg@ARM.com    }
10310751SAndreas.Sandberg@ARM.com
10410751SAndreas.Sandberg@ARM.com    /**
10510751SAndreas.Sandberg@ARM.com     * Do post-translation physical address finalization.
10610751SAndreas.Sandberg@ARM.com     *
10710751SAndreas.Sandberg@ARM.com     * This method is used by some architectures that need
10810751SAndreas.Sandberg@ARM.com     * post-translation massaging of physical addresses. For example,
10910751SAndreas.Sandberg@ARM.com     * X86 uses this to remap physical addresses in the APIC range to
11010751SAndreas.Sandberg@ARM.com     * a range of physical memory not normally available to real x86
11110751SAndreas.Sandberg@ARM.com     * implementations.
11210751SAndreas.Sandberg@ARM.com     *
11310751SAndreas.Sandberg@ARM.com     * @param req Request to updated in-place.
11410751SAndreas.Sandberg@ARM.com     * @param tc Thread context that created the request.
11510751SAndreas.Sandberg@ARM.com     * @param mode Request type (read/write/execute).
11610751SAndreas.Sandberg@ARM.com     * @return A fault on failure, NoFault otherwise.
11710751SAndreas.Sandberg@ARM.com     */
11810751SAndreas.Sandberg@ARM.com    virtual Fault finalizePhysical(
11910751SAndreas.Sandberg@ARM.com            const RequestPtr &req, ThreadContext *tc, Mode mode) const = 0;
12010751SAndreas.Sandberg@ARM.com
12110751SAndreas.Sandberg@ARM.com    /**
12210751SAndreas.Sandberg@ARM.com     * Remove all entries from the TLB
12310751SAndreas.Sandberg@ARM.com     */
12410751SAndreas.Sandberg@ARM.com    virtual void flushAll() = 0;
12510751SAndreas.Sandberg@ARM.com
12610751SAndreas.Sandberg@ARM.com    /**
12710751SAndreas.Sandberg@ARM.com     * Take over from an old tlb context
12810751SAndreas.Sandberg@ARM.com     */
12910751SAndreas.Sandberg@ARM.com    virtual void takeOverFrom(BaseTLB *otlb) = 0;
13010751SAndreas.Sandberg@ARM.com
13110751SAndreas.Sandberg@ARM.com    /**
13210751SAndreas.Sandberg@ARM.com     * Get the table walker port if present. This is used for
13310751SAndreas.Sandberg@ARM.com     * migrating port connections during a CPU takeOverFrom()
134     * call. For architectures that do not have a table walker, NULL
135     * is returned, hence the use of a pointer rather than a
136     * reference.
137     *
138     * @return A pointer to the walker port or NULL if not present
139     */
140    virtual Port* getTableWalkerPort() { return NULL; }
141
142    void memInvalidate() { flushAll(); }
143};
144
145class GenericTLB : public BaseTLB
146{
147  protected:
148    GenericTLB(const Params *p)
149        : BaseTLB(p)
150    {}
151
152  public:
153    void demapPage(Addr vaddr, uint64_t asn) override;
154
155    Fault translateAtomic(
156        const RequestPtr &req, ThreadContext *tc, Mode mode) override;
157    void translateTiming(
158        const RequestPtr &req, ThreadContext *tc,
159        Translation *translation, Mode mode) override;
160
161    Fault finalizePhysical(
162        const RequestPtr &req, ThreadContext *tc, Mode mode) const override;
163};
164
165#endif // __ARCH_GENERIC_TLB_HH__
166