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