faults.hh revision 8577:37dbd858c367
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * Copyright (c) 2007 MIPS Technologies, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer;
10 * redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution;
13 * neither the name of the copyright holders nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Authors: Gabe Black
30 *          Korey Sewell
31 *          Jaidev Patwardhan
32 */
33
34#ifndef __MIPS_FAULTS_HH__
35#define __MIPS_FAULTS_HH__
36
37#include "arch/mips/pra_constants.hh"
38#include "cpu/thread_context.hh"
39#include "debug/MipsPRA.hh"
40#include "sim/faults.hh"
41
42namespace MipsISA
43{
44
45typedef const Addr FaultVect;
46
47class MipsFaultBase : public FaultBase
48{
49  public:
50    struct FaultVals
51    {
52        const FaultName name;
53        const FaultVect vect;
54    };
55
56#if FULL_SYSTEM
57    void invoke(ThreadContext * tc,
58            StaticInst::StaticInstPtr inst = StaticInst::nullStaticInstPtr)
59    {}
60#endif
61    void setExceptionState(ThreadContext *, uint8_t);
62};
63
64template <typename T>
65class MipsFault : public MipsFaultBase
66{
67  protected:
68    static FaultVals vals;
69  public:
70    FaultName name() const { return vals.name; }
71    FaultVect vect() const { return vals.vect; }
72};
73
74template <typename T>
75class AddressFault : public MipsFault<T>
76{
77  protected:
78    Addr vaddr;
79    bool store;
80
81    AddressFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store)
82    {}
83};
84
85template <typename T>
86class TlbFault : public AddressFault<T>
87{
88  protected:
89    Addr asid;
90    Addr vpn;
91
92    TlbFault(Addr _asid, Addr _vaddr, Addr _vpn, bool _store) :
93        AddressFault<T>(_vaddr, _store), asid(_asid), vpn(_vpn)
94    {}
95
96    void
97    setTlbExceptionState(ThreadContext *tc, uint8_t excCode)
98    {
99        DPRINTF(MipsPRA, "%s encountered.\n", name());
100        this->setExceptionState(tc, excCode);
101
102        tc->setMiscRegNoEffect(MISCREG_BADVADDR, this->vaddr);
103        EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI);
104        entryHi.asid = this->asid;
105        entryHi.vpn2 = this->vpn >> 2;
106        entryHi.vpn2x = this->vpn & 0x3;
107        tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi);
108
109        ContextReg context = tc->readMiscReg(MISCREG_CONTEXT);
110        context.badVPN2 = this->vpn >> 2;
111        tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
112    }
113};
114
115class MachineCheckFault : public MipsFault<MachineCheckFault>
116{
117  public:
118    bool isMachineCheckFault() {return true;}
119};
120
121static inline Fault genMachineCheckFault()
122{
123    return new MachineCheckFault;
124}
125
126class NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt>
127{
128  public:
129    bool isNonMaskableInterrupt() {return true;}
130};
131
132class AddressErrorFault : public AddressFault<AddressErrorFault>
133{
134  public:
135    AddressErrorFault(Addr _vaddr, bool _store) :
136        AddressFault<AddressErrorFault>(_vaddr, _store)
137    {}
138#if FULL_SYSTEM
139    void invoke(ThreadContext * tc,
140            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
141#endif
142
143};
144
145class ResetFault : public MipsFault<ResetFault>
146{
147  public:
148    void invoke(ThreadContext * tc,
149            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
150
151};
152
153class SystemCallFault : public MipsFault<SystemCallFault>
154{
155  public:
156#if FULL_SYSTEM
157    void invoke(ThreadContext * tc,
158            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
159#endif
160};
161
162class SoftResetFault : public MipsFault<SoftResetFault>
163{
164  public:
165    void invoke(ThreadContext * tc,
166            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
167};
168
169class CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault>
170{
171  protected:
172    int coProcID;
173  public:
174    CoprocessorUnusableFault(int _procid) : coProcID(_procid)
175    {}
176
177    void invoke(ThreadContext * tc,
178            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
179};
180
181class ReservedInstructionFault : public MipsFault<ReservedInstructionFault>
182{
183  public:
184    void invoke(ThreadContext * tc,
185            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
186};
187
188class ThreadFault : public MipsFault<ThreadFault>
189{
190  public:
191    void invoke(ThreadContext * tc,
192            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
193};
194
195class IntegerOverflowFault : public MipsFault<IntegerOverflowFault>
196{
197  public:
198#if FULL_SYSTEM
199    void invoke(ThreadContext * tc,
200            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
201#endif
202};
203
204class InterruptFault : public MipsFault<InterruptFault>
205{
206  public:
207#if FULL_SYSTEM
208    void invoke(ThreadContext * tc,
209            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
210#endif
211};
212
213class TrapFault : public MipsFault<TrapFault>
214{
215  public:
216#if FULL_SYSTEM
217    void invoke(ThreadContext * tc,
218            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
219#endif
220};
221
222class BreakpointFault : public MipsFault<BreakpointFault>
223{
224  public:
225#if FULL_SYSTEM
226    void invoke(ThreadContext * tc,
227            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
228#endif
229};
230
231class TlbRefillFault : public TlbFault<TlbRefillFault>
232{
233  public:
234    TlbRefillFault(Addr asid, Addr vaddr, Addr vpn, bool store) :
235        TlbFault<TlbRefillFault>(asid, vaddr, vpn, store)
236    {}
237#if FULL_SYSTEM
238    void invoke(ThreadContext * tc,
239            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
240#endif
241};
242
243class TlbInvalidFault : public TlbFault<TlbInvalidFault>
244{
245  public:
246    TlbInvalidFault(Addr asid, Addr vaddr, Addr vpn, bool store) :
247        TlbFault<TlbInvalidFault>(asid, vaddr, vpn, store)
248    {}
249#if FULL_SYSTEM
250    void invoke(ThreadContext * tc,
251            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
252#endif
253};
254
255class TlbModifiedFault : public TlbFault<TlbModifiedFault>
256{
257  public:
258    TlbModifiedFault(Addr asid, Addr vaddr, Addr vpn) :
259        TlbFault<TlbModifiedFault>(asid, vaddr, vpn, false)
260    {}
261#if FULL_SYSTEM
262    void invoke(ThreadContext * tc,
263            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
264#endif
265};
266
267class DspStateDisabledFault : public MipsFault<DspStateDisabledFault>
268{
269  public:
270    void invoke(ThreadContext * tc,
271            StaticInstPtr inst = StaticInst::nullStaticInstPtr);
272};
273
274} // namespace MipsISA
275
276#endif // __MIPS_FAULTS_HH__
277