gem5  v22.1.0.0
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 
34 #include "arch/mips/regs/misc.hh"
35 #include "cpu/null_static_inst.hh"
36 #include "cpu/thread_context.hh"
37 #include "debug/MipsPRA.hh"
38 #include "sim/faults.hh"
39 #include "sim/full_system.hh"
40 
41 namespace gem5
42 {
43 
44 namespace MipsISA
45 {
46 
47 typedef Addr FaultVect;
48 
49 enum ExcCode
50 {
51  // A dummy value to use when the code isn't defined or doesn't matter.
53 
63  ExcCodeBp = 9,
64  ExcCodeRI = 10,
65  ExcCodeCpU = 11,
66  ExcCodeOv = 12,
67  ExcCodeTr = 13,
68  ExcCodeC2E = 18,
73  ExcCodeCacheErr = 30
74 };
75 
76 class MipsFaultBase : public FaultBase
77 {
78  public:
79  struct FaultVals
80  {
81  const FaultName name;
83  const ExcCode code;
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 
99  FaultVect
100  vect(ThreadContext *tc) const
101  {
102  return base(tc) + offset(tc);
103  }
104 
105  void invoke(ThreadContext * tc, const StaticInstPtr &inst =
107 };
108 
109 template <typename T>
110 class MipsFault : public MipsFaultBase
111 {
112  protected:
113  static FaultVals vals;
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 
120 class SystemCallFault : public MipsFault<SystemCallFault> {};
121 class ReservedInstructionFault : public MipsFault<ReservedInstructionFault> {};
122 class ThreadFault : public MipsFault<ThreadFault> {};
123 class IntegerOverflowFault : public MipsFault<IntegerOverflowFault> {};
124 class TrapFault : public MipsFault<TrapFault> {};
125 class BreakpointFault : public MipsFault<BreakpointFault> {};
126 class DspStateDisabledFault : public MipsFault<DspStateDisabledFault> {};
127 
128 class MachineCheckFault : public MipsFault<MachineCheckFault>
129 {
130  public:
131  bool isMachineCheckFault() { return true; }
132 };
133 
134 class ResetFault : public MipsFault<ResetFault>
135 {
136  public:
137  void invoke(ThreadContext * tc, const StaticInstPtr &inst =
139 
140 };
141 
142 class SoftResetFault : public MipsFault<SoftResetFault>
143 {
144  public:
145  void invoke(ThreadContext * tc, const StaticInstPtr &inst =
147 };
148 
149 class NonMaskableInterrupt : public MipsFault<NonMaskableInterrupt>
150 {
151  public:
152  void invoke(ThreadContext * tc, const StaticInstPtr &inst =
154 };
155 
156 class CoprocessorUnusableFault : public MipsFault<CoprocessorUnusableFault>
157 {
158  protected:
159  int coProcID;
160  public:
161  CoprocessorUnusableFault(int _procid) : coProcID(_procid)
162  {}
163 
164  void
165  invoke(ThreadContext * tc, const StaticInstPtr &inst =
167  {
169  if (FullSystem) {
170  CauseReg cause = tc->readMiscReg(misc_reg::Cause);
171  cause.ce = coProcID;
173  }
174  }
175 };
176 
177 class InterruptFault : public MipsFault<InterruptFault>
178 {
179  public:
180  FaultVect
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 
189 template <typename T>
190 class 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
200  invoke(ThreadContext * tc, const StaticInstPtr &inst =
202  {
203  MipsFault<T>::invoke(tc, inst);
204  if (FullSystem)
206  }
207 };
208 
209 class 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 
224 template <typename T>
225 class 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
253  invoke(ThreadContext * tc, const StaticInstPtr &inst =
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 
273 class TlbRefillFault : public TlbFault<TlbRefillFault>
274 {
275  public:
278  {}
279 
280  FaultVect
282  {
283  StatusReg status = tc->readMiscReg(misc_reg::Status);
284  return status.exl ? 0x180 : 0x000;
285  }
286 };
287 
288 class TlbInvalidFault : public TlbFault<TlbInvalidFault>
289 {
290  public:
293  {}
294 };
295 
296 class TlbModifiedFault : public TlbFault<TlbModifiedFault>
297 {
298  public:
301  {}
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:186
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< 5, 0 > status
Definition: misc_types.hh:429
Addr FaultVect
Definition: faults.hh:47
Bitfield< 6, 2 > excCode
@ ExcCodeWatch
Definition: faults.hh:70
@ ExcCodeDummy
Definition: faults.hh:52
@ ExcCodeThread
Definition: faults.hh:72
@ ExcCodeMCheck
Definition: faults.hh:71
@ ExcCodeCacheErr
Definition: faults.hh:73
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
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:53
const StaticInstPtr nullStaticInstPtr
Statically allocated null StaticInstPtr.

Generated on Wed Dec 21 2022 10:22:24 for gem5 by doxygen 1.9.1