faults.hh revision 3890
12SN/A/* 29448SAndreas.Sandberg@ARM.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 37338SAli.Saidi@ARM.com * All rights reserved. 47338SAli.Saidi@ARM.com * 57338SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 67338SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 77338SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 87338SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 97338SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 107338SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 117338SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 127338SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 137338SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 141762SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272SN/A * 282SN/A * Authors: Gabe Black 292SN/A * Kevin Lim 302SN/A */ 312SN/A 322SN/A#ifndef __SPARC_FAULTS_HH__ 332SN/A#define __SPARC_FAULTS_HH__ 342SN/A 352SN/A#include "sim/faults.hh" 362SN/A 372SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 382SN/A 392665Ssaidi@eecs.umich.edunamespace SparcISA 402665Ssaidi@eecs.umich.edu{ 412SN/A 422SN/Atypedef uint32_t TrapType; 438779Sgblack@eecs.umich.edutypedef uint32_t FaultPriority; 448779Sgblack@eecs.umich.edu 458779Sgblack@eecs.umich.educlass SparcFaultBase : public FaultBase 462439SN/A{ 478779Sgblack@eecs.umich.edu public: 488229Snate@binkert.org enum PrivilegeLevel 496216Snate@binkert.org { 50146SN/A U, User = U, 51146SN/A P, Privileged = P, 52146SN/A H, Hyperprivileged = H, 53146SN/A NumLevels, 54146SN/A SH = -1, 556216Snate@binkert.org ShouldntHappen = SH 566658Snate@binkert.org }; 578229Snate@binkert.org struct FaultVals 581717SN/A { 598887Sgeoffrey.blake@arm.com const FaultName name; 608887Sgeoffrey.blake@arm.com const TrapType trapType; 61146SN/A const FaultPriority priority; 621977SN/A const PrivilegeLevel nextPrivilegeLevel[NumLevels]; 632683Sktlim@umich.edu FaultStat count; 641717SN/A }; 65146SN/A#if FULL_SYSTEM 662683Sktlim@umich.edu void invoke(ThreadContext * tc); 678232Snate@binkert.org#endif 688232Snate@binkert.org virtual FaultName name() = 0; 698232Snate@binkert.org virtual TrapType trapType() = 0; 708779Sgblack@eecs.umich.edu virtual FaultPriority priority() = 0; 713348Sbinkertn@umich.edu virtual FaultStat & countStat() = 0; 726105Ssteve.reinhardt@amd.com virtual PrivilegeLevel getNextLevel(PrivilegeLevel current) = 0; 736216Snate@binkert.org}; 742036SN/A 75146SN/Atemplate<typename T> 768817Sgblack@eecs.umich.educlass SparcFault : public SparcFaultBase 778793Sgblack@eecs.umich.edu{ 7856SN/A protected: 7956SN/A static FaultVals vals; 80695SN/A public: 812901Ssaidi@eecs.umich.edu FaultName name() {return vals.name;} 822SN/A TrapType trapType() {return vals.trapType;} 832SN/A FaultPriority priority() {return vals.priority;} 842449SN/A FaultStat & countStat() {return vals.count;} 851355SN/A PrivilegeLevel getNextLevel(PrivilegeLevel current) 865529Snate@binkert.org { 879023Sgblack@eecs.umich.edu return vals.nextPrivilegeLevel[current]; 88224SN/A } 898793Sgblack@eecs.umich.edu}; 909384SAndreas.Sandberg@arm.com 919384SAndreas.Sandberg@arm.comclass PowerOnReset : public SparcFault<PowerOnReset> 928793Sgblack@eecs.umich.edu{ 938820Sgblack@eecs.umich.edu void invoke(ThreadContext * tc); 949384SAndreas.Sandberg@arm.com}; 952SN/A 966029Ssteve.reinhardt@amd.comclass WatchDogReset : public SparcFault<WatchDogReset> {}; 972672Sktlim@umich.edu 982683Sktlim@umich.educlass ExternallyInitiatedReset : public SparcFault<ExternallyInitiatedReset> {}; 992SN/A 1008733Sgeoffrey.blake@arm.comclass SoftwareInitiatedReset : public SparcFault<SoftwareInitiatedReset> {}; 1018733Sgeoffrey.blake@arm.com 1028733Sgeoffrey.blake@arm.comclass REDStateException : public SparcFault<REDStateException> {}; 1038733Sgeoffrey.blake@arm.com 1048733Sgeoffrey.blake@arm.comclass StoreError : public SparcFault<StoreError> {}; 1058733Sgeoffrey.blake@arm.com 1068733Sgeoffrey.blake@arm.comclass InstructionAccessException : public SparcFault<InstructionAccessException> {}; 1078733Sgeoffrey.blake@arm.com 1088733Sgeoffrey.blake@arm.com//class InstructionAccessMMUMiss : public SparcFault<InstructionAccessMMUMiss> {}; 1098733Sgeoffrey.blake@arm.com 1108733Sgeoffrey.blake@arm.comclass InstructionAccessError : public SparcFault<InstructionAccessError> {}; 1112SN/A 112334SN/Aclass IllegalInstruction : public SparcFault<IllegalInstruction> {}; 1138834Satgutier@umich.edu 1148834Satgutier@umich.educlass PrivilegedOpcode : public SparcFault<PrivilegedOpcode> {}; 115140SN/A 116334SN/A//class UnimplementedLDD : public SparcFault<UnimplementedLDD> {}; 1172SN/A 1182SN/A//class UnimplementedSTD : public SparcFault<UnimplementedSTD> {}; 1192SN/A 1202680Sktlim@umich.educlass FpDisabled : public SparcFault<FpDisabled> {}; 1214377Sgblack@eecs.umich.edu 1225169Ssaidi@eecs.umich.educlass FpExceptionIEEE754 : public SparcFault<FpExceptionIEEE754> {}; 1234377Sgblack@eecs.umich.edu 1244377Sgblack@eecs.umich.educlass FpExceptionOther : public SparcFault<FpExceptionOther> {}; 1252SN/A 1262SN/Aclass TagOverflow : public SparcFault<TagOverflow> {}; 1272623SN/A 1282SN/Aclass CleanWindow : public SparcFault<CleanWindow> {}; 1292SN/A 1302SN/Aclass DivisionByZero : public SparcFault<DivisionByZero> {}; 131180SN/A 1328737Skoansin.tan@gmail.comclass InternalProcessorError : 133393SN/A public SparcFault<InternalProcessorError> 134393SN/A{ 135393SN/A public: 136393SN/A bool isMachineCheckFault() {return true;} 137384SN/A}; 138384SN/A 139393SN/Aclass InstructionInvalidTSBEntry : public SparcFault<InstructionInvalidTSBEntry> {}; 1408737Skoansin.tan@gmail.com 141393SN/Aclass DataInvalidTSBEntry : public SparcFault<DataInvalidTSBEntry> {}; 142393SN/A 143393SN/Aclass DataAccessException : public SparcFault<DataAccessException> {}; 144393SN/A 145384SN/A//class DataAccessMMUMiss : public SparcFault<DataAccessMMUMiss> {}; 146189SN/A 147189SN/Aclass DataAccessError : public SparcFault<DataAccessError> {}; 1482623SN/A 1492SN/Aclass DataAccessProtection : public SparcFault<DataAccessProtection> {}; 150729SN/A 151334SN/Aclass MemAddressNotAligned : 1522SN/A public SparcFault<MemAddressNotAligned> 1532SN/A{ 1542SN/A public: 1558834Satgutier@umich.edu bool isAlignmentFault() {return true;} 1568834Satgutier@umich.edu}; 1578834Satgutier@umich.edu 1588834Satgutier@umich.educlass LDDFMemAddressNotAligned : public SparcFault<LDDFMemAddressNotAligned> {}; 1598834Satgutier@umich.edu 1608834Satgutier@umich.educlass STDFMemAddressNotAligned : public SparcFault<STDFMemAddressNotAligned> {}; 1618834Satgutier@umich.edu 1622SN/Aclass PrivilegedAction : public SparcFault<PrivilegedAction> {}; 1632SN/A 1647897Shestness@cs.utexas.educlass LDQFMemAddressNotAligned : public SparcFault<LDQFMemAddressNotAligned> {}; 1657897Shestness@cs.utexas.edu 1667897Shestness@cs.utexas.educlass STQFMemAddressNotAligned : public SparcFault<STQFMemAddressNotAligned> {}; 1677897Shestness@cs.utexas.edu 1687897Shestness@cs.utexas.educlass InstructionRealTranslationMiss : 1697897Shestness@cs.utexas.edu public SparcFault<InstructionRealTranslationMiss> {}; 1707897Shestness@cs.utexas.edu 1717897Shestness@cs.utexas.educlass DataRealTranslationMiss : public SparcFault<DataRealTranslationMiss> {}; 1727897Shestness@cs.utexas.edu 1737897Shestness@cs.utexas.edu//class AsyncDataError : public SparcFault<AsyncDataError> {}; 1747897Shestness@cs.utexas.edu 1757897Shestness@cs.utexas.edutemplate <class T> 1767897Shestness@cs.utexas.educlass EnumeratedFault : public SparcFault<T> 1777897Shestness@cs.utexas.edu{ 1787897Shestness@cs.utexas.edu protected: 1797897Shestness@cs.utexas.edu uint32_t _n; 1807897Shestness@cs.utexas.edu public: 1817897Shestness@cs.utexas.edu EnumeratedFault(uint32_t n) : SparcFault<T>(), _n(n) {} 1827897Shestness@cs.utexas.edu TrapType trapType() {return SparcFault<T>::trapType() + _n;} 1837897Shestness@cs.utexas.edu}; 1847897Shestness@cs.utexas.edu 1857897Shestness@cs.utexas.educlass InterruptLevelN : public EnumeratedFault<InterruptLevelN> 1867897Shestness@cs.utexas.edu{ 1877897Shestness@cs.utexas.edu public: 1887897Shestness@cs.utexas.edu InterruptLevelN(uint32_t n) : EnumeratedFault<InterruptLevelN>(n) {;} 1897897Shestness@cs.utexas.edu FaultPriority priority() {return 3200 - _n*100;} 1907897Shestness@cs.utexas.edu}; 1917897Shestness@cs.utexas.edu 1927897Shestness@cs.utexas.educlass HstickMatch : public SparcFault<HstickMatch> {}; 1937897Shestness@cs.utexas.edu 1947897Shestness@cs.utexas.educlass TrapLevelZero : public SparcFault<TrapLevelZero> {}; 1957897Shestness@cs.utexas.edu 1967897Shestness@cs.utexas.educlass PAWatchpoint : public SparcFault<PAWatchpoint> {}; 1977897Shestness@cs.utexas.edu 1987897Shestness@cs.utexas.educlass VAWatchpoint : public SparcFault<VAWatchpoint> {}; 1997897Shestness@cs.utexas.edu 2007897Shestness@cs.utexas.educlass FastInstructionAccessMMUMiss : 2017897Shestness@cs.utexas.edu public SparcFault<FastInstructionAccessMMUMiss> {}; 2027897Shestness@cs.utexas.edu 2037897Shestness@cs.utexas.educlass FastDataAccessMMUMiss : public SparcFault<FastDataAccessMMUMiss> {}; 2047897Shestness@cs.utexas.edu 2057897Shestness@cs.utexas.educlass FastDataAccessProtection : public SparcFault<FastDataAccessProtection> {}; 2067897Shestness@cs.utexas.edu 2077897Shestness@cs.utexas.educlass InstructionBreakpoint : public SparcFault<InstructionBreakpoint> {}; 2087897Shestness@cs.utexas.edu 2097897Shestness@cs.utexas.educlass CpuMondo : public SparcFault<CpuMondo> {}; 2107897Shestness@cs.utexas.edu 2117897Shestness@cs.utexas.educlass DevMondo : public SparcFault<DevMondo> {}; 2127897Shestness@cs.utexas.edu 2137897Shestness@cs.utexas.educlass ResumeableError : public SparcFault<ResumeableError> {}; 2142SN/A 2157897Shestness@cs.utexas.educlass SpillNNormal : public EnumeratedFault<SpillNNormal> 2167897Shestness@cs.utexas.edu{ 2177897Shestness@cs.utexas.edu public: 2187897Shestness@cs.utexas.edu SpillNNormal(uint32_t n) : EnumeratedFault<SpillNNormal>(n) {;} 2197897Shestness@cs.utexas.edu //These need to be handled specially to enable spill traps in SE 2207897Shestness@cs.utexas.edu#if !FULL_SYSTEM 2217897Shestness@cs.utexas.edu void invoke(ThreadContext * tc); 2227897Shestness@cs.utexas.edu#endif 2237897Shestness@cs.utexas.edu}; 2247897Shestness@cs.utexas.edu 2257897Shestness@cs.utexas.educlass SpillNOther : public EnumeratedFault<SpillNOther> 2267897Shestness@cs.utexas.edu{ 2272SN/A public: 2282SN/A SpillNOther(uint32_t n) : EnumeratedFault<SpillNOther>(n) {;} 2291001SN/A}; 2301001SN/A 2311001SN/Aclass FillNNormal : public EnumeratedFault<FillNNormal> 2321001SN/A{ 2331001SN/A public: 2342SN/A FillNNormal(uint32_t n) : EnumeratedFault<FillNNormal>(n) {;} 2352SN/A //These need to be handled specially to enable fill traps in SE 2362SN/A#if !FULL_SYSTEM 2372SN/A void invoke(ThreadContext * tc); 2382SN/A#endif 2397897Shestness@cs.utexas.edu}; 2407897Shestness@cs.utexas.edu 2417897Shestness@cs.utexas.educlass FillNOther : public EnumeratedFault<FillNOther> 2427897Shestness@cs.utexas.edu{ 2437897Shestness@cs.utexas.edu public: 2447897Shestness@cs.utexas.edu FillNOther(uint32_t n) : EnumeratedFault<FillNOther>(n) {;} 2457897Shestness@cs.utexas.edu}; 2467897Shestness@cs.utexas.edu 2477897Shestness@cs.utexas.educlass TrapInstruction : public EnumeratedFault<TrapInstruction> 2487897Shestness@cs.utexas.edu{ 2492SN/A 2502SN/A public: 2512SN/A TrapInstruction(uint32_t n) : EnumeratedFault<TrapInstruction>(n) {;} 2522SN/A}; 2532SN/A 2542SN/A#if !FULL_SYSTEM 2552SN/Aclass PageTableFault : public SparcFault<PageTableFault> 2562SN/A{ 2572SN/A private: 2582SN/A Addr vaddr; 2592SN/A public: 2602SN/A PageTableFault(Addr va) : vaddr(va) {} 2612390SN/A void invoke(ThreadContext * tc); 2622390SN/A}; 2632390SN/A 2642390SN/Astatic inline Fault genPageTableFault(Addr va) 2652390SN/A{ 2662390SN/A return new PageTableFault(va); 2672390SN/A} 2682390SN/A#endif 2692390SN/A 2702390SN/Astatic inline Fault genMachineCheckFault() 2712390SN/A{ 2722390SN/A return new InternalProcessorError; 273385SN/A} 2747897Shestness@cs.utexas.edu 2757897Shestness@cs.utexas.edustatic inline Fault genAlignmentFault() 2762SN/A{ 2772SN/A return new MemAddressNotAligned; 2782SN/A} 2792623SN/A 280334SN/A 2812361SN/A} // SparcISA namespace 2825496Ssaidi@eecs.umich.edu 283334SN/A#endif // __SPARC_FAULTS_HH__ 284334SN/A