faults.hh revision 5652
110447Snilay@cs.wisc.edu/*
210447Snilay@cs.wisc.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
310447Snilay@cs.wisc.edu * All rights reserved.
410447Snilay@cs.wisc.edu *
510447Snilay@cs.wisc.edu * Redistribution and use of this software in source and binary forms,
610447Snilay@cs.wisc.edu * with or without modification, are permitted provided that the
710447Snilay@cs.wisc.edu * following conditions are met:
810447Snilay@cs.wisc.edu *
910447Snilay@cs.wisc.edu * The software must be used only for Non-Commercial Use which means any
1010447Snilay@cs.wisc.edu * use which is NOT directed to receiving any direct monetary
1110447Snilay@cs.wisc.edu * compensation for, or commercial advantage from such use.  Illustrative
1210447Snilay@cs.wisc.edu * examples of non-commercial use are academic research, personal study,
1310447Snilay@cs.wisc.edu * teaching, education and corporate research & development.
1410447Snilay@cs.wisc.edu * Illustrative examples of commercial use are distributing products for
1510447Snilay@cs.wisc.edu * commercial advantage and providing services using the software for
1610447Snilay@cs.wisc.edu * commercial advantage.
1710447Snilay@cs.wisc.edu *
1810447Snilay@cs.wisc.edu * If you wish to use this software or functionality therein that may be
1910447Snilay@cs.wisc.edu * covered by patents for commercial use, please contact:
2010447Snilay@cs.wisc.edu *     Director of Intellectual Property Licensing
2110447Snilay@cs.wisc.edu *     Office of Strategy and Technology
2210447Snilay@cs.wisc.edu *     Hewlett-Packard Company
2310447Snilay@cs.wisc.edu *     1501 Page Mill Road
2410447Snilay@cs.wisc.edu *     Palo Alto, California  94304
2510447Snilay@cs.wisc.edu *
2610447Snilay@cs.wisc.edu * Redistributions of source code must retain the above copyright notice,
2710447Snilay@cs.wisc.edu * this list of conditions and the following disclaimer.  Redistributions
2810447Snilay@cs.wisc.edu * in binary form must reproduce the above copyright notice, this list of
2910447Snilay@cs.wisc.edu * conditions and the following disclaimer in the documentation and/or
3010447Snilay@cs.wisc.edu * other materials provided with the distribution.  Neither the name of
3110447Snilay@cs.wisc.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
3210447Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
3310447Snilay@cs.wisc.edu * this software without specific prior written permission.  No right of
3410447Snilay@cs.wisc.edu * sublicense is granted herewith.  Derivatives of the software and
3510447Snilay@cs.wisc.edu * output created using the software may be prepared, but only for
3610447Snilay@cs.wisc.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
3710447Snilay@cs.wisc.edu * others provided: (i) the others agree to abide by the list of
3810447Snilay@cs.wisc.edu * conditions herein which includes the Non-Commercial Use restrictions;
3910447Snilay@cs.wisc.edu * and (ii) such Derivatives of the software include the above copyright
4010447Snilay@cs.wisc.edu * notice to acknowledge the contribution from this software where
4110447Snilay@cs.wisc.edu * applicable, this list of conditions and the disclaimer below.
4210447Snilay@cs.wisc.edu *
4310447Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4410447Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4510447Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4610447Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4710447Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4810447Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4910447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5010447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5110447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5210447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
5310447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5410447Snilay@cs.wisc.edu *
5510447Snilay@cs.wisc.edu * Authors: Gabe Black
5610447Snilay@cs.wisc.edu */
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu#ifndef __ARCH_X86_FAULTS_HH__
5910447Snilay@cs.wisc.edu#define __ARCH_X86_FAULTS_HH__
6010447Snilay@cs.wisc.edu
6110447Snilay@cs.wisc.edu#include "base/misc.hh"
6210447Snilay@cs.wisc.edu#include "sim/faults.hh"
6310447Snilay@cs.wisc.edu
6410447Snilay@cs.wisc.edunamespace X86ISA
6510447Snilay@cs.wisc.edu{
6610447Snilay@cs.wisc.edu    // Base class for all x86 "faults" where faults is in the m5 sense
6710447Snilay@cs.wisc.edu    class X86FaultBase : public FaultBase
6810447Snilay@cs.wisc.edu    {
6910447Snilay@cs.wisc.edu      protected:
7010447Snilay@cs.wisc.edu        const char * faultName;
7110447Snilay@cs.wisc.edu        const char * mnem;
7210447Snilay@cs.wisc.edu        uint64_t errorCode;
7310447Snilay@cs.wisc.edu
7410447Snilay@cs.wisc.edu        X86FaultBase(const char * _faultName, const char * _mnem,
7510447Snilay@cs.wisc.edu                uint64_t _errorCode = 0) :
7610447Snilay@cs.wisc.edu            faultName(_faultName), mnem(_mnem), errorCode(_errorCode)
7710447Snilay@cs.wisc.edu        {
7810447Snilay@cs.wisc.edu        }
7910447Snilay@cs.wisc.edu
8010447Snilay@cs.wisc.edu        const char * name() const
8110447Snilay@cs.wisc.edu        {
8210447Snilay@cs.wisc.edu            return faultName;
8310447Snilay@cs.wisc.edu        }
8410447Snilay@cs.wisc.edu
8510447Snilay@cs.wisc.edu        virtual bool isBenign()
8610447Snilay@cs.wisc.edu        {
8710447Snilay@cs.wisc.edu            return true;
8810447Snilay@cs.wisc.edu        }
8910447Snilay@cs.wisc.edu
9010447Snilay@cs.wisc.edu        virtual const char * mnemonic() const
9110447Snilay@cs.wisc.edu        {
9210447Snilay@cs.wisc.edu            return mnem;
9310447Snilay@cs.wisc.edu        }
9410447Snilay@cs.wisc.edu    };
9510447Snilay@cs.wisc.edu
9610447Snilay@cs.wisc.edu    // Base class for x86 faults which behave as if the underlying instruction
9710447Snilay@cs.wisc.edu    // didn't happen.
9810447Snilay@cs.wisc.edu    class X86Fault : public X86FaultBase
9910447Snilay@cs.wisc.edu    {
10010447Snilay@cs.wisc.edu      protected:
10110447Snilay@cs.wisc.edu        X86Fault(const char * name, const char * mnem,
10210447Snilay@cs.wisc.edu                uint64_t _errorCode = 0) :
10310447Snilay@cs.wisc.edu            X86FaultBase(name, mnem, _errorCode)
10410447Snilay@cs.wisc.edu        {}
10510447Snilay@cs.wisc.edu    };
10610447Snilay@cs.wisc.edu
10710447Snilay@cs.wisc.edu    // Base class for x86 traps which behave as if the underlying instruction
10810447Snilay@cs.wisc.edu    // completed.
10910447Snilay@cs.wisc.edu    class X86Trap : public X86FaultBase
11010447Snilay@cs.wisc.edu    {
11110447Snilay@cs.wisc.edu      protected:
11210447Snilay@cs.wisc.edu        X86Trap(const char * name, const char * mnem,
11310447Snilay@cs.wisc.edu                uint64_t _errorCode = 0) :
11410447Snilay@cs.wisc.edu            X86FaultBase(name, mnem, _errorCode)
11510447Snilay@cs.wisc.edu        {}
11610447Snilay@cs.wisc.edu
11710447Snilay@cs.wisc.edu#if FULL_SYSTEM
11810447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc);
11910447Snilay@cs.wisc.edu#endif
12010447Snilay@cs.wisc.edu    };
12110447Snilay@cs.wisc.edu
12210447Snilay@cs.wisc.edu    // Base class for x86 aborts which seem to be catastrophic failures.
12310447Snilay@cs.wisc.edu    class X86Abort : public X86FaultBase
12410447Snilay@cs.wisc.edu    {
12510447Snilay@cs.wisc.edu      protected:
12610447Snilay@cs.wisc.edu        X86Abort(const char * name, const char * mnem,
12710447Snilay@cs.wisc.edu                uint64_t _errorCode = 0) :
12810447Snilay@cs.wisc.edu            X86FaultBase(name, mnem, _errorCode)
12910447Snilay@cs.wisc.edu        {}
13010447Snilay@cs.wisc.edu
13110447Snilay@cs.wisc.edu#if FULL_SYSTEM
13210447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc);
13310447Snilay@cs.wisc.edu#endif
13410447Snilay@cs.wisc.edu    };
13510447Snilay@cs.wisc.edu
13610447Snilay@cs.wisc.edu    // Base class for x86 interrupts.
13710447Snilay@cs.wisc.edu    class X86Interrupt : public X86FaultBase
13810447Snilay@cs.wisc.edu    {
13910447Snilay@cs.wisc.edu      protected:
14010447Snilay@cs.wisc.edu        X86Interrupt(const char * name, const char * mnem,
14110447Snilay@cs.wisc.edu                uint64_t _errorCode = 0) :
14210447Snilay@cs.wisc.edu            X86FaultBase(name, mnem, _errorCode)
14310447Snilay@cs.wisc.edu        {}
14410447Snilay@cs.wisc.edu
14510447Snilay@cs.wisc.edu#if FULL_SYSTEM
14610447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc);
14710447Snilay@cs.wisc.edu#endif
14810447Snilay@cs.wisc.edu    };
14910447Snilay@cs.wisc.edu
15010447Snilay@cs.wisc.edu    class UnimpInstFault : public FaultBase
15110447Snilay@cs.wisc.edu    {
15210447Snilay@cs.wisc.edu      public:
15310447Snilay@cs.wisc.edu        const char * name() const
15410447Snilay@cs.wisc.edu        {
15510447Snilay@cs.wisc.edu            return "unimplemented_micro";
15610447Snilay@cs.wisc.edu        }
15710447Snilay@cs.wisc.edu
15810447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc)
15910447Snilay@cs.wisc.edu        {
16010447Snilay@cs.wisc.edu            panic("Unimplemented instruction!");
16110447Snilay@cs.wisc.edu        }
16210447Snilay@cs.wisc.edu    };
16310447Snilay@cs.wisc.edu
16410447Snilay@cs.wisc.edu    static inline Fault genMachineCheckFault()
16510447Snilay@cs.wisc.edu    {
16610447Snilay@cs.wisc.edu        panic("Machine check fault not implemented in x86!\n");
16710447Snilay@cs.wisc.edu    }
16810447Snilay@cs.wisc.edu
16910447Snilay@cs.wisc.edu    // Below is a summary of the interrupt/exception information in the
17010447Snilay@cs.wisc.edu    // architecture manuals.
17110447Snilay@cs.wisc.edu
17210447Snilay@cs.wisc.edu    // Class  |  Type    | vector |               Cause                 | mnem
17310447Snilay@cs.wisc.edu    //------------------------------------------------------------------------
17410447Snilay@cs.wisc.edu    //Contrib   Fault     0         Divide-by-Zero-Error                  #DE
17510447Snilay@cs.wisc.edu    //Benign    Either    1         Debug                                 #DB
17610447Snilay@cs.wisc.edu    //Benign    Interrupt 2         Non-Maskable-Interrupt                #NMI
17710447Snilay@cs.wisc.edu    //Benign    Trap      3         Breakpoint                            #BP
17810447Snilay@cs.wisc.edu    //Benign    Trap      4         Overflow                              #OF
17910447Snilay@cs.wisc.edu    //Benign    Fault     5         Bound-Range                           #BR
18010447Snilay@cs.wisc.edu    //Benign    Fault     6         Invalid-Opcode                        #UD
18110447Snilay@cs.wisc.edu    //Benign    Fault     7         Device-Not-Available                  #NM
18210447Snilay@cs.wisc.edu    //Benign    Abort     8         Double-Fault                          #DF
18310447Snilay@cs.wisc.edu    //                    9         Coprocessor-Segment-Overrun
18410447Snilay@cs.wisc.edu    //Contrib   Fault     10        Invalid-TSS                           #TS
18510447Snilay@cs.wisc.edu    //Contrib   Fault     11        Segment-Not-Present                   #NP
18610447Snilay@cs.wisc.edu    //Contrib   Fault     12        Stack                                 #SS
18710447Snilay@cs.wisc.edu    //Contrib   Fault     13        General-Protection                    #GP
18810447Snilay@cs.wisc.edu    //Either    Fault     14        Page-Fault                            #PF
18910447Snilay@cs.wisc.edu    //                    15        Reserved
19010447Snilay@cs.wisc.edu    //Benign    Fault     16        x87 Floating-Point Exception Pending  #MF
19110447Snilay@cs.wisc.edu    //Benign    Fault     17        Alignment-Check                       #AC
19210447Snilay@cs.wisc.edu    //Benign    Abort     18        Machine-Check                         #MC
19310447Snilay@cs.wisc.edu    //Benign    Fault     19        SIMD Floating-Point                   #XF
19410447Snilay@cs.wisc.edu    //                    20-29     Reserved
19510447Snilay@cs.wisc.edu    //Contrib   ?         30        Security Exception                    #SX
19610447Snilay@cs.wisc.edu    //                    31        Reserved
19710447Snilay@cs.wisc.edu    //Benign    Interrupt 0-255     External Interrupts                   #INTR
19810447Snilay@cs.wisc.edu    //Benign    Interrupt 0-255     Software Interrupts                   INTn
19910447Snilay@cs.wisc.edu
20010447Snilay@cs.wisc.edu    class DivideByZero : public X86Fault
20110447Snilay@cs.wisc.edu    {
20210447Snilay@cs.wisc.edu      public:
20310447Snilay@cs.wisc.edu        DivideByZero() :
20410447Snilay@cs.wisc.edu            X86Fault("Divide-by-Zero-Error", "#DE")
20510447Snilay@cs.wisc.edu        {}
20610447Snilay@cs.wisc.edu    };
20710447Snilay@cs.wisc.edu
20810447Snilay@cs.wisc.edu    class DebugException : public X86FaultBase
20910447Snilay@cs.wisc.edu    {
21010447Snilay@cs.wisc.edu      public:
21110447Snilay@cs.wisc.edu        DebugException() :
21210447Snilay@cs.wisc.edu            X86FaultBase("Debug", "#DB")
21310447Snilay@cs.wisc.edu        {}
21410447Snilay@cs.wisc.edu    };
21510447Snilay@cs.wisc.edu
21610447Snilay@cs.wisc.edu    class NonMaskableInterrupt : public X86Interrupt
21710447Snilay@cs.wisc.edu    {
21810447Snilay@cs.wisc.edu      public:
21910447Snilay@cs.wisc.edu        NonMaskableInterrupt() :
22010447Snilay@cs.wisc.edu            X86Interrupt("Non-Maskable-Interrupt", "#NMI")
22110447Snilay@cs.wisc.edu        {}
22210447Snilay@cs.wisc.edu    };
22310447Snilay@cs.wisc.edu
22410447Snilay@cs.wisc.edu    class Breakpoint : public X86Trap
22510447Snilay@cs.wisc.edu    {
22610447Snilay@cs.wisc.edu      public:
22710447Snilay@cs.wisc.edu        Breakpoint() :
22810447Snilay@cs.wisc.edu            X86Trap("Breakpoint", "#BP")
22910447Snilay@cs.wisc.edu        {}
23010447Snilay@cs.wisc.edu    };
23110447Snilay@cs.wisc.edu
23210447Snilay@cs.wisc.edu    class OverflowTrap : public X86Trap
23310447Snilay@cs.wisc.edu    {
23410447Snilay@cs.wisc.edu      public:
23510447Snilay@cs.wisc.edu        OverflowTrap() :
23610447Snilay@cs.wisc.edu            X86Trap("Overflow", "#OF")
23710447Snilay@cs.wisc.edu        {}
23810447Snilay@cs.wisc.edu    };
23910447Snilay@cs.wisc.edu
24010447Snilay@cs.wisc.edu    class BoundRange : public X86Fault
24110447Snilay@cs.wisc.edu    {
24210447Snilay@cs.wisc.edu      public:
24310447Snilay@cs.wisc.edu        BoundRange() :
24410447Snilay@cs.wisc.edu            X86Fault("Bound-Range", "#BR")
24510447Snilay@cs.wisc.edu        {}
24610447Snilay@cs.wisc.edu    };
24710447Snilay@cs.wisc.edu
24810447Snilay@cs.wisc.edu    class InvalidOpcode : public X86Fault
24910447Snilay@cs.wisc.edu    {
25010447Snilay@cs.wisc.edu      public:
25110447Snilay@cs.wisc.edu        InvalidOpcode() :
25210447Snilay@cs.wisc.edu            X86Fault("Invalid-Opcode", "#UD")
25310447Snilay@cs.wisc.edu        {}
25410447Snilay@cs.wisc.edu    };
25510447Snilay@cs.wisc.edu
25610447Snilay@cs.wisc.edu    class DeviceNotAvailable : public X86Fault
25710447Snilay@cs.wisc.edu    {
25810447Snilay@cs.wisc.edu      public:
25910447Snilay@cs.wisc.edu        DeviceNotAvailable() :
26010447Snilay@cs.wisc.edu            X86Fault("Device-Not-Available", "#NM")
26110447Snilay@cs.wisc.edu        {}
26210447Snilay@cs.wisc.edu    };
26310447Snilay@cs.wisc.edu
26410447Snilay@cs.wisc.edu    class DoubleFault : public X86Abort
26510447Snilay@cs.wisc.edu    {
26610447Snilay@cs.wisc.edu      public:
26710447Snilay@cs.wisc.edu        DoubleFault() :
26810447Snilay@cs.wisc.edu            X86Abort("Double-Fault", "#DF")
26910447Snilay@cs.wisc.edu        {}
27010447Snilay@cs.wisc.edu    };
27110447Snilay@cs.wisc.edu
27210447Snilay@cs.wisc.edu    class InvalidTSS : public X86Fault
27310447Snilay@cs.wisc.edu    {
27410447Snilay@cs.wisc.edu      public:
27510447Snilay@cs.wisc.edu        InvalidTSS() :
27610447Snilay@cs.wisc.edu            X86Fault("Invalid-TSS", "#TS")
27710447Snilay@cs.wisc.edu        {}
27810447Snilay@cs.wisc.edu    };
27910447Snilay@cs.wisc.edu
28010447Snilay@cs.wisc.edu    class SegmentNotPresent : public X86Fault
28110447Snilay@cs.wisc.edu    {
28210447Snilay@cs.wisc.edu      public:
28310447Snilay@cs.wisc.edu        SegmentNotPresent() :
28410447Snilay@cs.wisc.edu            X86Fault("Segment-Not-Present", "#NP")
28510447Snilay@cs.wisc.edu        {}
28610447Snilay@cs.wisc.edu    };
28710447Snilay@cs.wisc.edu
28810447Snilay@cs.wisc.edu    class StackFault : public X86Fault
28910447Snilay@cs.wisc.edu    {
29010447Snilay@cs.wisc.edu      public:
29110447Snilay@cs.wisc.edu        StackFault() :
29210447Snilay@cs.wisc.edu            X86Fault("Stack", "#SS")
29310447Snilay@cs.wisc.edu        {}
29410447Snilay@cs.wisc.edu    };
29510447Snilay@cs.wisc.edu
29610447Snilay@cs.wisc.edu    class GeneralProtection : public X86Fault
29710447Snilay@cs.wisc.edu    {
29810447Snilay@cs.wisc.edu      public:
29910447Snilay@cs.wisc.edu        GeneralProtection(uint64_t _errorCode) :
30010447Snilay@cs.wisc.edu            X86Fault("General-Protection", "#GP", _errorCode)
30110447Snilay@cs.wisc.edu        {}
30210447Snilay@cs.wisc.edu    };
30310447Snilay@cs.wisc.edu
30410447Snilay@cs.wisc.edu    class PageFault : public X86Fault
30510447Snilay@cs.wisc.edu    {
30610447Snilay@cs.wisc.edu      public:
30710447Snilay@cs.wisc.edu        PageFault() :
30810447Snilay@cs.wisc.edu            X86Fault("Page-Fault", "#PF")
30910447Snilay@cs.wisc.edu        {}
31010447Snilay@cs.wisc.edu    };
31110447Snilay@cs.wisc.edu
31210447Snilay@cs.wisc.edu    class X87FpExceptionPending : public X86Fault
31310447Snilay@cs.wisc.edu    {
31410447Snilay@cs.wisc.edu      public:
31510447Snilay@cs.wisc.edu        X87FpExceptionPending() :
31610447Snilay@cs.wisc.edu            X86Fault("x87 Floating-Point Exception Pending", "#MF")
31710447Snilay@cs.wisc.edu        {}
31810447Snilay@cs.wisc.edu    };
31910447Snilay@cs.wisc.edu
32010447Snilay@cs.wisc.edu    class AlignmentCheck : public X86Fault
32110447Snilay@cs.wisc.edu    {
32210447Snilay@cs.wisc.edu      public:
32310447Snilay@cs.wisc.edu        AlignmentCheck() :
32410447Snilay@cs.wisc.edu            X86Fault("Alignment-Check", "#AC")
32510447Snilay@cs.wisc.edu        {}
32610447Snilay@cs.wisc.edu    };
32710447Snilay@cs.wisc.edu
32810447Snilay@cs.wisc.edu    class MachineCheck : public X86Abort
32910447Snilay@cs.wisc.edu    {
33010447Snilay@cs.wisc.edu      public:
33110447Snilay@cs.wisc.edu        MachineCheck() :
33210447Snilay@cs.wisc.edu            X86Abort("Machine-Check", "#MC")
33310447Snilay@cs.wisc.edu        {}
33410447Snilay@cs.wisc.edu    };
33510447Snilay@cs.wisc.edu
33610447Snilay@cs.wisc.edu    class SIMDFloatingPointFault : public X86Fault
33710447Snilay@cs.wisc.edu    {
33810447Snilay@cs.wisc.edu      public:
33910447Snilay@cs.wisc.edu        SIMDFloatingPointFault() :
34010447Snilay@cs.wisc.edu            X86Fault("SIMD Floating-Point", "#XF")
34110447Snilay@cs.wisc.edu        {}
34210447Snilay@cs.wisc.edu    };
34310447Snilay@cs.wisc.edu
34410447Snilay@cs.wisc.edu    class SecurityException : public X86FaultBase
34510447Snilay@cs.wisc.edu    {
34610447Snilay@cs.wisc.edu      public:
34710447Snilay@cs.wisc.edu        SecurityException() :
34810447Snilay@cs.wisc.edu            X86FaultBase("Security Exception", "#SX")
34910447Snilay@cs.wisc.edu        {}
35010447Snilay@cs.wisc.edu    };
35110447Snilay@cs.wisc.edu
35210447Snilay@cs.wisc.edu    class ExternalInterrupt : public X86Interrupt
35310447Snilay@cs.wisc.edu    {
35410447Snilay@cs.wisc.edu      public:
35510447Snilay@cs.wisc.edu        ExternalInterrupt() :
35610447Snilay@cs.wisc.edu            X86Interrupt("External Interrupt", "#INTR")
35710447Snilay@cs.wisc.edu        {}
35810447Snilay@cs.wisc.edu    };
35910447Snilay@cs.wisc.edu
36010447Snilay@cs.wisc.edu    class SoftwareInterrupt : public X86Interrupt
36110447Snilay@cs.wisc.edu    {
36210447Snilay@cs.wisc.edu      public:
36310447Snilay@cs.wisc.edu        SoftwareInterrupt() :
36410447Snilay@cs.wisc.edu            X86Interrupt("Software Interrupt", "INTn")
36510447Snilay@cs.wisc.edu        {}
36610447Snilay@cs.wisc.edu    };
36710447Snilay@cs.wisc.edu
36810447Snilay@cs.wisc.edu    // These faults aren't part of the ISA definition. They trigger filling
36910447Snilay@cs.wisc.edu    // the tlb on a miss and are to take the place of a hardware table walker.
37010447Snilay@cs.wisc.edu    class FakeITLBFault : public X86Fault
37110447Snilay@cs.wisc.edu    {
37210447Snilay@cs.wisc.edu      protected:
37310447Snilay@cs.wisc.edu        Addr vaddr;
37410447Snilay@cs.wisc.edu      public:
37510447Snilay@cs.wisc.edu        FakeITLBFault(Addr _vaddr) :
37610447Snilay@cs.wisc.edu            X86Fault("fake instruction tlb fault", "itlb"),
37710447Snilay@cs.wisc.edu            vaddr(_vaddr)
37810447Snilay@cs.wisc.edu        {}
37910447Snilay@cs.wisc.edu
38010447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc);
38110447Snilay@cs.wisc.edu    };
38210447Snilay@cs.wisc.edu
38310447Snilay@cs.wisc.edu    class FakeDTLBFault : public X86Fault
38410447Snilay@cs.wisc.edu    {
38510447Snilay@cs.wisc.edu      protected:
38610447Snilay@cs.wisc.edu        Addr vaddr;
38710447Snilay@cs.wisc.edu      public:
38810447Snilay@cs.wisc.edu        FakeDTLBFault(Addr _vaddr) :
38910447Snilay@cs.wisc.edu            X86Fault("fake data tlb fault", "dtlb"),
39010447Snilay@cs.wisc.edu            vaddr(_vaddr)
39110447Snilay@cs.wisc.edu        {}
39210447Snilay@cs.wisc.edu
39310447Snilay@cs.wisc.edu        void invoke(ThreadContext * tc);
39410447Snilay@cs.wisc.edu    };
39510447Snilay@cs.wisc.edu};
39610447Snilay@cs.wisc.edu
39710447Snilay@cs.wisc.edu#endif // __ARCH_X86_FAULTS_HH__
39810447Snilay@cs.wisc.edu