faults.hh revision 11877
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" 367678Sgblack@eecs.umich.edu#include "mem/request.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 4311294Sandreas.hansson@arm.comtypedef 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: 5110474Sandreas.hansson@arm.com virtual ~AlphaFault() {} 5210417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 5310417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 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;} 692166SN/A}; 702166SN/A 712203SN/Aclass AlignmentFault : public AlphaFault 722166SN/A{ 732166SN/A private: 742203SN/A static FaultName _name; 752166SN/A static FaultVect _vect; 762222SN/A static FaultStat _count; 775569Snate@binkert.org 782166SN/A public: 794695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 802166SN/A FaultVect vect() {return _vect;} 812222SN/A FaultStat & countStat() {return _count;} 824695Sgblack@eecs.umich.edu bool isAlignmentFault() const {return true;} 832166SN/A}; 842166SN/A 852147SN/Aclass ResetFault : public AlphaFault 862090SN/A{ 872147SN/A private: 882147SN/A static FaultName _name; 892147SN/A static FaultVect _vect; 902222SN/A static FaultStat _count; 915569Snate@binkert.org 922112SN/A public: 934695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 942147SN/A FaultVect vect() {return _vect;} 952222SN/A FaultStat & countStat() {return _count;} 962147SN/A}; 972090SN/A 982147SN/Aclass ArithmeticFault : public AlphaFault 992090SN/A{ 1002147SN/A private: 1012147SN/A static FaultName _name; 1022147SN/A static FaultVect _vect; 1032222SN/A static FaultStat _count; 1045569Snate@binkert.org 1055569Snate@binkert.org protected: 1065569Snate@binkert.org bool skipFaultingInstruction() {return true;} 1075569Snate@binkert.org 1082112SN/A public: 1094695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1102147SN/A FaultVect vect() {return _vect;} 1112222SN/A FaultStat & countStat() {return _count;} 11210417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 11310417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 1142147SN/A}; 1152090SN/A 1162147SN/Aclass InterruptFault : public AlphaFault 1172090SN/A{ 1182147SN/A private: 1192147SN/A static FaultName _name; 1202147SN/A static FaultVect _vect; 1212222SN/A static FaultStat _count; 1225569Snate@binkert.org 1235569Snate@binkert.org protected: 1245569Snate@binkert.org bool setRestartAddress() {return false;} 1255569Snate@binkert.org 1262112SN/A public: 1274695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1282147SN/A FaultVect vect() {return _vect;} 1292222SN/A FaultStat & countStat() {return _count;} 1302147SN/A}; 1312090SN/A 1322502SN/Aclass DtbFault : public AlphaFault 1332502SN/A{ 1344997Sgblack@eecs.umich.edu protected: 1355568Snate@binkert.org VAddr vaddr; 1365736Snate@binkert.org Request::Flags reqFlags; 1372502SN/A uint64_t flags; 1385569Snate@binkert.org 1392502SN/A public: 1405736Snate@binkert.org DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 1412502SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1422502SN/A { } 1434695Sgblack@eecs.umich.edu FaultName name() const = 0; 1442502SN/A FaultVect vect() = 0; 1452502SN/A FaultStat & countStat() = 0; 14610417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 14710417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 1482502SN/A}; 1492502SN/A 1502502SN/Aclass NDtbMissFault : public DtbFault 1512090SN/A{ 1522147SN/A private: 1532147SN/A static FaultName _name; 1542147SN/A static FaultVect _vect; 1552222SN/A static FaultStat _count; 1565569Snate@binkert.org 1572112SN/A public: 1585736Snate@binkert.org NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1592502SN/A : DtbFault(vaddr, reqFlags, flags) 1602502SN/A { } 1614695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1622147SN/A FaultVect vect() {return _vect;} 1632222SN/A FaultStat & countStat() {return _count;} 16410417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 16510417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 1662147SN/A}; 1672090SN/A 1682502SN/Aclass PDtbMissFault : public DtbFault 1692090SN/A{ 1702147SN/A private: 1712147SN/A static FaultName _name; 1722147SN/A static FaultVect _vect; 1732222SN/A static FaultStat _count; 1745569Snate@binkert.org 1752112SN/A public: 1765736Snate@binkert.org PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1772502SN/A : DtbFault(vaddr, reqFlags, flags) 1782502SN/A { } 1794695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1802147SN/A FaultVect vect() {return _vect;} 1812222SN/A FaultStat & countStat() {return _count;} 1822147SN/A}; 1832090SN/A 1842502SN/Aclass DtbPageFault : public DtbFault 1852090SN/A{ 1862147SN/A private: 1872147SN/A static FaultName _name; 1882147SN/A static FaultVect _vect; 1892222SN/A static FaultStat _count; 1905569Snate@binkert.org 1912112SN/A public: 1925736Snate@binkert.org DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1932502SN/A : DtbFault(vaddr, reqFlags, flags) 1942502SN/A { } 1954695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 1962147SN/A FaultVect vect() {return _vect;} 1972222SN/A FaultStat & countStat() {return _count;} 1982147SN/A}; 1992090SN/A 2002502SN/Aclass DtbAcvFault : public DtbFault 2012090SN/A{ 2022147SN/A private: 2032147SN/A static FaultName _name; 2042147SN/A static FaultVect _vect; 2052222SN/A static FaultStat _count; 2065569Snate@binkert.org 2072112SN/A public: 2085736Snate@binkert.org DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2092502SN/A : DtbFault(vaddr, reqFlags, flags) 2102502SN/A { } 2114695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2122147SN/A FaultVect vect() {return _vect;} 2132222SN/A FaultStat & countStat() {return _count;} 2142147SN/A}; 2152090SN/A 2162502SN/Aclass DtbAlignmentFault : public DtbFault 2172090SN/A{ 2182147SN/A private: 2192147SN/A static FaultName _name; 2202147SN/A static FaultVect _vect; 2212222SN/A static FaultStat _count; 2225569Snate@binkert.org 2232112SN/A public: 2245736Snate@binkert.org DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2252502SN/A : DtbFault(vaddr, reqFlags, flags) 2262502SN/A { } 2274695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2282147SN/A FaultVect vect() {return _vect;} 2292222SN/A FaultStat & countStat() {return _count;} 2302147SN/A}; 2312090SN/A 2322502SN/Aclass ItbFault : public AlphaFault 2332502SN/A{ 2344997Sgblack@eecs.umich.edu protected: 2352502SN/A Addr pc; 2365569Snate@binkert.org 2372502SN/A public: 2385569Snate@binkert.org ItbFault(Addr _pc) : pc(_pc) { } 2394695Sgblack@eecs.umich.edu FaultName name() const = 0; 2402505SN/A FaultVect vect() = 0; 2412505SN/A FaultStat & countStat() = 0; 24210417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 24310417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 2442502SN/A}; 2452502SN/A 2462502SN/Aclass ItbPageFault : public ItbFault 2472090SN/A{ 2482147SN/A private: 2492147SN/A static FaultName _name; 2502147SN/A static FaultVect _vect; 2512222SN/A static FaultStat _count; 2525569Snate@binkert.org 2532112SN/A public: 2545569Snate@binkert.org ItbPageFault(Addr pc) : ItbFault(pc) { } 2554695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2562502SN/A FaultVect vect() {return _vect;} 2572502SN/A FaultStat & countStat() {return _count;} 25810417Sandreas.hansson@arm.com void invoke(ThreadContext * tc, const StaticInstPtr &inst = 25910417Sandreas.hansson@arm.com StaticInst::nullStaticInstPtr); 2602502SN/A}; 2612502SN/A 2622502SN/Aclass ItbAcvFault : public ItbFault 2632502SN/A{ 2642502SN/A private: 2652502SN/A static FaultName _name; 2662502SN/A static FaultVect _vect; 2672502SN/A static FaultStat _count; 2685569Snate@binkert.org 2692502SN/A public: 2705569Snate@binkert.org ItbAcvFault(Addr pc) : ItbFault(pc) { } 2714695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2722147SN/A FaultVect vect() {return _vect;} 2732222SN/A FaultStat & countStat() {return _count;} 2742147SN/A}; 2752090SN/A 2762147SN/Aclass UnimplementedOpcodeFault : public AlphaFault 2772090SN/A{ 2782147SN/A private: 2792147SN/A static FaultName _name; 2802147SN/A static FaultVect _vect; 2812222SN/A static FaultStat _count; 2825569Snate@binkert.org 2832112SN/A public: 2844695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2852147SN/A FaultVect vect() {return _vect;} 2862222SN/A FaultStat & countStat() {return _count;} 2872147SN/A}; 2882090SN/A 2892147SN/Aclass FloatEnableFault : public AlphaFault 2902090SN/A{ 2912147SN/A private: 2922147SN/A static FaultName _name; 2932147SN/A static FaultVect _vect; 2942222SN/A static FaultStat _count; 2955569Snate@binkert.org 2962112SN/A public: 2974695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 2982147SN/A FaultVect vect() {return _vect;} 2992222SN/A FaultStat & countStat() {return _count;} 3002147SN/A}; 3012090SN/A 3022147SN/Aclass PalFault : public AlphaFault 3032090SN/A{ 3042147SN/A private: 3052147SN/A static FaultName _name; 3062147SN/A static FaultVect _vect; 3072222SN/A static FaultStat _count; 3085569Snate@binkert.org 3095569Snate@binkert.org protected: 3105569Snate@binkert.org bool skipFaultingInstruction() {return true;} 3115569Snate@binkert.org 3122112SN/A public: 3134695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3142147SN/A FaultVect vect() {return _vect;} 3152222SN/A FaultStat & countStat() {return _count;} 3162147SN/A}; 3172090SN/A 3182147SN/Aclass IntegerOverflowFault : public AlphaFault 3192090SN/A{ 3202147SN/A private: 3212147SN/A static FaultName _name; 3222147SN/A static FaultVect _vect; 3232222SN/A static FaultStat _count; 3245569Snate@binkert.org 3252112SN/A public: 3264695Sgblack@eecs.umich.edu FaultName name() const {return _name;} 3272147SN/A FaultVect vect() {return _vect;} 3282222SN/A FaultStat & countStat() {return _count;} 3292147SN/A}; 3302090SN/A 3315569Snate@binkert.org} // namespace AlphaISA 3322167SN/A 3335569Snate@binkert.org#endif // __ARCH_ALPHA_FAULTS_HH__ 334