faults.hh revision 5224:0e354459fb8a
1/* 2 * Copyright (c) 2007 MIPS Technologies, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Gabe Black 29 * Korey Sewell 30 * Jaidev Patwardhan 31 */ 32 33#ifndef __MIPS_FAULTS_HH__ 34#define __MIPS_FAULTS_HH__ 35 36#include "sim/faults.hh" 37 38// The design of the "name" and "vect" functions is in sim/faults.hh 39 40namespace MipsISA 41{ 42typedef const Addr FaultVect; 43 44class MipsFault : public FaultBase 45{ 46 protected: 47 virtual bool skipFaultingInstruction() {return false;} 48 virtual bool setRestartAddress() {return true;} 49 public: 50 Addr BadVAddr; 51 Addr EntryHi_Asid; 52 Addr EntryHi_VPN2; 53 Addr EntryHi_VPN2X; 54 Addr Context_BadVPN2; 55#if FULL_SYSTEM 56 void invoke(ThreadContext * tc) {}; 57 void setExceptionState(ThreadContext *,uint8_t); 58 void setHandlerPC(Addr,ThreadContext *); 59#endif 60 virtual FaultVect vect() = 0; 61 virtual FaultStat & countStat() = 0; 62}; 63 64class MachineCheckFault : public MipsFault 65{ 66 private: 67 static FaultName _name; 68 static FaultVect _vect; 69 static FaultStat _count; 70 public: 71 FaultName name() const {return _name;} 72 FaultVect vect() {return _vect;} 73 FaultStat & countStat() {return _count;} 74 bool isMachineCheckFault() {return true;} 75}; 76 77class NonMaskableInterrupt : public MipsFault 78{ 79 private: 80 static FaultName _name; 81 static FaultVect _vect; 82 static FaultStat _count; 83 public: 84 FaultName name() const {return _name;} 85 FaultVect vect() {return _vect;} 86 FaultStat & countStat() {return _count;} 87 bool isNonMaskableInterrupt() {return true;} 88}; 89 90class AlignmentFault : public MipsFault 91{ 92 private: 93 static FaultName _name; 94 static FaultVect _vect; 95 static FaultStat _count; 96 public: 97 FaultName name() const {return _name;} 98 FaultVect vect() {return _vect;} 99 FaultStat & countStat() {return _count;} 100 bool isAlignmentFault() {return true;} 101}; 102 103class AddressErrorFault : public MipsFault 104{ 105 private: 106 static FaultName _name; 107 static FaultVect _vect; 108 static FaultStat _count; 109 public: 110 FaultName name() const {return _name;} 111 FaultVect vect() {return _vect;} 112 FaultStat & countStat() {return _count;} 113#if FULL_SYSTEM 114 void invoke(ThreadContext * tc); 115#endif 116 117}; 118class StoreAddressErrorFault : public MipsFault 119{ 120 private: 121 static FaultName _name; 122 static FaultVect _vect; 123 static FaultStat _count; 124 public: 125 FaultName name() const {return _name;} 126 FaultVect vect() {return _vect;} 127 FaultStat & countStat() {return _count;} 128#if FULL_SYSTEM 129 void invoke(ThreadContext * tc); 130#endif 131 132}; 133class UnimplementedOpcodeFault : public MipsFault 134{ 135 private: 136 static FaultName _name; 137 static FaultVect _vect; 138 static FaultStat _count; 139 public: 140 FaultName name() const {return _name;} 141 FaultVect vect() {return _vect;} 142 FaultStat & countStat() {return _count;} 143}; 144 145 146class TLBRefillIFetchFault : public MipsFault 147{ 148 private: 149 Addr vaddr; 150 static FaultName _name; 151 static FaultVect _vect; 152 static FaultStat _count; 153 public: 154 FaultName name() const {return _name;} 155 FaultVect vect() {return _vect;} 156 FaultStat & countStat() {return _count;} 157 void invoke(ThreadContext * tc); 158}; 159class TLBInvalidIFetchFault : public MipsFault 160{ 161 private: 162 Addr vaddr; 163 static FaultName _name; 164 static FaultVect _vect; 165 static FaultStat _count; 166 public: 167 FaultName name() const {return _name;} 168 FaultVect vect() {return _vect;} 169 FaultStat & countStat() {return _count;} 170 void invoke(ThreadContext * tc); 171}; 172 173class NDtbMissFault : public MipsFault 174{ 175 private: 176 static FaultName _name; 177 static FaultVect _vect; 178 static FaultStat _count; 179 public: 180 FaultName name() const {return _name;} 181 FaultVect vect() {return _vect;} 182 FaultStat & countStat() {return _count;} 183}; 184 185class PDtbMissFault : public MipsFault 186{ 187 private: 188 static FaultName _name; 189 static FaultVect _vect; 190 static FaultStat _count; 191 public: 192 FaultName name() const {return _name;} 193 FaultVect vect() {return _vect;} 194 FaultStat & countStat() {return _count;} 195}; 196 197class DtbPageFault : public MipsFault 198{ 199 private: 200 static FaultName _name; 201 static FaultVect _vect; 202 static FaultStat _count; 203 public: 204 FaultName name() const {return _name;} 205 FaultVect vect() {return _vect;} 206 FaultStat & countStat() {return _count;} 207}; 208 209class DtbAcvFault : public MipsFault 210{ 211 private: 212 static FaultName _name; 213 static FaultVect _vect; 214 static FaultStat _count; 215 public: 216 FaultName name() const {return _name;} 217 FaultVect vect() {return _vect;} 218 FaultStat & countStat() {return _count;} 219}; 220 221class CacheErrorFault : public MipsFault 222{ 223 private: 224 Addr vaddr; 225 static FaultName _name; 226 static FaultVect _vect; 227 static FaultStat _count; 228 public: 229 FaultName name() const {return _name;} 230 FaultVect vect() {return _vect;} 231 FaultStat & countStat() {return _count;} 232 void invoke(ThreadContext * tc); 233}; 234 235 236 237 238static inline Fault genMachineCheckFault() 239{ 240 return new MachineCheckFault; 241} 242 243static inline Fault genAlignmentFault() 244{ 245 return new AlignmentFault; 246} 247 248class ResetFault : public MipsFault 249{ 250 private: 251 static FaultName _name; 252 static FaultVect _vect; 253 static FaultStat _count; 254 public: 255 FaultName name() const {return _name;} 256 FaultVect vect() {return _vect;} 257 FaultStat & countStat() {return _count;} 258 void invoke(ThreadContext * tc); 259 260}; 261class SystemCallFault : public MipsFault 262{ 263 private: 264 static FaultName _name; 265 static FaultVect _vect; 266 static FaultStat _count; 267 public: 268 FaultName name() const {return _name;} 269 FaultVect vect() {return _vect;} 270 FaultStat & countStat() {return _count;} 271 void invoke(ThreadContext * tc); 272}; 273 274class SoftResetFault : public MipsFault 275{ 276 private: 277 static FaultName _name; 278 static FaultVect _vect; 279 static FaultStat _count; 280 public: 281 FaultName name() const {return _name;} 282 FaultVect vect() {return _vect;} 283 FaultStat & countStat() {return _count;} 284 void invoke(ThreadContext * tc); 285}; 286class DebugSingleStep : public MipsFault 287{ 288 private: 289 static FaultName _name; 290 static FaultVect _vect; 291 static FaultStat _count; 292 public: 293 FaultName name() const {return _name;} 294 FaultVect vect() {return _vect;} 295 FaultStat & countStat() {return _count;} 296 void invoke(ThreadContext * tc); 297}; 298class DebugInterrupt : public MipsFault 299{ 300 private: 301 static FaultName _name; 302 static FaultVect _vect; 303 static FaultStat _count; 304 public: 305 FaultName name() const {return _name;} 306 FaultVect vect() {return _vect;} 307 FaultStat & countStat() {return _count;} 308 void invoke(ThreadContext * tc); 309}; 310 311class CoprocessorUnusableFault : public MipsFault 312{ 313 private: 314 static FaultName _name; 315 static FaultVect _vect; 316 static FaultStat _count; 317 int coProcID; 318 public: 319 FaultName name() const {return _name;} 320 FaultVect vect() {return _vect;} 321 FaultStat & countStat() {return _count;} 322 void invoke(ThreadContext * tc); 323 CoprocessorUnusableFault(int _procid){ coProcID = _procid;} 324}; 325 326class ReservedInstructionFault : public MipsFault 327{ 328 private: 329 static FaultName _name; 330 static FaultVect _vect; 331 static FaultStat _count; 332 public: 333 FaultName name() const {return _name;} 334 FaultVect vect() {return _vect;} 335 FaultStat & countStat() {return _count;} 336 void invoke(ThreadContext * tc); 337}; 338 339class ThreadFault : public MipsFault 340{ 341 private: 342 static FaultName _name; 343 static FaultVect _vect; 344 static FaultStat _count; 345 public: 346 FaultName name() const {return _name;} 347 FaultVect vect() {return _vect;} 348 FaultStat & countStat() {return _count;} 349 void invoke(ThreadContext * tc); 350}; 351 352 353class ArithmeticFault : public MipsFault 354{ 355 protected: 356 bool skipFaultingInstruction() {return true;} 357 private: 358 static FaultName _name; 359 static FaultVect _vect; 360 static FaultStat _count; 361 public: 362 FaultName name() const {return _name;} 363 FaultVect vect() {return _vect;} 364 FaultStat & countStat() {return _count;} 365#if FULL_SYSTEM 366 void invoke(ThreadContext * tc); 367#endif 368}; 369 370class InterruptFault : public MipsFault 371{ 372 protected: 373 bool setRestartAddress() {return false;} 374 private: 375 static FaultName _name; 376 static FaultVect _vect; 377 static FaultStat _count; 378 public: 379 FaultName name() const {return _name;} 380 FaultVect vect() {return _vect;} 381 FaultStat & countStat() {return _count;} 382 383#if FULL_SYSTEM 384 void invoke(ThreadContext * tc); 385#endif 386 387 //void invoke(ThreadContext * tc); 388}; 389 390class TrapFault : public MipsFault 391{ 392 private: 393 static FaultName _name; 394 static FaultVect _vect; 395 static FaultStat _count; 396 public: 397 FaultName name() const {return _name;} 398 FaultVect vect() {return _vect;} 399 FaultStat & countStat() {return _count;} 400#if FULL_SYSTEM 401 void invoke(ThreadContext * tc); 402#endif 403}; 404 405class BreakpointFault : public MipsFault 406{ 407 private: 408 static FaultName _name; 409 static FaultVect _vect; 410 static FaultStat _count; 411 public: 412 FaultName name() const {return _name;} 413 FaultVect vect() {return _vect;} 414 FaultStat & countStat() {return _count;} 415#if FULL_SYSTEM 416 void invoke(ThreadContext * tc); 417#endif 418}; 419 420class ItbRefillFault : public MipsFault 421{ 422 private: 423 static FaultName _name; 424 static FaultVect _vect; 425 static FaultStat _count; 426 public: 427 FaultName name() const {return _name;} 428 FaultVect vect() {return _vect;} 429 FaultStat & countStat() {return _count;} 430#if FULL_SYSTEM 431 void invoke(ThreadContext * tc); 432#endif 433}; 434class DtbRefillFault : public MipsFault 435{ 436 private: 437 static FaultName _name; 438 static FaultVect _vect; 439 static FaultStat _count; 440 public: 441 FaultName name() const {return _name;} 442 FaultVect vect() {return _vect;} 443 FaultStat & countStat() {return _count;} 444#if FULL_SYSTEM 445 void invoke(ThreadContext * tc); 446#endif 447}; 448 449class ItbPageFault : public MipsFault 450{ 451 private: 452 static FaultName _name; 453 static FaultVect _vect; 454 static FaultStat _count; 455 public: 456 FaultName name() const {return _name;} 457 FaultVect vect() {return _vect;} 458 FaultStat & countStat() {return _count;} 459#if FULL_SYSTEM 460 void invoke(ThreadContext * tc); 461#endif 462}; 463 464class ItbInvalidFault : public MipsFault 465{ 466 private: 467 static FaultName _name; 468 static FaultVect _vect; 469 static FaultStat _count; 470 public: 471 FaultName name() const {return _name;} 472 FaultVect vect() {return _vect;} 473 FaultStat & countStat() {return _count;} 474#if FULL_SYSTEM 475 void invoke(ThreadContext * tc); 476#endif 477 478}; 479class TLBModifiedFault : public MipsFault 480{ 481 private: 482 static FaultName _name; 483 static FaultVect _vect; 484 static FaultStat _count; 485 public: 486 FaultName name() const {return _name;} 487 FaultVect vect() {return _vect;} 488 FaultStat & countStat() {return _count;} 489#if FULL_SYSTEM 490 void invoke(ThreadContext * tc); 491#endif 492 493}; 494 495class DtbInvalidFault : public MipsFault 496{ 497 private: 498 static FaultName _name; 499 static FaultVect _vect; 500 static FaultStat _count; 501 public: 502 FaultName name() const {return _name;} 503 FaultVect vect() {return _vect;} 504 FaultStat & countStat() {return _count;} 505#if FULL_SYSTEM 506 void invoke(ThreadContext * tc); 507#endif 508 509}; 510 511class FloatEnableFault : public MipsFault 512{ 513 private: 514 static FaultName _name; 515 static FaultVect _vect; 516 static FaultStat _count; 517 public: 518 FaultName name() const {return _name;} 519 FaultVect vect() {return _vect;} 520 FaultStat & countStat() {return _count;} 521}; 522 523class ItbMissFault : public MipsFault 524{ 525 private: 526 static FaultName _name; 527 static FaultVect _vect; 528 static FaultStat _count; 529 public: 530 FaultName name() const {return _name;} 531 FaultVect vect() {return _vect;} 532 FaultStat & countStat() {return _count;} 533}; 534 535class ItbAcvFault : public MipsFault 536{ 537 private: 538 static FaultName _name; 539 static FaultVect _vect; 540 static FaultStat _count; 541 public: 542 FaultName name() const {return _name;} 543 FaultVect vect() {return _vect;} 544 FaultStat & countStat() {return _count;} 545}; 546 547class IntegerOverflowFault : public MipsFault 548{ 549 private: 550 static FaultName _name; 551 static FaultVect _vect; 552 static FaultStat _count; 553 public: 554 FaultName name() const {return _name;} 555 FaultVect vect() {return _vect;} 556 FaultStat & countStat() {return _count;} 557}; 558 559class DspStateDisabledFault : public MipsFault 560{ 561 private: 562 static FaultName _name; 563 static FaultVect _vect; 564 static FaultStat _count; 565 public: 566 FaultName name() const {return _name;} 567 FaultVect vect() {return _vect;} 568 FaultStat & countStat() {return _count;} 569 void invoke(ThreadContext * tc); 570}; 571 572} // MipsISA namespace 573 574#endif // __MIPS_FAULTS_HH__ 575