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