faults.hh revision 6023
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2007 The Hewlett-Packard Development Company
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * Redistribution and use of this software in source and binary forms,
611308Santhony.gutierrez@amd.com * with or without modification, are permitted provided that the
711308Santhony.gutierrez@amd.com * following conditions are met:
811308Santhony.gutierrez@amd.com *
911308Santhony.gutierrez@amd.com * The software must be used only for Non-Commercial Use which means any
1011308Santhony.gutierrez@amd.com * use which is NOT directed to receiving any direct monetary
1111308Santhony.gutierrez@amd.com * compensation for, or commercial advantage from such use.  Illustrative
1211308Santhony.gutierrez@amd.com * examples of non-commercial use are academic research, personal study,
1311308Santhony.gutierrez@amd.com * teaching, education and corporate research & development.
1411308Santhony.gutierrez@amd.com * Illustrative examples of commercial use are distributing products for
1511308Santhony.gutierrez@amd.com * commercial advantage and providing services using the software for
1611308Santhony.gutierrez@amd.com * commercial advantage.
1711308Santhony.gutierrez@amd.com *
1811308Santhony.gutierrez@amd.com * If you wish to use this software or functionality therein that may be
1911308Santhony.gutierrez@amd.com * covered by patents for commercial use, please contact:
2011308Santhony.gutierrez@amd.com *     Director of Intellectual Property Licensing
2111308Santhony.gutierrez@amd.com *     Office of Strategy and Technology
2211308Santhony.gutierrez@amd.com *     Hewlett-Packard Company
2311308Santhony.gutierrez@amd.com *     1501 Page Mill Road
2411308Santhony.gutierrez@amd.com *     Palo Alto, California  94304
2511308Santhony.gutierrez@amd.com *
2611308Santhony.gutierrez@amd.com * Redistributions of source code must retain the above copyright notice,
2711308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer.  Redistributions
2811308Santhony.gutierrez@amd.com * in binary form must reproduce the above copyright notice, this list of
2911308Santhony.gutierrez@amd.com * conditions and the following disclaimer in the documentation and/or
3011308Santhony.gutierrez@amd.com * other materials provided with the distribution.  Neither the name of
3111308Santhony.gutierrez@amd.com * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
3211308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from
3311308Santhony.gutierrez@amd.com * this software without specific prior written permission.  No right of
3411308Santhony.gutierrez@amd.com * sublicense is granted herewith.  Derivatives of the software and
3511308Santhony.gutierrez@amd.com * output created using the software may be prepared, but only for
3611308Santhony.gutierrez@amd.com * Non-Commercial Uses.  Derivatives of the software may be shared with
3711308Santhony.gutierrez@amd.com * others provided: (i) the others agree to abide by the list of
3811308Santhony.gutierrez@amd.com * conditions herein which includes the Non-Commercial Use restrictions;
3911308Santhony.gutierrez@amd.com * and (ii) such Derivatives of the software include the above copyright
4011308Santhony.gutierrez@amd.com * notice to acknowledge the contribution from this software where
4111308Santhony.gutierrez@amd.com * applicable, this list of conditions and the disclaimer below.
4211308Santhony.gutierrez@amd.com *
4311308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4411308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4511308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4611308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4711308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4811308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4911308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5011308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5111308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5211308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
5311308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5411308Santhony.gutierrez@amd.com *
5511308Santhony.gutierrez@amd.com * Authors: Gabe Black
5611308Santhony.gutierrez@amd.com */
5711308Santhony.gutierrez@amd.com
5811308Santhony.gutierrez@amd.com#ifndef __ARCH_X86_FAULTS_HH__
5911308Santhony.gutierrez@amd.com#define __ARCH_X86_FAULTS_HH__
6011308Santhony.gutierrez@amd.com
6111308Santhony.gutierrez@amd.com#include "base/bitunion.hh"
6211308Santhony.gutierrez@amd.com#include "base/misc.hh"
6311308Santhony.gutierrez@amd.com#include "sim/faults.hh"
6411308Santhony.gutierrez@amd.com#include "sim/tlb.hh"
6511308Santhony.gutierrez@amd.com
6611308Santhony.gutierrez@amd.com#include <string>
6711308Santhony.gutierrez@amd.com
6811308Santhony.gutierrez@amd.comnamespace X86ISA
6911308Santhony.gutierrez@amd.com{
7011308Santhony.gutierrez@amd.com    // Base class for all x86 "faults" where faults is in the m5 sense
7111308Santhony.gutierrez@amd.com    class X86FaultBase : public FaultBase
7211308Santhony.gutierrez@amd.com    {
7311308Santhony.gutierrez@amd.com      protected:
7411308Santhony.gutierrez@amd.com        const char * faultName;
7511308Santhony.gutierrez@amd.com        const char * mnem;
7611308Santhony.gutierrez@amd.com        uint8_t vector;
7711308Santhony.gutierrez@amd.com        uint64_t errorCode;
7811308Santhony.gutierrez@amd.com
7911308Santhony.gutierrez@amd.com        X86FaultBase(const char * _faultName, const char * _mnem,
8011308Santhony.gutierrez@amd.com                     const uint8_t _vector, uint64_t _errorCode = (uint64_t)-1)
8111308Santhony.gutierrez@amd.com            : faultName(_faultName), mnem(_mnem),
8211308Santhony.gutierrez@amd.com              vector(_vector), errorCode(_errorCode)
8311308Santhony.gutierrez@amd.com        {
8411308Santhony.gutierrez@amd.com        }
8511308Santhony.gutierrez@amd.com
8611308Santhony.gutierrez@amd.com        const char * name() const
8711308Santhony.gutierrez@amd.com        {
8811308Santhony.gutierrez@amd.com            return faultName;
8911308Santhony.gutierrez@amd.com        }
9011308Santhony.gutierrez@amd.com
9111308Santhony.gutierrez@amd.com        virtual bool isBenign()
9211308Santhony.gutierrez@amd.com        {
9311308Santhony.gutierrez@amd.com            return true;
9411308Santhony.gutierrez@amd.com        }
9511308Santhony.gutierrez@amd.com
9611308Santhony.gutierrez@amd.com        virtual const char * mnemonic() const
9711308Santhony.gutierrez@amd.com        {
9811308Santhony.gutierrez@amd.com            return mnem;
9911308Santhony.gutierrez@amd.com        }
10011308Santhony.gutierrez@amd.com
10111308Santhony.gutierrez@amd.com        virtual bool isSoft()
10211308Santhony.gutierrez@amd.com        {
10311308Santhony.gutierrez@amd.com            return false;
10411308Santhony.gutierrez@amd.com        }
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.com#if FULL_SYSTEM
10711308Santhony.gutierrez@amd.com        void invoke(ThreadContext * tc);
10811308Santhony.gutierrez@amd.com
10911308Santhony.gutierrez@amd.com        virtual std::string describe() const;
11011308Santhony.gutierrez@amd.com#endif
11111308Santhony.gutierrez@amd.com    };
11211308Santhony.gutierrez@amd.com
11311308Santhony.gutierrez@amd.com    // Base class for x86 faults which behave as if the underlying instruction
11411308Santhony.gutierrez@amd.com    // didn't happen.
11511308Santhony.gutierrez@amd.com    class X86Fault : public X86FaultBase
11611308Santhony.gutierrez@amd.com    {
11711308Santhony.gutierrez@amd.com      protected:
11811308Santhony.gutierrez@amd.com        X86Fault(const char * name, const char * mnem,
11911308Santhony.gutierrez@amd.com                 const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
12011308Santhony.gutierrez@amd.com            : X86FaultBase(name, mnem, vector, _errorCode)
12111308Santhony.gutierrez@amd.com        {}
12211308Santhony.gutierrez@amd.com    };
12311308Santhony.gutierrez@amd.com
12411308Santhony.gutierrez@amd.com    // Base class for x86 traps which behave as if the underlying instruction
12511308Santhony.gutierrez@amd.com    // completed.
12611308Santhony.gutierrez@amd.com    class X86Trap : public X86FaultBase
12711308Santhony.gutierrez@amd.com    {
12811308Santhony.gutierrez@amd.com      protected:
12911308Santhony.gutierrez@amd.com        X86Trap(const char * name, const char * mnem,
13011308Santhony.gutierrez@amd.com                const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
13111308Santhony.gutierrez@amd.com            : X86FaultBase(name, mnem, vector, _errorCode)
13211308Santhony.gutierrez@amd.com        {}
13311308Santhony.gutierrez@amd.com
13411308Santhony.gutierrez@amd.com#if FULL_SYSTEM
13511308Santhony.gutierrez@amd.com        void invoke(ThreadContext * tc);
13611308Santhony.gutierrez@amd.com#endif
13711308Santhony.gutierrez@amd.com    };
13811308Santhony.gutierrez@amd.com
13911308Santhony.gutierrez@amd.com    // Base class for x86 aborts which seem to be catastrophic failures.
14011308Santhony.gutierrez@amd.com    class X86Abort : public X86FaultBase
14111308Santhony.gutierrez@amd.com    {
14211308Santhony.gutierrez@amd.com      protected:
14311308Santhony.gutierrez@amd.com        X86Abort(const char * name, const char * mnem,
14411308Santhony.gutierrez@amd.com                const uint8_t vector, uint64_t _errorCode = (uint64_t)-1)
14511308Santhony.gutierrez@amd.com            : X86FaultBase(name, mnem, vector, _errorCode)
14611308Santhony.gutierrez@amd.com        {}
14711308Santhony.gutierrez@amd.com
14811308Santhony.gutierrez@amd.com#if FULL_SYSTEM
14911308Santhony.gutierrez@amd.com        void invoke(ThreadContext * tc);
15011308Santhony.gutierrez@amd.com#endif
15111308Santhony.gutierrez@amd.com    };
15211308Santhony.gutierrez@amd.com
15311308Santhony.gutierrez@amd.com    // Base class for x86 interrupts.
15411308Santhony.gutierrez@amd.com    class X86Interrupt : public X86FaultBase
15511308Santhony.gutierrez@amd.com    {
15611308Santhony.gutierrez@amd.com      protected:
15711308Santhony.gutierrez@amd.com        X86Interrupt(const char * name, const char * mnem,
15811308Santhony.gutierrez@amd.com                const uint8_t _vector, uint64_t _errorCode = (uint64_t)-1)
15911308Santhony.gutierrez@amd.com            : X86FaultBase(name, mnem, _vector, _errorCode)
16011308Santhony.gutierrez@amd.com        {}
16111308Santhony.gutierrez@amd.com    };
16211308Santhony.gutierrez@amd.com
16311308Santhony.gutierrez@amd.com    class UnimpInstFault : public FaultBase
16411308Santhony.gutierrez@amd.com    {
16511308Santhony.gutierrez@amd.com      public:
16611308Santhony.gutierrez@amd.com        const char * name() const
16711308Santhony.gutierrez@amd.com        {
16811308Santhony.gutierrez@amd.com            return "unimplemented_micro";
16911308Santhony.gutierrez@amd.com        }
17011308Santhony.gutierrez@amd.com
17111308Santhony.gutierrez@amd.com        void invoke(ThreadContext * tc)
17211308Santhony.gutierrez@amd.com        {
17311308Santhony.gutierrez@amd.com            panic("Unimplemented instruction!");
17411308Santhony.gutierrez@amd.com        }
17511308Santhony.gutierrez@amd.com    };
17611308Santhony.gutierrez@amd.com
17711308Santhony.gutierrez@amd.com    static inline Fault genMachineCheckFault()
17811308Santhony.gutierrez@amd.com    {
17911308Santhony.gutierrez@amd.com        panic("Machine check fault not implemented in x86!\n");
18011308Santhony.gutierrez@amd.com    }
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.com    // Below is a summary of the interrupt/exception information in the
18311308Santhony.gutierrez@amd.com    // architecture manuals.
18411308Santhony.gutierrez@amd.com
18511308Santhony.gutierrez@amd.com    // Class  |  Type    | vector |               Cause                 | mnem
18611308Santhony.gutierrez@amd.com    //------------------------------------------------------------------------
18711308Santhony.gutierrez@amd.com    //Contrib   Fault     0         Divide-by-Zero-Error                  #DE
18811308Santhony.gutierrez@amd.com    //Benign    Either    1         Debug                                 #DB
18911308Santhony.gutierrez@amd.com    //Benign    Interrupt 2         Non-Maskable-Interrupt                #NMI
19011308Santhony.gutierrez@amd.com    //Benign    Trap      3         Breakpoint                            #BP
19111308Santhony.gutierrez@amd.com    //Benign    Trap      4         Overflow                              #OF
19211308Santhony.gutierrez@amd.com    //Benign    Fault     5         Bound-Range                           #BR
19311308Santhony.gutierrez@amd.com    //Benign    Fault     6         Invalid-Opcode                        #UD
19411308Santhony.gutierrez@amd.com    //Benign    Fault     7         Device-Not-Available                  #NM
19511308Santhony.gutierrez@amd.com    //Benign    Abort     8         Double-Fault                          #DF
19611308Santhony.gutierrez@amd.com    //                    9         Coprocessor-Segment-Overrun
19711308Santhony.gutierrez@amd.com    //Contrib   Fault     10        Invalid-TSS                           #TS
19811308Santhony.gutierrez@amd.com    //Contrib   Fault     11        Segment-Not-Present                   #NP
19911308Santhony.gutierrez@amd.com    //Contrib   Fault     12        Stack                                 #SS
20011308Santhony.gutierrez@amd.com    //Contrib   Fault     13        General-Protection                    #GP
20111308Santhony.gutierrez@amd.com    //Either    Fault     14        Page-Fault                            #PF
20211308Santhony.gutierrez@amd.com    //                    15        Reserved
20311308Santhony.gutierrez@amd.com    //Benign    Fault     16        x87 Floating-Point Exception Pending  #MF
20411308Santhony.gutierrez@amd.com    //Benign    Fault     17        Alignment-Check                       #AC
20511308Santhony.gutierrez@amd.com    //Benign    Abort     18        Machine-Check                         #MC
20611308Santhony.gutierrez@amd.com    //Benign    Fault     19        SIMD Floating-Point                   #XF
20711308Santhony.gutierrez@amd.com    //                    20-29     Reserved
20811308Santhony.gutierrez@amd.com    //Contrib   ?         30        Security Exception                    #SX
20911308Santhony.gutierrez@amd.com    //                    31        Reserved
21011308Santhony.gutierrez@amd.com    //Benign    Interrupt 0-255     External Interrupts                   #INTR
21111308Santhony.gutierrez@amd.com    //Benign    Interrupt 0-255     Software Interrupts                   INTn
21211308Santhony.gutierrez@amd.com
21311308Santhony.gutierrez@amd.com    class DivideByZero : public X86Fault
21411308Santhony.gutierrez@amd.com    {
21511308Santhony.gutierrez@amd.com      public:
21611308Santhony.gutierrez@amd.com        DivideByZero() :
21711308Santhony.gutierrez@amd.com            X86Fault("Divide-by-Zero-Error", "#DE", 0)
21811308Santhony.gutierrez@amd.com        {}
21911308Santhony.gutierrez@amd.com    };
22011308Santhony.gutierrez@amd.com
22111308Santhony.gutierrez@amd.com    class DebugException : public X86FaultBase
22211308Santhony.gutierrez@amd.com    {
22311308Santhony.gutierrez@amd.com      public:
22411308Santhony.gutierrez@amd.com        DebugException() :
22511308Santhony.gutierrez@amd.com            X86FaultBase("Debug", "#DB", 1)
22611308Santhony.gutierrez@amd.com        {}
22711308Santhony.gutierrez@amd.com    };
22811308Santhony.gutierrez@amd.com
22911308Santhony.gutierrez@amd.com    class NonMaskableInterrupt : public X86Interrupt
23011308Santhony.gutierrez@amd.com    {
23111308Santhony.gutierrez@amd.com      public:
23211308Santhony.gutierrez@amd.com        NonMaskableInterrupt(uint8_t _vector) :
23311308Santhony.gutierrez@amd.com            X86Interrupt("Non Maskable Interrupt", "#NMI", 2, _vector)
23411308Santhony.gutierrez@amd.com        {}
23511308Santhony.gutierrez@amd.com    };
23611308Santhony.gutierrez@amd.com
23711308Santhony.gutierrez@amd.com    class Breakpoint : public X86Trap
23811308Santhony.gutierrez@amd.com    {
23911308Santhony.gutierrez@amd.com      public:
24011308Santhony.gutierrez@amd.com        Breakpoint() :
24111308Santhony.gutierrez@amd.com            X86Trap("Breakpoint", "#BP", 3)
24211308Santhony.gutierrez@amd.com        {}
24311308Santhony.gutierrez@amd.com    };
24411308Santhony.gutierrez@amd.com
24511308Santhony.gutierrez@amd.com    class OverflowTrap : public X86Trap
24611308Santhony.gutierrez@amd.com    {
24711308Santhony.gutierrez@amd.com      public:
24811308Santhony.gutierrez@amd.com        OverflowTrap() :
24911308Santhony.gutierrez@amd.com            X86Trap("Overflow", "#OF", 4)
25011308Santhony.gutierrez@amd.com        {}
25111308Santhony.gutierrez@amd.com    };
25211308Santhony.gutierrez@amd.com
25311308Santhony.gutierrez@amd.com    class BoundRange : public X86Fault
25411308Santhony.gutierrez@amd.com    {
25511308Santhony.gutierrez@amd.com      public:
25611308Santhony.gutierrez@amd.com        BoundRange() :
25711308Santhony.gutierrez@amd.com            X86Fault("Bound-Range", "#BR", 5)
25811308Santhony.gutierrez@amd.com        {}
25911308Santhony.gutierrez@amd.com    };
26011308Santhony.gutierrez@amd.com
26111308Santhony.gutierrez@amd.com    class InvalidOpcode : public X86Fault
26211308Santhony.gutierrez@amd.com    {
26311308Santhony.gutierrez@amd.com      public:
26411308Santhony.gutierrez@amd.com        InvalidOpcode() :
26511308Santhony.gutierrez@amd.com            X86Fault("Invalid-Opcode", "#UD", 6)
26611308Santhony.gutierrez@amd.com        {}
26711308Santhony.gutierrez@amd.com    };
26811308Santhony.gutierrez@amd.com
26911308Santhony.gutierrez@amd.com    class DeviceNotAvailable : public X86Fault
27011308Santhony.gutierrez@amd.com    {
27111308Santhony.gutierrez@amd.com      public:
27211308Santhony.gutierrez@amd.com        DeviceNotAvailable() :
27311308Santhony.gutierrez@amd.com            X86Fault("Device-Not-Available", "#NM", 7)
27411308Santhony.gutierrez@amd.com        {}
27511308Santhony.gutierrez@amd.com    };
27611308Santhony.gutierrez@amd.com
27711308Santhony.gutierrez@amd.com    class DoubleFault : public X86Abort
27811308Santhony.gutierrez@amd.com    {
27911308Santhony.gutierrez@amd.com      public:
28011308Santhony.gutierrez@amd.com        DoubleFault() :
28111308Santhony.gutierrez@amd.com            X86Abort("Double-Fault", "#DF", 8, 0)
28211308Santhony.gutierrez@amd.com        {}
28311308Santhony.gutierrez@amd.com    };
28411308Santhony.gutierrez@amd.com
28511308Santhony.gutierrez@amd.com    class InvalidTSS : public X86Fault
28611308Santhony.gutierrez@amd.com    {
28711308Santhony.gutierrez@amd.com      public:
28811308Santhony.gutierrez@amd.com        InvalidTSS(uint32_t _errorCode) :
28911308Santhony.gutierrez@amd.com            X86Fault("Invalid-TSS", "#TS", 10, _errorCode)
29011308Santhony.gutierrez@amd.com        {}
29111308Santhony.gutierrez@amd.com    };
29211308Santhony.gutierrez@amd.com
29311308Santhony.gutierrez@amd.com    class SegmentNotPresent : public X86Fault
29411308Santhony.gutierrez@amd.com    {
29511308Santhony.gutierrez@amd.com      public:
29611308Santhony.gutierrez@amd.com        SegmentNotPresent(uint32_t _errorCode) :
29711308Santhony.gutierrez@amd.com            X86Fault("Segment-Not-Present", "#NP", 11, _errorCode)
29811308Santhony.gutierrez@amd.com        {}
29911308Santhony.gutierrez@amd.com    };
30011308Santhony.gutierrez@amd.com
30111308Santhony.gutierrez@amd.com    class StackFault : public X86Fault
30211308Santhony.gutierrez@amd.com    {
30311308Santhony.gutierrez@amd.com      public:
30411308Santhony.gutierrez@amd.com        StackFault(uint32_t _errorCode) :
30511308Santhony.gutierrez@amd.com            X86Fault("Stack", "#SS", 12, _errorCode)
30611308Santhony.gutierrez@amd.com        {}
30711308Santhony.gutierrez@amd.com    };
30811308Santhony.gutierrez@amd.com
30911308Santhony.gutierrez@amd.com    class GeneralProtection : public X86Fault
31011308Santhony.gutierrez@amd.com    {
31111308Santhony.gutierrez@amd.com      public:
31211308Santhony.gutierrez@amd.com        GeneralProtection(uint32_t _errorCode) :
31311308Santhony.gutierrez@amd.com            X86Fault("General-Protection", "#GP", 13, _errorCode)
31411308Santhony.gutierrez@amd.com        {}
31511308Santhony.gutierrez@amd.com    };
31611308Santhony.gutierrez@amd.com
31711308Santhony.gutierrez@amd.com    class PageFault : public X86Fault
31811308Santhony.gutierrez@amd.com    {
31911308Santhony.gutierrez@amd.com      protected:
32011308Santhony.gutierrez@amd.com        BitUnion32(PageFaultErrorCode)
32111308Santhony.gutierrez@amd.com            Bitfield<0> present;
32211308Santhony.gutierrez@amd.com            Bitfield<1> write;
32311308Santhony.gutierrez@amd.com            Bitfield<2> user;
32411308Santhony.gutierrez@amd.com            Bitfield<3> reserved;
32511308Santhony.gutierrez@amd.com            Bitfield<4> fetch;
32611308Santhony.gutierrez@amd.com        EndBitUnion(PageFaultErrorCode)
32711308Santhony.gutierrez@amd.com
32811308Santhony.gutierrez@amd.com        Addr addr;
32911308Santhony.gutierrez@amd.com
33011308Santhony.gutierrez@amd.com      public:
33111308Santhony.gutierrez@amd.com        PageFault(Addr _addr, uint32_t _errorCode) :
33211308Santhony.gutierrez@amd.com            X86Fault("Page-Fault", "#PF", 14, _errorCode), addr(_addr)
33311308Santhony.gutierrez@amd.com        {}
33411308Santhony.gutierrez@amd.com
33511308Santhony.gutierrez@amd.com        PageFault(Addr _addr, bool present, BaseTLB::Mode mode,
33611308Santhony.gutierrez@amd.com                bool user, bool reserved) :
33711308Santhony.gutierrez@amd.com            X86Fault("Page-Fault", "#PF", 14, 0), addr(_addr)
33811308Santhony.gutierrez@amd.com        {
33911308Santhony.gutierrez@amd.com            PageFaultErrorCode code = 0;
34011308Santhony.gutierrez@amd.com            code.present = present;
34111308Santhony.gutierrez@amd.com            code.write = (mode == BaseTLB::Write);
34211308Santhony.gutierrez@amd.com            code.user = user;
34311308Santhony.gutierrez@amd.com            code.reserved = reserved;
34411308Santhony.gutierrez@amd.com            code.fetch = (mode == BaseTLB::Execute);
34511308Santhony.gutierrez@amd.com            errorCode = code;
34611308Santhony.gutierrez@amd.com        }
34711308Santhony.gutierrez@amd.com
34811308Santhony.gutierrez@amd.com#if FULL_SYSTEM
34911308Santhony.gutierrez@amd.com        void invoke(ThreadContext * tc);
35011308Santhony.gutierrez@amd.com
35111308Santhony.gutierrez@amd.com        virtual std::string describe() const;
35211308Santhony.gutierrez@amd.com#endif
35311308Santhony.gutierrez@amd.com    };
35411308Santhony.gutierrez@amd.com
35511308Santhony.gutierrez@amd.com    class X87FpExceptionPending : public X86Fault
35611308Santhony.gutierrez@amd.com    {
35711308Santhony.gutierrez@amd.com      public:
35811308Santhony.gutierrez@amd.com        X87FpExceptionPending() :
35911308Santhony.gutierrez@amd.com            X86Fault("x87 Floating-Point Exception Pending", "#MF", 16)
36011308Santhony.gutierrez@amd.com        {}
36111308Santhony.gutierrez@amd.com    };
36211308Santhony.gutierrez@amd.com
36311308Santhony.gutierrez@amd.com    class AlignmentCheck : public X86Fault
36411308Santhony.gutierrez@amd.com    {
36511308Santhony.gutierrez@amd.com      public:
36611308Santhony.gutierrez@amd.com        AlignmentCheck() :
36711308Santhony.gutierrez@amd.com            X86Fault("Alignment-Check", "#AC", 17, 0)
36811308Santhony.gutierrez@amd.com        {}
36911308Santhony.gutierrez@amd.com    };
37011308Santhony.gutierrez@amd.com
37111308Santhony.gutierrez@amd.com    class MachineCheck : public X86Abort
37211308Santhony.gutierrez@amd.com    {
37311308Santhony.gutierrez@amd.com      public:
37411308Santhony.gutierrez@amd.com        MachineCheck() :
37511308Santhony.gutierrez@amd.com            X86Abort("Machine-Check", "#MC", 18)
37611308Santhony.gutierrez@amd.com        {}
37711308Santhony.gutierrez@amd.com    };
37811308Santhony.gutierrez@amd.com
37911308Santhony.gutierrez@amd.com    class SIMDFloatingPointFault : public X86Fault
38011308Santhony.gutierrez@amd.com    {
38111308Santhony.gutierrez@amd.com      public:
38211308Santhony.gutierrez@amd.com        SIMDFloatingPointFault() :
38311308Santhony.gutierrez@amd.com            X86Fault("SIMD Floating-Point", "#XF", 19)
38411308Santhony.gutierrez@amd.com        {}
38511308Santhony.gutierrez@amd.com    };
38611308Santhony.gutierrez@amd.com
38711308Santhony.gutierrez@amd.com    class SecurityException : public X86FaultBase
38811308Santhony.gutierrez@amd.com    {
38911308Santhony.gutierrez@amd.com      public:
39011308Santhony.gutierrez@amd.com        SecurityException() :
39111308Santhony.gutierrez@amd.com            X86FaultBase("Security Exception", "#SX", 30)
39211308Santhony.gutierrez@amd.com        {}
39311308Santhony.gutierrez@amd.com    };
39411308Santhony.gutierrez@amd.com
39511308Santhony.gutierrez@amd.com    class ExternalInterrupt : public X86Interrupt
39611308Santhony.gutierrez@amd.com    {
39711308Santhony.gutierrez@amd.com      public:
39811308Santhony.gutierrez@amd.com        ExternalInterrupt(uint8_t _vector) :
39911308Santhony.gutierrez@amd.com            X86Interrupt("External Interrupt", "#INTR", _vector)
40011308Santhony.gutierrez@amd.com        {}
40111308Santhony.gutierrez@amd.com    };
40211308Santhony.gutierrez@amd.com
40311308Santhony.gutierrez@amd.com    class SystemManagementInterrupt : public X86Interrupt
40411308Santhony.gutierrez@amd.com    {
40511308Santhony.gutierrez@amd.com      public:
40611308Santhony.gutierrez@amd.com        SystemManagementInterrupt() :
40711308Santhony.gutierrez@amd.com            X86Interrupt("System Management Interrupt", "#SMI", 0)
40811308Santhony.gutierrez@amd.com        {}
40911308Santhony.gutierrez@amd.com    };
41011308Santhony.gutierrez@amd.com
41111308Santhony.gutierrez@amd.com    class InitInterrupt : public X86Interrupt
41211308Santhony.gutierrez@amd.com    {
41311308Santhony.gutierrez@amd.com        uint8_t vector;
41411308Santhony.gutierrez@amd.com      public:
41511308Santhony.gutierrez@amd.com        InitInterrupt(uint8_t _vector) :
41611308Santhony.gutierrez@amd.com            X86Interrupt("INIT Interrupt", "#INIT", _vector)
41711308Santhony.gutierrez@amd.com        {}
41811308Santhony.gutierrez@amd.com    };
41911308Santhony.gutierrez@amd.com
42011308Santhony.gutierrez@amd.com    class SoftwareInterrupt : public X86Interrupt
42111308Santhony.gutierrez@amd.com    {
42211308Santhony.gutierrez@amd.com      public:
42311308Santhony.gutierrez@amd.com        SoftwareInterrupt(uint8_t _vector) :
42411308Santhony.gutierrez@amd.com            X86Interrupt("Software Interrupt", "#INTR", _vector)
42511308Santhony.gutierrez@amd.com        {}
42611308Santhony.gutierrez@amd.com
42711308Santhony.gutierrez@amd.com        bool isSoft()
42811308Santhony.gutierrez@amd.com        {
42911308Santhony.gutierrez@amd.com            return true;
43011308Santhony.gutierrez@amd.com        }
43111308Santhony.gutierrez@amd.com    };
43211308Santhony.gutierrez@amd.com};
43311308Santhony.gutierrez@amd.com
43411308Santhony.gutierrez@amd.com#endif // __ARCH_X86_FAULTS_HH__
43511308Santhony.gutierrez@amd.com