gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
faults.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 RISC-V Foundation
3  * Copyright (c) 2016 The University of Virginia
4  * Copyright (c) 2018 TU Dresden
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are
9  * met: redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer;
11  * redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution;
14  * neither the name of the copyright holders nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  * Authors: Alec Roelke
31  * Robert Scheffel
32  */
33 
34 #ifndef __ARCH_RISCV_FAULTS_HH__
35 #define __ARCH_RISCV_FAULTS_HH__
36 
37 #include <string>
38 
39 #include "arch/riscv/isa.hh"
40 #include "arch/riscv/registers.hh"
41 #include "cpu/thread_context.hh"
42 #include "sim/faults.hh"
43 
44 namespace RiscvISA
45 {
46 
47 enum FloatException : uint64_t {
48  FloatInexact = 0x1,
51  FloatDivZero = 0x8,
52  FloatInvalid = 0x10
53 };
54 
55 /*
56  * In RISC-V, exception and interrupt codes share some values. They can be
57  * differentiated by an 'Interrupt' flag that is enabled for interrupt faults
58  * but not exceptions. The full fault cause can be computed by placing the
59  * exception (or interrupt) code in the least significant bits of the CAUSE
60  * CSR and then setting the highest bit of CAUSE with the 'Interrupt' flag.
61  * For more details on exception causes, see Chapter 3.1.20 of the RISC-V
62  * privileged specification v 1.10. Codes are enumerated in Table 3.6.
63  */
64 enum ExceptionCode : uint64_t {
78  INST_PAGE = 12,
79  LOAD_PAGE = 13,
80  STORE_PAGE = 15,
81  AMO_PAGE = 15,
82 
93 };
94 
95 class RiscvFault : public FaultBase
96 {
97  protected:
99  const bool _interrupt;
101 
103  : _name(n), _interrupt(i), _code(c)
104  {}
105 
106  FaultName name() const override { return _name; }
107  bool isInterrupt() const { return _interrupt; }
108  ExceptionCode exception() const { return _code; }
109  virtual RegVal trap_value() const { return 0; }
110 
111  virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst);
112  void invoke(ThreadContext *tc, const StaticInstPtr &inst) override;
113 };
114 
115 class Reset : public FaultBase
116 {
117  private:
119 
120  public:
121  Reset() : _name("reset") {}
122  FaultName name() const override { return _name; }
123 
124  void invoke(ThreadContext *tc, const StaticInstPtr &inst =
126 };
127 
129 {
130  public:
131  InterruptFault(ExceptionCode c) : RiscvFault("interrupt", true, c) {}
132  InterruptFault(int c) : InterruptFault(static_cast<ExceptionCode>(c)) {}
133 };
134 
135 class InstFault : public RiscvFault
136 {
137  protected:
139 
140  public:
142  : RiscvFault(n, false, INST_ILLEGAL), _inst(inst)
143  {}
144 
145  RegVal trap_value() const override { return _inst; }
146 };
147 
149 {
150  public:
152  : InstFault("Unknown instruction", inst)
153  {}
154 
155  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
156 };
157 
159 {
160  private:
161  const std::string reason;
162 
163  public:
164  IllegalInstFault(std::string r, const ExtMachInst inst)
165  : InstFault("Illegal instruction", inst)
166  {}
167 
168  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
169 };
170 
172 {
173  private:
174  const std::string instName;
175 
176  public:
177  UnimplementedFault(std::string name, const ExtMachInst inst)
178  : InstFault("Unimplemented instruction", inst),
179  instName(name)
180  {}
181 
182  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
183 };
184 
186 {
187  private:
188  const uint8_t frm;
189 
190  public:
191  IllegalFrmFault(uint8_t r, const ExtMachInst inst)
192  : InstFault("Illegal floating-point rounding mode", inst),
193  frm(r)
194  {}
195 
196  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
197 };
198 
199 class AddressFault : public RiscvFault
200 {
201  private:
202  const Addr _addr;
203 
204  public:
206  : RiscvFault("Address", false, code), _addr(addr)
207  {}
208 
209  RegVal trap_value() const override { return _addr; }
210 };
211 
213 {
214  private:
216 
217  public:
219  : RiscvFault("Breakpoint", false, BREAKPOINT), pcState(pc)
220  {}
221 
222  RegVal trap_value() const override { return pcState.pc(); }
223  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
224 };
225 
226 class SyscallFault : public RiscvFault
227 {
228  public:
230  : RiscvFault("System call", false, ECALL_USER)
231  {
232  switch (prv) {
233  case PRV_U:
234  _code = ECALL_USER;
235  break;
236  case PRV_S:
237  _code = ECALL_SUPER;
238  break;
239  case PRV_M:
241  break;
242  default:
243  panic("Unknown privilege mode %d.", prv);
244  break;
245  }
246  }
247 
248  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
249 };
250 
251 } // namespace RiscvISA
252 
253 #endif // __ARCH_RISCV_FAULTS_HH__
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:167
UnimplementedFault(std::string name, const ExtMachInst inst)
Definition: faults.hh:177
void invoke(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:54
ExceptionCode _code
Definition: faults.hh:100
ip6_addr_t addr
Definition: inet.hh:335
IllegalFrmFault(uint8_t r, const ExtMachInst inst)
Definition: faults.hh:191
const std::string reason
Definition: faults.hh:161
ExceptionCode
Definition: faults.hh:64
uint64_t RegVal
Definition: types.hh:168
InstFault(FaultName n, const ExtMachInst inst)
Definition: faults.hh:141
uint64_t ExtMachInst
Definition: types.hh:55
virtual RegVal trap_value() const
Definition: faults.hh:109
ThreadContext is the external interface to all thread state for anything outside of the CPU...
RegVal trap_value() const override
Definition: faults.hh:209
FaultName name() const override
Definition: faults.hh:122
Bitfield< 31 > n
InterruptFault(ExceptionCode c)
Definition: faults.hh:131
virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst)
Definition: faults.cc:48
const std::string instName
Definition: faults.hh:174
Bitfield< 4 > pc
RegVal trap_value() const override
Definition: faults.hh:222
const PCState pcState
Definition: faults.hh:215
const Addr _addr
Definition: faults.hh:202
const char * FaultName
Definition: faults.hh:39
Bitfield< 2 > i
const uint8_t frm
Definition: faults.hh:188
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
PrivilegeMode
Definition: isa.hh:60
const ExtMachInst _inst
Definition: faults.hh:138
bool isInterrupt() const
Definition: faults.hh:107
RiscvFault(FaultName n, bool i, ExceptionCode c)
Definition: faults.hh:102
IllegalInstFault(std::string r, const ExtMachInst inst)
Definition: faults.hh:164
UnknownInstFault(const ExtMachInst inst)
Definition: faults.hh:151
SyscallFault(PrivilegeMode prv)
Definition: faults.hh:229
BreakpointFault(const PCState &pc)
Definition: faults.hh:218
FaultName name() const override
Definition: faults.hh:106
AddressFault(const Addr addr, ExceptionCode code)
Definition: faults.hh:205
static StaticInstPtr nullStaticInstPtr
Pointer to a statically allocated "null" instruction object.
Definition: static_inst.hh:223
ExceptionCode exception() const
Definition: faults.hh:108
FloatException
Definition: faults.hh:47
Bitfield< 5, 3 > c
RegVal trap_value() const override
Definition: faults.hh:145
const bool _interrupt
Definition: faults.hh:99
const FaultName _name
Definition: faults.hh:98
const FaultName _name
Definition: faults.hh:118

Generated on Fri Feb 28 2020 16:26:55 for gem5 by doxygen 1.8.13