faults.hh revision 13896:5a827a65bd1d
1/* 2 * Copyright (c) 2010, 2012-2013, 2016-2018 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Copyright (c) 2003-2005 The Regents of The University of Michigan 15 * Copyright (c) 2007-2008 The Florida State University 16 * All rights reserved. 17 * 18 * Redistribution and use in source and binary forms, with or without 19 * modification, are permitted provided that the following conditions are 20 * met: redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer; 22 * redistributions in binary form must reproduce the above copyright 23 * notice, this list of conditions and the following disclaimer in the 24 * documentation and/or other materials provided with the distribution; 25 * neither the name of the copyright holders nor the names of its 26 * contributors may be used to endorse or promote products derived from 27 * this software without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Authors: Ali Saidi 42 * Gabe Black 43 * Giacomo Gabrielli 44 * Thomas Grocutt 45 */ 46 47#ifndef __ARM_FAULTS_HH__ 48#define __ARM_FAULTS_HH__ 49 50#include "arch/arm/miscregs.hh" 51#include "arch/arm/pagetable.hh" 52#include "arch/arm/types.hh" 53#include "base/logging.hh" 54#include "sim/faults.hh" 55#include "sim/full_system.hh" 56 57// The design of the "name" and "vect" functions is in sim/faults.hh 58 59namespace ArmISA 60{ 61typedef Addr FaultOffset; 62 63class ArmStaticInst; 64 65class ArmFault : public FaultBase 66{ 67 protected: 68 ExtMachInst machInst; 69 uint32_t issRaw; 70 71 // Helper variables for ARMv8 exception handling 72 bool from64; // True if the exception is generated from the AArch64 state 73 bool to64; // True if the exception is taken in AArch64 state 74 ExceptionLevel fromEL; // Source exception level 75 ExceptionLevel toEL; // Target exception level 76 OperatingMode fromMode; // Source operating mode (aarch32) 77 OperatingMode toMode; // Next operating mode (aarch32) 78 79 // This variable is true if the above fault specific informations 80 // have been updated. This is to prevent that a client is using their 81 // un-updated default constructed value. 82 bool faultUpdated; 83 84 bool hypRouted; // True if the fault has been routed to Hypervisor 85 86 virtual Addr getVector(ThreadContext *tc); 87 Addr getVector64(ThreadContext *tc); 88 89 public: 90 /// Generic fault source enums used to index into 91 /// {short/long/aarch64}DescFaultSources[] to get the actual encodings based 92 /// on the current register width state and the translation table format in 93 /// use 94 enum FaultSource 95 { 96 AlignmentFault = 0, 97 InstructionCacheMaintenance, // Short-desc. format only 98 SynchExtAbtOnTranslTableWalkLL, 99 SynchPtyErrOnTranslTableWalkLL = SynchExtAbtOnTranslTableWalkLL + 4, 100 TranslationLL = SynchPtyErrOnTranslTableWalkLL + 4, 101 AccessFlagLL = TranslationLL + 4, 102 DomainLL = AccessFlagLL + 4, 103 PermissionLL = DomainLL + 4, 104 DebugEvent = PermissionLL + 4, 105 SynchronousExternalAbort, 106 TLBConflictAbort, // Requires LPAE 107 SynchPtyErrOnMemoryAccess, 108 AsynchronousExternalAbort, 109 AsynchPtyErrOnMemoryAccess, 110 AddressSizeLL, // AArch64 only 111 112 // Not real faults. These are faults to allow the translation function 113 // to inform the memory access function not to proceed for a prefetch 114 // that misses in the TLB or that targets an uncacheable address 115 PrefetchTLBMiss = AddressSizeLL + 4, 116 PrefetchUncacheable, 117 118 NumFaultSources, 119 FaultSourceInvalid = 0xff 120 }; 121 122 /// Encodings of the fault sources when the short-desc. translation table 123 /// format is in use (ARM ARM Issue C B3.13.3) 124 static uint8_t shortDescFaultSources[NumFaultSources]; 125 /// Encodings of the fault sources when the long-desc. translation table 126 /// format is in use (ARM ARM Issue C B3.13.3) 127 static uint8_t longDescFaultSources[NumFaultSources]; 128 /// Encodings of the fault sources in AArch64 state 129 static uint8_t aarch64FaultSources[NumFaultSources]; 130 131 enum AnnotationIDs 132 { 133 S1PTW, // DataAbort, PrefetchAbort: Stage 1 Page Table Walk, 134 OVA, // DataAbort, PrefetchAbort: stage 1 Virtual Address for stage 2 faults 135 SAS, // DataAbort: Syndrome Access Size 136 SSE, // DataAbort: Syndrome Sign Extend 137 SRT, // DataAbort: Syndrome Register Transfer 138 139 // AArch64 only 140 SF, // DataAbort: width of the accessed register is SixtyFour 141 AR // DataAbort: Acquire/Release semantics 142 }; 143 144 enum TranMethod 145 { 146 LpaeTran, 147 VmsaTran, 148 UnknownTran 149 }; 150 151 struct FaultVals 152 { 153 const FaultName name; 154 155 const FaultOffset offset; 156 157 // Offsets used for exceptions taken in AArch64 state 158 const uint16_t currELTOffset; 159 const uint16_t currELHOffset; 160 const uint16_t lowerEL64Offset; 161 const uint16_t lowerEL32Offset; 162 163 const OperatingMode nextMode; 164 165 const uint8_t armPcOffset; 166 const uint8_t thumbPcOffset; 167 // The following two values are used in place of armPcOffset and 168 // thumbPcOffset when the exception return address is saved into ELR 169 // registers (exceptions taken in HYP mode or in AArch64 state) 170 const uint8_t armPcElrOffset; 171 const uint8_t thumbPcElrOffset; 172 173 const bool hypTrappable; 174 const bool abortDisable; 175 const bool fiqDisable; 176 177 // Exception class used to appropriately set the syndrome register 178 // (exceptions taken in HYP mode or in AArch64 state) 179 const ExceptionClass ec; 180 181 FaultStat count; 182 FaultVals(const FaultName& name_, const FaultOffset& offset_, 183 const uint16_t& currELTOffset_, const uint16_t& currELHOffset_, 184 const uint16_t& lowerEL64Offset_, 185 const uint16_t& lowerEL32Offset_, 186 const OperatingMode& nextMode_, const uint8_t& armPcOffset_, 187 const uint8_t& thumbPcOffset_, const uint8_t& armPcElrOffset_, 188 const uint8_t& thumbPcElrOffset_, const bool& hypTrappable_, 189 const bool& abortDisable_, const bool& fiqDisable_, 190 const ExceptionClass& ec_) 191 : name(name_), offset(offset_), currELTOffset(currELTOffset_), 192 currELHOffset(currELHOffset_), lowerEL64Offset(lowerEL64Offset_), 193 lowerEL32Offset(lowerEL32Offset_), nextMode(nextMode_), 194 armPcOffset(armPcOffset_), thumbPcOffset(thumbPcOffset_), 195 armPcElrOffset(armPcElrOffset_), thumbPcElrOffset(thumbPcElrOffset_), 196 hypTrappable(hypTrappable_), abortDisable(abortDisable_), 197 fiqDisable(fiqDisable_), ec(ec_) {} 198 }; 199 200 ArmFault(ExtMachInst _machInst = 0, uint32_t _iss = 0) : 201 machInst(_machInst), issRaw(_iss), from64(false), to64(false), 202 fromEL(EL0), toEL(EL0), fromMode(MODE_UNDEFINED), 203 faultUpdated(false), hypRouted(false) {} 204 205 // Returns the actual syndrome register to use based on the target 206 // exception level 207 MiscRegIndex getSyndromeReg64() const; 208 // Returns the actual fault address register to use based on the target 209 // exception level 210 MiscRegIndex getFaultAddrReg64() const; 211 212 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 213 StaticInst::nullStaticInstPtr) override; 214 void invoke64(ThreadContext *tc, const StaticInstPtr &inst = 215 StaticInst::nullStaticInstPtr); 216 void update(ThreadContext *tc); 217 218 ArmStaticInst *instrAnnotate(const StaticInstPtr &inst); 219 virtual void annotate(AnnotationIDs id, uint64_t val) {} 220 virtual FaultStat& countStat() = 0; 221 virtual FaultOffset offset(ThreadContext *tc) = 0; 222 virtual FaultOffset offset64(ThreadContext *tc) = 0; 223 virtual OperatingMode nextMode() = 0; 224 virtual bool routeToMonitor(ThreadContext *tc) const = 0; 225 virtual bool routeToHyp(ThreadContext *tc) const { return false; } 226 virtual uint8_t armPcOffset(bool isHyp) = 0; 227 virtual uint8_t thumbPcOffset(bool isHyp) = 0; 228 virtual uint8_t armPcElrOffset() = 0; 229 virtual uint8_t thumbPcElrOffset() = 0; 230 virtual bool abortDisable(ThreadContext *tc) = 0; 231 virtual bool fiqDisable(ThreadContext *tc) = 0; 232 virtual ExceptionClass ec(ThreadContext *tc) const = 0; 233 virtual uint32_t iss() const = 0; 234 virtual bool isStage2() const { return false; } 235 virtual FSR getFsr(ThreadContext *tc) const { return 0; } 236 virtual void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg); 237}; 238 239template<typename T> 240class ArmFaultVals : public ArmFault 241{ 242 protected: 243 static FaultVals vals; 244 245 public: 246 ArmFaultVals<T>(ExtMachInst _machInst = 0, uint32_t _iss = 0) : 247 ArmFault(_machInst, _iss) {} 248 FaultName name() const override { return vals.name; } 249 FaultStat & countStat() override { return vals.count; } 250 FaultOffset offset(ThreadContext *tc) override; 251 252 FaultOffset offset64(ThreadContext *tc) override; 253 254 OperatingMode nextMode() override { return vals.nextMode; } 255 virtual bool routeToMonitor(ThreadContext *tc) const override { 256 return false; 257 } 258 uint8_t armPcOffset(bool isHyp) override { 259 return isHyp ? vals.armPcElrOffset 260 : vals.armPcOffset; 261 } 262 uint8_t thumbPcOffset(bool isHyp) override { 263 return isHyp ? vals.thumbPcElrOffset 264 : vals.thumbPcOffset; 265 } 266 uint8_t armPcElrOffset() override { return vals.armPcElrOffset; } 267 uint8_t thumbPcElrOffset() override { return vals.thumbPcElrOffset; } 268 bool abortDisable(ThreadContext* tc) override { return vals.abortDisable; } 269 bool fiqDisable(ThreadContext* tc) override { return vals.fiqDisable; } 270 ExceptionClass ec(ThreadContext *tc) const override { return vals.ec; } 271 uint32_t iss() const override { return issRaw; } 272}; 273 274class Reset : public ArmFaultVals<Reset> 275{ 276 protected: 277 Addr getVector(ThreadContext *tc) override; 278 279 public: 280 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 281 StaticInst::nullStaticInstPtr) override; 282}; 283 284class UndefinedInstruction : public ArmFaultVals<UndefinedInstruction> 285{ 286 protected: 287 bool unknown; 288 bool disabled; 289 ExceptionClass overrideEc; 290 const char *mnemonic; 291 292 public: 293 UndefinedInstruction(ExtMachInst _machInst, 294 bool _unknown, 295 const char *_mnemonic = NULL, 296 bool _disabled = false) : 297 ArmFaultVals<UndefinedInstruction>(_machInst), 298 unknown(_unknown), disabled(_disabled), 299 overrideEc(EC_INVALID), mnemonic(_mnemonic) 300 {} 301 UndefinedInstruction(ExtMachInst _machInst, uint32_t _iss, 302 ExceptionClass _overrideEc, const char *_mnemonic = NULL) : 303 ArmFaultVals<UndefinedInstruction>(_machInst, _iss), 304 unknown(false), disabled(true), overrideEc(_overrideEc), 305 mnemonic(_mnemonic) 306 {} 307 308 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 309 StaticInst::nullStaticInstPtr) override; 310 bool routeToHyp(ThreadContext *tc) const override; 311 ExceptionClass ec(ThreadContext *tc) const override; 312 uint32_t iss() const override; 313}; 314 315class SupervisorCall : public ArmFaultVals<SupervisorCall> 316{ 317 protected: 318 ExceptionClass overrideEc; 319 public: 320 SupervisorCall(ExtMachInst _machInst, uint32_t _iss, 321 ExceptionClass _overrideEc = EC_INVALID) : 322 ArmFaultVals<SupervisorCall>(_machInst, _iss), 323 overrideEc(_overrideEc) 324 {} 325 326 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 327 StaticInst::nullStaticInstPtr) override; 328 bool routeToHyp(ThreadContext *tc) const override; 329 ExceptionClass ec(ThreadContext *tc) const override; 330 uint32_t iss() const override; 331}; 332 333class SecureMonitorCall : public ArmFaultVals<SecureMonitorCall> 334{ 335 public: 336 SecureMonitorCall(ExtMachInst _machInst) : 337 ArmFaultVals<SecureMonitorCall>(_machInst) 338 {} 339 340 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 341 StaticInst::nullStaticInstPtr) override; 342 ExceptionClass ec(ThreadContext *tc) const override; 343 uint32_t iss() const override; 344}; 345 346class SupervisorTrap : public ArmFaultVals<SupervisorTrap> 347{ 348 protected: 349 ExtMachInst machInst; 350 ExceptionClass overrideEc; 351 352 public: 353 SupervisorTrap(ExtMachInst _machInst, uint32_t _iss, 354 ExceptionClass _overrideEc = EC_INVALID) : 355 ArmFaultVals<SupervisorTrap>(_machInst, _iss), 356 overrideEc(_overrideEc) 357 {} 358 359 bool routeToHyp(ThreadContext *tc) const override; 360 uint32_t iss() const override; 361 ExceptionClass ec(ThreadContext *tc) const override; 362}; 363 364class SecureMonitorTrap : public ArmFaultVals<SecureMonitorTrap> 365{ 366 protected: 367 ExtMachInst machInst; 368 ExceptionClass overrideEc; 369 370 public: 371 SecureMonitorTrap(ExtMachInst _machInst, uint32_t _iss, 372 ExceptionClass _overrideEc = EC_INVALID) : 373 ArmFaultVals<SecureMonitorTrap>(_machInst, _iss), 374 overrideEc(_overrideEc) 375 {} 376 377 ExceptionClass ec(ThreadContext *tc) const override; 378}; 379 380class HypervisorCall : public ArmFaultVals<HypervisorCall> 381{ 382 public: 383 HypervisorCall(ExtMachInst _machInst, uint32_t _imm); 384 385 ExceptionClass ec(ThreadContext *tc) const override; 386}; 387 388class HypervisorTrap : public ArmFaultVals<HypervisorTrap> 389{ 390 protected: 391 ExtMachInst machInst; 392 ExceptionClass overrideEc; 393 394 public: 395 HypervisorTrap(ExtMachInst _machInst, uint32_t _iss, 396 ExceptionClass _overrideEc = EC_INVALID) : 397 ArmFaultVals<HypervisorTrap>(_machInst, _iss), 398 overrideEc(_overrideEc) 399 {} 400 401 ExceptionClass ec(ThreadContext *tc) const override; 402}; 403 404template <class T> 405class AbortFault : public ArmFaultVals<T> 406{ 407 protected: 408 /** 409 * The virtual address the fault occured at. If 2 stages of 410 * translation are being used then this is the intermediate 411 * physical address that is the starting point for the second 412 * stage of translation. 413 */ 414 Addr faultAddr; 415 /** 416 * Original virtual address. If the fault was generated on the 417 * second stage of translation then this variable stores the 418 * virtual address used in the original stage 1 translation. 419 */ 420 Addr OVAddr; 421 bool write; 422 TlbEntry::DomainType domain; 423 uint8_t source; 424 uint8_t srcEncoded; 425 bool stage2; 426 bool s1ptw; 427 ArmFault::TranMethod tranMethod; 428 429 public: 430 AbortFault(Addr _faultAddr, bool _write, TlbEntry::DomainType _domain, 431 uint8_t _source, bool _stage2, 432 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 433 faultAddr(_faultAddr), OVAddr(0), write(_write), 434 domain(_domain), source(_source), srcEncoded(0), 435 stage2(_stage2), s1ptw(false), tranMethod(_tranMethod) 436 {} 437 438 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 439 StaticInst::nullStaticInstPtr) override; 440 441 FSR getFsr(ThreadContext *tc) const override; 442 uint8_t getFaultStatusCode(ThreadContext *tc) const; 443 bool abortDisable(ThreadContext *tc) override; 444 uint32_t iss() const override; 445 bool isStage2() const override { return stage2; } 446 void annotate(ArmFault::AnnotationIDs id, uint64_t val) override; 447 void setSyndrome(ThreadContext *tc, MiscRegIndex syndrome_reg) override; 448 bool isMMUFault() const; 449}; 450 451class PrefetchAbort : public AbortFault<PrefetchAbort> 452{ 453 public: 454 static const MiscRegIndex FsrIndex = MISCREG_IFSR; 455 static const MiscRegIndex FarIndex = MISCREG_IFAR; 456 static const MiscRegIndex HFarIndex = MISCREG_HIFAR; 457 458 PrefetchAbort(Addr _addr, uint8_t _source, bool _stage2 = false, 459 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 460 AbortFault<PrefetchAbort>(_addr, false, TlbEntry::DomainType::NoAccess, 461 _source, _stage2, _tranMethod) 462 {} 463 464 ExceptionClass ec(ThreadContext *tc) const override; 465 // @todo: external aborts should be routed if SCR.EA == 1 466 bool routeToMonitor(ThreadContext *tc) const override; 467 bool routeToHyp(ThreadContext *tc) const override; 468}; 469 470class DataAbort : public AbortFault<DataAbort> 471{ 472 public: 473 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 474 static const MiscRegIndex FarIndex = MISCREG_DFAR; 475 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; 476 bool isv; 477 uint8_t sas; 478 uint8_t sse; 479 uint8_t srt; 480 481 // AArch64 only 482 bool sf; 483 bool ar; 484 485 DataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, uint8_t _source, 486 bool _stage2 = false, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 487 AbortFault<DataAbort>(_addr, _write, _domain, _source, _stage2, 488 _tranMethod), 489 isv(false), sas (0), sse(0), srt(0), sf(false), ar(false) 490 {} 491 492 ExceptionClass ec(ThreadContext *tc) const override; 493 // @todo: external aborts should be routed if SCR.EA == 1 494 bool routeToMonitor(ThreadContext *tc) const override; 495 bool routeToHyp(ThreadContext *tc) const override; 496 uint32_t iss() const override; 497 void annotate(AnnotationIDs id, uint64_t val) override; 498}; 499 500class VirtualDataAbort : public AbortFault<VirtualDataAbort> 501{ 502 public: 503 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 504 static const MiscRegIndex FarIndex = MISCREG_DFAR; 505 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; 506 507 VirtualDataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, 508 uint8_t _source) : 509 AbortFault<VirtualDataAbort>(_addr, _write, _domain, _source, false) 510 {} 511 512 void invoke(ThreadContext *tc, const StaticInstPtr &inst) override; 513}; 514 515class Interrupt : public ArmFaultVals<Interrupt> 516{ 517 public: 518 bool routeToMonitor(ThreadContext *tc) const override; 519 bool routeToHyp(ThreadContext *tc) const override; 520 bool abortDisable(ThreadContext *tc) override; 521}; 522 523class VirtualInterrupt : public ArmFaultVals<VirtualInterrupt> 524{ 525 public: 526 VirtualInterrupt(); 527}; 528 529class FastInterrupt : public ArmFaultVals<FastInterrupt> 530{ 531 public: 532 bool routeToMonitor(ThreadContext *tc) const override; 533 bool routeToHyp(ThreadContext *tc) const override; 534 bool abortDisable(ThreadContext *tc) override; 535 bool fiqDisable(ThreadContext *tc) override; 536}; 537 538class VirtualFastInterrupt : public ArmFaultVals<VirtualFastInterrupt> 539{ 540 public: 541 VirtualFastInterrupt(); 542}; 543 544/// PC alignment fault (AArch64 only) 545class PCAlignmentFault : public ArmFaultVals<PCAlignmentFault> 546{ 547 protected: 548 /// The unaligned value of the PC 549 Addr faultPC; 550 public: 551 PCAlignmentFault(Addr _faultPC) : faultPC(_faultPC) 552 {} 553 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 554 StaticInst::nullStaticInstPtr) override; 555 bool routeToHyp(ThreadContext *tc) const override; 556}; 557 558/// Stack pointer alignment fault (AArch64 only) 559class SPAlignmentFault : public ArmFaultVals<SPAlignmentFault> 560{ 561 public: 562 SPAlignmentFault(); 563}; 564 565/// System error (AArch64 only) 566class SystemError : public ArmFaultVals<SystemError> 567{ 568 public: 569 SystemError(); 570 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 571 StaticInst::nullStaticInstPtr) override; 572 bool routeToMonitor(ThreadContext *tc) const override; 573 bool routeToHyp(ThreadContext *tc) const override; 574}; 575 576/// System error (AArch64 only) 577class SoftwareBreakpoint : public ArmFaultVals<SoftwareBreakpoint> 578{ 579 public: 580 SoftwareBreakpoint(ExtMachInst _mach_inst, uint32_t _iss); 581 582 bool routeToHyp(ThreadContext *tc) const override; 583 ExceptionClass ec(ThreadContext *tc) const override; 584}; 585 586// A fault that flushes the pipe, excluding the faulting instructions 587class ArmSev : public ArmFaultVals<ArmSev> 588{ 589 public: 590 ArmSev () {} 591 void invoke(ThreadContext *tc, const StaticInstPtr &inst = 592 StaticInst::nullStaticInstPtr) override; 593}; 594 595/// Illegal Instruction Set State fault (AArch64 only) 596class IllegalInstSetStateFault : public ArmFaultVals<IllegalInstSetStateFault> 597{ 598 public: 599 IllegalInstSetStateFault(); 600}; 601 602/* 603 * Explicitly declare template static member variables to avoid warnings 604 * in some clang versions 605 */ 606template<> ArmFault::FaultVals ArmFaultVals<Reset>::vals; 607template<> ArmFault::FaultVals ArmFaultVals<UndefinedInstruction>::vals; 608template<> ArmFault::FaultVals ArmFaultVals<SupervisorCall>::vals; 609template<> ArmFault::FaultVals ArmFaultVals<SecureMonitorCall>::vals; 610template<> ArmFault::FaultVals ArmFaultVals<HypervisorCall>::vals; 611template<> ArmFault::FaultVals ArmFaultVals<PrefetchAbort>::vals; 612template<> ArmFault::FaultVals ArmFaultVals<DataAbort>::vals; 613template<> ArmFault::FaultVals ArmFaultVals<VirtualDataAbort>::vals; 614template<> ArmFault::FaultVals ArmFaultVals<HypervisorTrap>::vals; 615template<> ArmFault::FaultVals ArmFaultVals<Interrupt>::vals; 616template<> ArmFault::FaultVals ArmFaultVals<VirtualInterrupt>::vals; 617template<> ArmFault::FaultVals ArmFaultVals<FastInterrupt>::vals; 618template<> ArmFault::FaultVals ArmFaultVals<VirtualFastInterrupt>::vals; 619template<> ArmFault::FaultVals ArmFaultVals<IllegalInstSetStateFault>::vals; 620template<> ArmFault::FaultVals ArmFaultVals<SupervisorTrap>::vals; 621template<> ArmFault::FaultVals ArmFaultVals<SecureMonitorTrap>::vals; 622template<> ArmFault::FaultVals ArmFaultVals<PCAlignmentFault>::vals; 623template<> ArmFault::FaultVals ArmFaultVals<SPAlignmentFault>::vals; 624template<> ArmFault::FaultVals ArmFaultVals<SystemError>::vals; 625template<> ArmFault::FaultVals ArmFaultVals<SoftwareBreakpoint>::vals; 626template<> ArmFault::FaultVals ArmFaultVals<ArmSev>::vals; 627 628 629} // namespace ArmISA 630 631#endif // __ARM_FAULTS_HH__ 632