faults.hh revision 10474
1768SN/A/* 21762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 3768SN/A * All rights reserved. 4768SN/A * 5768SN/A * Redistribution and use in source and binary forms, with or without 6768SN/A * modification, are permitted provided that the following conditions are 7768SN/A * met: redistributions of source code must retain the above copyright 8768SN/A * notice, this list of conditions and the following disclaimer; 9768SN/A * redistributions in binary form must reproduce the above copyright 10768SN/A * notice, this list of conditions and the following disclaimer in the 11768SN/A * documentation and/or other materials provided with the distribution; 12768SN/A * neither the name of the copyright holders nor the names of its 13768SN/A * contributors may be used to endorse or promote products derived from 14768SN/A * this software without specific prior written permission. 15768SN/A * 16768SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17768SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18768SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19768SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20768SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21768SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22768SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23768SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24768SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25768SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26768SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665SN/A * 282665SN/A * Authors: Gabe Black 292665SN/A * Kevin Lim 302665SN/A */ 31768SN/A 32768SN/A#ifndef __ARCH_ALPHA_FAULTS_HH__ 331722SN/A#define __ARCH_ALPHA_FAULTS_HH__ 341722SN/A 35768SN/A#include "arch/alpha/pagetable.hh" 36768SN/A#include "mem/request.hh" 371401SN/A#include "sim/faults.hh" 381401SN/A 39768SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 40909SN/A 413540Sgblack@eecs.umich.edunamespace AlphaISA { 424762Snate@binkert.org 434762Snate@binkert.orgtypedef const Addr FaultVect; 44932SN/A 45768SN/Aclass AlphaFault : public FaultBase 461722SN/A{ 47885SN/A protected: 48885SN/A virtual bool skipFaultingInstruction() {return false;} 49768SN/A virtual bool setRestartAddress() {return true;} 502542SN/A public: 51768SN/A virtual ~AlphaFault() {} 52809SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 53773SN/A StaticInst::nullStaticInstPtr); 54773SN/A virtual FaultVect vect() = 0; 55768SN/A virtual FaultStat & countStat() = 0; 561854SN/A}; 571854SN/A 581854SN/Aclass MachineCheckFault : public AlphaFault 591854SN/A{ 601854SN/A private: 611854SN/A static FaultName _name; 621854SN/A static FaultVect _vect; 631854SN/A static FaultStat _count; 641854SN/A 651854SN/A public: 66768SN/A FaultName name() const {return _name;} 671854SN/A FaultVect vect() {return _vect;} 681817SN/A FaultStat & countStat() {return _count;} 691854SN/A}; 701854SN/A 711817SN/Aclass AlignmentFault : public AlphaFault 721854SN/A{ 731854SN/A private: 741817SN/A static FaultName _name; 751854SN/A static FaultVect _vect; 761854SN/A static FaultStat _count; 771854SN/A 781817SN/A public: 791817SN/A FaultName name() const {return _name;} 801854SN/A FaultVect vect() {return _vect;} 811854SN/A FaultStat & countStat() {return _count;} 821854SN/A bool isAlignmentFault() const {return true;} 831817SN/A}; 841817SN/A 851817SN/Aclass ResetFault : public AlphaFault 861817SN/A{ 871817SN/A private: 881817SN/A static FaultName _name; 891817SN/A static FaultVect _vect; 901817SN/A static FaultStat _count; 911817SN/A 921817SN/A public: 931817SN/A FaultName name() const {return _name;} 941817SN/A FaultVect vect() {return _vect;} 951817SN/A FaultStat & countStat() {return _count;} 961817SN/A}; 971817SN/A 981817SN/Aclass ArithmeticFault : public AlphaFault 991817SN/A{ 1001817SN/A private: 1011817SN/A static FaultName _name; 1021817SN/A static FaultVect _vect; 1031817SN/A static FaultStat _count; 1041817SN/A 1051817SN/A protected: 1061817SN/A bool skipFaultingInstruction() {return true;} 1071817SN/A 1081817SN/A public: 1091817SN/A FaultName name() const {return _name;} 1101817SN/A FaultVect vect() {return _vect;} 1111817SN/A FaultStat & countStat() {return _count;} 112771SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 113803SN/A StaticInst::nullStaticInstPtr); 1143932Sbinkertn@umich.edu}; 1154762Snate@binkert.org 1161817SN/Aclass InterruptFault : public AlphaFault 1171817SN/A{ 1182539SN/A private: 1191817SN/A static FaultName _name; 1201817SN/A static FaultVect _vect; 1212539SN/A static FaultStat _count; 1221817SN/A 1231817SN/A protected: 1242648SN/A bool setRestartAddress() {return false;} 125771SN/A 126885SN/A public: 1271817SN/A FaultName name() const {return _name;} 1282982SN/A FaultVect vect() {return _vect;} 1291817SN/A FaultStat & countStat() {return _count;} 1301817SN/A}; 1311854SN/A 132918SN/Aclass DtbFault : public AlphaFault 133918SN/A{ 134918SN/A protected: 1352982SN/A VAddr vaddr; 136918SN/A Request::Flags reqFlags; 137918SN/A uint64_t flags; 138918SN/A 1391854SN/A public: 1401854SN/A DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 1411817SN/A : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 142771SN/A { } 1431817SN/A FaultName name() const = 0; 1441854SN/A FaultVect vect() = 0; 145772SN/A FaultStat & countStat() = 0; 1461817SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1471854SN/A StaticInst::nullStaticInstPtr); 1481817SN/A}; 1491817SN/A 1501817SN/Aclass NDtbMissFault : public DtbFault 1511817SN/A{ 1521817SN/A private: 1531817SN/A static FaultName _name; 1541817SN/A static FaultVect _vect; 1551817SN/A static FaultStat _count; 1561817SN/A 1571817SN/A public: 1581817SN/A NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1591817SN/A : DtbFault(vaddr, reqFlags, flags) 1601817SN/A { } 1611817SN/A FaultName name() const {return _name;} 1621817SN/A FaultVect vect() {return _vect;} 1631817SN/A FaultStat & countStat() {return _count;} 1641817SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1651817SN/A StaticInst::nullStaticInstPtr); 1661817SN/A}; 1671817SN/A 1681817SN/Aclass PDtbMissFault : public DtbFault 1691817SN/A{ 1701854SN/A private: 1711854SN/A static FaultName _name; 1721854SN/A static FaultVect _vect; 1731817SN/A static FaultStat _count; 1741817SN/A 1751817SN/A public: 1761817SN/A PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1771817SN/A : DtbFault(vaddr, reqFlags, flags) 1781817SN/A { } 1791817SN/A FaultName name() const {return _name;} 1801817SN/A FaultVect vect() {return _vect;} 1811817SN/A FaultStat & countStat() {return _count;} 1821817SN/A}; 1831817SN/A 1841817SN/Aclass DtbPageFault : public DtbFault 1851817SN/A{ 1861817SN/A private: 1871817SN/A static FaultName _name; 1881817SN/A static FaultVect _vect; 1891817SN/A static FaultStat _count; 1901817SN/A 1911817SN/A public: 1921817SN/A DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1931817SN/A : DtbFault(vaddr, reqFlags, flags) 1941817SN/A { } 1951817SN/A FaultName name() const {return _name;} 1961817SN/A FaultVect vect() {return _vect;} 1971817SN/A FaultStat & countStat() {return _count;} 1981817SN/A}; 1991817SN/A 2001854SN/Aclass DtbAcvFault : public DtbFault 2011817SN/A{ 2021817SN/A private: 2031817SN/A static FaultName _name; 2041817SN/A static FaultVect _vect; 2051817SN/A static FaultStat _count; 2061817SN/A 2071817SN/A public: 2081817SN/A DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2091817SN/A : DtbFault(vaddr, reqFlags, flags) 2101817SN/A { } 2111817SN/A FaultName name() const {return _name;} 2121817SN/A FaultVect vect() {return _vect;} 2131817SN/A FaultStat & countStat() {return _count;} 2141817SN/A}; 2152648SN/A 2161817SN/Aclass DtbAlignmentFault : public DtbFault 2171817SN/A{ 2182539SN/A private: 2191817SN/A static FaultName _name; 2201817SN/A static FaultVect _vect; 2211817SN/A static FaultStat _count; 2221817SN/A 2231817SN/A public: 2241817SN/A DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 2252982SN/A : DtbFault(vaddr, reqFlags, flags) 2262982SN/A { } 2271817SN/A FaultName name() const {return _name;} 2281854SN/A FaultVect vect() {return _vect;} 2291817SN/A FaultStat & countStat() {return _count;} 2301817SN/A}; 2311817SN/A 2322982SN/Aclass ItbFault : public AlphaFault 2331817SN/A{ 2341817SN/A protected: 2351817SN/A Addr pc; 2361854SN/A 2371854SN/A public: 2381817SN/A ItbFault(Addr _pc) : pc(_pc) { } 2391817SN/A FaultName name() const = 0; 2401817SN/A FaultVect vect() = 0; 2411854SN/A FaultStat & countStat() = 0; 2421854SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 2431854SN/A StaticInst::nullStaticInstPtr); 2441817SN/A}; 2451854SN/A 2461634SN/Aclass ItbPageFault : public ItbFault 247772SN/A{ 2481817SN/A private: 2491854SN/A static FaultName _name; 2501854SN/A static FaultVect _vect; 2511854SN/A static FaultStat _count; 252772SN/A 2531854SN/A public: 254885SN/A ItbPageFault(Addr pc) : ItbFault(pc) { } 2551817SN/A FaultName name() const {return _name;} 2562539SN/A FaultVect vect() {return _vect;} 257909SN/A FaultStat & countStat() {return _count;} 2581401SN/A void invoke(ThreadContext * tc, const StaticInstPtr &inst = 2591401SN/A StaticInst::nullStaticInstPtr); 2602982SN/A}; 2611401SN/A 2621401SN/Aclass ItbAcvFault : public ItbFault 2631854SN/A{ 264918SN/A private: 2651401SN/A static FaultName _name; 2661401SN/A static FaultVect _vect; 2672982SN/A static FaultStat _count; 2681401SN/A 2691401SN/A public: 2701401SN/A ItbAcvFault(Addr pc) : ItbFault(pc) { } 2711854SN/A FaultName name() const {return _name;} 2721854SN/A FaultVect vect() {return _vect;} 2731401SN/A FaultStat & countStat() {return _count;} 274771SN/A}; 275885SN/A 276803SN/Aclass UnimplementedOpcodeFault : public AlphaFault 277885SN/A{ 278885SN/A private: 279803SN/A static FaultName _name; 280885SN/A static FaultVect _vect; 281885SN/A static FaultStat _count; 282803SN/A 283885SN/A public: 284885SN/A FaultName name() const {return _name;} 285803SN/A FaultVect vect() {return _vect;} 286769SN/A FaultStat & countStat() {return _count;} 287885SN/A}; 288885SN/A 289885SN/Aclass FloatEnableFault : public AlphaFault 290885SN/A{ 291777SN/A private: 292777SN/A static FaultName _name; 293885SN/A static FaultVect _vect; 294775SN/A static FaultStat _count; 295775SN/A 2961817SN/A public: 2971817SN/A FaultName name() const {return _name;} 298773SN/A FaultVect vect() {return _vect;} 2991817SN/A FaultStat & countStat() {return _count;} 300773SN/A}; 301885SN/A 302885SN/Aclass PalFault : public AlphaFault 303885SN/A{ 304885SN/A private: 3051817SN/A static FaultName _name; 306771SN/A static FaultVect _vect; 307768SN/A static FaultStat _count; 308891SN/A 309891SN/A protected: 310891SN/A bool skipFaultingInstruction() {return true;} 311891SN/A 3121634SN/A public: 313775SN/A FaultName name() const {return _name;} 3142539SN/A FaultVect vect() {return _vect;} 3154762Snate@binkert.org FaultStat & countStat() {return _count;} 316885SN/A}; 317885SN/A 3182539SN/Aclass IntegerOverflowFault : public AlphaFault 319885SN/A{ 3204762Snate@binkert.org private: 3214762Snate@binkert.org static FaultName _name; 3224762Snate@binkert.org static FaultVect _vect; 3234762Snate@binkert.org static FaultStat _count; 3244762Snate@binkert.org 3254762Snate@binkert.org public: 3264762Snate@binkert.org FaultName name() const {return _name;} 327768SN/A FaultVect vect() {return _vect;} 3283349SN/A FaultStat & countStat() {return _count;} 3293349SN/A}; 330768SN/A 331885SN/A} // namespace AlphaISA 332885SN/A 333885SN/A#endif // __ARCH_ALPHA_FAULTS_HH__ 334885SN/A