tlb.hh revision 5004
14120SN/A/* 27660Sgblack@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan 34120SN/A * All rights reserved. 44120SN/A * 57087SN/A * Redistribution and use in source and binary forms, with or without 67087SN/A * modification, are permitted provided that the following conditions are 77087SN/A * met: redistributions of source code must retain the above copyright 87087SN/A * notice, this list of conditions and the following disclaimer; 97087SN/A * redistributions in binary form must reproduce the above copyright 107087SN/A * notice, this list of conditions and the following disclaimer in the 117087SN/A * documentation and/or other materials provided with the distribution; 127087SN/A * neither the name of the copyright holders nor the names of its 134120SN/A * contributors may be used to endorse or promote products derived from 147087SN/A * this software without specific prior written permission. 154120SN/A * 164120SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174120SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184120SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194120SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204120SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214120SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224120SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234120SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244120SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254120SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264120SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274120SN/A * 284120SN/A * Authors: Gabe Black 294120SN/A */ 304120SN/A 317624Sgblack@eecs.umich.edu#ifndef __SIM_TLB_HH__ 327624Sgblack@eecs.umich.edu#define __SIM_TLB_HH__ 334120SN/A 347624Sgblack@eecs.umich.edu#include "base/misc.hh" 357624Sgblack@eecs.umich.edu#include "mem/request.hh" 364147SN/A#include "sim/faults.hh" 377624Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 387624Sgblack@eecs.umich.edu 3910905Sandreas.sandberg@arm.comclass ThreadContext; 407624Sgblack@eecs.umich.educlass Packet; 417624Sgblack@eecs.umich.edu 4210905Sandreas.sandberg@arm.comclass GenericTLBBase : public SimObject 4310905Sandreas.sandberg@arm.com{ 4410924Snilay@cs.wisc.edu protected: 454276SN/A GenericTLBBase(const std::string &name) : SimObject(name) 467624Sgblack@eecs.umich.edu {} 4710905Sandreas.sandberg@arm.com 4810905Sandreas.sandberg@arm.com Fault translate(RequestPtr req, ThreadContext *tc); 497624Sgblack@eecs.umich.edu}; 507624Sgblack@eecs.umich.edu 5110905Sandreas.sandberg@arm.comtemplate <bool doSizeCheck=true, bool doAlignmentCheck=true> 5210905Sandreas.sandberg@arm.comclass GenericTLB : public GenericTLBBase 537624Sgblack@eecs.umich.edu{ 547624Sgblack@eecs.umich.edu public: 5510905Sandreas.sandberg@arm.com GenericTLB(const std::string &name) : GenericTLBBase(name) 5610905Sandreas.sandberg@arm.com {} 577624Sgblack@eecs.umich.edu 587624Sgblack@eecs.umich.edu Fault translate(RequestPtr req, ThreadContext *tc, bool=false) 5910905Sandreas.sandberg@arm.com { 6010905Sandreas.sandberg@arm.com Fault fault = GenericTLBBase::translate(req, tc); 6110905Sandreas.sandberg@arm.com if (fault != NoFault) 6210905Sandreas.sandberg@arm.com return fault; 637624Sgblack@eecs.umich.edu 647624Sgblack@eecs.umich.edu typeof(req->getSize()) size = req->getSize(); 6510905Sandreas.sandberg@arm.com Addr paddr = req->getPaddr(); 667624Sgblack@eecs.umich.edu 677624Sgblack@eecs.umich.edu if(doSizeCheck && !isPowerOf2(size)) 687624Sgblack@eecs.umich.edu panic("Invalid request size!\n"); 697624Sgblack@eecs.umich.edu if (doAlignmentCheck && ((size - 1) & paddr)) 7010905Sandreas.sandberg@arm.com return Fault(new GenericAlignmentFault(paddr)); 714120SN/A 727624Sgblack@eecs.umich.edu return NoFault; 737624Sgblack@eecs.umich.edu } 7410905Sandreas.sandberg@arm.com}; 757624Sgblack@eecs.umich.edu 7610905Sandreas.sandberg@arm.comtemplate <bool doSizeCheck=true, bool doAlignmentCheck=true> 777624Sgblack@eecs.umich.educlass GenericITB : public GenericTLB<doSizeCheck, doAlignmentCheck> 784182SN/A{ 7910924Snilay@cs.wisc.edu public: 8010924Snilay@cs.wisc.edu GenericITB(const std::string &name) : 8110924Snilay@cs.wisc.edu GenericTLB<doSizeCheck, doAlignmentCheck>(name) 8210924Snilay@cs.wisc.edu {} 837624Sgblack@eecs.umich.edu}; 8410905Sandreas.sandberg@arm.com 8510593Sgabeblack@google.comtemplate <bool doSizeCheck=true, bool doAlignmentCheck=true> 8610905Sandreas.sandberg@arm.comclass GenericDTB : public GenericTLB<doSizeCheck, doAlignmentCheck> 877624Sgblack@eecs.umich.edu{ 884342SN/A public: 897624Sgblack@eecs.umich.edu GenericDTB(const std::string &name) : 9010905Sandreas.sandberg@arm.com GenericTLB<doSizeCheck, doAlignmentCheck>(name) 917624Sgblack@eecs.umich.edu {} 9210905Sandreas.sandberg@arm.com}; 937624Sgblack@eecs.umich.edu 944182SN/A#endif // __ARCH_SPARC_TLB_HH__ 957624Sgblack@eecs.umich.edu