faults.hh revision 3614
16145Snate@binkert.org/*
26145Snate@binkert.org * Copyright (c) 2003-2005 The Regents of The University of Michigan
36145Snate@binkert.org * All rights reserved.
46145Snate@binkert.org *
56145Snate@binkert.org * Redistribution and use in source and binary forms, with or without
66145Snate@binkert.org * modification, are permitted provided that the following conditions are
76145Snate@binkert.org * met: redistributions of source code must retain the above copyright
86145Snate@binkert.org * notice, this list of conditions and the following disclaimer;
96145Snate@binkert.org * redistributions in binary form must reproduce the above copyright
106145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
116145Snate@binkert.org * documentation and/or other materials provided with the distribution;
126145Snate@binkert.org * neither the name of the copyright holders nor the names of its
136145Snate@binkert.org * contributors may be used to endorse or promote products derived from
146145Snate@binkert.org * this software without specific prior written permission.
156145Snate@binkert.org *
166145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276145Snate@binkert.org *
286145Snate@binkert.org * Authors: Gabe Black
296145Snate@binkert.org *          Kevin Lim
307054Snate@binkert.org */
317054Snate@binkert.org
327054Snate@binkert.org#ifndef __ALPHA_FAULTS_HH__
337054Snate@binkert.org#define __ALPHA_FAULTS_HH__
347054Snate@binkert.org
357054Snate@binkert.org#include "config/full_system.hh"
367054Snate@binkert.org#include "sim/faults.hh"
377054Snate@binkert.org
387054Snate@binkert.org#if FULL_SYSTEM
396145Snate@binkert.org#include "arch/alpha/pagetable.hh"
407054Snate@binkert.org#endif
417054Snate@binkert.org
426145Snate@binkert.org// The design of the "name" and "vect" functions is in sim/faults.hh
437055Snate@binkert.org
447055Snate@binkert.orgnamespace AlphaISA
457454Snate@binkert.org{
467055Snate@binkert.org
478257SBrad.Beckmann@amd.comtypedef const Addr FaultVect;
487054Snate@binkert.org
498645Snilay@cs.wisc.educlass AlphaFault : public FaultBase
509594Snilay@cs.wisc.edu{
519594Snilay@cs.wisc.edu  protected:
527054Snate@binkert.org    virtual bool skipFaultingInstruction() {return false;}
539465Snilay@cs.wisc.edu    virtual bool setRestartAddress() {return true;}
546145Snate@binkert.org  public:
556145Snate@binkert.org#if FULL_SYSTEM
566145Snate@binkert.org    void invoke(ThreadContext * tc);
576145Snate@binkert.org#endif
589465Snilay@cs.wisc.edu    virtual FaultVect vect() = 0;
597054Snate@binkert.org    virtual FaultStat & countStat() = 0;
607054Snate@binkert.org};
616876Ssteve.reinhardt@amd.com
626876Ssteve.reinhardt@amd.comclass MachineCheckFault : public AlphaFault
639594Snilay@cs.wisc.edu{
6410917Sbrandon.potter@amd.com  private:
656145Snate@binkert.org    static FaultName _name;
6610303Snilay@cs.wisc.edu    static FaultVect _vect;
677054Snate@binkert.org    static FaultStat _count;
686145Snate@binkert.org  public:
699497Snilay@cs.wisc.edu    FaultName name() {return _name;}
7010303Snilay@cs.wisc.edu    FaultVect vect() {return _vect;}
7110303Snilay@cs.wisc.edu    FaultStat & countStat() {return _count;}
729275Snilay@cs.wisc.edu    bool isMachineCheckFault() {return true;}
736493STushar.Krishna@amd.com};
747054Snate@binkert.org
7511113Sjoe.gross@amd.comclass AlignmentFault : public AlphaFault
7611113Sjoe.gross@amd.com{
7710311Snilay@cs.wisc.edu  private:
7811113Sjoe.gross@amd.com    static FaultName _name;
7911113Sjoe.gross@amd.com    static FaultVect _vect;
8011113Sjoe.gross@amd.com    static FaultStat _count;
8111113Sjoe.gross@amd.com  public:
826145Snate@binkert.org    FaultName name() {return _name;}
8311663Stushar@ece.gatech.edu    FaultVect vect() {return _vect;}
849799Snilay@cs.wisc.edu    FaultStat & countStat() {return _count;}
8511663Stushar@ece.gatech.edu    bool isAlignmentFault() {return true;}
869799Snilay@cs.wisc.edu};
878257SBrad.Beckmann@amd.com
8811664Stushar@ece.gatech.edu#if !FULL_SYSTEM
8911664Stushar@ece.gatech.educlass PageTableFault : public AlphaFault
9011664Stushar@ece.gatech.edu{
916145Snate@binkert.org  private:
929863Snilay@cs.wisc.edu    Addr vaddr;
937055Snate@binkert.org    static FaultName _name;
946145Snate@binkert.org    static FaultVect _vect;
959302Snilay@cs.wisc.edu    static FaultStat _count;
969302Snilay@cs.wisc.edu  public:
979302Snilay@cs.wisc.edu    PageTableFault(Addr va)
989302Snilay@cs.wisc.edu        : vaddr(va) {}
999302Snilay@cs.wisc.edu    FaultName name() {return _name;}
1009302Snilay@cs.wisc.edu    FaultVect vect() {return _vect;}
1019302Snilay@cs.wisc.edu    FaultStat & countStat() {return _count;}
1029302Snilay@cs.wisc.edu    void invoke(ThreadContext * tc);
1039302Snilay@cs.wisc.edu};
1049302Snilay@cs.wisc.edu
1057054Snate@binkert.orgstatic inline Fault genPageTableFault(Addr va)
1067054Snate@binkert.org{
1077054Snate@binkert.org    return new PageTableFault(va);
1087054Snate@binkert.org}
1096145Snate@binkert.org#endif
1109863Snilay@cs.wisc.edu
1119275Snilay@cs.wisc.edustatic inline Fault genMachineCheckFault()
11211113Sjoe.gross@amd.com{
1137054Snate@binkert.org    return new MachineCheckFault;
1149275Snilay@cs.wisc.edu}
1159275Snilay@cs.wisc.edu
1169863Snilay@cs.wisc.edustatic inline Fault genAlignmentFault()
11710082Snilay@cs.wisc.edu{
11810370Snilay@cs.wisc.edu    return new AlignmentFault;
11910370Snilay@cs.wisc.edu}
12010082Snilay@cs.wisc.edu
12110082Snilay@cs.wisc.educlass ResetFault : public AlphaFault
1229863Snilay@cs.wisc.edu{
1239863Snilay@cs.wisc.edu  private:
1249863Snilay@cs.wisc.edu    static FaultName _name;
1259863Snilay@cs.wisc.edu    static FaultVect _vect;
1269863Snilay@cs.wisc.edu    static FaultStat _count;
1279863Snilay@cs.wisc.edu  public:
1289863Snilay@cs.wisc.edu    FaultName name() {return _name;}
1299863Snilay@cs.wisc.edu    FaultVect vect() {return _vect;}
1309863Snilay@cs.wisc.edu    FaultStat & countStat() {return _count;}
1319863Snilay@cs.wisc.edu};
1329863Snilay@cs.wisc.edu
1339863Snilay@cs.wisc.educlass ArithmeticFault : public AlphaFault
1349863Snilay@cs.wisc.edu{
1359863Snilay@cs.wisc.edu  protected:
1369863Snilay@cs.wisc.edu    bool skipFaultingInstruction() {return true;}
1379863Snilay@cs.wisc.edu  private:
1389863Snilay@cs.wisc.edu    static FaultName _name;
1399863Snilay@cs.wisc.edu    static FaultVect _vect;
1406145Snate@binkert.org    static FaultStat _count;
1416145Snate@binkert.org  public:
1427055Snate@binkert.org    FaultName name() {return _name;}
1437055Snate@binkert.org    FaultVect vect() {return _vect;}
1446145Snate@binkert.org    FaultStat & countStat() {return _count;}
1457054Snate@binkert.org#if FULL_SYSTEM
1467055Snate@binkert.org    void invoke(ThreadContext * tc);
1477054Snate@binkert.org#endif
1486145Snate@binkert.org};
1496145Snate@binkert.org
1507054Snate@binkert.orgclass InterruptFault : public AlphaFault
151{
152  protected:
153    bool setRestartAddress() {return false;}
154  private:
155    static FaultName _name;
156    static FaultVect _vect;
157    static FaultStat _count;
158  public:
159    FaultName name() {return _name;}
160    FaultVect vect() {return _vect;}
161    FaultStat & countStat() {return _count;}
162};
163
164class DtbFault : public AlphaFault
165{
166#if FULL_SYSTEM
167  private:
168    AlphaISA::VAddr vaddr;
169    uint32_t reqFlags;
170    uint64_t flags;
171  public:
172    DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags)
173        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
174    { }
175#endif
176    FaultName name() = 0;
177    FaultVect vect() = 0;
178    FaultStat & countStat() = 0;
179#if FULL_SYSTEM
180    void invoke(ThreadContext * tc);
181#endif
182};
183
184class NDtbMissFault : public DtbFault
185{
186  private:
187    static FaultName _name;
188    static FaultVect _vect;
189    static FaultStat _count;
190  public:
191#if FULL_SYSTEM
192    NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
193        : DtbFault(vaddr, reqFlags, flags)
194    { }
195#endif
196    FaultName name() {return _name;}
197    FaultVect vect() {return _vect;}
198    FaultStat & countStat() {return _count;}
199};
200
201class PDtbMissFault : public DtbFault
202{
203  private:
204    static FaultName _name;
205    static FaultVect _vect;
206    static FaultStat _count;
207  public:
208#if FULL_SYSTEM
209    PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
210        : DtbFault(vaddr, reqFlags, flags)
211    { }
212#endif
213    FaultName name() {return _name;}
214    FaultVect vect() {return _vect;}
215    FaultStat & countStat() {return _count;}
216};
217
218class DtbPageFault : public DtbFault
219{
220  private:
221    static FaultName _name;
222    static FaultVect _vect;
223    static FaultStat _count;
224  public:
225#if FULL_SYSTEM
226    DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
227        : DtbFault(vaddr, reqFlags, flags)
228    { }
229#endif
230    FaultName name() {return _name;}
231    FaultVect vect() {return _vect;}
232    FaultStat & countStat() {return _count;}
233};
234
235class DtbAcvFault : public DtbFault
236{
237  private:
238    static FaultName _name;
239    static FaultVect _vect;
240    static FaultStat _count;
241  public:
242#if FULL_SYSTEM
243    DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
244        : DtbFault(vaddr, reqFlags, flags)
245    { }
246#endif
247    FaultName name() {return _name;}
248    FaultVect vect() {return _vect;}
249    FaultStat & countStat() {return _count;}
250};
251
252class DtbAlignmentFault : public DtbFault
253{
254  private:
255    static FaultName _name;
256    static FaultVect _vect;
257    static FaultStat _count;
258  public:
259#if FULL_SYSTEM
260    DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags)
261        : DtbFault(vaddr, reqFlags, flags)
262    { }
263#endif
264    FaultName name() {return _name;}
265    FaultVect vect() {return _vect;}
266    FaultStat & countStat() {return _count;}
267};
268
269class ItbFault : public AlphaFault
270{
271  private:
272    Addr pc;
273  public:
274    ItbFault(Addr _pc)
275        : pc(_pc)
276    { }
277    FaultName name() = 0;
278    FaultVect vect() = 0;
279    FaultStat & countStat() = 0;
280#if FULL_SYSTEM
281    void invoke(ThreadContext * tc);
282#endif
283};
284
285class ItbMissFault : public ItbFault
286{
287  private:
288    static FaultName _name;
289    static FaultVect _vect;
290    static FaultStat _count;
291  public:
292    ItbMissFault(Addr pc)
293        : ItbFault(pc)
294    { }
295    FaultName name() {return _name;}
296    FaultVect vect() {return _vect;}
297    FaultStat & countStat() {return _count;}
298};
299
300class ItbPageFault : public ItbFault
301{
302  private:
303    static FaultName _name;
304    static FaultVect _vect;
305    static FaultStat _count;
306  public:
307    ItbPageFault(Addr pc)
308        : ItbFault(pc)
309    { }
310    FaultName name() {return _name;}
311    FaultVect vect() {return _vect;}
312    FaultStat & countStat() {return _count;}
313};
314
315class ItbAcvFault : public ItbFault
316{
317  private:
318    static FaultName _name;
319    static FaultVect _vect;
320    static FaultStat _count;
321  public:
322    ItbAcvFault(Addr pc)
323        : ItbFault(pc)
324    { }
325    FaultName name() {return _name;}
326    FaultVect vect() {return _vect;}
327    FaultStat & countStat() {return _count;}
328};
329
330class UnimplementedOpcodeFault : public AlphaFault
331{
332  private:
333    static FaultName _name;
334    static FaultVect _vect;
335    static FaultStat _count;
336  public:
337    FaultName name() {return _name;}
338    FaultVect vect() {return _vect;}
339    FaultStat & countStat() {return _count;}
340};
341
342class FloatEnableFault : public AlphaFault
343{
344  private:
345    static FaultName _name;
346    static FaultVect _vect;
347    static FaultStat _count;
348  public:
349    FaultName name() {return _name;}
350    FaultVect vect() {return _vect;}
351    FaultStat & countStat() {return _count;}
352};
353
354class PalFault : public AlphaFault
355{
356  protected:
357    bool skipFaultingInstruction() {return true;}
358  private:
359    static FaultName _name;
360    static FaultVect _vect;
361    static FaultStat _count;
362  public:
363    FaultName name() {return _name;}
364    FaultVect vect() {return _vect;}
365    FaultStat & countStat() {return _count;}
366};
367
368class IntegerOverflowFault : public AlphaFault
369{
370  private:
371    static FaultName _name;
372    static FaultVect _vect;
373    static FaultStat _count;
374  public:
375    FaultName name() {return _name;}
376    FaultVect vect() {return _vect;}
377    FaultStat & countStat() {return _count;}
378};
379
380} // AlphaISA namespace
381
382#endif // __FAULTS_HH__
383