faults.hh revision 10417
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
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:
5110417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
5210417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
532175SN/A    virtual FaultVect vect() = 0;
542222SN/A    virtual FaultStat & countStat() = 0;
552SN/A};
562SN/A
572203SN/Aclass MachineCheckFault : public AlphaFault
582166SN/A{
592166SN/A  private:
602203SN/A    static FaultName _name;
612166SN/A    static FaultVect _vect;
622222SN/A    static FaultStat _count;
635569Snate@binkert.org
642166SN/A  public:
654695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
662166SN/A    FaultVect vect() {return _vect;}
672222SN/A    FaultStat & countStat() {return _count;}
682166SN/A};
692166SN/A
702203SN/Aclass AlignmentFault : public AlphaFault
712166SN/A{
722166SN/A  private:
732203SN/A    static FaultName _name;
742166SN/A    static FaultVect _vect;
752222SN/A    static FaultStat _count;
765569Snate@binkert.org
772166SN/A  public:
784695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
792166SN/A    FaultVect vect() {return _vect;}
802222SN/A    FaultStat & countStat() {return _count;}
814695Sgblack@eecs.umich.edu    bool isAlignmentFault() const {return true;}
822166SN/A};
832166SN/A
842147SN/Aclass ResetFault : public AlphaFault
852090SN/A{
862147SN/A  private:
872147SN/A    static FaultName _name;
882147SN/A    static FaultVect _vect;
892222SN/A    static FaultStat _count;
905569Snate@binkert.org
912112SN/A  public:
924695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
932147SN/A    FaultVect vect() {return _vect;}
942222SN/A    FaultStat & countStat() {return _count;}
952147SN/A};
962090SN/A
972147SN/Aclass ArithmeticFault : public AlphaFault
982090SN/A{
992147SN/A  private:
1002147SN/A    static FaultName _name;
1012147SN/A    static FaultVect _vect;
1022222SN/A    static FaultStat _count;
1035569Snate@binkert.org
1045569Snate@binkert.org  protected:
1055569Snate@binkert.org    bool skipFaultingInstruction() {return true;}
1065569Snate@binkert.org
1072112SN/A  public:
1084695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1092147SN/A    FaultVect vect() {return _vect;}
1102222SN/A    FaultStat & countStat() {return _count;}
11110417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
11210417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1132147SN/A};
1142090SN/A
1152147SN/Aclass InterruptFault : public AlphaFault
1162090SN/A{
1172147SN/A  private:
1182147SN/A    static FaultName _name;
1192147SN/A    static FaultVect _vect;
1202222SN/A    static FaultStat _count;
1215569Snate@binkert.org
1225569Snate@binkert.org  protected:
1235569Snate@binkert.org    bool setRestartAddress() {return false;}
1245569Snate@binkert.org
1252112SN/A  public:
1264695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1272147SN/A    FaultVect vect() {return _vect;}
1282222SN/A    FaultStat & countStat() {return _count;}
1292147SN/A};
1302090SN/A
1312502SN/Aclass DtbFault : public AlphaFault
1322502SN/A{
1334997Sgblack@eecs.umich.edu  protected:
1345568Snate@binkert.org    VAddr vaddr;
1355736Snate@binkert.org    Request::Flags reqFlags;
1362502SN/A    uint64_t flags;
1375569Snate@binkert.org
1382502SN/A  public:
1395736Snate@binkert.org    DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags)
1402502SN/A        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1412502SN/A    { }
1424695Sgblack@eecs.umich.edu    FaultName name() const = 0;
1432502SN/A    FaultVect vect() = 0;
1442502SN/A    FaultStat & countStat() = 0;
14510417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
14610417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1472502SN/A};
1482502SN/A
1492502SN/Aclass NDtbMissFault : public DtbFault
1502090SN/A{
1512147SN/A  private:
1522147SN/A    static FaultName _name;
1532147SN/A    static FaultVect _vect;
1542222SN/A    static FaultStat _count;
1555569Snate@binkert.org
1562112SN/A  public:
1575736Snate@binkert.org    NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1582502SN/A        : DtbFault(vaddr, reqFlags, flags)
1592502SN/A    { }
1604695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1612147SN/A    FaultVect vect() {return _vect;}
1622222SN/A    FaultStat & countStat() {return _count;}
16310417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
16410417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
1652147SN/A};
1662090SN/A
1672502SN/Aclass PDtbMissFault : public DtbFault
1682090SN/A{
1692147SN/A  private:
1702147SN/A    static FaultName _name;
1712147SN/A    static FaultVect _vect;
1722222SN/A    static FaultStat _count;
1735569Snate@binkert.org
1742112SN/A  public:
1755736Snate@binkert.org    PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1762502SN/A        : DtbFault(vaddr, reqFlags, flags)
1772502SN/A    { }
1784695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1792147SN/A    FaultVect vect() {return _vect;}
1802222SN/A    FaultStat & countStat() {return _count;}
1812147SN/A};
1822090SN/A
1832502SN/Aclass DtbPageFault : public DtbFault
1842090SN/A{
1852147SN/A  private:
1862147SN/A    static FaultName _name;
1872147SN/A    static FaultVect _vect;
1882222SN/A    static FaultStat _count;
1895569Snate@binkert.org
1902112SN/A  public:
1915736Snate@binkert.org    DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1922502SN/A        : DtbFault(vaddr, reqFlags, flags)
1932502SN/A    { }
1944695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
1952147SN/A    FaultVect vect() {return _vect;}
1962222SN/A    FaultStat & countStat() {return _count;}
1972147SN/A};
1982090SN/A
1992502SN/Aclass DtbAcvFault : public DtbFault
2002090SN/A{
2012147SN/A  private:
2022147SN/A    static FaultName _name;
2032147SN/A    static FaultVect _vect;
2042222SN/A    static FaultStat _count;
2055569Snate@binkert.org
2062112SN/A  public:
2075736Snate@binkert.org    DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2082502SN/A        : DtbFault(vaddr, reqFlags, flags)
2092502SN/A    { }
2104695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2112147SN/A    FaultVect vect() {return _vect;}
2122222SN/A    FaultStat & countStat() {return _count;}
2132147SN/A};
2142090SN/A
2152502SN/Aclass DtbAlignmentFault : public DtbFault
2162090SN/A{
2172147SN/A  private:
2182147SN/A    static FaultName _name;
2192147SN/A    static FaultVect _vect;
2202222SN/A    static FaultStat _count;
2215569Snate@binkert.org
2222112SN/A  public:
2235736Snate@binkert.org    DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
2242502SN/A        : DtbFault(vaddr, reqFlags, flags)
2252502SN/A    { }
2264695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2272147SN/A    FaultVect vect() {return _vect;}
2282222SN/A    FaultStat & countStat() {return _count;}
2292147SN/A};
2302090SN/A
2312502SN/Aclass ItbFault : public AlphaFault
2322502SN/A{
2334997Sgblack@eecs.umich.edu  protected:
2342502SN/A    Addr pc;
2355569Snate@binkert.org
2362502SN/A  public:
2375569Snate@binkert.org    ItbFault(Addr _pc) : pc(_pc) { }
2384695Sgblack@eecs.umich.edu    FaultName name() const = 0;
2392505SN/A    FaultVect vect() = 0;
2402505SN/A    FaultStat & countStat() = 0;
24110417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
24210417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
2432502SN/A};
2442502SN/A
2452502SN/Aclass ItbPageFault : public ItbFault
2462090SN/A{
2472147SN/A  private:
2482147SN/A    static FaultName _name;
2492147SN/A    static FaultVect _vect;
2502222SN/A    static FaultStat _count;
2515569Snate@binkert.org
2522112SN/A  public:
2535569Snate@binkert.org    ItbPageFault(Addr pc) : ItbFault(pc) { }
2544695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2552502SN/A    FaultVect vect() {return _vect;}
2562502SN/A    FaultStat & countStat() {return _count;}
25710417Sandreas.hansson@arm.com    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
25810417Sandreas.hansson@arm.com                StaticInst::nullStaticInstPtr);
2592502SN/A};
2602502SN/A
2612502SN/Aclass ItbAcvFault : public ItbFault
2622502SN/A{
2632502SN/A  private:
2642502SN/A    static FaultName _name;
2652502SN/A    static FaultVect _vect;
2662502SN/A    static FaultStat _count;
2675569Snate@binkert.org
2682502SN/A  public:
2695569Snate@binkert.org    ItbAcvFault(Addr pc) : ItbFault(pc) { }
2704695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2712147SN/A    FaultVect vect() {return _vect;}
2722222SN/A    FaultStat & countStat() {return _count;}
2732147SN/A};
2742090SN/A
2752147SN/Aclass UnimplementedOpcodeFault : public AlphaFault
2762090SN/A{
2772147SN/A  private:
2782147SN/A    static FaultName _name;
2792147SN/A    static FaultVect _vect;
2802222SN/A    static FaultStat _count;
2815569Snate@binkert.org
2822112SN/A  public:
2834695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2842147SN/A    FaultVect vect() {return _vect;}
2852222SN/A    FaultStat & countStat() {return _count;}
2862147SN/A};
2872090SN/A
2882147SN/Aclass FloatEnableFault : public AlphaFault
2892090SN/A{
2902147SN/A  private:
2912147SN/A    static FaultName _name;
2922147SN/A    static FaultVect _vect;
2932222SN/A    static FaultStat _count;
2945569Snate@binkert.org
2952112SN/A  public:
2964695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
2972147SN/A    FaultVect vect() {return _vect;}
2982222SN/A    FaultStat & countStat() {return _count;}
2992147SN/A};
3002090SN/A
3012147SN/Aclass PalFault : public AlphaFault
3022090SN/A{
3032147SN/A  private:
3042147SN/A    static FaultName _name;
3052147SN/A    static FaultVect _vect;
3062222SN/A    static FaultStat _count;
3075569Snate@binkert.org
3085569Snate@binkert.org  protected:
3095569Snate@binkert.org    bool skipFaultingInstruction() {return true;}
3105569Snate@binkert.org
3112112SN/A  public:
3124695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3132147SN/A    FaultVect vect() {return _vect;}
3142222SN/A    FaultStat & countStat() {return _count;}
3152147SN/A};
3162090SN/A
3172147SN/Aclass IntegerOverflowFault : public AlphaFault
3182090SN/A{
3192147SN/A  private:
3202147SN/A    static FaultName _name;
3212147SN/A    static FaultVect _vect;
3222222SN/A    static FaultStat _count;
3235569Snate@binkert.org
3242112SN/A  public:
3254695Sgblack@eecs.umich.edu    FaultName name() const {return _name;}
3262147SN/A    FaultVect vect() {return _vect;}
3272222SN/A    FaultStat & countStat() {return _count;}
3282147SN/A};
3292090SN/A
3305569Snate@binkert.org} // namespace AlphaISA
3312167SN/A
3325569Snate@binkert.org#endif // __ARCH_ALPHA_FAULTS_HH__
333