gem5  v20.1.0.0
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 
31 #ifndef __ARCH_RISCV_FAULTS_HH__
32 #define __ARCH_RISCV_FAULTS_HH__
33 
34 #include <string>
35 
36 #include "arch/riscv/isa.hh"
37 #include "arch/riscv/registers.hh"
38 #include "cpu/thread_context.hh"
39 #include "sim/faults.hh"
40 
41 namespace RiscvISA
42 {
43 
44 enum FloatException : uint64_t {
45  FloatInexact = 0x1,
48  FloatDivZero = 0x8,
49  FloatInvalid = 0x10
50 };
51 
52 /*
53  * In RISC-V, exception and interrupt codes share some values. They can be
54  * differentiated by an 'Interrupt' flag that is enabled for interrupt faults
55  * but not exceptions. The full fault cause can be computed by placing the
56  * exception (or interrupt) code in the least significant bits of the CAUSE
57  * CSR and then setting the highest bit of CAUSE with the 'Interrupt' flag.
58  * For more details on exception causes, see Chapter 3.1.20 of the RISC-V
59  * privileged specification v 1.10. Codes are enumerated in Table 3.6.
60  */
61 enum ExceptionCode : uint64_t {
75  INST_PAGE = 12,
76  LOAD_PAGE = 13,
77  STORE_PAGE = 15,
78  AMO_PAGE = 15,
79 
90 };
91 
92 class RiscvFault : public FaultBase
93 {
94  protected:
96  const bool _interrupt;
98 
100  : _name(n), _interrupt(i), _code(c)
101  {}
102 
103  FaultName name() const override { return _name; }
104  bool isInterrupt() const { return _interrupt; }
105  ExceptionCode exception() const { return _code; }
106  virtual RegVal trap_value() const { return 0; }
107 
108  virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst);
109  void invoke(ThreadContext *tc, const StaticInstPtr &inst) override;
110 };
111 
112 class Reset : public FaultBase
113 {
114  private:
116 
117  public:
118  Reset() : _name("reset") {}
119  FaultName name() const override { return _name; }
120 
121  void invoke(ThreadContext *tc, const StaticInstPtr &inst =
123 };
124 
126 {
127  public:
128  InterruptFault(ExceptionCode c) : RiscvFault("interrupt", true, c) {}
129  InterruptFault(int c) : InterruptFault(static_cast<ExceptionCode>(c)) {}
130 };
131 
132 class InstFault : public RiscvFault
133 {
134  protected:
136 
137  public:
139  : RiscvFault(n, false, INST_ILLEGAL), _inst(inst)
140  {}
141 
142  RegVal trap_value() const override { return _inst; }
143 };
144 
146 {
147  public:
149  : InstFault("Unknown instruction", inst)
150  {}
151 
152  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
153 };
154 
156 {
157  private:
158  const std::string reason;
159 
160  public:
161  IllegalInstFault(std::string r, const ExtMachInst inst)
162  : InstFault("Illegal instruction", inst)
163  {}
164 
165  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
166 };
167 
169 {
170  private:
171  const std::string instName;
172 
173  public:
174  UnimplementedFault(std::string name, const ExtMachInst inst)
175  : InstFault("Unimplemented instruction", inst),
176  instName(name)
177  {}
178 
179  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
180 };
181 
183 {
184  private:
185  const uint8_t frm;
186 
187  public:
188  IllegalFrmFault(uint8_t r, const ExtMachInst inst)
189  : InstFault("Illegal floating-point rounding mode", inst),
190  frm(r)
191  {}
192 
193  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
194 };
195 
196 class AddressFault : public RiscvFault
197 {
198  private:
199  const Addr _addr;
200 
201  public:
203  : RiscvFault("Address", false, code), _addr(addr)
204  {}
205 
206  RegVal trap_value() const override { return _addr; }
207 };
208 
210 {
211  private:
213 
214  public:
216  : RiscvFault("Breakpoint", false, BREAKPOINT), pcState(pc)
217  {}
218 
219  RegVal trap_value() const override { return pcState.pc(); }
220  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
221 };
222 
223 class SyscallFault : public RiscvFault
224 {
225  public:
227  : RiscvFault("System call", false, ECALL_USER)
228  {
229  switch (prv) {
230  case PRV_U:
231  _code = ECALL_USER;
232  break;
233  case PRV_S:
234  _code = ECALL_SUPER;
235  break;
236  case PRV_M:
238  break;
239  default:
240  panic("Unknown privilege mode %d.", prv);
241  break;
242  }
243  }
244 
245  void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override;
246 };
247 
248 } // namespace RiscvISA
249 
250 #endif // __ARCH_RISCV_FAULTS_HH__
RiscvISA::InterruptFault::InterruptFault
InterruptFault(ExceptionCode c)
Definition: faults.hh:128
RiscvISA::InstFault::InstFault
InstFault(FaultName n, const ExtMachInst inst)
Definition: faults.hh:138
RiscvISA::FloatOverflow
@ FloatOverflow
Definition: faults.hh:47
RiscvISA::Reset::Reset
Reset()
Definition: faults.hh:118
RiscvISA::IllegalInstFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:167
RiscvISA::BreakpointFault::BreakpointFault
BreakpointFault(const PCState &pc)
Definition: faults.hh:215
RiscvISA::SyscallFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:195
RiscvISA::PCState
Definition: types.hh:53
RiscvISA::FloatException
FloatException
Definition: faults.hh:44
RiscvISA::STORE_PAGE
@ STORE_PAGE
Definition: faults.hh:77
RiscvISA::Reset::invoke
void invoke(ThreadContext *tc, const StaticInstPtr &inst=StaticInst::nullStaticInstPtr) override
Definition: faults.cc:144
RiscvISA::INT_TIMER_USER
@ INT_TIMER_USER
Definition: faults.hh:83
RiscvISA::INT_SOFTWARE_USER
@ INT_SOFTWARE_USER
Definition: faults.hh:80
RiscvISA::AddressFault::AddressFault
AddressFault(const Addr addr, ExceptionCode code)
Definition: faults.hh:202
RiscvISA::c
Bitfield< 5, 3 > c
Definition: pra_constants.hh:56
RiscvISA::INT_EXT_MACHINE
@ INT_EXT_MACHINE
Definition: faults.hh:88
RiscvISA::FloatInexact
@ FloatInexact
Definition: faults.hh:45
RiscvISA::BreakpointFault
Definition: faults.hh:209
RiscvISA::IllegalInstFault::IllegalInstFault
IllegalInstFault(std::string r, const ExtMachInst inst)
Definition: faults.hh:161
RiscvISA::UnknownInstFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:160
RiscvISA::SyscallFault
Definition: faults.hh:223
RiscvISA::pc
Bitfield< 4 > pc
Definition: pra_constants.hh:240
RiscvISA::IllegalFrmFault::frm
const uint8_t frm
Definition: faults.hh:185
RiscvISA::BreakpointFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:189
RiscvISA::AddressFault
Definition: faults.hh:196
RiscvISA::UnimplementedFault::instName
const std::string instName
Definition: faults.hh:171
RiscvISA::AMO_ADDR_MISALIGNED
@ AMO_ADDR_MISALIGNED
Definition: faults.hh:69
RiscvISA::PRV_S
@ PRV_S
Definition: isa.hh:59
RiscvISA::INST_ILLEGAL
@ INST_ILLEGAL
Definition: faults.hh:64
RiscvISA::RiscvFault::invokeSE
virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst)
Definition: faults.cc:48
RiscvISA::IllegalFrmFault
Definition: faults.hh:182
RiscvISA::IllegalFrmFault::IllegalFrmFault
IllegalFrmFault(uint8_t r, const ExtMachInst inst)
Definition: faults.hh:188
RiscvISA::INT_TIMER_MACHINE
@ INT_TIMER_MACHINE
Definition: faults.hh:85
RiscvISA::RiscvFault::_code
ExceptionCode _code
Definition: faults.hh:97
RiscvISA::RiscvFault::name
FaultName name() const override
Definition: faults.hh:103
RiscvISA::LOAD_ACCESS
@ LOAD_ACCESS
Definition: faults.hh:67
RiscvISA::NumInterruptTypes
@ NumInterruptTypes
Definition: faults.hh:89
RiscvISA::LOAD_PAGE
@ LOAD_PAGE
Definition: faults.hh:76
faults.hh
RiscvISA::BreakpointFault::pcState
const PCState pcState
Definition: faults.hh:212
isa.hh
RiscvISA
Definition: fs_workload.cc:36
RiscvISA::INT_TIMER_SUPER
@ INT_TIMER_SUPER
Definition: faults.hh:84
RiscvISA::IllegalInstFault
Definition: faults.hh:155
RiscvISA::UnimplementedFault
Definition: faults.hh:168
RiscvISA::Reset::name
FaultName name() const override
Definition: faults.hh:119
ArmISA::n
Bitfield< 31 > n
Definition: miscregs_types.hh:450
RiscvISA::RiscvFault::RiscvFault
RiscvFault(FaultName n, bool i, ExceptionCode c)
Definition: faults.hh:99
RiscvISA::UnknownInstFault
Definition: faults.hh:145
RiscvISA::INT_EXT_USER
@ INT_EXT_USER
Definition: faults.hh:86
ThreadContext
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Definition: thread_context.hh:88
RiscvISA::INT_SOFTWARE_MACHINE
@ INT_SOFTWARE_MACHINE
Definition: faults.hh:82
RiscvISA::AddressFault::_addr
const Addr _addr
Definition: faults.hh:199
RiscvISA::IllegalFrmFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:182
FaultName
const typedef char * FaultName
Definition: faults.hh:49
RiscvISA::STORE_ACCESS
@ STORE_ACCESS
Definition: faults.hh:70
RiscvISA::INST_ACCESS
@ INST_ACCESS
Definition: faults.hh:63
RiscvISA::LOAD_ADDR_MISALIGNED
@ LOAD_ADDR_MISALIGNED
Definition: faults.hh:66
RiscvISA::PrivilegeMode
PrivilegeMode
Definition: isa.hh:56
RiscvISA::PRV_U
@ PRV_U
Definition: isa.hh:58
RiscvISA::RiscvFault::_interrupt
const bool _interrupt
Definition: faults.hh:96
RiscvISA::UnimplementedFault::UnimplementedFault
UnimplementedFault(std::string name, const ExtMachInst inst)
Definition: faults.hh:174
RiscvISA::INT_SOFTWARE_SUPER
@ INT_SOFTWARE_SUPER
Definition: faults.hh:81
RiscvISA::FloatDivZero
@ FloatDivZero
Definition: faults.hh:48
RiscvISA::ECALL_SUPER
@ ECALL_SUPER
Definition: faults.hh:73
RiscvISA::RiscvFault::exception
ExceptionCode exception() const
Definition: faults.hh:105
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
RiscvISA::ExtMachInst
uint64_t ExtMachInst
Definition: types.hh:51
StaticInst::nullStaticInstPtr
static StaticInstPtr nullStaticInstPtr
Pointer to a statically allocated "null" instruction object.
Definition: static_inst.hh:237
RiscvISA::InstFault
Definition: faults.hh:132
registers.hh
RiscvISA::IllegalInstFault::reason
const std::string reason
Definition: faults.hh:158
RiscvISA::FloatInvalid
@ FloatInvalid
Definition: faults.hh:49
RiscvISA::i
Bitfield< 2 > i
Definition: pra_constants.hh:276
RiscvISA::RiscvFault::_name
const FaultName _name
Definition: faults.hh:95
RiscvISA::RiscvFault::invoke
void invoke(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:54
RiscvISA::AMO_PAGE
@ AMO_PAGE
Definition: faults.hh:78
RiscvISA::ECALL_MACHINE
@ ECALL_MACHINE
Definition: faults.hh:74
RiscvISA::AMO_ACCESS
@ AMO_ACCESS
Definition: faults.hh:71
RiscvISA::RiscvFault::trap_value
virtual RegVal trap_value() const
Definition: faults.hh:106
RiscvISA::Reset
Definition: faults.hh:112
RiscvISA::InterruptFault::InterruptFault
InterruptFault(int c)
Definition: faults.hh:129
RiscvISA::INST_PAGE
@ INST_PAGE
Definition: faults.hh:75
RiscvISA::InstFault::trap_value
RegVal trap_value() const override
Definition: faults.hh:142
addr
ip6_addr_t addr
Definition: inet.hh:423
RiscvISA::InstFault::_inst
const ExtMachInst _inst
Definition: faults.hh:135
RiscvISA::r
Bitfield< 1 > r
Definition: pagetable.hh:71
RiscvISA::STORE_ADDR_MISALIGNED
@ STORE_ADDR_MISALIGNED
Definition: faults.hh:68
RiscvISA::InterruptFault
Definition: faults.hh:125
RiscvISA::BreakpointFault::trap_value
RegVal trap_value() const override
Definition: faults.hh:219
GenericISA::SimplePCState::pc
Addr pc() const
Definition: types.hh:158
RiscvISA::ExceptionCode
ExceptionCode
Definition: faults.hh:61
RiscvISA::AddressFault::trap_value
RegVal trap_value() const override
Definition: faults.hh:206
RefCountingPtr< StaticInst >
RiscvISA::RiscvFault
Definition: faults.hh:92
RiscvISA::ECALL_USER
@ ECALL_USER
Definition: faults.hh:72
RiscvISA::PRV_M
@ PRV_M
Definition: isa.hh:60
RiscvISA::INST_ADDR_MISALIGNED
@ INST_ADDR_MISALIGNED
Definition: faults.hh:62
FaultBase
Definition: faults.hh:54
RiscvISA::SyscallFault::SyscallFault
SyscallFault(PrivilegeMode prv)
Definition: faults.hh:226
RiscvISA::UnknownInstFault::UnknownInstFault
UnknownInstFault(const ExtMachInst inst)
Definition: faults.hh:148
thread_context.hh
RiscvISA::INT_EXT_SUPER
@ INT_EXT_SUPER
Definition: faults.hh:87
RiscvISA::BREAKPOINT
@ BREAKPOINT
Definition: faults.hh:65
RiscvISA::Reset::_name
const FaultName _name
Definition: faults.hh:115
RegVal
uint64_t RegVal
Definition: types.hh:168
RiscvISA::UnimplementedFault::invokeSE
void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override
Definition: faults.cc:174
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
RiscvISA::RiscvFault::isInterrupt
bool isInterrupt() const
Definition: faults.hh:104
RiscvISA::FloatUnderflow
@ FloatUnderflow
Definition: faults.hh:46

Generated on Wed Sep 30 2020 14:01:59 for gem5 by doxygen 1.8.17