gem5 v24.0.0.0
Loading...
Searching...
No Matches
faults.hh
Go to the documentation of this file.
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
30#ifndef __MIPS_FAULTS_HH__
31#define __MIPS_FAULTS_HH__
32
36#include "cpu/thread_context.hh"
37#include "debug/MipsPRA.hh"
38#include "sim/faults.hh"
39#include "sim/full_system.hh"
40
41namespace gem5
42{
43
44namespace MipsISA
45{
46
48
50{
51 // A dummy value to use when the code isn't defined or doesn't matter.
53
74};
75
77{
78 public:
79 struct FaultVals
80 {
84 };
85
86 void setExceptionState(ThreadContext *, uint8_t);
87
88 virtual FaultVect offset(ThreadContext *tc) const = 0;
89 virtual ExcCode code() const = 0;
90 virtual FaultVect base(ThreadContext *tc) const
91 {
92 StatusReg status = tc->readMiscReg(misc_reg::Status);
93 if (!status.bev)
94 return tc->readMiscReg(misc_reg::Ebase);
95 else
96 return 0xbfc00200;
97 }
98
101 {
102 return base(tc) + offset(tc);
103 }
104
105 void invoke(ThreadContext * tc, const StaticInstPtr &inst =
107};
108
109template <typename T>
111{
112 protected:
114 public:
115 FaultName name() const { return vals.name; }
116 FaultVect offset(ThreadContext *tc) const { return vals.offset; }
117 ExcCode code() const { return vals.code; }
118};
119
120class SystemCallFault : public MipsFault<SystemCallFault> {};
121class ReservedInstructionFault : public MipsFault<ReservedInstructionFault> {};
122class ThreadFault : public MipsFault<ThreadFault> {};
123class IntegerOverflowFault : public MipsFault<IntegerOverflowFault> {};
124class TrapFault : public MipsFault<TrapFault> {};
125class BreakpointFault : public MipsFault<BreakpointFault> {};
126class DspStateDisabledFault : public MipsFault<DspStateDisabledFault> {};
127
128class MachineCheckFault : public MipsFault<MachineCheckFault>
129{
130 public:
131 bool isMachineCheckFault() { return true; }
132};
133
134class ResetFault : public MipsFault<ResetFault>
135{
136 public:
137 void invoke(ThreadContext * tc, const StaticInstPtr &inst =
139
140};
141
142class SoftResetFault : public MipsFault<SoftResetFault>
143{
144 public:
145 void invoke(ThreadContext * tc, const StaticInstPtr &inst =
147};
148
149class NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt>
150{
151 public:
152 void invoke(ThreadContext * tc, const StaticInstPtr &inst =
154};
155
156class CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault>
157{
158 protected:
160 public:
161 CoprocessorUnusableFault(int _procid) : coProcID(_procid)
162 {}
163
164 void
167 {
169 if (FullSystem) {
170 CauseReg cause = tc->readMiscReg(misc_reg::Cause);
171 cause.ce = coProcID;
173 }
174 }
175};
176
177class InterruptFault : public MipsFault<InterruptFault>
178{
179 public:
182 {
183 CauseReg cause = tc->readMiscRegNoEffect(misc_reg::Cause);
184 // offset 0x200 for release 2, 0x180 for release 1.
185 return cause.iv ? 0x200 : 0x180;
186 }
187};
188
189template <typename T>
190class AddressFault : public MipsFault<T>
191{
192 protected:
194 bool store;
195
196 AddressFault(Addr _vaddr, bool _store) : vaddr(_vaddr), store(_store)
197 {}
198
199 void
207};
208
209class AddressErrorFault : public AddressFault<AddressErrorFault>
210{
211 public:
212 AddressErrorFault(Addr _vaddr, bool _store) :
213 AddressFault<AddressErrorFault>(_vaddr, _store)
214 {}
215
216 ExcCode
217 code() const
218 {
219 return store ? ExcCodeAdES : ExcCodeAdEL;
220 }
221
222};
223
224template <typename T>
225class TlbFault : public AddressFault<T>
226{
227 protected:
230
231 TlbFault(Addr _asid, Addr _vaddr, Addr _vpn, bool _store) :
232 AddressFault<T>(_vaddr, _store), asid(_asid), vpn(_vpn)
233 {}
234
235 void
237 {
238 this->setExceptionState(tc, excCode);
239
241 EntryHiReg entryHi = tc->readMiscReg(misc_reg::Entryhi);
242 entryHi.asid = this->asid;
243 entryHi.vpn2 = this->vpn >> 2;
244 entryHi.vpn2x = this->vpn & 0x3;
246
247 ContextReg context = tc->readMiscReg(misc_reg::Context);
248 context.badVPN2 = this->vpn >> 2;
250 }
251
252 void
255 {
256 if (FullSystem) {
257 DPRINTF(MipsPRA, "Fault %s encountered.\n", this->name());
258 Addr vect = this->vect(tc);
259 setTlbExceptionState(tc, this->code());
260 tc->pcState(vect);
261 } else {
262 AddressFault<T>::invoke(tc, inst);
263 }
264 }
265
266 ExcCode
267 code() const
268 {
269 return this->store ? ExcCodeTlbS : ExcCodeTlbL;
270 }
271};
272
273class TlbRefillFault : public TlbFault<TlbRefillFault>
274{
275 public:
279
282 {
283 StatusReg status = tc->readMiscReg(misc_reg::Status);
284 return status.exl ? 0x180 : 0x000;
285 }
286};
287
288class TlbInvalidFault : public TlbFault<TlbInvalidFault>
289{
290 public:
294};
295
296class TlbModifiedFault : public TlbFault<TlbModifiedFault>
297{
298 public:
302
304};
305
306/*
307 * Explicitly declare template static member variables to avoid warnings
308 * in some clang versions
309 */
327
328
329
330} // namespace MipsISA
331} // namespace gem5
332
333#endif // __MIPS_FAULTS_HH__
#define DPRINTF(x,...)
Definition trace.hh:210
AddressErrorFault(Addr _vaddr, bool _store)
Definition faults.hh:212
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.hh:200
AddressFault(Addr _vaddr, bool _store)
Definition faults.hh:196
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.hh:165
FaultVect offset(ThreadContext *tc) const
Definition faults.hh:181
virtual FaultVect offset(ThreadContext *tc) const =0
void setExceptionState(ThreadContext *, uint8_t)
Definition faults.cc:100
virtual ExcCode code() const =0
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.cc:132
virtual FaultVect base(ThreadContext *tc) const
Definition faults.hh:90
FaultVect vect(ThreadContext *tc) const
Definition faults.hh:100
static FaultVals vals
Definition faults.hh:113
FaultVect offset(ThreadContext *tc) const
Definition faults.hh:116
FaultName name() const
Definition faults.hh:115
ExcCode code() const
Definition faults.hh:117
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.cc:167
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.cc:144
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.cc:161
TlbFault(Addr _asid, Addr _vaddr, Addr _vpn, bool _store)
Definition faults.hh:231
void setTlbExceptionState(ThreadContext *tc, uint8_t excCode)
Definition faults.hh:236
ExcCode code() const
Definition faults.hh:267
void invoke(ThreadContext *tc, const StaticInstPtr &inst=nullStaticInstPtr)
Definition faults.hh:253
TlbInvalidFault(Addr asid, Addr vaddr, Addr vpn, bool store)
Definition faults.hh:291
TlbModifiedFault(Addr asid, Addr vaddr, Addr vpn)
Definition faults.hh:299
TlbRefillFault(Addr asid, Addr vaddr, Addr vpn, bool store)
Definition faults.hh:276
FaultVect offset(ThreadContext *tc) const
Definition faults.hh:281
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual RegVal readMiscReg(RegIndex misc_reg)=0
virtual void setMiscRegNoEffect(RegIndex misc_reg, RegVal val)=0
virtual const PCStateBase & pcState() const =0
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 5, 0 > status
Addr FaultVect
Definition faults.hh:47
Bitfield< 6, 2 > excCode
@ ExcCodeCacheErr
Definition faults.hh:73
Bitfield< 51, 12 > base
Definition pagetable.hh:141
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
Definition root.cc:220
const char * FaultName
Definition faults.hh:55
const StaticInstPtr nullStaticInstPtr
Statically allocated null StaticInstPtr.

Generated on Tue Jun 18 2024 16:23:57 for gem5 by doxygen 1.11.0