faults.hh revision 2665
113531Sjairo.balart@metempsy.com/*
213531Sjairo.balart@metempsy.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
313531Sjairo.balart@metempsy.com * All rights reserved.
413531Sjairo.balart@metempsy.com *
513531Sjairo.balart@metempsy.com * Redistribution and use in source and binary forms, with or without
613531Sjairo.balart@metempsy.com * modification, are permitted provided that the following conditions are
713531Sjairo.balart@metempsy.com * met: redistributions of source code must retain the above copyright
813531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer;
913531Sjairo.balart@metempsy.com * redistributions in binary form must reproduce the above copyright
1013531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer in the
1113531Sjairo.balart@metempsy.com * documentation and/or other materials provided with the distribution;
1213531Sjairo.balart@metempsy.com * neither the name of the copyright holders nor the names of its
1313531Sjairo.balart@metempsy.com * contributors may be used to endorse or promote products derived from
1413531Sjairo.balart@metempsy.com * this software without specific prior written permission.
1513531Sjairo.balart@metempsy.com *
1613531Sjairo.balart@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713531Sjairo.balart@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813531Sjairo.balart@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913531Sjairo.balart@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013531Sjairo.balart@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113531Sjairo.balart@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213531Sjairo.balart@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313531Sjairo.balart@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413531Sjairo.balart@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513531Sjairo.balart@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613531Sjairo.balart@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713531Sjairo.balart@metempsy.com *
2813531Sjairo.balart@metempsy.com * Authors: Gabe Black
2913531Sjairo.balart@metempsy.com *          Kevin Lim
3013531Sjairo.balart@metempsy.com */
3113531Sjairo.balart@metempsy.com
3213531Sjairo.balart@metempsy.com#ifndef __ALPHA_FAULTS_HH__
3313531Sjairo.balart@metempsy.com#define __ALPHA_FAULTS_HH__
3413531Sjairo.balart@metempsy.com
3513531Sjairo.balart@metempsy.com#include "arch/alpha/isa_traits.hh"
3613531Sjairo.balart@metempsy.com#include "sim/faults.hh"
3713531Sjairo.balart@metempsy.com
3813531Sjairo.balart@metempsy.com// The design of the "name" and "vect" functions is in sim/faults.hh
3913531Sjairo.balart@metempsy.com
4013531Sjairo.balart@metempsy.comnamespace AlphaISA
4113531Sjairo.balart@metempsy.com{
4213531Sjairo.balart@metempsy.com
4313531Sjairo.balart@metempsy.comtypedef const Addr FaultVect;
4413531Sjairo.balart@metempsy.com
4513531Sjairo.balart@metempsy.comclass AlphaFault : public FaultBase
4613531Sjairo.balart@metempsy.com{
4713531Sjairo.balart@metempsy.com  protected:
4813531Sjairo.balart@metempsy.com    virtual bool skipFaultingInstruction() {return false;}
4913531Sjairo.balart@metempsy.com    virtual bool setRestartAddress() {return true;}
5013531Sjairo.balart@metempsy.com  public:
5113531Sjairo.balart@metempsy.com#if FULL_SYSTEM
5213531Sjairo.balart@metempsy.com    void invoke(ExecContext * xc);
5313531Sjairo.balart@metempsy.com#endif
5413531Sjairo.balart@metempsy.com    virtual FaultVect vect() = 0;
5513531Sjairo.balart@metempsy.com    virtual FaultStat & countStat() = 0;
5613531Sjairo.balart@metempsy.com};
5713531Sjairo.balart@metempsy.com
5813531Sjairo.balart@metempsy.comclass MachineCheckFault : public AlphaFault
5913531Sjairo.balart@metempsy.com{
6013531Sjairo.balart@metempsy.com  private:
6113531Sjairo.balart@metempsy.com    static FaultName _name;
6213531Sjairo.balart@metempsy.com    static FaultVect _vect;
6313531Sjairo.balart@metempsy.com    static FaultStat _count;
6413531Sjairo.balart@metempsy.com  public:
6513531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
6613531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
6713531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
6813531Sjairo.balart@metempsy.com    bool isMachineCheckFault() {return true;}
6913531Sjairo.balart@metempsy.com};
7013531Sjairo.balart@metempsy.com
7113531Sjairo.balart@metempsy.comclass AlignmentFault : public AlphaFault
7213531Sjairo.balart@metempsy.com{
7313531Sjairo.balart@metempsy.com  private:
7413531Sjairo.balart@metempsy.com    static FaultName _name;
7513531Sjairo.balart@metempsy.com    static FaultVect _vect;
7613531Sjairo.balart@metempsy.com    static FaultStat _count;
7713531Sjairo.balart@metempsy.com  public:
7813531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
7913531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
8013531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
8113531Sjairo.balart@metempsy.com    bool isAlignmentFault() {return true;}
8213531Sjairo.balart@metempsy.com};
8313531Sjairo.balart@metempsy.com
8413531Sjairo.balart@metempsy.comstatic inline Fault genMachineCheckFault()
8513531Sjairo.balart@metempsy.com{
8613531Sjairo.balart@metempsy.com    return new MachineCheckFault;
8713531Sjairo.balart@metempsy.com}
8813531Sjairo.balart@metempsy.com
8913531Sjairo.balart@metempsy.comstatic inline Fault genAlignmentFault()
9013531Sjairo.balart@metempsy.com{
9113531Sjairo.balart@metempsy.com    return new AlignmentFault;
9213531Sjairo.balart@metempsy.com}
9313531Sjairo.balart@metempsy.com
9413531Sjairo.balart@metempsy.comclass ResetFault : public AlphaFault
9513531Sjairo.balart@metempsy.com{
9613531Sjairo.balart@metempsy.com  private:
9713531Sjairo.balart@metempsy.com    static FaultName _name;
9813531Sjairo.balart@metempsy.com    static FaultVect _vect;
9913531Sjairo.balart@metempsy.com    static FaultStat _count;
10013531Sjairo.balart@metempsy.com  public:
10113531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
10213531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
10313531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
10413531Sjairo.balart@metempsy.com};
10513531Sjairo.balart@metempsy.com
10613531Sjairo.balart@metempsy.comclass ArithmeticFault : public AlphaFault
10713531Sjairo.balart@metempsy.com{
10813531Sjairo.balart@metempsy.com  protected:
10913756Sjairo.balart@metempsy.com    bool skipFaultingInstruction() {return true;}
11013756Sjairo.balart@metempsy.com  private:
11113756Sjairo.balart@metempsy.com    static FaultName _name;
11213756Sjairo.balart@metempsy.com    static FaultVect _vect;
11313756Sjairo.balart@metempsy.com    static FaultStat _count;
11413756Sjairo.balart@metempsy.com  public:
11513756Sjairo.balart@metempsy.com    FaultName name() {return _name;}
11613531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
11713531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
11813756Sjairo.balart@metempsy.com#if FULL_SYSTEM
11913756Sjairo.balart@metempsy.com    void invoke(ExecContext * xc);
12013531Sjairo.balart@metempsy.com#endif
12113756Sjairo.balart@metempsy.com};
12213756Sjairo.balart@metempsy.com
12313756Sjairo.balart@metempsy.comclass InterruptFault : public AlphaFault
12413531Sjairo.balart@metempsy.com{
12513531Sjairo.balart@metempsy.com  protected:
12613531Sjairo.balart@metempsy.com    bool setRestartAddress() {return false;}
12713531Sjairo.balart@metempsy.com  private:
12813531Sjairo.balart@metempsy.com    static FaultName _name;
12913531Sjairo.balart@metempsy.com    static FaultVect _vect;
13013531Sjairo.balart@metempsy.com    static FaultStat _count;
13113531Sjairo.balart@metempsy.com  public:
13213531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
13313531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
13413531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
13513531Sjairo.balart@metempsy.com};
13613531Sjairo.balart@metempsy.com
13713531Sjairo.balart@metempsy.comclass DtbFault : public AlphaFault
13813531Sjairo.balart@metempsy.com{
13913531Sjairo.balart@metempsy.com#if FULL_SYSTEM
14013531Sjairo.balart@metempsy.com  private:
14113531Sjairo.balart@metempsy.com    AlphaISA::VAddr vaddr;
14213531Sjairo.balart@metempsy.com    uint32_t reqFlags;
14313531Sjairo.balart@metempsy.com    uint64_t flags;
14413756Sjairo.balart@metempsy.com  public:
14513531Sjairo.balart@metempsy.com    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
14613756Sjairo.balart@metempsy.com        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
14713756Sjairo.balart@metempsy.com    { }
14813756Sjairo.balart@metempsy.com#endif
14913756Sjairo.balart@metempsy.com    FaultName name() = 0;
15013531Sjairo.balart@metempsy.com    FaultVect vect() = 0;
15113756Sjairo.balart@metempsy.com    FaultStat & countStat() = 0;
15213756Sjairo.balart@metempsy.com#if FULL_SYSTEM
15313531Sjairo.balart@metempsy.com    void invoke(ExecContext * xc);
15413531Sjairo.balart@metempsy.com#endif
15513531Sjairo.balart@metempsy.com};
15613531Sjairo.balart@metempsy.com
15713531Sjairo.balart@metempsy.comclass NDtbMissFault : public DtbFault
15813531Sjairo.balart@metempsy.com{
15913531Sjairo.balart@metempsy.com  private:
16013531Sjairo.balart@metempsy.com    static FaultName _name;
16113531Sjairo.balart@metempsy.com    static FaultVect _vect;
16213531Sjairo.balart@metempsy.com    static FaultStat _count;
16313531Sjairo.balart@metempsy.com  public:
16413531Sjairo.balart@metempsy.com#if FULL_SYSTEM
16513531Sjairo.balart@metempsy.com    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
16613531Sjairo.balart@metempsy.com        : DtbFault(vaddr, reqFlags, flags)
16713531Sjairo.balart@metempsy.com    { }
16813531Sjairo.balart@metempsy.com#endif
16913531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
17013531Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
17113531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
17213531Sjairo.balart@metempsy.com};
17313531Sjairo.balart@metempsy.com
17413531Sjairo.balart@metempsy.comclass PDtbMissFault : public DtbFault
17513531Sjairo.balart@metempsy.com{
17613531Sjairo.balart@metempsy.com  private:
17713531Sjairo.balart@metempsy.com    static FaultName _name;
17813531Sjairo.balart@metempsy.com    static FaultVect _vect;
17913531Sjairo.balart@metempsy.com    static FaultStat _count;
18013531Sjairo.balart@metempsy.com  public:
18113531Sjairo.balart@metempsy.com#if FULL_SYSTEM
18213531Sjairo.balart@metempsy.com    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
18313531Sjairo.balart@metempsy.com        : DtbFault(vaddr, reqFlags, flags)
18413531Sjairo.balart@metempsy.com    { }
18513756Sjairo.balart@metempsy.com#endif
18613531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
18713756Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
18813531Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
18913531Sjairo.balart@metempsy.com};
19013531Sjairo.balart@metempsy.com
19113531Sjairo.balart@metempsy.comclass DtbPageFault : public DtbFault
19213531Sjairo.balart@metempsy.com{
19313531Sjairo.balart@metempsy.com  private:
19413531Sjairo.balart@metempsy.com    static FaultName _name;
19513531Sjairo.balart@metempsy.com    static FaultVect _vect;
19613756Sjairo.balart@metempsy.com    static FaultStat _count;
19713531Sjairo.balart@metempsy.com  public:
19813531Sjairo.balart@metempsy.com#if FULL_SYSTEM
19913531Sjairo.balart@metempsy.com    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
20013531Sjairo.balart@metempsy.com        : DtbFault(vaddr, reqFlags, flags)
20113756Sjairo.balart@metempsy.com    { }
20213756Sjairo.balart@metempsy.com#endif
20313756Sjairo.balart@metempsy.com    FaultName name() {return _name;}
20413756Sjairo.balart@metempsy.com    FaultVect vect() {return _vect;}
20513756Sjairo.balart@metempsy.com    FaultStat & countStat() {return _count;}
20613531Sjairo.balart@metempsy.com};
20713756Sjairo.balart@metempsy.com
20813756Sjairo.balart@metempsy.comclass DtbAcvFault : public DtbFault
20913756Sjairo.balart@metempsy.com{
21013756Sjairo.balart@metempsy.com  private:
21113756Sjairo.balart@metempsy.com    static FaultName _name;
21213756Sjairo.balart@metempsy.com    static FaultVect _vect;
21313756Sjairo.balart@metempsy.com    static FaultStat _count;
21413756Sjairo.balart@metempsy.com  public:
21513756Sjairo.balart@metempsy.com#if FULL_SYSTEM
21613756Sjairo.balart@metempsy.com    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
21713756Sjairo.balart@metempsy.com        : DtbFault(vaddr, reqFlags, flags)
21813531Sjairo.balart@metempsy.com    { }
21913531Sjairo.balart@metempsy.com#endif
22013531Sjairo.balart@metempsy.com    FaultName name() {return _name;}
221    FaultVect vect() {return _vect;}
222    FaultStat & countStat() {return _count;}
223};
224
225class DtbAlignmentFault : public DtbFault
226{
227  private:
228    static FaultName _name;
229    static FaultVect _vect;
230    static FaultStat _count;
231  public:
232#if FULL_SYSTEM
233    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
234        : DtbFault(vaddr, reqFlags, flags)
235    { }
236#endif
237    FaultName name() {return _name;}
238    FaultVect vect() {return _vect;}
239    FaultStat & countStat() {return _count;}
240};
241
242class ItbFault : public AlphaFault
243{
244  private:
245    Addr pc;
246  public:
247    ItbFault(Addr _pc)
248        : pc(_pc)
249    { }
250    FaultName name() = 0;
251    FaultVect vect() = 0;
252    FaultStat & countStat() = 0;
253#if FULL_SYSTEM
254    void invoke(ExecContext * xc);
255#endif
256};
257
258class ItbMissFault : public ItbFault
259{
260  private:
261    static FaultName _name;
262    static FaultVect _vect;
263    static FaultStat _count;
264  public:
265    ItbMissFault(Addr pc)
266        : ItbFault(pc)
267    { }
268    FaultName name() {return _name;}
269    FaultVect vect() {return _vect;}
270    FaultStat & countStat() {return _count;}
271};
272
273class ItbPageFault : public ItbFault
274{
275  private:
276    static FaultName _name;
277    static FaultVect _vect;
278    static FaultStat _count;
279  public:
280    ItbPageFault(Addr pc)
281        : ItbFault(pc)
282    { }
283    FaultName name() {return _name;}
284    FaultVect vect() {return _vect;}
285    FaultStat & countStat() {return _count;}
286};
287
288class ItbAcvFault : public ItbFault
289{
290  private:
291    static FaultName _name;
292    static FaultVect _vect;
293    static FaultStat _count;
294  public:
295    ItbAcvFault(Addr pc)
296        : ItbFault(pc)
297    { }
298    FaultName name() {return _name;}
299    FaultVect vect() {return _vect;}
300    FaultStat & countStat() {return _count;}
301};
302
303class UnimplementedOpcodeFault : public AlphaFault
304{
305  private:
306    static FaultName _name;
307    static FaultVect _vect;
308    static FaultStat _count;
309  public:
310    FaultName name() {return _name;}
311    FaultVect vect() {return _vect;}
312    FaultStat & countStat() {return _count;}
313};
314
315class FloatEnableFault : public AlphaFault
316{
317  private:
318    static FaultName _name;
319    static FaultVect _vect;
320    static FaultStat _count;
321  public:
322    FaultName name() {return _name;}
323    FaultVect vect() {return _vect;}
324    FaultStat & countStat() {return _count;}
325};
326
327class PalFault : public AlphaFault
328{
329  protected:
330    bool skipFaultingInstruction() {return true;}
331  private:
332    static FaultName _name;
333    static FaultVect _vect;
334    static FaultStat _count;
335  public:
336    FaultName name() {return _name;}
337    FaultVect vect() {return _vect;}
338    FaultStat & countStat() {return _count;}
339};
340
341class IntegerOverflowFault : public AlphaFault
342{
343  private:
344    static FaultName _name;
345    static FaultVect _vect;
346    static FaultStat _count;
347  public:
348    FaultName name() {return _name;}
349    FaultVect vect() {return _vect;}
350    FaultStat & countStat() {return _count;}
351};
352
353} // AlphaISA namespace
354
355#endif // __FAULTS_HH__
356