faults.hh revision 10417
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
311986Sandreas.sandberg@arm.com * All rights reserved.
411986Sandreas.sandberg@arm.com *
511986Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
611986Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
711986Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
811986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
911986Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1011986Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1111986Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1211986Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1311986Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
1411986Sandreas.sandberg@arm.com * this software without specific prior written permission.
1511986Sandreas.sandberg@arm.com *
1611986Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711986Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811986Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911986Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011986Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111986Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211986Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311986Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411986Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511986Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611986Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711986Sandreas.sandberg@arm.com *
2811986Sandreas.sandberg@arm.com * Authors: Nathan Binkert
2911986Sandreas.sandberg@arm.com *          Gabe Black
3011986Sandreas.sandberg@arm.com */
3111986Sandreas.sandberg@arm.com
3211986Sandreas.sandberg@arm.com#ifndef __FAULTS_HH__
3311986Sandreas.sandberg@arm.com#define __FAULTS_HH__
3411986Sandreas.sandberg@arm.com
3511986Sandreas.sandberg@arm.com#include "base/refcnt.hh"
3611986Sandreas.sandberg@arm.com#include "base/types.hh"
3711986Sandreas.sandberg@arm.com#include "cpu/static_inst.hh"
3811986Sandreas.sandberg@arm.com#include "sim/fault_fwd.hh"
3911986Sandreas.sandberg@arm.com#include "sim/stats.hh"
4011986Sandreas.sandberg@arm.com
4111986Sandreas.sandberg@arm.comclass ThreadContext;
4211986Sandreas.sandberg@arm.com
4311986Sandreas.sandberg@arm.comtypedef const char * FaultName;
4411986Sandreas.sandberg@arm.comtypedef Stats::Scalar FaultStat;
4511986Sandreas.sandberg@arm.com
4611986Sandreas.sandberg@arm.com// Each class has it's name statically define in _name,
4711986Sandreas.sandberg@arm.com// and has a virtual function to access it's name.
4811986Sandreas.sandberg@arm.com// The function is necessary because otherwise, all objects
4911986Sandreas.sandberg@arm.com// which are being accessed cast as a FaultBase * (namely
5011986Sandreas.sandberg@arm.com// all faults returned using the Fault type) will use the
5111986Sandreas.sandberg@arm.com// generic FaultBase name.
5211986Sandreas.sandberg@arm.com
5311986Sandreas.sandberg@arm.comclass FaultBase : public RefCounted
5411986Sandreas.sandberg@arm.com{
5511986Sandreas.sandberg@arm.com  public:
5611986Sandreas.sandberg@arm.com    virtual FaultName name() const = 0;
5711986Sandreas.sandberg@arm.com    virtual void invoke(ThreadContext * tc, const StaticInstPtr &inst =
5811986Sandreas.sandberg@arm.com                        StaticInst::nullStaticInstPtr);
5911986Sandreas.sandberg@arm.com};
6011986Sandreas.sandberg@arm.com
6111986Sandreas.sandberg@arm.comclass UnimpFault : public FaultBase
6211986Sandreas.sandberg@arm.com{
6311986Sandreas.sandberg@arm.com  private:
6411986Sandreas.sandberg@arm.com    std::string panicStr;
6511986Sandreas.sandberg@arm.com  public:
6611986Sandreas.sandberg@arm.com    UnimpFault(std::string _str)
6711986Sandreas.sandberg@arm.com        : panicStr(_str)
6811986Sandreas.sandberg@arm.com    { }
6911986Sandreas.sandberg@arm.com
7011986Sandreas.sandberg@arm.com    FaultName name() const {return "Unimplemented simulator feature";}
7111986Sandreas.sandberg@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
7211986Sandreas.sandberg@arm.com                StaticInst::nullStaticInstPtr);
7311986Sandreas.sandberg@arm.com};
7411986Sandreas.sandberg@arm.com
7511986Sandreas.sandberg@arm.comclass ReExec : public FaultBase
7611986Sandreas.sandberg@arm.com{
7711986Sandreas.sandberg@arm.com  public:
7811986Sandreas.sandberg@arm.com    virtual FaultName name() const { return "Re-execution fault";}
7911986Sandreas.sandberg@arm.com    ReExec() {}
8011986Sandreas.sandberg@arm.com    void invoke(ThreadContext *tc, const StaticInstPtr &inst =
8111986Sandreas.sandberg@arm.com                StaticInst::nullStaticInstPtr);
8211986Sandreas.sandberg@arm.com};
8311986Sandreas.sandberg@arm.com
8411986Sandreas.sandberg@arm.comclass GenericPageTableFault : public FaultBase
8511986Sandreas.sandberg@arm.com{
8611986Sandreas.sandberg@arm.com  private:
8711986Sandreas.sandberg@arm.com    Addr vaddr;
8811986Sandreas.sandberg@arm.com  public:
8911986Sandreas.sandberg@arm.com    FaultName name() const {return "Generic page table fault";}
9011986Sandreas.sandberg@arm.com    GenericPageTableFault(Addr va) : vaddr(va) {}
9111986Sandreas.sandberg@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
9211986Sandreas.sandberg@arm.com                StaticInst::nullStaticInstPtr);
9311986Sandreas.sandberg@arm.com};
9411986Sandreas.sandberg@arm.com
9511986Sandreas.sandberg@arm.comclass GenericAlignmentFault : public FaultBase
9611986Sandreas.sandberg@arm.com{
9711986Sandreas.sandberg@arm.com  private:
9811986Sandreas.sandberg@arm.com    Addr vaddr;
9911986Sandreas.sandberg@arm.com  public:
10011986Sandreas.sandberg@arm.com    FaultName name() const {return "Generic alignment fault";}
10111986Sandreas.sandberg@arm.com    GenericAlignmentFault(Addr va) : vaddr(va) {}
10211986Sandreas.sandberg@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
10311986Sandreas.sandberg@arm.com                StaticInst::nullStaticInstPtr);
10411986Sandreas.sandberg@arm.com};
10511986Sandreas.sandberg@arm.com
10611986Sandreas.sandberg@arm.com#endif // __FAULTS_HH__
10711986Sandreas.sandberg@arm.com