faults.hh revision 12110:c24ee249b8ba
12929Sktlim@umich.edu/* 22929Sktlim@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 32932Sktlim@umich.edu * All rights reserved. 42929Sktlim@umich.edu * 52929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 62929Sktlim@umich.edu * modification, are permitted provided that the following conditions are 72929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 82929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 92929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 102929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 112929Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 122929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 132929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 142929Sktlim@umich.edu * this software without specific prior written permission. 152929Sktlim@umich.edu * 162929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272929Sktlim@umich.edu * 282932Sktlim@umich.edu * Authors: Gabe Black 292932Sktlim@umich.edu * Kevin Lim 302932Sktlim@umich.edu */ 312929Sktlim@umich.edu 326007Ssteve.reinhardt@amd.com#ifndef __ARCH_ALPHA_FAULTS_HH__ 337735SAli.Saidi@ARM.com#define __ARCH_ALPHA_FAULTS_HH__ 342929Sktlim@umich.edu 352929Sktlim@umich.edu#include "arch/alpha/pagetable.hh" 362929Sktlim@umich.edu#include "mem/request.hh" 372929Sktlim@umich.edu#include "sim/faults.hh" 382929Sktlim@umich.edu 392929Sktlim@umich.edu// The design of the "name" and "vect" functions is in sim/faults.hh 402929Sktlim@umich.edu 418947Sandreas.hansson@arm.comnamespace AlphaISA { 428947Sandreas.hansson@arm.com 438947Sandreas.hansson@arm.comtypedef Addr FaultVect; 442929Sktlim@umich.edu 452929Sktlim@umich.educlass AlphaFault : public FaultBase 462929Sktlim@umich.edu{ 472929Sktlim@umich.edu protected: 482929Sktlim@umich.edu virtual bool skipFaultingInstruction() {return false;} 492929Sktlim@umich.edu virtual bool setRestartAddress() {return true;} 506007Ssteve.reinhardt@amd.com public: 516007Ssteve.reinhardt@amd.com virtual ~AlphaFault() {} 526007Ssteve.reinhardt@amd.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 536007Ssteve.reinhardt@amd.com StaticInst::nullStaticInstPtr); 546007Ssteve.reinhardt@amd.com virtual FaultVect vect() = 0; 556007Ssteve.reinhardt@amd.com virtual FaultStat & countStat() = 0; 566007Ssteve.reinhardt@amd.com}; 576007Ssteve.reinhardt@amd.com 586007Ssteve.reinhardt@amd.comclass MachineCheckFault : public AlphaFault 596007Ssteve.reinhardt@amd.com{ 606007Ssteve.reinhardt@amd.com private: 616007Ssteve.reinhardt@amd.com static FaultName _name; 626007Ssteve.reinhardt@amd.com static FaultVect _vect; 636007Ssteve.reinhardt@amd.com static FaultStat _count; 646007Ssteve.reinhardt@amd.com 656007Ssteve.reinhardt@amd.com public: 666007Ssteve.reinhardt@amd.com FaultName name() const {return _name;} 676007Ssteve.reinhardt@amd.com FaultVect vect() {return _vect;} 686007Ssteve.reinhardt@amd.com FaultStat & countStat() {return _count;} 696007Ssteve.reinhardt@amd.com}; 706007Ssteve.reinhardt@amd.com 716007Ssteve.reinhardt@amd.comclass AlignmentFault : public AlphaFault 726007Ssteve.reinhardt@amd.com{ 736007Ssteve.reinhardt@amd.com private: 746007Ssteve.reinhardt@amd.com static FaultName _name; 756007Ssteve.reinhardt@amd.com static FaultVect _vect; 766007Ssteve.reinhardt@amd.com static FaultStat _count; 776007Ssteve.reinhardt@amd.com 786007Ssteve.reinhardt@amd.com public: 792929Sktlim@umich.edu FaultName name() const {return _name;} 802929Sktlim@umich.edu FaultVect vect() {return _vect;} 812929Sktlim@umich.edu FaultStat & countStat() {return _count;} 826007Ssteve.reinhardt@amd.com bool isAlignmentFault() const {return true;} 836007Ssteve.reinhardt@amd.com}; 846007Ssteve.reinhardt@amd.com 856007Ssteve.reinhardt@amd.comclass ResetFault : public AlphaFault 866007Ssteve.reinhardt@amd.com{ 876007Ssteve.reinhardt@amd.com private: 882929Sktlim@umich.edu static FaultName _name; 892929Sktlim@umich.edu static FaultVect _vect; 902929Sktlim@umich.edu static FaultStat _count; 912929Sktlim@umich.edu 922929Sktlim@umich.edu public: 936011Ssteve.reinhardt@amd.com FaultName name() const {return _name;} 946007Ssteve.reinhardt@amd.com FaultVect vect() {return _vect;} 956007Ssteve.reinhardt@amd.com FaultStat & countStat() {return _count;} 966007Ssteve.reinhardt@amd.com}; 976007Ssteve.reinhardt@amd.com 986007Ssteve.reinhardt@amd.comclass ArithmeticFault : public AlphaFault 996007Ssteve.reinhardt@amd.com{ 1006007Ssteve.reinhardt@amd.com private: 1016007Ssteve.reinhardt@amd.com static FaultName _name; 1026007Ssteve.reinhardt@amd.com static FaultVect _vect; 1036007Ssteve.reinhardt@amd.com static FaultStat _count; 1046007Ssteve.reinhardt@amd.com 1056007Ssteve.reinhardt@amd.com protected: 1066007Ssteve.reinhardt@amd.com bool skipFaultingInstruction() {return true;} 1076007Ssteve.reinhardt@amd.com 1087735SAli.Saidi@ARM.com public: 1096011Ssteve.reinhardt@amd.com FaultName name() const {return _name;} 1106007Ssteve.reinhardt@amd.com FaultVect vect() {return _vect;} 1116007Ssteve.reinhardt@amd.com FaultStat & countStat() {return _count;} 1126007Ssteve.reinhardt@amd.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1136007Ssteve.reinhardt@amd.com StaticInst::nullStaticInstPtr); 1147735SAli.Saidi@ARM.com}; 1157735SAli.Saidi@ARM.com 1167735SAli.Saidi@ARM.comclass InterruptFault : public AlphaFault 1177735SAli.Saidi@ARM.com{ 1187735SAli.Saidi@ARM.com private: 1197735SAli.Saidi@ARM.com static FaultName _name; 1207735SAli.Saidi@ARM.com static FaultVect _vect; 1217735SAli.Saidi@ARM.com static FaultStat _count; 1227735SAli.Saidi@ARM.com 1237735SAli.Saidi@ARM.com protected: 1247735SAli.Saidi@ARM.com bool setRestartAddress() {return false;} 1257735SAli.Saidi@ARM.com 1267735SAli.Saidi@ARM.com public: 1277735SAli.Saidi@ARM.com FaultName name() const {return _name;} 1286007Ssteve.reinhardt@amd.com FaultVect vect() {return _vect;} 1298599Ssteve.reinhardt@amd.com FaultStat & countStat() {return _count;} 1308599Ssteve.reinhardt@amd.com}; 1318599Ssteve.reinhardt@amd.com 1326007Ssteve.reinhardt@amd.comclass DtbFault : public AlphaFault 1336011Ssteve.reinhardt@amd.com{ 1346007Ssteve.reinhardt@amd.com protected: 1356007Ssteve.reinhardt@amd.com VAddr vaddr; 1366007Ssteve.reinhardt@amd.com Request::Flags reqFlags; 1376007Ssteve.reinhardt@amd.com uint64_t flags; 1386007Ssteve.reinhardt@amd.com 1396007Ssteve.reinhardt@amd.com public: 1406011Ssteve.reinhardt@amd.com DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 1416007Ssteve.reinhardt@amd.com : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1426007Ssteve.reinhardt@amd.com { } 1436007Ssteve.reinhardt@amd.com FaultName name() const = 0; 1446007Ssteve.reinhardt@amd.com FaultVect vect() = 0; 1456007Ssteve.reinhardt@amd.com FaultStat & countStat() = 0; 1466008Ssteve.reinhardt@amd.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1476007Ssteve.reinhardt@amd.com StaticInst::nullStaticInstPtr); 1486008Ssteve.reinhardt@amd.com}; 1496008Ssteve.reinhardt@amd.com 1506008Ssteve.reinhardt@amd.comclass NDtbMissFault : public DtbFault 1516008Ssteve.reinhardt@amd.com{ 1526008Ssteve.reinhardt@amd.com private: 1536008Ssteve.reinhardt@amd.com static FaultName _name; 1546008Ssteve.reinhardt@amd.com static FaultVect _vect; 1556007Ssteve.reinhardt@amd.com static FaultStat _count; 1566007Ssteve.reinhardt@amd.com 1576007Ssteve.reinhardt@amd.com public: 1586007Ssteve.reinhardt@amd.com NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1596007Ssteve.reinhardt@amd.com : DtbFault(vaddr, reqFlags, flags) 1602929Sktlim@umich.edu { } 1612929Sktlim@umich.edu FaultName name() const {return _name;} 1622929Sktlim@umich.edu FaultVect vect() {return _vect;} 1632929Sktlim@umich.edu FaultStat & countStat() {return _count;} 1646007Ssteve.reinhardt@amd.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1656007Ssteve.reinhardt@amd.com StaticInst::nullStaticInstPtr); 1662929Sktlim@umich.edu}; 1672929Sktlim@umich.edu 1682929Sktlim@umich.educlass PDtbMissFault : public DtbFault 1692929Sktlim@umich.edu{ 1706007Ssteve.reinhardt@amd.com private: 1716007Ssteve.reinhardt@amd.com static FaultName _name; 1722929Sktlim@umich.edu static FaultVect _vect; 1732929Sktlim@umich.edu static FaultStat _count; 1746007Ssteve.reinhardt@amd.com 1752929Sktlim@umich.edu public: 1762929Sktlim@umich.edu PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1778947Sandreas.hansson@arm.com : DtbFault(vaddr, reqFlags, flags) 1788947Sandreas.hansson@arm.com { } 1798947Sandreas.hansson@arm.com FaultName name() const {return _name;} 1808947Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 1818947Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 1828947Sandreas.hansson@arm.com}; 1838947Sandreas.hansson@arm.com 1848947Sandreas.hansson@arm.comclass DtbPageFault : public DtbFault 1858947Sandreas.hansson@arm.com{ 1868947Sandreas.hansson@arm.com private: 1878947Sandreas.hansson@arm.com static FaultName _name; 1888947Sandreas.hansson@arm.com static FaultVect _vect; 1898947Sandreas.hansson@arm.com static FaultStat _count; 1908947Sandreas.hansson@arm.com 1918947Sandreas.hansson@arm.com public: 1928947Sandreas.hansson@arm.com DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1938947Sandreas.hansson@arm.com : DtbFault(vaddr, reqFlags, flags) 1948947Sandreas.hansson@arm.com { } 1958947Sandreas.hansson@arm.com FaultName name() const {return _name;} 1968947Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 1972929Sktlim@umich.edu FaultStat & countStat() {return _count;} 1982929Sktlim@umich.edu}; 1992929Sktlim@umich.edu 2002929Sktlim@umich.educlass DtbAcvFault : public DtbFault 2014937Sstever@gmail.com{ 2024937Sstever@gmail.com private: 2034937Sstever@gmail.com static FaultName _name; 2044937Sstever@gmail.com static FaultVect _vect; 2058120Sgblack@eecs.umich.edu static FaultStat _count; 2064937Sstever@gmail.com 2074937Sstever@gmail.com public: 2084937Sstever@gmail.com DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2094937Sstever@gmail.com : DtbFault(vaddr, reqFlags, flags) 2105773Snate@binkert.org { } 2114937Sstever@gmail.com FaultName name() const {return _name;} 2124937Sstever@gmail.com FaultVect vect() {return _vect;} 2134937Sstever@gmail.com FaultStat & countStat() {return _count;} 2142929Sktlim@umich.edu}; 2152929Sktlim@umich.edu 2162929Sktlim@umich.educlass DtbAlignmentFault : public DtbFault 2175773Snate@binkert.org{ 2182929Sktlim@umich.edu private: 2192929Sktlim@umich.edu static FaultName _name; 2202929Sktlim@umich.edu static FaultVect _vect; 2212929Sktlim@umich.edu static FaultStat _count; 2222929Sktlim@umich.edu 2232929Sktlim@umich.edu public: 2244937Sstever@gmail.com DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2254937Sstever@gmail.com : DtbFault(vaddr, reqFlags, flags) 2264937Sstever@gmail.com { } 2274937Sstever@gmail.com FaultName name() const {return _name;} 2284937Sstever@gmail.com FaultVect vect() {return _vect;} 2294937Sstever@gmail.com FaultStat & countStat() {return _count;} 2304937Sstever@gmail.com}; 2314937Sstever@gmail.com 2324937Sstever@gmail.comclass ItbFault : public AlphaFault 2334937Sstever@gmail.com{ 2344937Sstever@gmail.com protected: 2354937Sstever@gmail.com Addr pc; 2364937Sstever@gmail.com 2374937Sstever@gmail.com public: 2384937Sstever@gmail.com ItbFault(Addr _pc) : pc(_pc) { } 2392929Sktlim@umich.edu FaultName name() const = 0; 2402929Sktlim@umich.edu FaultVect vect() = 0; 2412929Sktlim@umich.edu FaultStat & countStat() = 0; 2422929Sktlim@umich.edu void invoke(ThreadContext * tc, const StaticInstPtr &inst = 2432929Sktlim@umich.edu StaticInst::nullStaticInstPtr); 2442929Sktlim@umich.edu}; 2452929Sktlim@umich.edu 2466011Ssteve.reinhardt@amd.comclass ItbPageFault : public ItbFault 2472929Sktlim@umich.edu{ 2482929Sktlim@umich.edu private: 2492929Sktlim@umich.edu static FaultName _name; 2502929Sktlim@umich.edu static FaultVect _vect; 2512929Sktlim@umich.edu static FaultStat _count; 2522929Sktlim@umich.edu 2532929Sktlim@umich.edu public: 2542929Sktlim@umich.edu ItbPageFault(Addr pc) : ItbFault(pc) { } 2552997Sstever@eecs.umich.edu FaultName name() const {return _name;} 2562997Sstever@eecs.umich.edu FaultVect vect() {return _vect;} 2572929Sktlim@umich.edu FaultStat & countStat() {return _count;} 2588802Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, const StaticInstPtr &inst = 2592997Sstever@eecs.umich.edu StaticInst::nullStaticInstPtr); 2602929Sktlim@umich.edu}; 2612997Sstever@eecs.umich.edu 2622997Sstever@eecs.umich.educlass ItbAcvFault : public ItbFault 2638802Sgblack@eecs.umich.edu{ 2642929Sktlim@umich.edu private: 2652997Sstever@eecs.umich.edu static FaultName _name; 2662997Sstever@eecs.umich.edu static FaultVect _vect; 2672997Sstever@eecs.umich.edu static FaultStat _count; 2682997Sstever@eecs.umich.edu 2695773Snate@binkert.org public: 2705773Snate@binkert.org ItbAcvFault(Addr pc) : ItbFault(pc) { } 2712997Sstever@eecs.umich.edu FaultName name() const {return _name;} 2722997Sstever@eecs.umich.edu FaultVect vect() {return _vect;} 2736007Ssteve.reinhardt@amd.com FaultStat & countStat() {return _count;} 2746007Ssteve.reinhardt@amd.com}; 2752997Sstever@eecs.umich.edu 2762929Sktlim@umich.educlass UnimplementedOpcodeFault : public AlphaFault 2772997Sstever@eecs.umich.edu{ 2788120Sgblack@eecs.umich.edu private: 2792997Sstever@eecs.umich.edu static FaultName _name; 2802997Sstever@eecs.umich.edu static FaultVect _vect; 2812997Sstever@eecs.umich.edu static FaultStat _count; 2822997Sstever@eecs.umich.edu 2832997Sstever@eecs.umich.edu public: 2842929Sktlim@umich.edu FaultName name() const {return _name;} 2852997Sstever@eecs.umich.edu FaultVect vect() {return _vect;} 2862929Sktlim@umich.edu FaultStat & countStat() {return _count;} 2872929Sktlim@umich.edu}; 2883005Sstever@eecs.umich.edu 2893005Sstever@eecs.umich.educlass FloatEnableFault : public AlphaFault 2908802Sgblack@eecs.umich.edu{ 2918802Sgblack@eecs.umich.edu private: 2928802Sgblack@eecs.umich.edu static FaultName _name; 2938802Sgblack@eecs.umich.edu static FaultVect _vect; 2948802Sgblack@eecs.umich.edu static FaultStat _count; 2958802Sgblack@eecs.umich.edu 2968802Sgblack@eecs.umich.edu public: 2978802Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2988802Sgblack@eecs.umich.edu FaultVect vect() {return _vect;} 2998802Sgblack@eecs.umich.edu FaultStat & countStat() {return _count;} 3008802Sgblack@eecs.umich.edu}; 3018802Sgblack@eecs.umich.edu 3028889Sgeoffrey.blake@arm.comclass VectorEnableFault : public AlphaFault 3038889Sgeoffrey.blake@arm.com{ 3048889Sgeoffrey.blake@arm.com private: 3058802Sgblack@eecs.umich.edu static FaultName _name; 3068802Sgblack@eecs.umich.edu static FaultVect _vect; 3078802Sgblack@eecs.umich.edu static FaultStat _count; 3088802Sgblack@eecs.umich.edu 3098889Sgeoffrey.blake@arm.com public: 3108802Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3118802Sgblack@eecs.umich.edu FaultVect vect() {return _vect;} 3128802Sgblack@eecs.umich.edu FaultStat & countStat() {return _count;} 3138802Sgblack@eecs.umich.edu}; 3148802Sgblack@eecs.umich.edu 3153691Shsul@eecs.umich.educlass PalFault : public AlphaFault 3168802Sgblack@eecs.umich.edu{ 3178802Sgblack@eecs.umich.edu private: 3188802Sgblack@eecs.umich.edu static FaultName _name; 3193005Sstever@eecs.umich.edu static FaultVect _vect; 3208492Snilay@cs.wisc.edu static FaultStat _count; 3216928SBrad.Beckmann@amd.com 3226928SBrad.Beckmann@amd.com protected: 3236928SBrad.Beckmann@amd.com bool skipFaultingInstruction() {return true;} 3246928SBrad.Beckmann@amd.com 3256166Ssteve.reinhardt@amd.com public: 3262929Sktlim@umich.edu FaultName name() const {return _name;} 3272929Sktlim@umich.edu FaultVect vect() {return _vect;} 3283005Sstever@eecs.umich.edu FaultStat & countStat() {return _count;} 3298802Sgblack@eecs.umich.edu}; 3302997Sstever@eecs.umich.edu 3316293Ssteve.reinhardt@amd.comclass IntegerOverflowFault : public AlphaFault 3326293Ssteve.reinhardt@amd.com{ 3332929Sktlim@umich.edu private: 334 static FaultName _name; 335 static FaultVect _vect; 336 static FaultStat _count; 337 338 public: 339 FaultName name() const {return _name;} 340 FaultVect vect() {return _vect;} 341 FaultStat & countStat() {return _count;} 342}; 343 344} // namespace AlphaISA 345 346#endif // __ARCH_ALPHA_FAULTS_HH__ 347