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