faults.hh revision 12110:c24ee249b8ba
17503Snate@binkert.org/*
27503Snate@binkert.org * Copyright (c) 2003-2005 The Regents of The University of Michigan
37503Snate@binkert.org * All rights reserved.
47503Snate@binkert.org *
57503Snate@binkert.org * Redistribution and use in source and binary forms, with or without
67503Snate@binkert.org * modification, are permitted provided that the following conditions are
77503Snate@binkert.org * met: redistributions of source code must retain the above copyright
87503Snate@binkert.org * notice, this list of conditions and the following disclaimer;
97503Snate@binkert.org * redistributions in binary form must reproduce the above copyright
107503Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
117503Snate@binkert.org * documentation and/or other materials provided with the distribution;
127503Snate@binkert.org * neither the name of the copyright holders nor the names of its
137503Snate@binkert.org * contributors may be used to endorse or promote products derived from
147503Snate@binkert.org * this software without specific prior written permission.
157503Snate@binkert.org *
167503Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177503Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187503Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197503Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207503Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217503Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227503Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237503Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247503Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257503Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267503Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712563Sgabeblack@google.com *
2813714Sandreas.sandberg@arm.com * Authors: Gabe Black
2912563Sgabeblack@google.com *          Kevin Lim
308223Snate@binkert.org */
318223Snate@binkert.org
327503Snate@binkert.org#ifndef __ARCH_ALPHA_FAULTS_HH__
337503Snate@binkert.org#define __ARCH_ALPHA_FAULTS_HH__
347503Snate@binkert.org
357503Snate@binkert.org#include "arch/alpha/pagetable.hh"
367503Snate@binkert.org#include "mem/request.hh"
377503Snate@binkert.org#include "sim/faults.hh"
387503Snate@binkert.org
397503Snate@binkert.org// The design of the "name" and "vect" functions is in sim/faults.hh
407503Snate@binkert.org
417503Snate@binkert.orgnamespace AlphaISA {
427503Snate@binkert.org
437503Snate@binkert.orgtypedef Addr FaultVect;
447503Snate@binkert.org
4513709Sandreas.sandberg@arm.comclass AlphaFault : public FaultBase
467503Snate@binkert.org{
477503Snate@binkert.org  protected:
487503Snate@binkert.org    virtual bool skipFaultingInstruction() {return false;}
498223Snate@binkert.org    virtual bool setRestartAddress() {return true;}
508223Snate@binkert.org  public:
518223Snate@binkert.org    virtual ~AlphaFault() {}
528223Snate@binkert.org    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
538223Snate@binkert.org                StaticInst::nullStaticInstPtr);
548223Snate@binkert.org    virtual FaultVect vect() = 0;
558223Snate@binkert.org    virtual FaultStat & countStat() = 0;
568223Snate@binkert.org};
578223Snate@binkert.org
588223Snate@binkert.orgclass MachineCheckFault : public AlphaFault
598223Snate@binkert.org{
608223Snate@binkert.org  private:
618223Snate@binkert.org    static FaultName _name;
628223Snate@binkert.org    static FaultVect _vect;
638223Snate@binkert.org    static FaultStat _count;
648223Snate@binkert.org
658223Snate@binkert.org  public:
668223Snate@binkert.org    FaultName name() const {return _name;}
678223Snate@binkert.org    FaultVect vect() {return _vect;}
688223Snate@binkert.org    FaultStat & countStat() {return _count;}
698223Snate@binkert.org};
708223Snate@binkert.org
718223Snate@binkert.orgclass AlignmentFault : public AlphaFault
728223Snate@binkert.org{
738223Snate@binkert.org  private:
748223Snate@binkert.org    static FaultName _name;
758223Snate@binkert.org    static FaultVect _vect;
768223Snate@binkert.org    static FaultStat _count;
778223Snate@binkert.org
788223Snate@binkert.org  public:
798223Snate@binkert.org    FaultName name() const {return _name;}
808223Snate@binkert.org    FaultVect vect() {return _vect;}
818223Snate@binkert.org    FaultStat & countStat() {return _count;}
828223Snate@binkert.org    bool isAlignmentFault() const {return true;}
838223Snate@binkert.org};
848223Snate@binkert.org
857503Snate@binkert.orgclass ResetFault : public AlphaFault
867503Snate@binkert.org{
877503Snate@binkert.org  private:
887503Snate@binkert.org    static FaultName _name;
897503Snate@binkert.org    static FaultVect _vect;
907503Snate@binkert.org    static FaultStat _count;
917503Snate@binkert.org
927503Snate@binkert.org  public:
9313709Sandreas.sandberg@arm.com    FaultName name() const {return _name;}
947503Snate@binkert.org    FaultVect vect() {return _vect;}
957503Snate@binkert.org    FaultStat & countStat() {return _count;}
967503Snate@binkert.org};
977503Snate@binkert.org
987503Snate@binkert.orgclass ArithmeticFault : public AlphaFault
997503Snate@binkert.org{
1007503Snate@binkert.org  private:
1017503Snate@binkert.org    static FaultName _name;
1027503Snate@binkert.org    static FaultVect _vect;
1037503Snate@binkert.org    static FaultStat _count;
1047503Snate@binkert.org
1057503Snate@binkert.org  protected:
1067503Snate@binkert.org    bool skipFaultingInstruction() {return true;}
1077503Snate@binkert.org
1087503Snate@binkert.org  public:
1097503Snate@binkert.org    FaultName name() const {return _name;}
1107503Snate@binkert.org    FaultVect vect() {return _vect;}
11113709Sandreas.sandberg@arm.com    FaultStat & countStat() {return _count;}
1127503Snate@binkert.org    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1137503Snate@binkert.org                StaticInst::nullStaticInstPtr);
1147503Snate@binkert.org};
1157503Snate@binkert.org
1167503Snate@binkert.orgclass InterruptFault : public AlphaFault
11713709Sandreas.sandberg@arm.com{
1187503Snate@binkert.org  private:
1197503Snate@binkert.org    static FaultName _name;
1207503Snate@binkert.org    static FaultVect _vect;
1218223Snate@binkert.org    static FaultStat _count;
1228223Snate@binkert.org
1238223Snate@binkert.org  protected:
1248223Snate@binkert.org    bool setRestartAddress() {return false;}
1258223Snate@binkert.org
1268223Snate@binkert.org  public:
1278223Snate@binkert.org    FaultName name() const {return _name;}
1288223Snate@binkert.org    FaultVect vect() {return _vect;}
1298223Snate@binkert.org    FaultStat & countStat() {return _count;}
1308223Snate@binkert.org};
1318223Snate@binkert.org
1328223Snate@binkert.orgclass DtbFault : public AlphaFault
1338223Snate@binkert.org{
1348223Snate@binkert.org  protected:
1358223Snate@binkert.org    VAddr vaddr;
1368223Snate@binkert.org    Request::Flags reqFlags;
1378223Snate@binkert.org    uint64_t flags;
1388223Snate@binkert.org
1398223Snate@binkert.org  public:
1408223Snate@binkert.org    DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags)
1417503Snate@binkert.org        : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags)
1427503Snate@binkert.org    { }
1437503Snate@binkert.org    FaultName name() const = 0;
1447503Snate@binkert.org    FaultVect vect() = 0;
1457503Snate@binkert.org    FaultStat & countStat() = 0;
1467503Snate@binkert.org    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1477503Snate@binkert.org                StaticInst::nullStaticInstPtr);
1487503Snate@binkert.org};
1497503Snate@binkert.org
1507503Snate@binkert.orgclass NDtbMissFault : public DtbFault
1517503Snate@binkert.org{
1527503Snate@binkert.org  private:
1537503Snate@binkert.org    static FaultName _name;
1547503Snate@binkert.org    static FaultVect _vect;
1557503Snate@binkert.org    static FaultStat _count;
1567503Snate@binkert.org
1577503Snate@binkert.org  public:
1587503Snate@binkert.org    NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1597503Snate@binkert.org        : DtbFault(vaddr, reqFlags, flags)
1607503Snate@binkert.org    { }
1617503Snate@binkert.org    FaultName name() const {return _name;}
1627503Snate@binkert.org    FaultVect vect() {return _vect;}
1637503Snate@binkert.org    FaultStat & countStat() {return _count;}
1647503Snate@binkert.org    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
1657503Snate@binkert.org                StaticInst::nullStaticInstPtr);
1667503Snate@binkert.org};
1677503Snate@binkert.org
1687503Snate@binkert.orgclass PDtbMissFault : public DtbFault
1697503Snate@binkert.org{
1707503Snate@binkert.org  private:
1717503Snate@binkert.org    static FaultName _name;
1727503Snate@binkert.org    static FaultVect _vect;
1737503Snate@binkert.org    static FaultStat _count;
1747503Snate@binkert.org
1757503Snate@binkert.org  public:
1767503Snate@binkert.org    PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1777503Snate@binkert.org        : DtbFault(vaddr, reqFlags, flags)
17812563Sgabeblack@google.com    { }
17913709Sandreas.sandberg@arm.com    FaultName name() const {return _name;}
18013709Sandreas.sandberg@arm.com    FaultVect vect() {return _vect;}
18113709Sandreas.sandberg@arm.com    FaultStat & countStat() {return _count;}
18213709Sandreas.sandberg@arm.com};
18313709Sandreas.sandberg@arm.com
18413709Sandreas.sandberg@arm.comclass DtbPageFault : public DtbFault
1857503Snate@binkert.org{
1867503Snate@binkert.org  private:
1877503Snate@binkert.org    static FaultName _name;
1887503Snate@binkert.org    static FaultVect _vect;
18912563Sgabeblack@google.com    static FaultStat _count;
1907503Snate@binkert.org
1917503Snate@binkert.org  public:
19212563Sgabeblack@google.com    DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
1937503Snate@binkert.org        : DtbFault(vaddr, reqFlags, flags)
1947503Snate@binkert.org    { }
1957503Snate@binkert.org    FaultName name() const {return _name;}
1967503Snate@binkert.org    FaultVect vect() {return _vect;}
1977503Snate@binkert.org    FaultStat & countStat() {return _count;}
1987503Snate@binkert.org};
1997503Snate@binkert.org
2007503Snate@binkert.orgclass DtbAcvFault : public DtbFault
2017503Snate@binkert.org{
2027503Snate@binkert.org  private:
2037503Snate@binkert.org    static FaultName _name;
2047503Snate@binkert.org    static FaultVect _vect;
2057503Snate@binkert.org    static FaultStat _count;
2067503Snate@binkert.org
2077503Snate@binkert.org  public:
2087503Snate@binkert.org    DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
20913682Sandreas.sandberg@arm.com        : DtbFault(vaddr, reqFlags, flags)
2107503Snate@binkert.org    { }
21112563Sgabeblack@google.com    FaultName name() const {return _name;}
2128223Snate@binkert.org    FaultVect vect() {return _vect;}
2138223Snate@binkert.org    FaultStat & countStat() {return _count;}
21412563Sgabeblack@google.com};
215
216class DtbAlignmentFault : public DtbFault
217{
218  private:
219    static FaultName _name;
220    static FaultVect _vect;
221    static FaultStat _count;
222
223  public:
224    DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags)
225        : DtbFault(vaddr, reqFlags, flags)
226    { }
227    FaultName name() const {return _name;}
228    FaultVect vect() {return _vect;}
229    FaultStat & countStat() {return _count;}
230};
231
232class ItbFault : public AlphaFault
233{
234  protected:
235    Addr pc;
236
237  public:
238    ItbFault(Addr _pc) : pc(_pc) { }
239    FaultName name() const = 0;
240    FaultVect vect() = 0;
241    FaultStat & countStat() = 0;
242    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
243                StaticInst::nullStaticInstPtr);
244};
245
246class ItbPageFault : public ItbFault
247{
248  private:
249    static FaultName _name;
250    static FaultVect _vect;
251    static FaultStat _count;
252
253  public:
254    ItbPageFault(Addr pc) : ItbFault(pc) { }
255    FaultName name() const {return _name;}
256    FaultVect vect() {return _vect;}
257    FaultStat & countStat() {return _count;}
258    void invoke(ThreadContext * tc, const StaticInstPtr &inst =
259                StaticInst::nullStaticInstPtr);
260};
261
262class ItbAcvFault : public ItbFault
263{
264  private:
265    static FaultName _name;
266    static FaultVect _vect;
267    static FaultStat _count;
268
269  public:
270    ItbAcvFault(Addr pc) : ItbFault(pc) { }
271    FaultName name() const {return _name;}
272    FaultVect vect() {return _vect;}
273    FaultStat & countStat() {return _count;}
274};
275
276class UnimplementedOpcodeFault : public AlphaFault
277{
278  private:
279    static FaultName _name;
280    static FaultVect _vect;
281    static FaultStat _count;
282
283  public:
284    FaultName name() const {return _name;}
285    FaultVect vect() {return _vect;}
286    FaultStat & countStat() {return _count;}
287};
288
289class FloatEnableFault : public AlphaFault
290{
291  private:
292    static FaultName _name;
293    static FaultVect _vect;
294    static FaultStat _count;
295
296  public:
297    FaultName name() const {return _name;}
298    FaultVect vect() {return _vect;}
299    FaultStat & countStat() {return _count;}
300};
301
302class VectorEnableFault : public AlphaFault
303{
304  private:
305    static FaultName _name;
306    static FaultVect _vect;
307    static FaultStat _count;
308
309  public:
310    FaultName name() const {return _name;}
311    FaultVect vect() {return _vect;}
312    FaultStat & countStat() {return _count;}
313};
314
315class PalFault : public AlphaFault
316{
317  private:
318    static FaultName _name;
319    static FaultVect _vect;
320    static FaultStat _count;
321
322  protected:
323    bool skipFaultingInstruction() {return true;}
324
325  public:
326    FaultName name() const {return _name;}
327    FaultVect vect() {return _vect;}
328    FaultStat & countStat() {return _count;}
329};
330
331class IntegerOverflowFault : public AlphaFault
332{
333  private:
334    static FaultName _name;
335    static FaultVect _vect;
336    static FaultStat _count;
337
338  public:
339    FaultName name() const {return _name;}
340    FaultVect vect() {return _vect;}
341    FaultStat & countStat() {return _count;}
342};
343
344} // namespace AlphaISA
345
346#endif // __ARCH_ALPHA_FAULTS_HH__
347