faults.hh revision 12110:c24ee249b8ba
12929Sktlim@umich.edu/*
22929Sktlim@umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
32932Sktlim@umich.edu * All rights reserved.
42929Sktlim@umich.edu *
52929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without
62929Sktlim@umich.edu * modification, are permitted provided that the following conditions are
72929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright
82929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer;
92929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright
102929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the
112929Sktlim@umich.edu * documentation and/or other materials provided with the distribution;
122929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its
132929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from
142929Sktlim@umich.edu * this software without specific prior written permission.
152929Sktlim@umich.edu *
162929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272929Sktlim@umich.edu *
282932Sktlim@umich.edu * Authors: Gabe Black
292932Sktlim@umich.edu *          Kevin Lim
302932Sktlim@umich.edu */
312929Sktlim@umich.edu
326007Ssteve.reinhardt@amd.com#ifndef __ARCH_ALPHA_FAULTS_HH__
337735SAli.Saidi@ARM.com#define __ARCH_ALPHA_FAULTS_HH__
342929Sktlim@umich.edu
352929Sktlim@umich.edu#include "arch/alpha/pagetable.hh"
362929Sktlim@umich.edu#include "mem/request.hh"
372929Sktlim@umich.edu#include "sim/faults.hh"
382929Sktlim@umich.edu
392929Sktlim@umich.edu// The design of the "name" and "vect" functions is in sim/faults.hh
402929Sktlim@umich.edu
418947Sandreas.hansson@arm.comnamespace AlphaISA {
428947Sandreas.hansson@arm.com
438947Sandreas.hansson@arm.comtypedef Addr FaultVect;
442929Sktlim@umich.edu
452929Sktlim@umich.educlass AlphaFault : public FaultBase
462929Sktlim@umich.edu{
472929Sktlim@umich.edu  protected:
482929Sktlim@umich.edu    virtual bool skipFaultingInstruction() {return false;}
492929Sktlim@umich.edu    virtual bool setRestartAddress() {return true;}
506007Ssteve.reinhardt@amd.com  public:
516007Ssteve.reinhardt@amd.com    virtual ~AlphaFault() {}
526007Ssteve.reinhardt@amd.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
536007Ssteve.reinhardt@amd.com                StaticInst::nullStaticInstPtr);
546007Ssteve.reinhardt@amd.com    virtual FaultVect vect() = 0;
556007Ssteve.reinhardt@amd.com    virtual FaultStat & countStat() = 0;
566007Ssteve.reinhardt@amd.com};
576007Ssteve.reinhardt@amd.com
586007Ssteve.reinhardt@amd.comclass MachineCheckFault : public AlphaFault
596007Ssteve.reinhardt@amd.com{
606007Ssteve.reinhardt@amd.com  private:
616007Ssteve.reinhardt@amd.com    static FaultName _name;
626007Ssteve.reinhardt@amd.com    static FaultVect _vect;
636007Ssteve.reinhardt@amd.com    static FaultStat _count;
646007Ssteve.reinhardt@amd.com
656007Ssteve.reinhardt@amd.com  public:
666007Ssteve.reinhardt@amd.com    FaultName name() const {return _name;}
676007Ssteve.reinhardt@amd.com    FaultVect vect() {return _vect;}
686007Ssteve.reinhardt@amd.com    FaultStat & countStat() {return _count;}
696007Ssteve.reinhardt@amd.com};
706007Ssteve.reinhardt@amd.com
716007Ssteve.reinhardt@amd.comclass AlignmentFault : public AlphaFault
726007Ssteve.reinhardt@amd.com{
736007Ssteve.reinhardt@amd.com  private:
746007Ssteve.reinhardt@amd.com    static FaultName _name;
756007Ssteve.reinhardt@amd.com    static FaultVect _vect;
766007Ssteve.reinhardt@amd.com    static FaultStat _count;
776007Ssteve.reinhardt@amd.com
786007Ssteve.reinhardt@amd.com  public:
792929Sktlim@umich.edu    FaultName name() const {return _name;}
802929Sktlim@umich.edu    FaultVect vect() {return _vect;}
812929Sktlim@umich.edu    FaultStat & countStat() {return _count;}
826007Ssteve.reinhardt@amd.com    bool isAlignmentFault() const {return true;}
836007Ssteve.reinhardt@amd.com};
846007Ssteve.reinhardt@amd.com
856007Ssteve.reinhardt@amd.comclass ResetFault : public AlphaFault
866007Ssteve.reinhardt@amd.com{
876007Ssteve.reinhardt@amd.com  private:
882929Sktlim@umich.edu    static FaultName _name;
892929Sktlim@umich.edu    static FaultVect _vect;
902929Sktlim@umich.edu    static FaultStat _count;
912929Sktlim@umich.edu
922929Sktlim@umich.edu  public:
936011Ssteve.reinhardt@amd.com    FaultName name() const {return _name;}
946007Ssteve.reinhardt@amd.com    FaultVect vect() {return _vect;}
956007Ssteve.reinhardt@amd.com    FaultStat & countStat() {return _count;}
966007Ssteve.reinhardt@amd.com};
976007Ssteve.reinhardt@amd.com
986007Ssteve.reinhardt@amd.comclass ArithmeticFault : public AlphaFault
996007Ssteve.reinhardt@amd.com{
1006007Ssteve.reinhardt@amd.com  private:
1016007Ssteve.reinhardt@amd.com    static FaultName _name;
1026007Ssteve.reinhardt@amd.com    static FaultVect _vect;
1036007Ssteve.reinhardt@amd.com    static FaultStat _count;
1046007Ssteve.reinhardt@amd.com
1056007Ssteve.reinhardt@amd.com  protected:
1066007Ssteve.reinhardt@amd.com    bool skipFaultingInstruction() {return true;}
1076007Ssteve.reinhardt@amd.com
1087735SAli.Saidi@ARM.com  public:
1096011Ssteve.reinhardt@amd.com    FaultName name() const {return _name;}
1106007Ssteve.reinhardt@amd.com    FaultVect vect() {return _vect;}
1116007Ssteve.reinhardt@amd.com    FaultStat & countStat() {return _count;}
1126007Ssteve.reinhardt@amd.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1136007Ssteve.reinhardt@amd.com                StaticInst::nullStaticInstPtr);
1147735SAli.Saidi@ARM.com};
1157735SAli.Saidi@ARM.com
1167735SAli.Saidi@ARM.comclass InterruptFault : public AlphaFault
1177735SAli.Saidi@ARM.com{
1187735SAli.Saidi@ARM.com  private:
1197735SAli.Saidi@ARM.com    static FaultName _name;
1207735SAli.Saidi@ARM.com    static FaultVect _vect;
1217735SAli.Saidi@ARM.com    static FaultStat _count;
1227735SAli.Saidi@ARM.com
1237735SAli.Saidi@ARM.com  protected:
1247735SAli.Saidi@ARM.com    bool setRestartAddress() {return false;}
1257735SAli.Saidi@ARM.com
1267735SAli.Saidi@ARM.com  public:
1277735SAli.Saidi@ARM.com    FaultName name() const {return _name;}
1286007Ssteve.reinhardt@amd.com    FaultVect vect() {return _vect;}
1298599Ssteve.reinhardt@amd.com    FaultStat & countStat() {return _count;}
1308599Ssteve.reinhardt@amd.com};
1318599Ssteve.reinhardt@amd.com
1326007Ssteve.reinhardt@amd.comclass DtbFault : public AlphaFault
1336011Ssteve.reinhardt@amd.com{
1346007Ssteve.reinhardt@amd.com  protected:
1356007Ssteve.reinhardt@amd.com    VAddr vaddr;
1366007Ssteve.reinhardt@amd.com    Request::Flags reqFlags;
1376007Ssteve.reinhardt@amd.com    uint64_t flags;
1386007Ssteve.reinhardt@amd.com
1396007Ssteve.reinhardt@amd.com  public:
1406011Ssteve.reinhardt@amd.com    DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags)
1416007Ssteve.reinhardt@amd.com        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1426007Ssteve.reinhardt@amd.com    { }
1436007Ssteve.reinhardt@amd.com    FaultName name() const = 0;
1446007Ssteve.reinhardt@amd.com    FaultVect vect() = 0;
1456007Ssteve.reinhardt@amd.com    FaultStat & countStat() = 0;
1466008Ssteve.reinhardt@amd.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1476007Ssteve.reinhardt@amd.com                StaticInst::nullStaticInstPtr);
1486008Ssteve.reinhardt@amd.com};
1496008Ssteve.reinhardt@amd.com
1506008Ssteve.reinhardt@amd.comclass NDtbMissFault : public DtbFault
1516008Ssteve.reinhardt@amd.com{
1526008Ssteve.reinhardt@amd.com  private:
1536008Ssteve.reinhardt@amd.com    static FaultName _name;
1546008Ssteve.reinhardt@amd.com    static FaultVect _vect;
1556007Ssteve.reinhardt@amd.com    static FaultStat _count;
1566007Ssteve.reinhardt@amd.com
1576007Ssteve.reinhardt@amd.com  public:
1586007Ssteve.reinhardt@amd.com    NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1596007Ssteve.reinhardt@amd.com        : DtbFault(vaddr, reqFlags, flags)
1602929Sktlim@umich.edu    { }
1612929Sktlim@umich.edu    FaultName name() const {return _name;}
1622929Sktlim@umich.edu    FaultVect vect() {return _vect;}
1632929Sktlim@umich.edu    FaultStat & countStat() {return _count;}
1646007Ssteve.reinhardt@amd.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1656007Ssteve.reinhardt@amd.com                StaticInst::nullStaticInstPtr);
1662929Sktlim@umich.edu};
1672929Sktlim@umich.edu
1682929Sktlim@umich.educlass PDtbMissFault : public DtbFault
1692929Sktlim@umich.edu{
1706007Ssteve.reinhardt@amd.com  private:
1716007Ssteve.reinhardt@amd.com    static FaultName _name;
1722929Sktlim@umich.edu    static FaultVect _vect;
1732929Sktlim@umich.edu    static FaultStat _count;
1746007Ssteve.reinhardt@amd.com
1752929Sktlim@umich.edu  public:
1762929Sktlim@umich.edu    PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1778947Sandreas.hansson@arm.com        : DtbFault(vaddr, reqFlags, flags)
1788947Sandreas.hansson@arm.com    { }
1798947Sandreas.hansson@arm.com    FaultName name() const {return _name;}
1808947Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
1818947Sandreas.hansson@arm.com    FaultStat & countStat() {return _count;}
1828947Sandreas.hansson@arm.com};
1838947Sandreas.hansson@arm.com
1848947Sandreas.hansson@arm.comclass DtbPageFault : public DtbFault
1858947Sandreas.hansson@arm.com{
1868947Sandreas.hansson@arm.com  private:
1878947Sandreas.hansson@arm.com    static FaultName _name;
1888947Sandreas.hansson@arm.com    static FaultVect _vect;
1898947Sandreas.hansson@arm.com    static FaultStat _count;
1908947Sandreas.hansson@arm.com
1918947Sandreas.hansson@arm.com  public:
1928947Sandreas.hansson@arm.com    DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1938947Sandreas.hansson@arm.com        : DtbFault(vaddr, reqFlags, flags)
1948947Sandreas.hansson@arm.com    { }
1958947Sandreas.hansson@arm.com    FaultName name() const {return _name;}
1968947Sandreas.hansson@arm.com    FaultVect vect() {return _vect;}
1972929Sktlim@umich.edu    FaultStat & countStat() {return _count;}
1982929Sktlim@umich.edu};
1992929Sktlim@umich.edu
2002929Sktlim@umich.educlass DtbAcvFault : public DtbFault
2014937Sstever@gmail.com{
2024937Sstever@gmail.com  private:
2034937Sstever@gmail.com    static FaultName _name;
2044937Sstever@gmail.com    static FaultVect _vect;
2058120Sgblack@eecs.umich.edu    static FaultStat _count;
2064937Sstever@gmail.com
2074937Sstever@gmail.com  public:
2084937Sstever@gmail.com    DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2094937Sstever@gmail.com        : DtbFault(vaddr, reqFlags, flags)
2105773Snate@binkert.org    { }
2114937Sstever@gmail.com    FaultName name() const {return _name;}
2124937Sstever@gmail.com    FaultVect vect() {return _vect;}
2134937Sstever@gmail.com    FaultStat & countStat() {return _count;}
2142929Sktlim@umich.edu};
2152929Sktlim@umich.edu
2162929Sktlim@umich.educlass DtbAlignmentFault : public DtbFault
2175773Snate@binkert.org{
2182929Sktlim@umich.edu  private:
2192929Sktlim@umich.edu    static FaultName _name;
2202929Sktlim@umich.edu    static FaultVect _vect;
2212929Sktlim@umich.edu    static FaultStat _count;
2222929Sktlim@umich.edu
2232929Sktlim@umich.edu  public:
2244937Sstever@gmail.com    DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2254937Sstever@gmail.com        : DtbFault(vaddr, reqFlags, flags)
2264937Sstever@gmail.com    { }
2274937Sstever@gmail.com    FaultName name() const {return _name;}
2284937Sstever@gmail.com    FaultVect vect() {return _vect;}
2294937Sstever@gmail.com    FaultStat & countStat() {return _count;}
2304937Sstever@gmail.com};
2314937Sstever@gmail.com
2324937Sstever@gmail.comclass ItbFault : public AlphaFault
2334937Sstever@gmail.com{
2344937Sstever@gmail.com  protected:
2354937Sstever@gmail.com    Addr pc;
2364937Sstever@gmail.com
2374937Sstever@gmail.com  public:
2384937Sstever@gmail.com    ItbFault(Addr _pc) : pc(_pc) { }
2392929Sktlim@umich.edu    FaultName name() const = 0;
2402929Sktlim@umich.edu    FaultVect vect() = 0;
2412929Sktlim@umich.edu    FaultStat & countStat() = 0;
2422929Sktlim@umich.edu    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
2432929Sktlim@umich.edu                StaticInst::nullStaticInstPtr);
2442929Sktlim@umich.edu};
2452929Sktlim@umich.edu
2466011Ssteve.reinhardt@amd.comclass ItbPageFault : public ItbFault
2472929Sktlim@umich.edu{
2482929Sktlim@umich.edu  private:
2492929Sktlim@umich.edu    static FaultName _name;
2502929Sktlim@umich.edu    static FaultVect _vect;
2512929Sktlim@umich.edu    static FaultStat _count;
2522929Sktlim@umich.edu
2532929Sktlim@umich.edu  public:
2542929Sktlim@umich.edu    ItbPageFault(Addr pc) : ItbFault(pc) { }
2552997Sstever@eecs.umich.edu    FaultName name() const {return _name;}
2562997Sstever@eecs.umich.edu    FaultVect vect() {return _vect;}
2572929Sktlim@umich.edu    FaultStat & countStat() {return _count;}
2588802Sgblack@eecs.umich.edu    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
2592997Sstever@eecs.umich.edu                StaticInst::nullStaticInstPtr);
2602929Sktlim@umich.edu};
2612997Sstever@eecs.umich.edu
2622997Sstever@eecs.umich.educlass ItbAcvFault : public ItbFault
2638802Sgblack@eecs.umich.edu{
2642929Sktlim@umich.edu  private:
2652997Sstever@eecs.umich.edu    static FaultName _name;
2662997Sstever@eecs.umich.edu    static FaultVect _vect;
2672997Sstever@eecs.umich.edu    static FaultStat _count;
2682997Sstever@eecs.umich.edu
2695773Snate@binkert.org  public:
2705773Snate@binkert.org    ItbAcvFault(Addr pc) : ItbFault(pc) { }
2712997Sstever@eecs.umich.edu    FaultName name() const {return _name;}
2722997Sstever@eecs.umich.edu    FaultVect vect() {return _vect;}
2736007Ssteve.reinhardt@amd.com    FaultStat & countStat() {return _count;}
2746007Ssteve.reinhardt@amd.com};
2752997Sstever@eecs.umich.edu
2762929Sktlim@umich.educlass UnimplementedOpcodeFault : public AlphaFault
2772997Sstever@eecs.umich.edu{
2788120Sgblack@eecs.umich.edu  private:
2792997Sstever@eecs.umich.edu    static FaultName _name;
2802997Sstever@eecs.umich.edu    static FaultVect _vect;
2812997Sstever@eecs.umich.edu    static FaultStat _count;
2822997Sstever@eecs.umich.edu
2832997Sstever@eecs.umich.edu  public:
2842929Sktlim@umich.edu    FaultName name() const {return _name;}
2852997Sstever@eecs.umich.edu    FaultVect vect() {return _vect;}
2862929Sktlim@umich.edu    FaultStat & countStat() {return _count;}
2872929Sktlim@umich.edu};
2883005Sstever@eecs.umich.edu
2893005Sstever@eecs.umich.educlass FloatEnableFault : public AlphaFault
2908802Sgblack@eecs.umich.edu{
2918802Sgblack@eecs.umich.edu  private:
2928802Sgblack@eecs.umich.edu    static FaultName _name;
2938802Sgblack@eecs.umich.edu    static FaultVect _vect;
2948802Sgblack@eecs.umich.edu    static FaultStat _count;
2958802Sgblack@eecs.umich.edu
2968802Sgblack@eecs.umich.edu  public:
2978802Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2988802Sgblack@eecs.umich.edu    FaultVect vect() {return _vect;}
2998802Sgblack@eecs.umich.edu    FaultStat & countStat() {return _count;}
3008802Sgblack@eecs.umich.edu};
3018802Sgblack@eecs.umich.edu
3028889Sgeoffrey.blake@arm.comclass VectorEnableFault : public AlphaFault
3038889Sgeoffrey.blake@arm.com{
3048889Sgeoffrey.blake@arm.com  private:
3058802Sgblack@eecs.umich.edu    static FaultName _name;
3068802Sgblack@eecs.umich.edu    static FaultVect _vect;
3078802Sgblack@eecs.umich.edu    static FaultStat _count;
3088802Sgblack@eecs.umich.edu
3098889Sgeoffrey.blake@arm.com  public:
3108802Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3118802Sgblack@eecs.umich.edu    FaultVect vect() {return _vect;}
3128802Sgblack@eecs.umich.edu    FaultStat & countStat() {return _count;}
3138802Sgblack@eecs.umich.edu};
3148802Sgblack@eecs.umich.edu
3153691Shsul@eecs.umich.educlass PalFault : public AlphaFault
3168802Sgblack@eecs.umich.edu{
3178802Sgblack@eecs.umich.edu  private:
3188802Sgblack@eecs.umich.edu    static FaultName _name;
3193005Sstever@eecs.umich.edu    static FaultVect _vect;
3208492Snilay@cs.wisc.edu    static FaultStat _count;
3216928SBrad.Beckmann@amd.com
3226928SBrad.Beckmann@amd.com  protected:
3236928SBrad.Beckmann@amd.com    bool skipFaultingInstruction() {return true;}
3246928SBrad.Beckmann@amd.com
3256166Ssteve.reinhardt@amd.com  public:
3262929Sktlim@umich.edu    FaultName name() const {return _name;}
3272929Sktlim@umich.edu    FaultVect vect() {return _vect;}
3283005Sstever@eecs.umich.edu    FaultStat & countStat() {return _count;}
3298802Sgblack@eecs.umich.edu};
3302997Sstever@eecs.umich.edu
3316293Ssteve.reinhardt@amd.comclass IntegerOverflowFault : public AlphaFault
3326293Ssteve.reinhardt@amd.com{
3332929Sktlim@umich.edu  private:
334    static FaultName _name;
335    static FaultVect _vect;
336    static FaultStat _count;
337
338  public:
339    FaultName name() const {return _name;}
340    FaultVect vect() {return _vect;}
341    FaultStat & countStat() {return _count;}
342};
343
344} // namespace AlphaISA
345
346#endif // __ARCH_ALPHA_FAULTS_HH__
347