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