faults.hh revision 6009
19883Sandreas@sandberg.pp.se/*
29883Sandreas@sandberg.pp.se * Copyright (c) 2007 The Hewlett-Packard Development Company
39883Sandreas@sandberg.pp.se * All rights reserved.
49883Sandreas@sandberg.pp.se *
59883Sandreas@sandberg.pp.se * Redistribution and use of this software in source and binary forms,
69883Sandreas@sandberg.pp.se * with or without modification, are permitted provided that the
79883Sandreas@sandberg.pp.se * following conditions are met:
89883Sandreas@sandberg.pp.se *
99883Sandreas@sandberg.pp.se * The software must be used only for Non-Commercial Use which means any
109883Sandreas@sandberg.pp.se * use which is NOT directed to receiving any direct monetary
119883Sandreas@sandberg.pp.se * compensation for, or commercial advantage from such use.  Illustrative
129883Sandreas@sandberg.pp.se * examples of non-commercial use are academic research, personal study,
139883Sandreas@sandberg.pp.se * teaching, education and corporate research & development.
149883Sandreas@sandberg.pp.se * Illustrative examples of commercial use are distributing products for
159883Sandreas@sandberg.pp.se * commercial advantage and providing services using the software for
169883Sandreas@sandberg.pp.se * commercial advantage.
179883Sandreas@sandberg.pp.se *
189883Sandreas@sandberg.pp.se * If you wish to use this software or functionality therein that may be
199883Sandreas@sandberg.pp.se * covered by patents for commercial use, please contact:
209883Sandreas@sandberg.pp.se *     Director of Intellectual Property Licensing
219883Sandreas@sandberg.pp.se *     Office of Strategy and Technology
229883Sandreas@sandberg.pp.se *     Hewlett-Packard Company
239883Sandreas@sandberg.pp.se *     1501 Page Mill Road
249883Sandreas@sandberg.pp.se *     Palo Alto, California  94304
259883Sandreas@sandberg.pp.se *
269883Sandreas@sandberg.pp.se * Redistributions of source code must retain the above copyright notice,
279883Sandreas@sandberg.pp.se * this list of conditions and the following disclaimer.  Redistributions
289883Sandreas@sandberg.pp.se * in binary form must reproduce the above copyright notice, this list of
299883Sandreas@sandberg.pp.se * conditions and the following disclaimer in the documentation and/or
309883Sandreas@sandberg.pp.se * other materials provided with the distribution.  Neither the name of
319883Sandreas@sandberg.pp.se * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
329883Sandreas@sandberg.pp.se * contributors may be used to endorse or promote products derived from
339883Sandreas@sandberg.pp.se * this software without specific prior written permission.  No right of
349883Sandreas@sandberg.pp.se * sublicense is granted herewith.  Derivatives of the software and
359883Sandreas@sandberg.pp.se * output created using the software may be prepared, but only for
369883Sandreas@sandberg.pp.se * Non-Commercial Uses.  Derivatives of the software may be shared with
379883Sandreas@sandberg.pp.se * others provided: (i) the others agree to abide by the list of
389883Sandreas@sandberg.pp.se * conditions herein which includes the Non-Commercial Use restrictions;
399883Sandreas@sandberg.pp.se * and (ii) such Derivatives of the software include the above copyright
409883Sandreas@sandberg.pp.se * notice to acknowledge the contribution from this software where
419883Sandreas@sandberg.pp.se * applicable, this list of conditions and the disclaimer below.
429883Sandreas@sandberg.pp.se *
439883Sandreas@sandberg.pp.se * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
449883Sandreas@sandberg.pp.se * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
459883Sandreas@sandberg.pp.se * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
469883Sandreas@sandberg.pp.se * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
479883Sandreas@sandberg.pp.se * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
489883Sandreas@sandberg.pp.se * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
499883Sandreas@sandberg.pp.se * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
509883Sandreas@sandberg.pp.se * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
519883Sandreas@sandberg.pp.se * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
529883Sandreas@sandberg.pp.se * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
539883Sandreas@sandberg.pp.se * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
549883Sandreas@sandberg.pp.se *
559883Sandreas@sandberg.pp.se * Authors: Gabe Black
569883Sandreas@sandberg.pp.se */
579883Sandreas@sandberg.pp.se
589883Sandreas@sandberg.pp.se#ifndef __ARCH_X86_FAULTS_HH__
599883Sandreas@sandberg.pp.se#define __ARCH_X86_FAULTS_HH__
609883Sandreas@sandberg.pp.se
619883Sandreas@sandberg.pp.se#include "base/bitunion.hh"
629883Sandreas@sandberg.pp.se#include "base/misc.hh"
639883Sandreas@sandberg.pp.se#include "sim/faults.hh"
649883Sandreas@sandberg.pp.se
659883Sandreas@sandberg.pp.se#include <string>
669883Sandreas@sandberg.pp.se
679883Sandreas@sandberg.pp.senamespace X86ISA
689883Sandreas@sandberg.pp.se{
699883Sandreas@sandberg.pp.se    // Base class for all x86 "faults" where faults is in the m5 sense
709883Sandreas@sandberg.pp.se    class X86FaultBase : public FaultBase
719883Sandreas@sandberg.pp.se    {
729883Sandreas@sandberg.pp.se      protected:
739883Sandreas@sandberg.pp.se        const char * faultName;
749883Sandreas@sandberg.pp.se        const char * mnem;
759883Sandreas@sandberg.pp.se        uint8_t vector;
769883Sandreas@sandberg.pp.se        uint64_t errorCode;
779883Sandreas@sandberg.pp.se
789883Sandreas@sandberg.pp.se        X86FaultBase(const char * _faultName, const char * _mnem,
799883Sandreas@sandberg.pp.se                     const uint8_t _vector, uint64_t _errorCode = (uint64_t)-1)
809883Sandreas@sandberg.pp.se            : faultName(_faultName), mnem(_mnem),
819883Sandreas@sandberg.pp.se              vector(_vector), errorCode(_errorCode)
829883Sandreas@sandberg.pp.se        {
839883Sandreas@sandberg.pp.se        }
849883Sandreas@sandberg.pp.se
859883Sandreas@sandberg.pp.se        const char * name() const
869883Sandreas@sandberg.pp.se        {
879883Sandreas@sandberg.pp.se            return faultName;
889883Sandreas@sandberg.pp.se        }
899883Sandreas@sandberg.pp.se
909883Sandreas@sandberg.pp.se        virtual bool isBenign()
919883Sandreas@sandberg.pp.se        {
929883Sandreas@sandberg.pp.se            return true;
939883Sandreas@sandberg.pp.se        }
949883Sandreas@sandberg.pp.se
959883Sandreas@sandberg.pp.se        virtual const char * mnemonic() const
969883Sandreas@sandberg.pp.se        {
979883Sandreas@sandberg.pp.se            return mnem;
989883Sandreas@sandberg.pp.se        }
999883Sandreas@sandberg.pp.se
1009883Sandreas@sandberg.pp.se        virtual bool isSoft()
1019883Sandreas@sandberg.pp.se        {
1029883Sandreas@sandberg.pp.se            return false;
1039883Sandreas@sandberg.pp.se        }
1049883Sandreas@sandberg.pp.se
1059883Sandreas@sandberg.pp.se#if FULL_SYSTEM
1069883Sandreas@sandberg.pp.se        void invoke(ThreadContext * tc);
1079883Sandreas@sandberg.pp.se
1089883Sandreas@sandberg.pp.se        virtual std::string describe() const;
1099883Sandreas@sandberg.pp.se#endif
1109883Sandreas@sandberg.pp.se    };
1119883Sandreas@sandberg.pp.se
1129883Sandreas@sandberg.pp.se    // Base class for x86 faults which behave as if the underlying instruction
1139883Sandreas@sandberg.pp.se    // didn't happen.
1149883Sandreas@sandberg.pp.se    class X86Fault : public X86FaultBase
1159883Sandreas@sandberg.pp.se    {
1169883Sandreas@sandberg.pp.se      protected:
1179883Sandreas@sandberg.pp.se        X86Fault(const char * name, const char * mnem,
1189883Sandreas@sandberg.pp.se                 const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
1199883Sandreas@sandberg.pp.se            : X86FaultBase(name, mnem, vector, _errorCode)
1209883Sandreas@sandberg.pp.se        {}
1219883Sandreas@sandberg.pp.se    };
1229883Sandreas@sandberg.pp.se
1239883Sandreas@sandberg.pp.se    // Base class for x86 traps which behave as if the underlying instruction
1249883Sandreas@sandberg.pp.se    // completed.
1259883Sandreas@sandberg.pp.se    class X86Trap : public X86FaultBase
1269883Sandreas@sandberg.pp.se    {
1279883Sandreas@sandberg.pp.se      protected:
1289883Sandreas@sandberg.pp.se        X86Trap(const char * name, const char * mnem,
1299883Sandreas@sandberg.pp.se                const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
1309883Sandreas@sandberg.pp.se            : X86FaultBase(name, mnem, vector, _errorCode)
1319883Sandreas@sandberg.pp.se        {}
1329883Sandreas@sandberg.pp.se
1339883Sandreas@sandberg.pp.se#if FULL_SYSTEM
1349883Sandreas@sandberg.pp.se        void invoke(ThreadContext * tc);
1359883Sandreas@sandberg.pp.se#endif
1369883Sandreas@sandberg.pp.se    };
1379883Sandreas@sandberg.pp.se
1389883Sandreas@sandberg.pp.se    // Base class for x86 aborts which seem to be catastrophic failures.
1399883Sandreas@sandberg.pp.se    class X86Abort : public X86FaultBase
1409883Sandreas@sandberg.pp.se    {
1419883Sandreas@sandberg.pp.se      protected:
1429883Sandreas@sandberg.pp.se        X86Abort(const char * name, const char * mnem,
1439883Sandreas@sandberg.pp.se                const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
1449883Sandreas@sandberg.pp.se            : X86FaultBase(name, mnem, vector, _errorCode)
1459883Sandreas@sandberg.pp.se        {}
1469883Sandreas@sandberg.pp.se
1479883Sandreas@sandberg.pp.se#if FULL_SYSTEM
1489883Sandreas@sandberg.pp.se        void invoke(ThreadContext * tc);
1499883Sandreas@sandberg.pp.se#endif
1509883Sandreas@sandberg.pp.se    };
1519883Sandreas@sandberg.pp.se
1529883Sandreas@sandberg.pp.se    // Base class for x86 interrupts.
1539883Sandreas@sandberg.pp.se    class X86Interrupt : public X86FaultBase
1549883Sandreas@sandberg.pp.se    {
1559883Sandreas@sandberg.pp.se      protected:
1569883Sandreas@sandberg.pp.se        X86Interrupt(const char * name, const char * mnem,
1579883Sandreas@sandberg.pp.se                const uint8_t _vector, uint64_t _errorCode = (uint64_t)-1)
1589883Sandreas@sandberg.pp.se            : X86FaultBase(name, mnem, _vector, _errorCode)
1599883Sandreas@sandberg.pp.se        {}
1609883Sandreas@sandberg.pp.se    };
1619883Sandreas@sandberg.pp.se
1629883Sandreas@sandberg.pp.se    class UnimpInstFault : public FaultBase
1639883Sandreas@sandberg.pp.se    {
1649883Sandreas@sandberg.pp.se      public:
1659883Sandreas@sandberg.pp.se        const char * name() const
1669883Sandreas@sandberg.pp.se        {
1679883Sandreas@sandberg.pp.se            return "unimplemented_micro";
1689883Sandreas@sandberg.pp.se        }
1699883Sandreas@sandberg.pp.se
1709883Sandreas@sandberg.pp.se        void invoke(ThreadContext * tc)
1719883Sandreas@sandberg.pp.se        {
1729883Sandreas@sandberg.pp.se            panic("Unimplemented instruction!");
1739883Sandreas@sandberg.pp.se        }
1749883Sandreas@sandberg.pp.se    };
1759883Sandreas@sandberg.pp.se
1769883Sandreas@sandberg.pp.se    static inline Fault genMachineCheckFault()
1779883Sandreas@sandberg.pp.se    {
1789883Sandreas@sandberg.pp.se        panic("Machine check fault not implemented in x86!\n");
1799883Sandreas@sandberg.pp.se    }
1809883Sandreas@sandberg.pp.se
1819883Sandreas@sandberg.pp.se    // Below is a summary of the interrupt/exception information in the
1829883Sandreas@sandberg.pp.se    // architecture manuals.
1839883Sandreas@sandberg.pp.se
1849883Sandreas@sandberg.pp.se    // Class  |  Type    | vector |               Cause                 | mnem
1859883Sandreas@sandberg.pp.se    //------------------------------------------------------------------------
1869883Sandreas@sandberg.pp.se    //Contrib   Fault     0         Divide-by-Zero-Error                  #DE
1879883Sandreas@sandberg.pp.se    //Benign    Either    1         Debug                                 #DB
1889883Sandreas@sandberg.pp.se    //Benign    Interrupt 2         Non-Maskable-Interrupt                #NMI
1899883Sandreas@sandberg.pp.se    //Benign    Trap      3         Breakpoint                            #BP
1909883Sandreas@sandberg.pp.se    //Benign    Trap      4         Overflow                              #OF
1919883Sandreas@sandberg.pp.se    //Benign    Fault     5         Bound-Range                           #BR
1929883Sandreas@sandberg.pp.se    //Benign    Fault     6         Invalid-Opcode                        #UD
1939883Sandreas@sandberg.pp.se    //Benign    Fault     7         Device-Not-Available                  #NM
1949883Sandreas@sandberg.pp.se    //Benign    Abort     8         Double-Fault                          #DF
1959883Sandreas@sandberg.pp.se    //                    9         Coprocessor-Segment-Overrun
1969883Sandreas@sandberg.pp.se    //Contrib   Fault     10        Invalid-TSS                           #TS
1979883Sandreas@sandberg.pp.se    //Contrib   Fault     11        Segment-Not-Present                   #NP
1989883Sandreas@sandberg.pp.se    //Contrib   Fault     12        Stack                                 #SS
1999883Sandreas@sandberg.pp.se    //Contrib   Fault     13        General-Protection                    #GP
2009883Sandreas@sandberg.pp.se    //Either    Fault     14        Page-Fault                            #PF
2019883Sandreas@sandberg.pp.se    //                    15        Reserved
2029883Sandreas@sandberg.pp.se    //Benign    Fault     16        x87 Floating-Point Exception Pending  #MF
2039883Sandreas@sandberg.pp.se    //Benign    Fault     17        Alignment-Check                       #AC
2049883Sandreas@sandberg.pp.se    //Benign    Abort     18        Machine-Check                         #MC
2059883Sandreas@sandberg.pp.se    //Benign    Fault     19        SIMD Floating-Point                   #XF
2069883Sandreas@sandberg.pp.se    //                    20-29     Reserved
2079883Sandreas@sandberg.pp.se    //Contrib   ?         30        Security Exception                    #SX
2089883Sandreas@sandberg.pp.se    //                    31        Reserved
2099883Sandreas@sandberg.pp.se    //Benign    Interrupt 0-255     External Interrupts                   #INTR
2109883Sandreas@sandberg.pp.se    //Benign    Interrupt 0-255     Software Interrupts                   INTn
2119883Sandreas@sandberg.pp.se
2129883Sandreas@sandberg.pp.se    class DivideByZero : public X86Fault
2139883Sandreas@sandberg.pp.se    {
2149883Sandreas@sandberg.pp.se      public:
2159883Sandreas@sandberg.pp.se        DivideByZero() :
2169883Sandreas@sandberg.pp.se            X86Fault("Divide-by-Zero-Error", "#DE", 0)
2179883Sandreas@sandberg.pp.se        {}
2189883Sandreas@sandberg.pp.se    };
2199883Sandreas@sandberg.pp.se
2209883Sandreas@sandberg.pp.se    class DebugException : public X86FaultBase
2219883Sandreas@sandberg.pp.se    {
2229883Sandreas@sandberg.pp.se      public:
2239883Sandreas@sandberg.pp.se        DebugException() :
2249883Sandreas@sandberg.pp.se            X86FaultBase("Debug", "#DB", 1)
2259883Sandreas@sandberg.pp.se        {}
2269883Sandreas@sandberg.pp.se    };
2279883Sandreas@sandberg.pp.se
2289883Sandreas@sandberg.pp.se    class NonMaskableInterrupt : public X86Interrupt
2299883Sandreas@sandberg.pp.se    {
2309883Sandreas@sandberg.pp.se      public:
2319883Sandreas@sandberg.pp.se        NonMaskableInterrupt(uint8_t _vector) :
2329883Sandreas@sandberg.pp.se            X86Interrupt("Non Maskable Interrupt", "#NMI", 2, _vector)
2339883Sandreas@sandberg.pp.se        {}
2349883Sandreas@sandberg.pp.se    };
2359883Sandreas@sandberg.pp.se
2369883Sandreas@sandberg.pp.se    class Breakpoint : public X86Trap
2379883Sandreas@sandberg.pp.se    {
2389883Sandreas@sandberg.pp.se      public:
2399883Sandreas@sandberg.pp.se        Breakpoint() :
2409883Sandreas@sandberg.pp.se            X86Trap("Breakpoint", "#BP", 3)
2419883Sandreas@sandberg.pp.se        {}
2429883Sandreas@sandberg.pp.se    };
2439883Sandreas@sandberg.pp.se
2449883Sandreas@sandberg.pp.se    class OverflowTrap : public X86Trap
2459883Sandreas@sandberg.pp.se    {
2469883Sandreas@sandberg.pp.se      public:
2479883Sandreas@sandberg.pp.se        OverflowTrap() :
2489883Sandreas@sandberg.pp.se            X86Trap("Overflow", "#OF", 4)
2499883Sandreas@sandberg.pp.se        {}
2509883Sandreas@sandberg.pp.se    };
2519883Sandreas@sandberg.pp.se
2529883Sandreas@sandberg.pp.se    class BoundRange : public X86Fault
2539883Sandreas@sandberg.pp.se    {
2549883Sandreas@sandberg.pp.se      public:
2559883Sandreas@sandberg.pp.se        BoundRange() :
2569883Sandreas@sandberg.pp.se            X86Fault("Bound-Range", "#BR", 5)
2579883Sandreas@sandberg.pp.se        {}
2589883Sandreas@sandberg.pp.se    };
2599883Sandreas@sandberg.pp.se
2609883Sandreas@sandberg.pp.se    class InvalidOpcode : public X86Fault
2619883Sandreas@sandberg.pp.se    {
2629883Sandreas@sandberg.pp.se      public:
2639883Sandreas@sandberg.pp.se        InvalidOpcode() :
2649883Sandreas@sandberg.pp.se            X86Fault("Invalid-Opcode", "#UD", 6)
2659883Sandreas@sandberg.pp.se        {}
2669883Sandreas@sandberg.pp.se    };
2679883Sandreas@sandberg.pp.se
2689883Sandreas@sandberg.pp.se    class DeviceNotAvailable : public X86Fault
2699883Sandreas@sandberg.pp.se    {
2709883Sandreas@sandberg.pp.se      public:
2719883Sandreas@sandberg.pp.se        DeviceNotAvailable() :
2729883Sandreas@sandberg.pp.se            X86Fault("Device-Not-Available", "#NM", 7)
2739883Sandreas@sandberg.pp.se        {}
2749883Sandreas@sandberg.pp.se    };
2759883Sandreas@sandberg.pp.se
2769883Sandreas@sandberg.pp.se    class DoubleFault : public X86Abort
2779883Sandreas@sandberg.pp.se    {
2789884Sandreas@sandberg.pp.se      public:
2799884Sandreas@sandberg.pp.se        DoubleFault() :
2809884Sandreas@sandberg.pp.se            X86Abort("Double-Fault", "#DF", 8, 0)
2819884Sandreas@sandberg.pp.se        {}
2829884Sandreas@sandberg.pp.se    };
2839884Sandreas@sandberg.pp.se
2849884Sandreas@sandberg.pp.se    class InvalidTSS : public X86Fault
2859884Sandreas@sandberg.pp.se    {
2869884Sandreas@sandberg.pp.se      public:
2879884Sandreas@sandberg.pp.se        InvalidTSS(uint32_t _errorCode) :
2889884Sandreas@sandberg.pp.se            X86Fault("Invalid-TSS", "#TS", 10, _errorCode)
2899884Sandreas@sandberg.pp.se        {}
2909884Sandreas@sandberg.pp.se    };
2919884Sandreas@sandberg.pp.se
2929884Sandreas@sandberg.pp.se    class SegmentNotPresent : public X86Fault
2939884Sandreas@sandberg.pp.se    {
2949884Sandreas@sandberg.pp.se      public:
2959884Sandreas@sandberg.pp.se        SegmentNotPresent(uint32_t _errorCode) :
2969884Sandreas@sandberg.pp.se            X86Fault("Segment-Not-Present", "#NP", 11, _errorCode)
2979884Sandreas@sandberg.pp.se        {}
2989884Sandreas@sandberg.pp.se    };
2999884Sandreas@sandberg.pp.se
3009884Sandreas@sandberg.pp.se    class StackFault : public X86Fault
3019884Sandreas@sandberg.pp.se    {
3029884Sandreas@sandberg.pp.se      public:
3039884Sandreas@sandberg.pp.se        StackFault(uint32_t _errorCode) :
3049884Sandreas@sandberg.pp.se            X86Fault("Stack", "#SS", 12, _errorCode)
3059884Sandreas@sandberg.pp.se        {}
3069884Sandreas@sandberg.pp.se    };
3079884Sandreas@sandberg.pp.se
3089884Sandreas@sandberg.pp.se    class GeneralProtection : public X86Fault
3099884Sandreas@sandberg.pp.se    {
3109884Sandreas@sandberg.pp.se      public:
3119884Sandreas@sandberg.pp.se        GeneralProtection(uint32_t _errorCode) :
3129884Sandreas@sandberg.pp.se            X86Fault("General-Protection", "#GP", 13, _errorCode)
3139884Sandreas@sandberg.pp.se        {}
3149884Sandreas@sandberg.pp.se    };
3159884Sandreas@sandberg.pp.se
3169884Sandreas@sandberg.pp.se    class PageFault : public X86Fault
3179884Sandreas@sandberg.pp.se    {
3189884Sandreas@sandberg.pp.se      protected:
3199884Sandreas@sandberg.pp.se        BitUnion32(PageFaultErrorCode)
3209884Sandreas@sandberg.pp.se            Bitfield<0> present;
3219884Sandreas@sandberg.pp.se            Bitfield<1> write;
3229884Sandreas@sandberg.pp.se            Bitfield<2> user;
3239884Sandreas@sandberg.pp.se            Bitfield<3> reserved;
3249884Sandreas@sandberg.pp.se            Bitfield<4> fetch;
3259884Sandreas@sandberg.pp.se        EndBitUnion(PageFaultErrorCode)
3269884Sandreas@sandberg.pp.se
3279884Sandreas@sandberg.pp.se        Addr addr;
3289884Sandreas@sandberg.pp.se
3299884Sandreas@sandberg.pp.se      public:
3309884Sandreas@sandberg.pp.se        PageFault(Addr _addr, uint32_t _errorCode) :
3319884Sandreas@sandberg.pp.se            X86Fault("Page-Fault", "#PF", 14, _errorCode), addr(_addr)
3329884Sandreas@sandberg.pp.se        {}
3339884Sandreas@sandberg.pp.se
3349884Sandreas@sandberg.pp.se        PageFault(Addr _addr, bool present, bool write,
3359884Sandreas@sandberg.pp.se                bool user, bool reserved, bool fetch) :
3369884Sandreas@sandberg.pp.se            X86Fault("Page-Fault", "#PF", 14, 0), addr(_addr)
3379884Sandreas@sandberg.pp.se        {
3389884Sandreas@sandberg.pp.se            PageFaultErrorCode code = 0;
3399884Sandreas@sandberg.pp.se            code.present = present;
3409884Sandreas@sandberg.pp.se            code.write = write;
3419884Sandreas@sandberg.pp.se            code.user = user;
3429884Sandreas@sandberg.pp.se            code.reserved = reserved;
3439884Sandreas@sandberg.pp.se            code.fetch = fetch;
3449884Sandreas@sandberg.pp.se            errorCode = code;
3459884Sandreas@sandberg.pp.se        }
3469884Sandreas@sandberg.pp.se
3479884Sandreas@sandberg.pp.se#if FULL_SYSTEM
3489884Sandreas@sandberg.pp.se        void invoke(ThreadContext * tc);
3499884Sandreas@sandberg.pp.se
3509884Sandreas@sandberg.pp.se        virtual std::string describe() const;
3519884Sandreas@sandberg.pp.se#endif
3529884Sandreas@sandberg.pp.se    };
3539884Sandreas@sandberg.pp.se
3549884Sandreas@sandberg.pp.se    class X87FpExceptionPending : public X86Fault
3559884Sandreas@sandberg.pp.se    {
3569884Sandreas@sandberg.pp.se      public:
3579884Sandreas@sandberg.pp.se        X87FpExceptionPending() :
3589884Sandreas@sandberg.pp.se            X86Fault("x87 Floating-Point Exception Pending", "#MF", 16)
3599884Sandreas@sandberg.pp.se        {}
3609884Sandreas@sandberg.pp.se    };
3619884Sandreas@sandberg.pp.se
3629884Sandreas@sandberg.pp.se    class AlignmentCheck : public X86Fault
3639884Sandreas@sandberg.pp.se    {
3649884Sandreas@sandberg.pp.se      public:
3659884Sandreas@sandberg.pp.se        AlignmentCheck() :
3669884Sandreas@sandberg.pp.se            X86Fault("Alignment-Check", "#AC", 17, 0)
3679884Sandreas@sandberg.pp.se        {}
3689884Sandreas@sandberg.pp.se    };
3699884Sandreas@sandberg.pp.se
3709884Sandreas@sandberg.pp.se    class MachineCheck : public X86Abort
3719884Sandreas@sandberg.pp.se    {
3729884Sandreas@sandberg.pp.se      public:
3739884Sandreas@sandberg.pp.se        MachineCheck() :
3749884Sandreas@sandberg.pp.se            X86Abort("Machine-Check", "#MC", 18)
3759884Sandreas@sandberg.pp.se        {}
3769884Sandreas@sandberg.pp.se    };
3779884Sandreas@sandberg.pp.se
3789884Sandreas@sandberg.pp.se    class SIMDFloatingPointFault : public X86Fault
3799884Sandreas@sandberg.pp.se    {
3809884Sandreas@sandberg.pp.se      public:
3819884Sandreas@sandberg.pp.se        SIMDFloatingPointFault() :
3829884Sandreas@sandberg.pp.se            X86Fault("SIMD Floating-Point", "#XF", 19)
3839884Sandreas@sandberg.pp.se        {}
3849884Sandreas@sandberg.pp.se    };
3859884Sandreas@sandberg.pp.se
3869884Sandreas@sandberg.pp.se    class SecurityException : public X86FaultBase
3879884Sandreas@sandberg.pp.se    {
3889884Sandreas@sandberg.pp.se      public:
3899884Sandreas@sandberg.pp.se        SecurityException() :
3909884Sandreas@sandberg.pp.se            X86FaultBase("Security Exception", "#SX", 30)
3919884Sandreas@sandberg.pp.se        {}
3929884Sandreas@sandberg.pp.se    };
3939884Sandreas@sandberg.pp.se
3949884Sandreas@sandberg.pp.se    class ExternalInterrupt : public X86Interrupt
3959884Sandreas@sandberg.pp.se    {
3969884Sandreas@sandberg.pp.se      public:
3979884Sandreas@sandberg.pp.se        ExternalInterrupt(uint8_t _vector) :
3989884Sandreas@sandberg.pp.se            X86Interrupt("External Interrupt", "#INTR", _vector)
3999884Sandreas@sandberg.pp.se        {}
4009884Sandreas@sandberg.pp.se    };
4019884Sandreas@sandberg.pp.se
4029884Sandreas@sandberg.pp.se    class SystemManagementInterrupt : public X86Interrupt
4039884Sandreas@sandberg.pp.se    {
4049884Sandreas@sandberg.pp.se      public:
4059884Sandreas@sandberg.pp.se        SystemManagementInterrupt() :
4069884Sandreas@sandberg.pp.se            X86Interrupt("System Management Interrupt", "#SMI", 0)
4079884Sandreas@sandberg.pp.se        {}
4089884Sandreas@sandberg.pp.se    };
4099884Sandreas@sandberg.pp.se
4109884Sandreas@sandberg.pp.se    class InitInterrupt : public X86Interrupt
4119884Sandreas@sandberg.pp.se    {
4129884Sandreas@sandberg.pp.se        uint8_t vector;
4139884Sandreas@sandberg.pp.se      public:
4149884Sandreas@sandberg.pp.se        InitInterrupt(uint8_t _vector) :
4159884Sandreas@sandberg.pp.se            X86Interrupt("INIT Interrupt", "#INIT", _vector)
4169884Sandreas@sandberg.pp.se        {}
4179884Sandreas@sandberg.pp.se    };
4189884Sandreas@sandberg.pp.se
4199884Sandreas@sandberg.pp.se    class SoftwareInterrupt : public X86Interrupt
4209884Sandreas@sandberg.pp.se    {
4219884Sandreas@sandberg.pp.se      public:
4229884Sandreas@sandberg.pp.se        SoftwareInterrupt(uint8_t _vector) :
4239884Sandreas@sandberg.pp.se            X86Interrupt("Software Interrupt", "#INTR", _vector)
4249884Sandreas@sandberg.pp.se        {}
4259884Sandreas@sandberg.pp.se
4269884Sandreas@sandberg.pp.se        bool isSoft()
4279884Sandreas@sandberg.pp.se        {
4289883Sandreas@sandberg.pp.se            return true;
4299883Sandreas@sandberg.pp.se        }
4309883Sandreas@sandberg.pp.se    };
4319883Sandreas@sandberg.pp.se};
4329883Sandreas@sandberg.pp.se
4339883Sandreas@sandberg.pp.se#endif // __ARCH_X86_FAULTS_HH__
4349883Sandreas@sandberg.pp.se