faults.hh revision 4695
18706Sandreas.hansson@arm.com/*
28706Sandreas.hansson@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
38706Sandreas.hansson@arm.com * All rights reserved.
48706Sandreas.hansson@arm.com *
58706Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68706Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78706Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98706Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108706Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118706Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128706Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
136892SBrad.Beckmann@amd.com * contributors may be used to endorse or promote products derived from
146892SBrad.Beckmann@amd.com * this software without specific prior written permission.
156892SBrad.Beckmann@amd.com *
166892SBrad.Beckmann@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176892SBrad.Beckmann@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186892SBrad.Beckmann@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196892SBrad.Beckmann@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206892SBrad.Beckmann@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216892SBrad.Beckmann@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226892SBrad.Beckmann@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236892SBrad.Beckmann@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246892SBrad.Beckmann@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256892SBrad.Beckmann@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266892SBrad.Beckmann@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276892SBrad.Beckmann@amd.com *
286892SBrad.Beckmann@amd.com * Authors: Nathan Binkert
296892SBrad.Beckmann@amd.com *          Gabe Black
306892SBrad.Beckmann@amd.com */
316892SBrad.Beckmann@amd.com
326892SBrad.Beckmann@amd.com#ifndef __FAULTS_HH__
336892SBrad.Beckmann@amd.com#define __FAULTS_HH__
346892SBrad.Beckmann@amd.com
356892SBrad.Beckmann@amd.com#include "base/refcnt.hh"
366892SBrad.Beckmann@amd.com#include "sim/stats.hh"
376892SBrad.Beckmann@amd.com#include "config/full_system.hh"
386892SBrad.Beckmann@amd.com
396892SBrad.Beckmann@amd.comclass ThreadContext;
406892SBrad.Beckmann@amd.comclass FaultBase;
416892SBrad.Beckmann@amd.comtypedef RefCountingPtr<FaultBase> Fault;
427563SBrad.Beckmann@amd.com
436892SBrad.Beckmann@amd.comtypedef const char * FaultName;
446892SBrad.Beckmann@amd.comtypedef Stats::Scalar<> FaultStat;
456892SBrad.Beckmann@amd.com
466892SBrad.Beckmann@amd.com// Each class has it's name statically define in _name,
477538SBrad.Beckmann@amd.com// and has a virtual function to access it's name.
487538SBrad.Beckmann@amd.com// The function is necessary because otherwise, all objects
497538SBrad.Beckmann@amd.com// which are being accessed cast as a FaultBase * (namely
507538SBrad.Beckmann@amd.com// all faults returned using the Fault type) will use the
517538SBrad.Beckmann@amd.com// generic FaultBase name.
527538SBrad.Beckmann@amd.com
537661Snate@binkert.orgclass FaultBase : public RefCounted
547538SBrad.Beckmann@amd.com{
558612Stushar@csail.mit.edu  public:
568612Stushar@csail.mit.edu    virtual FaultName name() const = 0;
577538SBrad.Beckmann@amd.com    virtual void invoke(ThreadContext * tc);
587538SBrad.Beckmann@amd.com//    template<typename T>
597917SBrad.Beckmann@amd.com//    bool isA() {return dynamic_cast<T *>(this);}
607563SBrad.Beckmann@amd.com    virtual bool isMachineCheckFault() const {return false;}
617563SBrad.Beckmann@amd.com    virtual bool isAlignmentFault() const {return false;}
627538SBrad.Beckmann@amd.com};
637538SBrad.Beckmann@amd.com
647538SBrad.Beckmann@amd.comFaultBase * const NoFault = 0;
657538SBrad.Beckmann@amd.com
667538SBrad.Beckmann@amd.comclass UnimpFault : public FaultBase
677566SBrad.Beckmann@amd.com{
687566SBrad.Beckmann@amd.com  private:
697809Snilay@cs.wisc.edu    std::string panicStr;
707809Snilay@cs.wisc.edu  public:
717809Snilay@cs.wisc.edu    UnimpFault(std::string _str)
727809Snilay@cs.wisc.edu        : panicStr(_str)
738638Sgloh    { }
748638Sgloh
757538SBrad.Beckmann@amd.com    FaultName name() const {return "Unimplemented simulator feature";}
767538SBrad.Beckmann@amd.com    void invoke(ThreadContext * tc);
777538SBrad.Beckmann@amd.com};
787538SBrad.Beckmann@amd.com
797541SBrad.Beckmann@amd.com#if !FULL_SYSTEM
806892SBrad.Beckmann@amd.comclass PageTableFault : public FaultBase
818638Sgloh{
828690Snilay@cs.wisc.edu  private:
838690Snilay@cs.wisc.edu    Addr vaddr;
848436SBrad.Beckmann@amd.com  public:
858436SBrad.Beckmann@amd.com    FaultName name() const {return "M5 page table fault";}
867032SBrad.Beckmann@amd.com    PageTableFault(Addr va) : vaddr(va) {}
877032SBrad.Beckmann@amd.com    void invoke(ThreadContext * tc);
886923SBrad.Beckmann@amd.com};
896893SBrad.Beckmann@amd.com#endif
908436SBrad.Beckmann@amd.com
918436SBrad.Beckmann@amd.com#endif // __FAULTS_HH__
927557SBrad.Beckmann@amd.com