faults.hh (12032:d218c2fe9440) | faults.hh (12176:4282f755a69a) |
---|---|
1/* 2 * Copyright (c) 2010, 2012-2013, 2016-2017 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 --- 169 unchanged lines hidden (view full) --- 178 // Returns the actual syndrome register to use based on the target 179 // exception level 180 MiscRegIndex getSyndromeReg64() const; 181 // Returns the actual fault address register to use based on the target 182 // exception level 183 MiscRegIndex getFaultAddrReg64() const; 184 185 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 1/* 2 * Copyright (c) 2010, 2012-2013, 2016-2017 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 --- 169 unchanged lines hidden (view full) --- 178 // Returns the actual syndrome register to use based on the target 179 // exception level 180 MiscRegIndex getSyndromeReg64() const; 181 // Returns the actual fault address register to use based on the target 182 // exception level 183 MiscRegIndex getFaultAddrReg64() const; 184 185 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
186 StaticInst::nullStaticInstPtr); | 186 StaticInst::nullStaticInstPtr) override; |
187 void invoke64(ThreadContext *tc, const StaticInstPtr &inst = 188 StaticInst::nullStaticInstPtr); 189 virtual void annotate(AnnotationIDs id, uint64_t val) {} 190 virtual FaultStat& countStat() = 0; 191 virtual FaultOffset offset(ThreadContext *tc) = 0; 192 virtual FaultOffset offset64() = 0; 193 virtual OperatingMode nextMode() = 0; 194 virtual bool routeToMonitor(ThreadContext *tc) const = 0; --- 15 unchanged lines hidden (view full) --- 210class ArmFaultVals : public ArmFault 211{ 212 protected: 213 static FaultVals vals; 214 215 public: 216 ArmFaultVals<T>(ExtMachInst _machInst = 0, uint32_t _iss = 0) : 217 ArmFault(_machInst, _iss) {} | 187 void invoke64(ThreadContext *tc, const StaticInstPtr &inst = 188 StaticInst::nullStaticInstPtr); 189 virtual void annotate(AnnotationIDs id, uint64_t val) {} 190 virtual FaultStat& countStat() = 0; 191 virtual FaultOffset offset(ThreadContext *tc) = 0; 192 virtual FaultOffset offset64() = 0; 193 virtual OperatingMode nextMode() = 0; 194 virtual bool routeToMonitor(ThreadContext *tc) const = 0; --- 15 unchanged lines hidden (view full) --- 210class ArmFaultVals : public ArmFault 211{ 212 protected: 213 static FaultVals vals; 214 215 public: 216 ArmFaultVals<T>(ExtMachInst _machInst = 0, uint32_t _iss = 0) : 217 ArmFault(_machInst, _iss) {} |
218 FaultName name() const { return vals.name; } 219 FaultStat & countStat() { return vals.count; } 220 FaultOffset offset(ThreadContext *tc); | 218 FaultName name() const override { return vals.name; } 219 FaultStat & countStat() override { return vals.count; } 220 FaultOffset offset(ThreadContext *tc) override; |
221 | 221 |
222 FaultOffset 223 offset64() 224 { | 222 FaultOffset offset64() override { |
225 if (toEL == fromEL) { 226 if (opModeIsT(fromMode)) 227 return vals.currELTOffset; 228 return vals.currELHOffset; 229 } else { 230 if (from64) 231 return vals.lowerEL64Offset; 232 return vals.lowerEL32Offset; 233 } 234 } 235 | 223 if (toEL == fromEL) { 224 if (opModeIsT(fromMode)) 225 return vals.currELTOffset; 226 return vals.currELHOffset; 227 } else { 228 if (from64) 229 return vals.lowerEL64Offset; 230 return vals.lowerEL32Offset; 231 } 232 } 233 |
236 OperatingMode nextMode() { return vals.nextMode; } 237 virtual bool routeToMonitor(ThreadContext *tc) const { return false; } 238 uint8_t armPcOffset(bool isHyp) { return isHyp ? vals.armPcElrOffset 239 : vals.armPcOffset; } 240 uint8_t thumbPcOffset(bool isHyp) { return isHyp ? vals.thumbPcElrOffset 241 : vals.thumbPcOffset; } 242 uint8_t armPcElrOffset() { return vals.armPcElrOffset; } 243 uint8_t thumbPcElrOffset() { return vals.thumbPcElrOffset; } 244 virtual bool abortDisable(ThreadContext* tc) { return vals.abortDisable; } 245 virtual bool fiqDisable(ThreadContext* tc) { return vals.fiqDisable; } 246 virtual ExceptionClass ec(ThreadContext *tc) const { return vals.ec; } 247 virtual uint32_t iss() const { return issRaw; } | 234 OperatingMode nextMode() override { return vals.nextMode; } 235 virtual bool routeToMonitor(ThreadContext *tc) const override { 236 return false; 237 } 238 uint8_t armPcOffset(bool isHyp) override { 239 return isHyp ? vals.armPcElrOffset 240 : vals.armPcOffset; 241 } 242 uint8_t thumbPcOffset(bool isHyp) override { 243 return isHyp ? vals.thumbPcElrOffset 244 : vals.thumbPcOffset; 245 } 246 uint8_t armPcElrOffset() override { return vals.armPcElrOffset; } 247 uint8_t thumbPcElrOffset() override { return vals.thumbPcElrOffset; } 248 bool abortDisable(ThreadContext* tc) override { return vals.abortDisable; } 249 bool fiqDisable(ThreadContext* tc) override { return vals.fiqDisable; } 250 ExceptionClass ec(ThreadContext *tc) const override { return vals.ec; } 251 uint32_t iss() const override { return issRaw; } |
248}; 249 250class Reset : public ArmFaultVals<Reset> 251{ 252 public: 253 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 252}; 253 254class Reset : public ArmFaultVals<Reset> 255{ 256 public: 257 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
254 StaticInst::nullStaticInstPtr); | 258 StaticInst::nullStaticInstPtr) override; |
255}; 256 257class UndefinedInstruction : public ArmFaultVals<UndefinedInstruction> 258{ 259 protected: 260 bool unknown; 261 bool disabled; 262 ExceptionClass overrideEc; --- 11 unchanged lines hidden (view full) --- 274 UndefinedInstruction(ExtMachInst _machInst, uint32_t _iss, 275 ExceptionClass _overrideEc, const char *_mnemonic = NULL) : 276 ArmFaultVals<UndefinedInstruction>(_machInst, _iss), 277 unknown(false), disabled(true), overrideEc(_overrideEc), 278 mnemonic(_mnemonic) 279 {} 280 281 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 259}; 260 261class UndefinedInstruction : public ArmFaultVals<UndefinedInstruction> 262{ 263 protected: 264 bool unknown; 265 bool disabled; 266 ExceptionClass overrideEc; --- 11 unchanged lines hidden (view full) --- 278 UndefinedInstruction(ExtMachInst _machInst, uint32_t _iss, 279 ExceptionClass _overrideEc, const char *_mnemonic = NULL) : 280 ArmFaultVals<UndefinedInstruction>(_machInst, _iss), 281 unknown(false), disabled(true), overrideEc(_overrideEc), 282 mnemonic(_mnemonic) 283 {} 284 285 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
282 StaticInst::nullStaticInstPtr); 283 bool routeToHyp(ThreadContext *tc) const; 284 ExceptionClass ec(ThreadContext *tc) const; 285 uint32_t iss() const; | 286 StaticInst::nullStaticInstPtr) override; 287 bool routeToHyp(ThreadContext *tc) const override; 288 ExceptionClass ec(ThreadContext *tc) const override; 289 uint32_t iss() const override; |
286}; 287 288class SupervisorCall : public ArmFaultVals<SupervisorCall> 289{ 290 protected: 291 ExceptionClass overrideEc; 292 public: 293 SupervisorCall(ExtMachInst _machInst, uint32_t _iss, 294 ExceptionClass _overrideEc = EC_INVALID) : 295 ArmFaultVals<SupervisorCall>(_machInst, _iss), 296 overrideEc(_overrideEc) 297 {} 298 299 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 290}; 291 292class SupervisorCall : public ArmFaultVals<SupervisorCall> 293{ 294 protected: 295 ExceptionClass overrideEc; 296 public: 297 SupervisorCall(ExtMachInst _machInst, uint32_t _iss, 298 ExceptionClass _overrideEc = EC_INVALID) : 299 ArmFaultVals<SupervisorCall>(_machInst, _iss), 300 overrideEc(_overrideEc) 301 {} 302 303 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
300 StaticInst::nullStaticInstPtr); 301 bool routeToHyp(ThreadContext *tc) const; 302 ExceptionClass ec(ThreadContext *tc) const; 303 uint32_t iss() const; | 304 StaticInst::nullStaticInstPtr) override; 305 bool routeToHyp(ThreadContext *tc) const override; 306 ExceptionClass ec(ThreadContext *tc) const override; 307 uint32_t iss() const override; |
304}; 305 306class SecureMonitorCall : public ArmFaultVals<SecureMonitorCall> 307{ 308 public: 309 SecureMonitorCall(ExtMachInst _machInst) : 310 ArmFaultVals<SecureMonitorCall>(_machInst) 311 {} 312 313 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 308}; 309 310class SecureMonitorCall : public ArmFaultVals<SecureMonitorCall> 311{ 312 public: 313 SecureMonitorCall(ExtMachInst _machInst) : 314 ArmFaultVals<SecureMonitorCall>(_machInst) 315 {} 316 317 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
314 StaticInst::nullStaticInstPtr); 315 ExceptionClass ec(ThreadContext *tc) const; 316 uint32_t iss() const; | 318 StaticInst::nullStaticInstPtr) override; 319 ExceptionClass ec(ThreadContext *tc) const override; 320 uint32_t iss() const override; |
317}; 318 319class SupervisorTrap : public ArmFaultVals<SupervisorTrap> 320{ 321 protected: 322 ExtMachInst machInst; 323 ExceptionClass overrideEc; 324 325 public: 326 SupervisorTrap(ExtMachInst _machInst, uint32_t _iss, 327 ExceptionClass _overrideEc = EC_INVALID) : 328 ArmFaultVals<SupervisorTrap>(_machInst, _iss), 329 overrideEc(_overrideEc) 330 {} 331 | 321}; 322 323class SupervisorTrap : public ArmFaultVals<SupervisorTrap> 324{ 325 protected: 326 ExtMachInst machInst; 327 ExceptionClass overrideEc; 328 329 public: 330 SupervisorTrap(ExtMachInst _machInst, uint32_t _iss, 331 ExceptionClass _overrideEc = EC_INVALID) : 332 ArmFaultVals<SupervisorTrap>(_machInst, _iss), 333 overrideEc(_overrideEc) 334 {} 335 |
332 ExceptionClass ec(ThreadContext *tc) const; | 336 ExceptionClass ec(ThreadContext *tc) const override; |
333}; 334 335class SecureMonitorTrap : public ArmFaultVals<SecureMonitorTrap> 336{ 337 protected: 338 ExtMachInst machInst; 339 ExceptionClass overrideEc; 340 341 public: 342 SecureMonitorTrap(ExtMachInst _machInst, uint32_t _iss, 343 ExceptionClass _overrideEc = EC_INVALID) : 344 ArmFaultVals<SecureMonitorTrap>(_machInst, _iss), 345 overrideEc(_overrideEc) 346 {} 347 | 337}; 338 339class SecureMonitorTrap : public ArmFaultVals<SecureMonitorTrap> 340{ 341 protected: 342 ExtMachInst machInst; 343 ExceptionClass overrideEc; 344 345 public: 346 SecureMonitorTrap(ExtMachInst _machInst, uint32_t _iss, 347 ExceptionClass _overrideEc = EC_INVALID) : 348 ArmFaultVals<SecureMonitorTrap>(_machInst, _iss), 349 overrideEc(_overrideEc) 350 {} 351 |
348 ExceptionClass ec(ThreadContext *tc) const; | 352 ExceptionClass ec(ThreadContext *tc) const override; |
349}; 350 351class HypervisorCall : public ArmFaultVals<HypervisorCall> 352{ 353 public: 354 HypervisorCall(ExtMachInst _machInst, uint32_t _imm); 355 | 353}; 354 355class HypervisorCall : public ArmFaultVals<HypervisorCall> 356{ 357 public: 358 HypervisorCall(ExtMachInst _machInst, uint32_t _imm); 359 |
356 ExceptionClass ec(ThreadContext *tc) const; | 360 ExceptionClass ec(ThreadContext *tc) const override; |
357}; 358 359class HypervisorTrap : public ArmFaultVals<HypervisorTrap> 360{ 361 protected: 362 ExtMachInst machInst; 363 ExceptionClass overrideEc; 364 365 public: 366 HypervisorTrap(ExtMachInst _machInst, uint32_t _iss, 367 ExceptionClass _overrideEc = EC_INVALID) : 368 ArmFaultVals<HypervisorTrap>(_machInst, _iss), 369 overrideEc(_overrideEc) 370 {} 371 | 361}; 362 363class HypervisorTrap : public ArmFaultVals<HypervisorTrap> 364{ 365 protected: 366 ExtMachInst machInst; 367 ExceptionClass overrideEc; 368 369 public: 370 HypervisorTrap(ExtMachInst _machInst, uint32_t _iss, 371 ExceptionClass _overrideEc = EC_INVALID) : 372 ArmFaultVals<HypervisorTrap>(_machInst, _iss), 373 overrideEc(_overrideEc) 374 {} 375 |
372 ExceptionClass ec(ThreadContext *tc) const; | 376 ExceptionClass ec(ThreadContext *tc) const override; |
373}; 374 375template <class T> 376class AbortFault : public ArmFaultVals<T> 377{ 378 protected: 379 /** 380 * The virtual address the fault occured at. If 2 stages of --- 21 unchanged lines hidden (view full) --- 402 uint8_t _source, bool _stage2, 403 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 404 faultAddr(_faultAddr), OVAddr(0), write(_write), 405 domain(_domain), source(_source), srcEncoded(0), 406 stage2(_stage2), s1ptw(false), tranMethod(_tranMethod) 407 {} 408 409 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 377}; 378 379template <class T> 380class AbortFault : public ArmFaultVals<T> 381{ 382 protected: 383 /** 384 * The virtual address the fault occured at. If 2 stages of --- 21 unchanged lines hidden (view full) --- 406 uint8_t _source, bool _stage2, 407 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 408 faultAddr(_faultAddr), OVAddr(0), write(_write), 409 domain(_domain), source(_source), srcEncoded(0), 410 stage2(_stage2), s1ptw(false), tranMethod(_tranMethod) 411 {} 412 413 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
410 StaticInst::nullStaticInstPtr); | 414 StaticInst::nullStaticInstPtr) override; |
411 | 415 |
412 FSR getFsr(ThreadContext *tc); 413 bool abortDisable(ThreadContext *tc); 414 uint32_t iss() const; 415 bool isStage2() const { return stage2; } 416 void annotate(ArmFault::AnnotationIDs id, uint64_t val); | 416 FSR getFsr(ThreadContext *tc) override; 417 bool abortDisable(ThreadContext *tc) override; 418 uint32_t iss() const override; 419 bool isStage2() const override { return stage2; } 420 void annotate(ArmFault::AnnotationIDs id, uint64_t val) override; |
417 bool isMMUFault() const; 418}; 419 420class PrefetchAbort : public AbortFault<PrefetchAbort> 421{ 422 public: 423 static const MiscRegIndex FsrIndex = MISCREG_IFSR; 424 static const MiscRegIndex FarIndex = MISCREG_IFAR; 425 static const MiscRegIndex HFarIndex = MISCREG_HIFAR; 426 427 PrefetchAbort(Addr _addr, uint8_t _source, bool _stage2 = false, 428 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 429 AbortFault<PrefetchAbort>(_addr, false, TlbEntry::DomainType::NoAccess, 430 _source, _stage2, _tranMethod) 431 {} 432 | 421 bool isMMUFault() const; 422}; 423 424class PrefetchAbort : public AbortFault<PrefetchAbort> 425{ 426 public: 427 static const MiscRegIndex FsrIndex = MISCREG_IFSR; 428 static const MiscRegIndex FarIndex = MISCREG_IFAR; 429 static const MiscRegIndex HFarIndex = MISCREG_HIFAR; 430 431 PrefetchAbort(Addr _addr, uint8_t _source, bool _stage2 = false, 432 ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 433 AbortFault<PrefetchAbort>(_addr, false, TlbEntry::DomainType::NoAccess, 434 _source, _stage2, _tranMethod) 435 {} 436 |
433 ExceptionClass ec(ThreadContext *tc) const; | 437 ExceptionClass ec(ThreadContext *tc) const override; |
434 // @todo: external aborts should be routed if SCR.EA == 1 | 438 // @todo: external aborts should be routed if SCR.EA == 1 |
435 bool routeToMonitor(ThreadContext *tc) const; 436 bool routeToHyp(ThreadContext *tc) const; | 439 bool routeToMonitor(ThreadContext *tc) const override; 440 bool routeToHyp(ThreadContext *tc) const override; |
437}; 438 439class DataAbort : public AbortFault<DataAbort> 440{ 441 public: 442 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 443 static const MiscRegIndex FarIndex = MISCREG_DFAR; 444 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; --- 8 unchanged lines hidden (view full) --- 453 454 DataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, uint8_t _source, 455 bool _stage2 = false, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 456 AbortFault<DataAbort>(_addr, _write, _domain, _source, _stage2, 457 _tranMethod), 458 isv(false), sas (0), sse(0), srt(0), sf(false), ar(false) 459 {} 460 | 441}; 442 443class DataAbort : public AbortFault<DataAbort> 444{ 445 public: 446 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 447 static const MiscRegIndex FarIndex = MISCREG_DFAR; 448 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; --- 8 unchanged lines hidden (view full) --- 457 458 DataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, uint8_t _source, 459 bool _stage2 = false, ArmFault::TranMethod _tranMethod = ArmFault::UnknownTran) : 460 AbortFault<DataAbort>(_addr, _write, _domain, _source, _stage2, 461 _tranMethod), 462 isv(false), sas (0), sse(0), srt(0), sf(false), ar(false) 463 {} 464 |
461 ExceptionClass ec(ThreadContext *tc) const; | 465 ExceptionClass ec(ThreadContext *tc) const override; |
462 // @todo: external aborts should be routed if SCR.EA == 1 | 466 // @todo: external aborts should be routed if SCR.EA == 1 |
463 bool routeToMonitor(ThreadContext *tc) const; 464 bool routeToHyp(ThreadContext *tc) const; 465 uint32_t iss() const; 466 void annotate(AnnotationIDs id, uint64_t val); | 467 bool routeToMonitor(ThreadContext *tc) const override; 468 bool routeToHyp(ThreadContext *tc) const override; 469 uint32_t iss() const override; 470 void annotate(AnnotationIDs id, uint64_t val) override; |
467}; 468 469class VirtualDataAbort : public AbortFault<VirtualDataAbort> 470{ 471 public: 472 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 473 static const MiscRegIndex FarIndex = MISCREG_DFAR; 474 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; 475 476 VirtualDataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, 477 uint8_t _source) : 478 AbortFault<VirtualDataAbort>(_addr, _write, _domain, _source, false) 479 {} 480 | 471}; 472 473class VirtualDataAbort : public AbortFault<VirtualDataAbort> 474{ 475 public: 476 static const MiscRegIndex FsrIndex = MISCREG_DFSR; 477 static const MiscRegIndex FarIndex = MISCREG_DFAR; 478 static const MiscRegIndex HFarIndex = MISCREG_HDFAR; 479 480 VirtualDataAbort(Addr _addr, TlbEntry::DomainType _domain, bool _write, 481 uint8_t _source) : 482 AbortFault<VirtualDataAbort>(_addr, _write, _domain, _source, false) 483 {} 484 |
481 void invoke(ThreadContext *tc, const StaticInstPtr &inst); | 485 void invoke(ThreadContext *tc, const StaticInstPtr &inst) override; |
482}; 483 484class Interrupt : public ArmFaultVals<Interrupt> 485{ 486 public: | 486}; 487 488class Interrupt : public ArmFaultVals<Interrupt> 489{ 490 public: |
487 bool routeToMonitor(ThreadContext *tc) const; 488 bool routeToHyp(ThreadContext *tc) const; 489 bool abortDisable(ThreadContext *tc); | 491 bool routeToMonitor(ThreadContext *tc) const override; 492 bool routeToHyp(ThreadContext *tc) const override; 493 bool abortDisable(ThreadContext *tc) override; |
490}; 491 492class VirtualInterrupt : public ArmFaultVals<VirtualInterrupt> 493{ 494 public: 495 VirtualInterrupt(); 496}; 497 498class FastInterrupt : public ArmFaultVals<FastInterrupt> 499{ 500 public: | 494}; 495 496class VirtualInterrupt : public ArmFaultVals<VirtualInterrupt> 497{ 498 public: 499 VirtualInterrupt(); 500}; 501 502class FastInterrupt : public ArmFaultVals<FastInterrupt> 503{ 504 public: |
501 bool routeToMonitor(ThreadContext *tc) const; 502 bool routeToHyp(ThreadContext *tc) const; 503 bool abortDisable(ThreadContext *tc); 504 bool fiqDisable(ThreadContext *tc); | 505 bool routeToMonitor(ThreadContext *tc) const override; 506 bool routeToHyp(ThreadContext *tc) const override; 507 bool abortDisable(ThreadContext *tc) override; 508 bool fiqDisable(ThreadContext *tc) override; |
505}; 506 507class VirtualFastInterrupt : public ArmFaultVals<VirtualFastInterrupt> 508{ 509 public: 510 VirtualFastInterrupt(); 511}; 512 513/// PC alignment fault (AArch64 only) 514class PCAlignmentFault : public ArmFaultVals<PCAlignmentFault> 515{ 516 protected: 517 /// The unaligned value of the PC 518 Addr faultPC; 519 public: 520 PCAlignmentFault(Addr _faultPC) : faultPC(_faultPC) 521 {} 522 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 509}; 510 511class VirtualFastInterrupt : public ArmFaultVals<VirtualFastInterrupt> 512{ 513 public: 514 VirtualFastInterrupt(); 515}; 516 517/// PC alignment fault (AArch64 only) 518class PCAlignmentFault : public ArmFaultVals<PCAlignmentFault> 519{ 520 protected: 521 /// The unaligned value of the PC 522 Addr faultPC; 523 public: 524 PCAlignmentFault(Addr _faultPC) : faultPC(_faultPC) 525 {} 526 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
523 StaticInst::nullStaticInstPtr); | 527 StaticInst::nullStaticInstPtr) override; |
524}; 525 526/// Stack pointer alignment fault (AArch64 only) 527class SPAlignmentFault : public ArmFaultVals<SPAlignmentFault> 528{ 529 public: 530 SPAlignmentFault(); 531}; 532 533/// System error (AArch64 only) 534class SystemError : public ArmFaultVals<SystemError> 535{ 536 public: 537 SystemError(); 538 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 528}; 529 530/// Stack pointer alignment fault (AArch64 only) 531class SPAlignmentFault : public ArmFaultVals<SPAlignmentFault> 532{ 533 public: 534 SPAlignmentFault(); 535}; 536 537/// System error (AArch64 only) 538class SystemError : public ArmFaultVals<SystemError> 539{ 540 public: 541 SystemError(); 542 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
539 StaticInst::nullStaticInstPtr); 540 bool routeToMonitor(ThreadContext *tc) const; 541 bool routeToHyp(ThreadContext *tc) const; | 543 StaticInst::nullStaticInstPtr) override; 544 bool routeToMonitor(ThreadContext *tc) const override; 545 bool routeToHyp(ThreadContext *tc) const override; |
542}; 543 544// A fault that flushes the pipe, excluding the faulting instructions 545class FlushPipe : public ArmFaultVals<FlushPipe> 546{ 547 public: 548 FlushPipe() {} 549 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 546}; 547 548// A fault that flushes the pipe, excluding the faulting instructions 549class FlushPipe : public ArmFaultVals<FlushPipe> 550{ 551 public: 552 FlushPipe() {} 553 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
550 StaticInst::nullStaticInstPtr); | 554 StaticInst::nullStaticInstPtr) override; |
551}; 552 553// A fault that flushes the pipe, excluding the faulting instructions 554class ArmSev : public ArmFaultVals<ArmSev> 555{ 556 public: 557 ArmSev () {} 558 void invoke(ThreadContext *tc, const StaticInstPtr &inst = | 555}; 556 557// A fault that flushes the pipe, excluding the faulting instructions 558class ArmSev : public ArmFaultVals<ArmSev> 559{ 560 public: 561 ArmSev () {} 562 void invoke(ThreadContext *tc, const StaticInstPtr &inst = |
559 StaticInst::nullStaticInstPtr); | 563 StaticInst::nullStaticInstPtr) override; |
560}; 561 562/// Illegal Instruction Set State fault (AArch64 only) 563class IllegalInstSetStateFault : public ArmFaultVals<IllegalInstSetStateFault> 564{ 565 public: 566 IllegalInstSetStateFault(); 567}; --- 30 unchanged lines hidden --- | 564}; 565 566/// Illegal Instruction Set State fault (AArch64 only) 567class IllegalInstSetStateFault : public ArmFaultVals<IllegalInstSetStateFault> 568{ 569 public: 570 IllegalInstSetStateFault(); 571}; --- 30 unchanged lines hidden --- |