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