faults.hh revision 4661:44458219add1
12207SN/A/* 22207SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32207SN/A * All rights reserved. 42207SN/A * 52207SN/A * Redistribution and use in source and binary forms, with or without 62207SN/A * modification, are permitted provided that the following conditions are 72207SN/A * met: redistributions of source code must retain the above copyright 82207SN/A * notice, this list of conditions and the following disclaimer; 92207SN/A * redistributions in binary form must reproduce the above copyright 102207SN/A * notice, this list of conditions and the following disclaimer in the 112207SN/A * documentation and/or other materials provided with the distribution; 122207SN/A * neither the name of the copyright holders nor the names of its 132207SN/A * contributors may be used to endorse or promote products derived from 142207SN/A * this software without specific prior written permission. 152207SN/A * 162207SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172207SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182207SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192207SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202207SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212207SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222207SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232207SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242207SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252207SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262207SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Gabe Black 292665Ssaidi@eecs.umich.edu * Korey Sewell 302207SN/A */ 312207SN/A 322474SN/A#ifndef __MIPS_FAULTS_HH__ 332207SN/A#define __MIPS_FAULTS_HH__ 342597SN/A 352454SN/A#include "sim/faults.hh" 362454SN/A 372474SN/A// The design of the "name" and "vect" functions is in sim/faults.hh 382474SN/A 392474SN/Anamespace MipsISA 402207SN/A{ 412447SN/A 422474SN/Atypedef const Addr FaultVect; 432447SN/A 442474SN/Aclass MipsFault : public FaultBase 452474SN/A{ 462474SN/A protected: 472474SN/A virtual bool skipFaultingInstruction() {return false;} 482474SN/A virtual bool setRestartAddress() {return true;} 492207SN/A public: 502474SN/A#if FULL_SYSTEM 512207SN/A void invoke(ThreadContext * tc); 522474SN/A#endif 532474SN/A virtual FaultVect vect() = 0; 542474SN/A virtual FaultStat & countStat() = 0; 552474SN/A}; 562474SN/A 572474SN/Aclass MachineCheckFault : public MipsFault 582472SN/A{ 592207SN/A private: 602207SN/A static FaultName _name; 612207SN/A static FaultVect _vect; 622474SN/A static FaultStat _count; 632207SN/A public: 642207SN/A FaultName name() {return _name;} 652207SN/A FaultVect vect() {return _vect;} 662207SN/A FaultStat & countStat() {return _count;} 672207SN/A bool isMachineCheckFault() {return true;} 682207SN/A}; 692207SN/A 702474SN/Aclass AlignmentFault : public MipsFault 712474SN/A{ 722474SN/A private: 732207SN/A static FaultName _name; 742207SN/A static FaultVect _vect; 752207SN/A static FaultStat _count; 762474SN/A public: 772474SN/A FaultName name() {return _name;} 782474SN/A FaultVect vect() {return _vect;} 792474SN/A FaultStat & countStat() {return _count;} 802474SN/A bool isAlignmentFault() {return true;} 812474SN/A}; 822207SN/A 832474SN/Aclass UnimplementedOpcodeFault : public MipsFault 842474SN/A{ 852474SN/A private: 862474SN/A static FaultName _name; 872474SN/A static FaultVect _vect; 882474SN/A static FaultStat _count; 892474SN/A public: 902474SN/A FaultName name() {return _name;} 912474SN/A FaultVect vect() {return _vect;} 922474SN/A FaultStat & countStat() {return _count;} 932474SN/A}; 942474SN/A 952474SN/A#if !FULL_SYSTEM 962474SN/A//class PageTableFault : public MipsFault 972474SN/A//{ 982474SN/A//private: 992474SN/A// Addr vaddr; 1002474SN/A// static FaultName _name; 1012474SN/A// static FaultVect _vect; 1022474SN/A// static FaultStat _count; 1032474SN/A//public: 1042474SN/A// PageTableFault(Addr va) 1052474SN/A// : vaddr(va) {} 1062474SN/A// FaultName name() {return _name;} 1072474SN/A// FaultVect vect() {return _vect;} 1082474SN/A// FaultStat & countStat() {return _count;} 1092474SN/A// void invoke(ThreadContext * tc); 1102474SN/A//}; 1112474SN/A 1122474SN/Astatic inline Fault genPageTableFault(Addr va) 1132474SN/A{ 1142474SN/A return new PageTableFault(va); 1152474SN/A} 1162474SN/A#endif 1172474SN/A 1182474SN/A 1192474SN/Astatic inline Fault genMachineCheckFault() 1202474SN/A{ 1212474SN/A return new MachineCheckFault; 1222474SN/A} 1232474SN/A 1242474SN/Astatic inline Fault genAlignmentFault() 1252474SN/A{ 1262474SN/A return new AlignmentFault; 1272474SN/A} 1282474SN/A 1292474SN/Aclass ResetFault : public MipsFault 1302474SN/A{ 1312474SN/A private: 1322474SN/A static FaultName _name; 1332474SN/A static FaultVect _vect; 1342474SN/A static FaultStat _count; 1352474SN/A public: 1362474SN/A FaultName name() {return _name;} 1372474SN/A FaultVect vect() {return _vect;} 1382474SN/A FaultStat & countStat() {return _count;} 1392474SN/A void invoke(ThreadContext * tc); 1402474SN/A}; 1412474SN/A 1422474SN/Aclass CoprocessorUnusableFault : public MipsFault 1432474SN/A{ 1442474SN/A private: 1452474SN/A static FaultName _name; 1462474SN/A static FaultVect _vect; 1472474SN/A static FaultStat _count; 1482474SN/A public: 1492474SN/A FaultName name() {return _name;} 1502474SN/A FaultVect vect() {return _vect;} 1512474SN/A FaultStat & countStat() {return _count;} 1522474SN/A void invoke(ThreadContext * tc); 1532474SN/A}; 1542474SN/A 1552474SN/Aclass ReservedInstructionFault : public MipsFault 1562474SN/A{ 1572474SN/A private: 1582474SN/A static FaultName _name; 1592474SN/A static FaultVect _vect; 1602474SN/A static FaultStat _count; 1612474SN/A public: 1622474SN/A FaultName name() {return _name;} 1632474SN/A FaultVect vect() {return _vect;} 1642474SN/A FaultStat & countStat() {return _count;} 165 void invoke(ThreadContext * tc); 166}; 167 168class ThreadFault : public MipsFault 169{ 170 private: 171 static FaultName _name; 172 static FaultVect _vect; 173 static FaultStat _count; 174 public: 175 FaultName name() {return _name;} 176 FaultVect vect() {return _vect;} 177 FaultStat & countStat() {return _count;} 178 void invoke(ThreadContext * tc); 179}; 180 181 182class ArithmeticFault : public MipsFault 183{ 184 protected: 185 bool skipFaultingInstruction() {return true;} 186 private: 187 static FaultName _name; 188 static FaultVect _vect; 189 static FaultStat _count; 190 public: 191 FaultName name() {return _name;} 192 FaultVect vect() {return _vect;} 193 FaultStat & countStat() {return _count;} 194#if FULL_SYSTEM 195 void invoke(ThreadContext * tc); 196#endif 197}; 198 199class InterruptFault : public MipsFault 200{ 201 protected: 202 bool setRestartAddress() {return false;} 203 private: 204 static FaultName _name; 205 static FaultVect _vect; 206 static FaultStat _count; 207 public: 208 FaultName name() {return _name;} 209 FaultVect vect() {return _vect;} 210 FaultStat & countStat() {return _count;} 211}; 212 213class NDtbMissFault : public MipsFault 214{ 215 private: 216 static FaultName _name; 217 static FaultVect _vect; 218 static FaultStat _count; 219 public: 220 FaultName name() {return _name;} 221 FaultVect vect() {return _vect;} 222 FaultStat & countStat() {return _count;} 223}; 224 225class PDtbMissFault : public MipsFault 226{ 227 private: 228 static FaultName _name; 229 static FaultVect _vect; 230 static FaultStat _count; 231 public: 232 FaultName name() {return _name;} 233 FaultVect vect() {return _vect;} 234 FaultStat & countStat() {return _count;} 235}; 236 237class DtbPageFault : public MipsFault 238{ 239 private: 240 static FaultName _name; 241 static FaultVect _vect; 242 static FaultStat _count; 243 public: 244 FaultName name() {return _name;} 245 FaultVect vect() {return _vect;} 246 FaultStat & countStat() {return _count;} 247}; 248 249class DtbAcvFault : public MipsFault 250{ 251 private: 252 static FaultName _name; 253 static FaultVect _vect; 254 static FaultStat _count; 255 public: 256 FaultName name() {return _name;} 257 FaultVect vect() {return _vect;} 258 FaultStat & countStat() {return _count;} 259}; 260 261class ItbMissFault : public MipsFault 262{ 263 private: 264 static FaultName _name; 265 static FaultVect _vect; 266 static FaultStat _count; 267 public: 268 FaultName name() {return _name;} 269 FaultVect vect() {return _vect;} 270 FaultStat & countStat() {return _count;} 271}; 272 273class ItbPageFault : public MipsFault 274{ 275 private: 276 static FaultName _name; 277 static FaultVect _vect; 278 static FaultStat _count; 279 public: 280 FaultName name() {return _name;} 281 FaultVect vect() {return _vect;} 282 FaultStat & countStat() {return _count;} 283}; 284 285class ItbAcvFault : public MipsFault 286{ 287 private: 288 static FaultName _name; 289 static FaultVect _vect; 290 static FaultStat _count; 291 public: 292 FaultName name() {return _name;} 293 FaultVect vect() {return _vect;} 294 FaultStat & countStat() {return _count;} 295}; 296 297class FloatEnableFault : public MipsFault 298{ 299 private: 300 static FaultName _name; 301 static FaultVect _vect; 302 static FaultStat _count; 303 public: 304 FaultName name() {return _name;} 305 FaultVect vect() {return _vect;} 306 FaultStat & countStat() {return _count;} 307}; 308 309class IntegerOverflowFault : public MipsFault 310{ 311 private: 312 static FaultName _name; 313 static FaultVect _vect; 314 static FaultStat _count; 315 public: 316 FaultName name() {return _name;} 317 FaultVect vect() {return _vect;} 318 FaultStat & countStat() {return _count;} 319}; 320 321class DspStateDisabledFault : public MipsFault 322{ 323 private: 324 static FaultName _name; 325 static FaultVect _vect; 326 static FaultStat _count; 327 public: 328 FaultName name() {return _name;} 329 FaultVect vect() {return _vect;} 330 FaultStat & countStat() {return _count;} 331 void invoke(ThreadContext * tc); 332}; 333 334} // MipsISA namespace 335 336#endif // __FAULTS_HH__ 337