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