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