faults.hh revision 7678
12SN/A/* 21762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Gabe Black 292665Ssaidi@eecs.umich.edu * Kevin Lim 302SN/A */ 312SN/A 325569Snate@binkert.org#ifndef __ARCH_ALPHA_FAULTS_HH__ 335569Snate@binkert.org#define __ARCH_ALPHA_FAULTS_HH__ 342SN/A 355569Snate@binkert.org#include "arch/alpha/pagetable.hh" 363614Sgblack@eecs.umich.edu#include "config/full_system.hh" 377678Sgblack@eecs.umich.edu#include "mem/request.hh" 383614Sgblack@eecs.umich.edu#include "sim/faults.hh" 393614Sgblack@eecs.umich.edu 402166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 412147SN/A 425569Snate@binkert.orgnamespace AlphaISA { 432167SN/A 442147SN/Atypedef const Addr FaultVect; 452090SN/A 462222SN/Aclass AlphaFault : public FaultBase 472090SN/A{ 482201SN/A protected: 492201SN/A virtual bool skipFaultingInstruction() {return false;} 502201SN/A virtual bool setRestartAddress() {return true;} 512112SN/A public: 522174SN/A#if FULL_SYSTEM 537678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 547678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 552174SN/A#endif 562175SN/A virtual FaultVect vect() = 0; 572222SN/A virtual FaultStat & countStat() = 0; 582SN/A}; 592SN/A 602203SN/Aclass MachineCheckFault : public AlphaFault 612166SN/A{ 622166SN/A private: 632203SN/A static FaultName _name; 642166SN/A static FaultVect _vect; 652222SN/A static FaultStat _count; 665569Snate@binkert.org 672166SN/A public: 684695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 692166SN/A FaultVect vect() {return _vect;} 702222SN/A FaultStat & countStat() {return _count;} 714695Sgblack@eecs.umich.edu bool isMachineCheckFault() const {return true;} 722166SN/A}; 732166SN/A 742203SN/Aclass AlignmentFault : public AlphaFault 752166SN/A{ 762166SN/A private: 772203SN/A static FaultName _name; 782166SN/A static FaultVect _vect; 792222SN/A static FaultStat _count; 805569Snate@binkert.org 812166SN/A public: 824695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 832166SN/A FaultVect vect() {return _vect;} 842222SN/A FaultStat & countStat() {return _count;} 854695Sgblack@eecs.umich.edu bool isAlignmentFault() const {return true;} 862166SN/A}; 872166SN/A 882166SN/Astatic inline Fault genMachineCheckFault() 892166SN/A{ 902203SN/A return new MachineCheckFault; 912166SN/A} 922166SN/A 932147SN/Aclass ResetFault : public AlphaFault 942090SN/A{ 952147SN/A private: 962147SN/A static FaultName _name; 972147SN/A static FaultVect _vect; 982222SN/A static FaultStat _count; 995569Snate@binkert.org 1002112SN/A public: 1014695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1022147SN/A FaultVect vect() {return _vect;} 1032222SN/A FaultStat & countStat() {return _count;} 1042147SN/A}; 1052090SN/A 1062147SN/Aclass ArithmeticFault : public AlphaFault 1072090SN/A{ 1082147SN/A private: 1092147SN/A static FaultName _name; 1102147SN/A static FaultVect _vect; 1112222SN/A static FaultStat _count; 1125569Snate@binkert.org 1135569Snate@binkert.org protected: 1145569Snate@binkert.org bool skipFaultingInstruction() {return true;} 1155569Snate@binkert.org 1162112SN/A public: 1174695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1182147SN/A FaultVect vect() {return _vect;} 1192222SN/A FaultStat & countStat() {return _count;} 1202203SN/A#if FULL_SYSTEM 1217678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1227678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1232203SN/A#endif 1242147SN/A}; 1252090SN/A 1262147SN/Aclass InterruptFault : public AlphaFault 1272090SN/A{ 1282147SN/A private: 1292147SN/A static FaultName _name; 1302147SN/A static FaultVect _vect; 1312222SN/A static FaultStat _count; 1325569Snate@binkert.org 1335569Snate@binkert.org protected: 1345569Snate@binkert.org bool setRestartAddress() {return false;} 1355569Snate@binkert.org 1362112SN/A public: 1374695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1382147SN/A FaultVect vect() {return _vect;} 1392222SN/A FaultStat & countStat() {return _count;} 1402147SN/A}; 1412090SN/A 1422502SN/Aclass DtbFault : public AlphaFault 1432502SN/A{ 1444997Sgblack@eecs.umich.edu protected: 1455568Snate@binkert.org VAddr vaddr; 1465736Snate@binkert.org Request::Flags reqFlags; 1472502SN/A uint64_t flags; 1485569Snate@binkert.org 1492502SN/A public: 1505736Snate@binkert.org DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 1512502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1522502SN/A { } 1534695Sgblack@eecs.umich.edu FaultName name() const = 0; 1542502SN/A FaultVect vect() = 0; 1552502SN/A FaultStat & countStat() = 0; 1562502SN/A#if FULL_SYSTEM 1577678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1587678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1592502SN/A#endif 1602502SN/A}; 1612502SN/A 1622502SN/Aclass NDtbMissFault : public DtbFault 1632090SN/A{ 1642147SN/A private: 1652147SN/A static FaultName _name; 1662147SN/A static FaultVect _vect; 1672222SN/A static FaultStat _count; 1685569Snate@binkert.org 1692112SN/A public: 1705736Snate@binkert.org NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1712502SN/A : DtbFault(vaddr, reqFlags, flags) 1722502SN/A { } 1734695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1742147SN/A FaultVect vect() {return _vect;} 1752222SN/A FaultStat & countStat() {return _count;} 1764997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 1777678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 1787678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 1794997Sgblack@eecs.umich.edu#endif 1802147SN/A}; 1812090SN/A 1822502SN/Aclass PDtbMissFault : public DtbFault 1832090SN/A{ 1842147SN/A private: 1852147SN/A static FaultName _name; 1862147SN/A static FaultVect _vect; 1872222SN/A static FaultStat _count; 1885569Snate@binkert.org 1892112SN/A public: 1905736Snate@binkert.org PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1912502SN/A : DtbFault(vaddr, reqFlags, flags) 1922502SN/A { } 1934695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1942147SN/A FaultVect vect() {return _vect;} 1952222SN/A FaultStat & countStat() {return _count;} 1962147SN/A}; 1972090SN/A 1982502SN/Aclass DtbPageFault : public DtbFault 1992090SN/A{ 2002147SN/A private: 2012147SN/A static FaultName _name; 2022147SN/A static FaultVect _vect; 2032222SN/A static FaultStat _count; 2045569Snate@binkert.org 2052112SN/A public: 2065736Snate@binkert.org DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2072502SN/A : DtbFault(vaddr, reqFlags, flags) 2082502SN/A { } 2094695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2102147SN/A FaultVect vect() {return _vect;} 2112222SN/A FaultStat & countStat() {return _count;} 2122147SN/A}; 2132090SN/A 2142502SN/Aclass DtbAcvFault : public DtbFault 2152090SN/A{ 2162147SN/A private: 2172147SN/A static FaultName _name; 2182147SN/A static FaultVect _vect; 2192222SN/A static FaultStat _count; 2205569Snate@binkert.org 2212112SN/A public: 2225736Snate@binkert.org DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2232502SN/A : DtbFault(vaddr, reqFlags, flags) 2242502SN/A { } 2254695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2262147SN/A FaultVect vect() {return _vect;} 2272222SN/A FaultStat & countStat() {return _count;} 2282147SN/A}; 2292090SN/A 2302502SN/Aclass DtbAlignmentFault : public DtbFault 2312090SN/A{ 2322147SN/A private: 2332147SN/A static FaultName _name; 2342147SN/A static FaultVect _vect; 2352222SN/A static FaultStat _count; 2365569Snate@binkert.org 2372112SN/A public: 2385736Snate@binkert.org DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2392502SN/A : DtbFault(vaddr, reqFlags, flags) 2402502SN/A { } 2414695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2422147SN/A FaultVect vect() {return _vect;} 2432222SN/A FaultStat & countStat() {return _count;} 2442147SN/A}; 2452090SN/A 2462502SN/Aclass ItbFault : public AlphaFault 2472502SN/A{ 2484997Sgblack@eecs.umich.edu protected: 2492502SN/A Addr pc; 2505569Snate@binkert.org 2512502SN/A public: 2525569Snate@binkert.org ItbFault(Addr _pc) : pc(_pc) { } 2534695Sgblack@eecs.umich.edu FaultName name() const = 0; 2542505SN/A FaultVect vect() = 0; 2552505SN/A FaultStat & countStat() = 0; 2562502SN/A#if FULL_SYSTEM 2577678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2587678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2592502SN/A#endif 2602502SN/A}; 2612502SN/A 2622502SN/Aclass ItbPageFault : public ItbFault 2632090SN/A{ 2642147SN/A private: 2652147SN/A static FaultName _name; 2662147SN/A static FaultVect _vect; 2672222SN/A static FaultStat _count; 2685569Snate@binkert.org 2692112SN/A public: 2705569Snate@binkert.org ItbPageFault(Addr pc) : ItbFault(pc) { } 2714695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2722502SN/A FaultVect vect() {return _vect;} 2732502SN/A FaultStat & countStat() {return _count;} 2744997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 2757678Sgblack@eecs.umich.edu void invoke(ThreadContext * tc, 2767678Sgblack@eecs.umich.edu StaticInstPtr inst = StaticInst::nullStaticInstPtr); 2774997Sgblack@eecs.umich.edu#endif 2782502SN/A}; 2792502SN/A 2802502SN/Aclass ItbAcvFault : public ItbFault 2812502SN/A{ 2822502SN/A private: 2832502SN/A static FaultName _name; 2842502SN/A static FaultVect _vect; 2852502SN/A static FaultStat _count; 2865569Snate@binkert.org 2872502SN/A public: 2885569Snate@binkert.org ItbAcvFault(Addr pc) : ItbFault(pc) { } 2894695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2902147SN/A FaultVect vect() {return _vect;} 2912222SN/A FaultStat & countStat() {return _count;} 2922147SN/A}; 2932090SN/A 2942147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 2952090SN/A{ 2962147SN/A private: 2972147SN/A static FaultName _name; 2982147SN/A static FaultVect _vect; 2992222SN/A static FaultStat _count; 3005569Snate@binkert.org 3012112SN/A public: 3024695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3032147SN/A FaultVect vect() {return _vect;} 3042222SN/A FaultStat & countStat() {return _count;} 3052147SN/A}; 3062090SN/A 3072147SN/Aclass FloatEnableFault : public AlphaFault 3082090SN/A{ 3092147SN/A private: 3102147SN/A static FaultName _name; 3112147SN/A static FaultVect _vect; 3122222SN/A static FaultStat _count; 3135569Snate@binkert.org 3142112SN/A public: 3154695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3162147SN/A FaultVect vect() {return _vect;} 3172222SN/A FaultStat & countStat() {return _count;} 3182147SN/A}; 3192090SN/A 3202147SN/Aclass PalFault : public AlphaFault 3212090SN/A{ 3222147SN/A private: 3232147SN/A static FaultName _name; 3242147SN/A static FaultVect _vect; 3252222SN/A static FaultStat _count; 3265569Snate@binkert.org 3275569Snate@binkert.org protected: 3285569Snate@binkert.org bool skipFaultingInstruction() {return true;} 3295569Snate@binkert.org 3302112SN/A public: 3314695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3322147SN/A FaultVect vect() {return _vect;} 3332222SN/A FaultStat & countStat() {return _count;} 3342147SN/A}; 3352090SN/A 3362147SN/Aclass IntegerOverflowFault : public AlphaFault 3372090SN/A{ 3382147SN/A private: 3392147SN/A static FaultName _name; 3402147SN/A static FaultVect _vect; 3412222SN/A static FaultStat _count; 3425569Snate@binkert.org 3432112SN/A public: 3444695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3452147SN/A FaultVect vect() {return _vect;} 3462222SN/A FaultStat & countStat() {return _count;} 3472147SN/A}; 3482090SN/A 3495569Snate@binkert.org} // namespace AlphaISA 3502167SN/A 3515569Snate@binkert.org#endif // __ARCH_ALPHA_FAULTS_HH__ 352