faults.hh revision 5569
17927SN/A/* 27927SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 39289Sandreas.hansson@arm.com * All rights reserved. 49289Sandreas.hansson@arm.com * 59289Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 67927SN/A * modification, are permitted provided that the following conditions are 79289Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 89289Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 99289Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 109289Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 119289Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 129289Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 139289Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 149289Sandreas.hansson@arm.com * this software without specific prior written permission. 159079SAli.Saidi@ARM.com * 169079SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179079SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189289Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199289Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209079SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219079SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229289Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239289Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249289Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259079SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269079SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279079SAli.Saidi@ARM.com * 289289Sandreas.hansson@arm.com * Authors: Gabe Black 299289Sandreas.hansson@arm.com * Kevin Lim 309289Sandreas.hansson@arm.com */ 319289Sandreas.hansson@arm.com 329289Sandreas.hansson@arm.com#ifndef __ARCH_ALPHA_FAULTS_HH__ 339079SAli.Saidi@ARM.com#define __ARCH_ALPHA_FAULTS_HH__ 349079SAli.Saidi@ARM.com 359079SAli.Saidi@ARM.com#include "arch/alpha/pagetable.hh" 369289Sandreas.hansson@arm.com#include "config/full_system.hh" 379289Sandreas.hansson@arm.com#include "sim/faults.hh" 389079SAli.Saidi@ARM.com 399079SAli.Saidi@ARM.com// The design of the "name" and "vect" functions is in sim/faults.hh 409289Sandreas.hansson@arm.com 419289Sandreas.hansson@arm.comnamespace AlphaISA { 429289Sandreas.hansson@arm.com 439289Sandreas.hansson@arm.comtypedef const Addr FaultVect; 449079SAli.Saidi@ARM.com 459079SAli.Saidi@ARM.comclass AlphaFault : public FaultBase 469079SAli.Saidi@ARM.com{ 479289Sandreas.hansson@arm.com protected: 489289Sandreas.hansson@arm.com virtual bool skipFaultingInstruction() {return false;} 499289Sandreas.hansson@arm.com virtual bool setRestartAddress() {return true;} 509289Sandreas.hansson@arm.com public: 518613SN/A#if FULL_SYSTEM 529289Sandreas.hansson@arm.com void invoke(ThreadContext * tc); 538613SN/A#endif 549289Sandreas.hansson@arm.com virtual FaultVect vect() = 0; 559289Sandreas.hansson@arm.com virtual FaultStat & countStat() = 0; 569289Sandreas.hansson@arm.com}; 579289Sandreas.hansson@arm.com 589289Sandreas.hansson@arm.comclass MachineCheckFault : public AlphaFault 599289Sandreas.hansson@arm.com{ 608835SAli.Saidi@ARM.com private: 618613SN/A static FaultName _name; 629289Sandreas.hansson@arm.com static FaultVect _vect; 639289Sandreas.hansson@arm.com static FaultStat _count; 649289Sandreas.hansson@arm.com 659289Sandreas.hansson@arm.com public: 669289Sandreas.hansson@arm.com FaultName name() const {return _name;} 679289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 688835SAli.Saidi@ARM.com FaultStat & countStat() {return _count;} 698613SN/A bool isMachineCheckFault() const {return true;} 709289Sandreas.hansson@arm.com}; 719289Sandreas.hansson@arm.com 729289Sandreas.hansson@arm.comclass AlignmentFault : public AlphaFault 739289Sandreas.hansson@arm.com{ 748835SAli.Saidi@ARM.com private: 759055Ssaidi@eecs.umich.edu static FaultName _name; 768835SAli.Saidi@ARM.com static FaultVect _vect; 779055Ssaidi@eecs.umich.edu static FaultStat _count; 788835SAli.Saidi@ARM.com 799055Ssaidi@eecs.umich.edu public: 808835SAli.Saidi@ARM.com FaultName name() const {return _name;} 819055Ssaidi@eecs.umich.edu FaultVect vect() {return _vect;} 828613SN/A FaultStat & countStat() {return _count;} 838613SN/A bool isAlignmentFault() const {return true;} 848613SN/A}; 858613SN/A 868983Snate@binkert.orgstatic inline Fault genMachineCheckFault() 878983Snate@binkert.org{ 888613SN/A return new MachineCheckFault; 898613SN/A} 908835SAli.Saidi@ARM.com 918835SAli.Saidi@ARM.comclass ResetFault : public AlphaFault 928613SN/A{ 938613SN/A private: 948613SN/A static FaultName _name; 959289Sandreas.hansson@arm.com static FaultVect _vect; 968613SN/A static FaultStat _count; 978613SN/A 988613SN/A public: 998613SN/A FaultName name() const {return _name;} 1008613SN/A FaultVect vect() {return _vect;} 1018613SN/A FaultStat & countStat() {return _count;} 1028613SN/A}; 1038613SN/A 1048613SN/Aclass ArithmeticFault : public AlphaFault 1059289Sandreas.hansson@arm.com{ 1068613SN/A private: 1078613SN/A static FaultName _name; 1089289Sandreas.hansson@arm.com static FaultVect _vect; 1099289Sandreas.hansson@arm.com static FaultStat _count; 1109289Sandreas.hansson@arm.com 1118613SN/A protected: 1128613SN/A bool skipFaultingInstruction() {return true;} 1139289Sandreas.hansson@arm.com 1149289Sandreas.hansson@arm.com public: 1158613SN/A FaultName name() const {return _name;} 1169289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 1179289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 1188613SN/A#if FULL_SYSTEM 1198613SN/A void invoke(ThreadContext * tc); 1209289Sandreas.hansson@arm.com#endif 1219289Sandreas.hansson@arm.com}; 1229289Sandreas.hansson@arm.com 1239289Sandreas.hansson@arm.comclass InterruptFault : public AlphaFault 1249289Sandreas.hansson@arm.com{ 1259289Sandreas.hansson@arm.com private: 1269289Sandreas.hansson@arm.com static FaultName _name; 1278613SN/A static FaultVect _vect; 1288613SN/A static FaultStat _count; 1299289Sandreas.hansson@arm.com 1308673SN/A protected: 1319289Sandreas.hansson@arm.com bool setRestartAddress() {return false;} 1329289Sandreas.hansson@arm.com 1339289Sandreas.hansson@arm.com public: 1349125Snilay@cs.wisc.edu FaultName name() const {return _name;} 1358835SAli.Saidi@ARM.com FaultVect vect() {return _vect;} 1368835SAli.Saidi@ARM.com FaultStat & countStat() {return _count;} 1378835SAli.Saidi@ARM.com}; 1389289Sandreas.hansson@arm.com 1399289Sandreas.hansson@arm.comclass DtbFault : public AlphaFault 1409289Sandreas.hansson@arm.com{ 1419289Sandreas.hansson@arm.com protected: 1429289Sandreas.hansson@arm.com VAddr vaddr; 1439289Sandreas.hansson@arm.com uint32_t reqFlags; 1449289Sandreas.hansson@arm.com uint64_t flags; 1459289Sandreas.hansson@arm.com 1469289Sandreas.hansson@arm.com public: 1479289Sandreas.hansson@arm.com DtbFault(VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 1489289Sandreas.hansson@arm.com : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1499289Sandreas.hansson@arm.com { } 1509289Sandreas.hansson@arm.com FaultName name() const = 0; 1519289Sandreas.hansson@arm.com FaultVect vect() = 0; 1529289Sandreas.hansson@arm.com FaultStat & countStat() = 0; 1539289Sandreas.hansson@arm.com#if FULL_SYSTEM 1549289Sandreas.hansson@arm.com void invoke(ThreadContext * tc); 1559289Sandreas.hansson@arm.com#endif 1568835SAli.Saidi@ARM.com}; 1579055Ssaidi@eecs.umich.edu 1588835SAli.Saidi@ARM.comclass NDtbMissFault : public DtbFault 1599055Ssaidi@eecs.umich.edu{ 1608835SAli.Saidi@ARM.com private: 1619055Ssaidi@eecs.umich.edu static FaultName _name; 1628613SN/A static FaultVect _vect; 1638613SN/A static FaultStat _count; 1648613SN/A 1658613SN/A public: 1668983Snate@binkert.org NDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1678983Snate@binkert.org : DtbFault(vaddr, reqFlags, flags) 1688613SN/A { } 1698613SN/A FaultName name() const {return _name;} 1708613SN/A FaultVect vect() {return _vect;} 1719079SAli.Saidi@ARM.com FaultStat & countStat() {return _count;} 1729289Sandreas.hansson@arm.com#if !FULL_SYSTEM 1739079SAli.Saidi@ARM.com void invoke(ThreadContext * tc); 1749079SAli.Saidi@ARM.com#endif 1759079SAli.Saidi@ARM.com}; 1769289Sandreas.hansson@arm.com 1779289Sandreas.hansson@arm.comclass PDtbMissFault : public DtbFault 1789289Sandreas.hansson@arm.com{ 1799289Sandreas.hansson@arm.com private: 1809079SAli.Saidi@ARM.com static FaultName _name; 1819079SAli.Saidi@ARM.com static FaultVect _vect; 1828835SAli.Saidi@ARM.com static FaultStat _count; 1838613SN/A 1849079SAli.Saidi@ARM.com public: 1859079SAli.Saidi@ARM.com PDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1869079SAli.Saidi@ARM.com : DtbFault(vaddr, reqFlags, flags) 1879079SAli.Saidi@ARM.com { } 1889079SAli.Saidi@ARM.com FaultName name() const {return _name;} 1899079SAli.Saidi@ARM.com FaultVect vect() {return _vect;} 1909079SAli.Saidi@ARM.com FaultStat & countStat() {return _count;} 1919079SAli.Saidi@ARM.com}; 1929079SAli.Saidi@ARM.com 1939079SAli.Saidi@ARM.comclass DtbPageFault : public DtbFault 1948835SAli.Saidi@ARM.com{ 1958673SN/A private: 1968835SAli.Saidi@ARM.com static FaultName _name; 1978613SN/A static FaultVect _vect; 1988835SAli.Saidi@ARM.com static FaultStat _count; 1998673SN/A 2008835SAli.Saidi@ARM.com public: 2018673SN/A DtbPageFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2029079SAli.Saidi@ARM.com : DtbFault(vaddr, reqFlags, flags) 2039079SAli.Saidi@ARM.com { } 2049079SAli.Saidi@ARM.com FaultName name() const {return _name;} 2059079SAli.Saidi@ARM.com FaultVect vect() {return _vect;} 2069079SAli.Saidi@ARM.com FaultStat & countStat() {return _count;} 2079079SAli.Saidi@ARM.com}; 2088613SN/A 2098613SN/Aclass DtbAcvFault : public DtbFault 2108613SN/A{ 2118613SN/A private: 2128983Snate@binkert.org static FaultName _name; 2138983Snate@binkert.org static FaultVect _vect; 2148613SN/A static FaultStat _count; 2158613SN/A 2169079SAli.Saidi@ARM.com public: 2179079SAli.Saidi@ARM.com DtbAcvFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2188613SN/A : DtbFault(vaddr, reqFlags, flags) 2199289Sandreas.hansson@arm.com { } 2209289Sandreas.hansson@arm.com FaultName name() const {return _name;} 2219289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 2229289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 2239289Sandreas.hansson@arm.com}; 2249289Sandreas.hansson@arm.com 2259289Sandreas.hansson@arm.comclass DtbAlignmentFault : public DtbFault 2269289Sandreas.hansson@arm.com{ 2279289Sandreas.hansson@arm.com private: 2289289Sandreas.hansson@arm.com static FaultName _name; 2299289Sandreas.hansson@arm.com static FaultVect _vect; 2309289Sandreas.hansson@arm.com static FaultStat _count; 2319289Sandreas.hansson@arm.com 2329289Sandreas.hansson@arm.com public: 2339289Sandreas.hansson@arm.com DtbAlignmentFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2349289Sandreas.hansson@arm.com : DtbFault(vaddr, reqFlags, flags) 2359289Sandreas.hansson@arm.com { } 2369289Sandreas.hansson@arm.com FaultName name() const {return _name;} 2379289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 2389289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 2399289Sandreas.hansson@arm.com}; 2408835SAli.Saidi@ARM.com 2418673SN/Aclass ItbFault : public AlphaFault 2428835SAli.Saidi@ARM.com{ 2438673SN/A protected: 2448835SAli.Saidi@ARM.com Addr pc; 2458673SN/A 2469289Sandreas.hansson@arm.com public: 2479289Sandreas.hansson@arm.com ItbFault(Addr _pc) : pc(_pc) { } 2489289Sandreas.hansson@arm.com FaultName name() const = 0; 2499289Sandreas.hansson@arm.com FaultVect vect() = 0; 2509289Sandreas.hansson@arm.com FaultStat & countStat() = 0; 2519289Sandreas.hansson@arm.com#if FULL_SYSTEM 2528613SN/A void invoke(ThreadContext * tc); 2538613SN/A#endif 2548613SN/A}; 2558613SN/A 2568983Snate@binkert.orgclass ItbPageFault : public ItbFault 2578983Snate@binkert.org{ 2588613SN/A private: 2598613SN/A static FaultName _name; 2609079SAli.Saidi@ARM.com static FaultVect _vect; 2619079SAli.Saidi@ARM.com static FaultStat _count; 2628613SN/A 2639289Sandreas.hansson@arm.com public: 2649079SAli.Saidi@ARM.com ItbPageFault(Addr pc) : ItbFault(pc) { } 2659289Sandreas.hansson@arm.com FaultName name() const {return _name;} 2669289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 2679289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 2688613SN/A#if !FULL_SYSTEM 2699079SAli.Saidi@ARM.com void invoke(ThreadContext * tc); 2708835SAli.Saidi@ARM.com#endif 2718835SAli.Saidi@ARM.com}; 2729289Sandreas.hansson@arm.com 2739289Sandreas.hansson@arm.comclass ItbAcvFault : public ItbFault 2749289Sandreas.hansson@arm.com{ 2759289Sandreas.hansson@arm.com private: 2769289Sandreas.hansson@arm.com static FaultName _name; 2779289Sandreas.hansson@arm.com static FaultVect _vect; 2789289Sandreas.hansson@arm.com static FaultStat _count; 2799289Sandreas.hansson@arm.com 2809289Sandreas.hansson@arm.com public: 2819289Sandreas.hansson@arm.com ItbAcvFault(Addr pc) : ItbFault(pc) { } 2829289Sandreas.hansson@arm.com FaultName name() const {return _name;} 2839289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 2849289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 2859289Sandreas.hansson@arm.com}; 2869289Sandreas.hansson@arm.com 2879289Sandreas.hansson@arm.comclass UnimplementedOpcodeFault : public AlphaFault 2889289Sandreas.hansson@arm.com{ 2899289Sandreas.hansson@arm.com private: 2909289Sandreas.hansson@arm.com static FaultName _name; 2919289Sandreas.hansson@arm.com static FaultVect _vect; 2929289Sandreas.hansson@arm.com static FaultStat _count; 2939289Sandreas.hansson@arm.com 2949289Sandreas.hansson@arm.com public: 2959289Sandreas.hansson@arm.com FaultName name() const {return _name;} 2968835SAli.Saidi@ARM.com FaultVect vect() {return _vect;} 2979055Ssaidi@eecs.umich.edu FaultStat & countStat() {return _count;} 2988835SAli.Saidi@ARM.com}; 2999055Ssaidi@eecs.umich.edu 3008835SAli.Saidi@ARM.comclass FloatEnableFault : public AlphaFault 3019055Ssaidi@eecs.umich.edu{ 3028835SAli.Saidi@ARM.com private: 3039055Ssaidi@eecs.umich.edu static FaultName _name; 3048613SN/A static FaultVect _vect; 3058613SN/A static FaultStat _count; 3068613SN/A 3078613SN/A public: 3088983Snate@binkert.org FaultName name() const {return _name;} 3098983Snate@binkert.org FaultVect vect() {return _vect;} 3108613SN/A FaultStat & countStat() {return _count;} 3118613SN/A}; 3129289Sandreas.hansson@arm.com 3139289Sandreas.hansson@arm.comclass PalFault : public AlphaFault 3148613SN/A{ 3159289Sandreas.hansson@arm.com private: 3169289Sandreas.hansson@arm.com static FaultName _name; 3179289Sandreas.hansson@arm.com static FaultVect _vect; 3189289Sandreas.hansson@arm.com static FaultStat _count; 3199289Sandreas.hansson@arm.com 3209289Sandreas.hansson@arm.com protected: 3219289Sandreas.hansson@arm.com bool skipFaultingInstruction() {return true;} 3229289Sandreas.hansson@arm.com 3239289Sandreas.hansson@arm.com public: 3249289Sandreas.hansson@arm.com FaultName name() const {return _name;} 3259289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 3269289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 3279289Sandreas.hansson@arm.com}; 3289289Sandreas.hansson@arm.com 3299289Sandreas.hansson@arm.comclass IntegerOverflowFault : public AlphaFault 3309289Sandreas.hansson@arm.com{ 3319289Sandreas.hansson@arm.com private: 3329289Sandreas.hansson@arm.com static FaultName _name; 3339289Sandreas.hansson@arm.com static FaultVect _vect; 3349289Sandreas.hansson@arm.com static FaultStat _count; 3359289Sandreas.hansson@arm.com 3369289Sandreas.hansson@arm.com public: 3379289Sandreas.hansson@arm.com FaultName name() const {return _name;} 3389289Sandreas.hansson@arm.com FaultVect vect() {return _vect;} 3399289Sandreas.hansson@arm.com FaultStat & countStat() {return _count;} 3409289Sandreas.hansson@arm.com}; 3419289Sandreas.hansson@arm.com 3429289Sandreas.hansson@arm.com} // namespace AlphaISA 3439289Sandreas.hansson@arm.com 3449289Sandreas.hansson@arm.com#endif // __ARCH_ALPHA_FAULTS_HH__ 3459289Sandreas.hansson@arm.com