faults.hh revision 5569
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" 373614Sgblack@eecs.umich.edu#include "sim/faults.hh" 383614Sgblack@eecs.umich.edu 392166SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 402147SN/A 415569Snate@binkert.orgnamespace AlphaISA { 422167SN/A 432147SN/Atypedef const Addr FaultVect; 442090SN/A 452222SN/Aclass AlphaFault : public FaultBase 462090SN/A{ 472201SN/A protected: 482201SN/A virtual bool skipFaultingInstruction() {return false;} 492201SN/A virtual bool setRestartAddress() {return true;} 502112SN/A public: 512174SN/A#if FULL_SYSTEM 522680Sktlim@umich.edu void invoke(ThreadContext * tc); 532174SN/A#endif 542175SN/A virtual FaultVect vect() = 0; 552222SN/A virtual FaultStat & countStat() = 0; 562SN/A}; 572SN/A 582203SN/Aclass MachineCheckFault : public AlphaFault 592166SN/A{ 602166SN/A private: 612203SN/A static FaultName _name; 622166SN/A static FaultVect _vect; 632222SN/A static FaultStat _count; 645569Snate@binkert.org 652166SN/A public: 664695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 672166SN/A FaultVect vect() {return _vect;} 682222SN/A FaultStat & countStat() {return _count;} 694695Sgblack@eecs.umich.edu bool isMachineCheckFault() const {return true;} 702166SN/A}; 712166SN/A 722203SN/Aclass AlignmentFault : public AlphaFault 732166SN/A{ 742166SN/A private: 752203SN/A static FaultName _name; 762166SN/A static FaultVect _vect; 772222SN/A static FaultStat _count; 785569Snate@binkert.org 792166SN/A public: 804695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 812166SN/A FaultVect vect() {return _vect;} 822222SN/A FaultStat & countStat() {return _count;} 834695Sgblack@eecs.umich.edu bool isAlignmentFault() const {return true;} 842166SN/A}; 852166SN/A 862166SN/Astatic inline Fault genMachineCheckFault() 872166SN/A{ 882203SN/A return new MachineCheckFault; 892166SN/A} 902166SN/A 912147SN/Aclass ResetFault : public AlphaFault 922090SN/A{ 932147SN/A private: 942147SN/A static FaultName _name; 952147SN/A static FaultVect _vect; 962222SN/A static FaultStat _count; 975569Snate@binkert.org 982112SN/A public: 994695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1002147SN/A FaultVect vect() {return _vect;} 1012222SN/A FaultStat & countStat() {return _count;} 1022147SN/A}; 1032090SN/A 1042147SN/Aclass ArithmeticFault : public AlphaFault 1052090SN/A{ 1062147SN/A private: 1072147SN/A static FaultName _name; 1082147SN/A static FaultVect _vect; 1092222SN/A static FaultStat _count; 1105569Snate@binkert.org 1115569Snate@binkert.org protected: 1125569Snate@binkert.org bool skipFaultingInstruction() {return true;} 1135569Snate@binkert.org 1142112SN/A public: 1154695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1162147SN/A FaultVect vect() {return _vect;} 1172222SN/A FaultStat & countStat() {return _count;} 1182203SN/A#if FULL_SYSTEM 1192680Sktlim@umich.edu void invoke(ThreadContext * tc); 1202203SN/A#endif 1212147SN/A}; 1222090SN/A 1232147SN/Aclass InterruptFault : public AlphaFault 1242090SN/A{ 1252147SN/A private: 1262147SN/A static FaultName _name; 1272147SN/A static FaultVect _vect; 1282222SN/A static FaultStat _count; 1295569Snate@binkert.org 1305569Snate@binkert.org protected: 1315569Snate@binkert.org bool setRestartAddress() {return false;} 1325569Snate@binkert.org 1332112SN/A public: 1344695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1352147SN/A FaultVect vect() {return _vect;} 1362222SN/A FaultStat & countStat() {return _count;} 1372147SN/A}; 1382090SN/A 1392502SN/Aclass DtbFault : public AlphaFault 1402502SN/A{ 1414997Sgblack@eecs.umich.edu protected: 1425568Snate@binkert.org VAddr vaddr; 1432502SN/A uint32_t reqFlags; 1442502SN/A uint64_t flags; 1455569Snate@binkert.org 1462502SN/A public: 1475568Snate@binkert.org DtbFault(VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 1482502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1492502SN/A { } 1504695Sgblack@eecs.umich.edu FaultName name() const = 0; 1512502SN/A FaultVect vect() = 0; 1522502SN/A FaultStat & countStat() = 0; 1532502SN/A#if FULL_SYSTEM 1542680Sktlim@umich.edu void invoke(ThreadContext * tc); 1552502SN/A#endif 1562502SN/A}; 1572502SN/A 1582502SN/Aclass NDtbMissFault : public DtbFault 1592090SN/A{ 1602147SN/A private: 1612147SN/A static FaultName _name; 1622147SN/A static FaultVect _vect; 1632222SN/A static FaultStat _count; 1645569Snate@binkert.org 1652112SN/A public: 1665568Snate@binkert.org NDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1672502SN/A : DtbFault(vaddr, reqFlags, flags) 1682502SN/A { } 1694695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1702147SN/A FaultVect vect() {return _vect;} 1712222SN/A FaultStat & countStat() {return _count;} 1724997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 1734997Sgblack@eecs.umich.edu void invoke(ThreadContext * tc); 1744997Sgblack@eecs.umich.edu#endif 1752147SN/A}; 1762090SN/A 1772502SN/Aclass PDtbMissFault : public DtbFault 1782090SN/A{ 1792147SN/A private: 1802147SN/A static FaultName _name; 1812147SN/A static FaultVect _vect; 1822222SN/A static FaultStat _count; 1835569Snate@binkert.org 1842112SN/A public: 1855568Snate@binkert.org PDtbMissFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 1862502SN/A : DtbFault(vaddr, reqFlags, flags) 1872502SN/A { } 1884695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1892147SN/A FaultVect vect() {return _vect;} 1902222SN/A FaultStat & countStat() {return _count;} 1912147SN/A}; 1922090SN/A 1932502SN/Aclass DtbPageFault : public DtbFault 1942090SN/A{ 1952147SN/A private: 1962147SN/A static FaultName _name; 1972147SN/A static FaultVect _vect; 1982222SN/A static FaultStat _count; 1995569Snate@binkert.org 2002112SN/A public: 2015568Snate@binkert.org DtbPageFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2022502SN/A : DtbFault(vaddr, reqFlags, flags) 2032502SN/A { } 2044695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2052147SN/A FaultVect vect() {return _vect;} 2062222SN/A FaultStat & countStat() {return _count;} 2072147SN/A}; 2082090SN/A 2092502SN/Aclass DtbAcvFault : public DtbFault 2102090SN/A{ 2112147SN/A private: 2122147SN/A static FaultName _name; 2132147SN/A static FaultVect _vect; 2142222SN/A static FaultStat _count; 2155569Snate@binkert.org 2162112SN/A public: 2175568Snate@binkert.org DtbAcvFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2182502SN/A : DtbFault(vaddr, reqFlags, flags) 2192502SN/A { } 2204695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2212147SN/A FaultVect vect() {return _vect;} 2222222SN/A FaultStat & countStat() {return _count;} 2232147SN/A}; 2242090SN/A 2252502SN/Aclass DtbAlignmentFault : public DtbFault 2262090SN/A{ 2272147SN/A private: 2282147SN/A static FaultName _name; 2292147SN/A static FaultVect _vect; 2302222SN/A static FaultStat _count; 2315569Snate@binkert.org 2322112SN/A public: 2335568Snate@binkert.org DtbAlignmentFault(VAddr vaddr, uint32_t reqFlags, uint64_t flags) 2342502SN/A : DtbFault(vaddr, reqFlags, flags) 2352502SN/A { } 2364695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2372147SN/A FaultVect vect() {return _vect;} 2382222SN/A FaultStat & countStat() {return _count;} 2392147SN/A}; 2402090SN/A 2412502SN/Aclass ItbFault : public AlphaFault 2422502SN/A{ 2434997Sgblack@eecs.umich.edu protected: 2442502SN/A Addr pc; 2455569Snate@binkert.org 2462502SN/A public: 2475569Snate@binkert.org ItbFault(Addr _pc) : pc(_pc) { } 2484695Sgblack@eecs.umich.edu FaultName name() const = 0; 2492505SN/A FaultVect vect() = 0; 2502505SN/A FaultStat & countStat() = 0; 2512502SN/A#if FULL_SYSTEM 2522680Sktlim@umich.edu void invoke(ThreadContext * tc); 2532502SN/A#endif 2542502SN/A}; 2552502SN/A 2562502SN/Aclass ItbPageFault : public ItbFault 2572090SN/A{ 2582147SN/A private: 2592147SN/A static FaultName _name; 2602147SN/A static FaultVect _vect; 2612222SN/A static FaultStat _count; 2625569Snate@binkert.org 2632112SN/A public: 2645569Snate@binkert.org ItbPageFault(Addr pc) : ItbFault(pc) { } 2654695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2662502SN/A FaultVect vect() {return _vect;} 2672502SN/A FaultStat & countStat() {return _count;} 2684997Sgblack@eecs.umich.edu#if !FULL_SYSTEM 2694997Sgblack@eecs.umich.edu void invoke(ThreadContext * tc); 2704997Sgblack@eecs.umich.edu#endif 2712502SN/A}; 2722502SN/A 2732502SN/Aclass ItbAcvFault : public ItbFault 2742502SN/A{ 2752502SN/A private: 2762502SN/A static FaultName _name; 2772502SN/A static FaultVect _vect; 2782502SN/A static FaultStat _count; 2795569Snate@binkert.org 2802502SN/A public: 2815569Snate@binkert.org ItbAcvFault(Addr pc) : ItbFault(pc) { } 2824695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2832147SN/A FaultVect vect() {return _vect;} 2842222SN/A FaultStat & countStat() {return _count;} 2852147SN/A}; 2862090SN/A 2872147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 2882090SN/A{ 2892147SN/A private: 2902147SN/A static FaultName _name; 2912147SN/A static FaultVect _vect; 2922222SN/A static FaultStat _count; 2935569Snate@binkert.org 2942112SN/A public: 2954695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2962147SN/A FaultVect vect() {return _vect;} 2972222SN/A FaultStat & countStat() {return _count;} 2982147SN/A}; 2992090SN/A 3002147SN/Aclass FloatEnableFault : public AlphaFault 3012090SN/A{ 3022147SN/A private: 3032147SN/A static FaultName _name; 3042147SN/A static FaultVect _vect; 3052222SN/A static FaultStat _count; 3065569Snate@binkert.org 3072112SN/A public: 3084695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3092147SN/A FaultVect vect() {return _vect;} 3102222SN/A FaultStat & countStat() {return _count;} 3112147SN/A}; 3122090SN/A 3132147SN/Aclass PalFault : public AlphaFault 3142090SN/A{ 3152147SN/A private: 3162147SN/A static FaultName _name; 3172147SN/A static FaultVect _vect; 3182222SN/A static FaultStat _count; 3195569Snate@binkert.org 3205569Snate@binkert.org protected: 3215569Snate@binkert.org bool skipFaultingInstruction() {return true;} 3225569Snate@binkert.org 3232112SN/A public: 3244695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3252147SN/A FaultVect vect() {return _vect;} 3262222SN/A FaultStat & countStat() {return _count;} 3272147SN/A}; 3282090SN/A 3292147SN/Aclass IntegerOverflowFault : public AlphaFault 3302090SN/A{ 3312147SN/A private: 3322147SN/A static FaultName _name; 3332147SN/A static FaultVect _vect; 3342222SN/A static FaultStat _count; 3355569Snate@binkert.org 3362112SN/A public: 3374695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3382147SN/A FaultVect vect() {return _vect;} 3392222SN/A FaultStat & countStat() {return _count;} 3402147SN/A}; 3412090SN/A 3425569Snate@binkert.org} // namespace AlphaISA 3432167SN/A 3445569Snate@binkert.org#endif // __ARCH_ALPHA_FAULTS_HH__ 345