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