faults.hh (12848:67652b15de3b) | faults.hh (12849:7f43ad13ebf0) |
---|---|
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 --- 115 unchanged lines hidden (view full) --- 124 const FaultName _name; 125 bool _interrupt; 126 const ExceptionCode _code; 127 128 RiscvFault(FaultName n, bool i, ExceptionCode c) 129 : _name(n), _interrupt(i), _code(c) 130 {} 131 | 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 --- 115 unchanged lines hidden (view full) --- 124 const FaultName _name; 125 bool _interrupt; 126 const ExceptionCode _code; 127 128 RiscvFault(FaultName n, bool i, ExceptionCode c) 129 : _name(n), _interrupt(i), _code(c) 130 {} 131 |
132 FaultName name() const { return _name; } | 132 FaultName name() const override { return _name; } |
133 bool isInterrupt() const { return _interrupt; } 134 ExceptionCode exception() const { return _code; } | 133 bool isInterrupt() const { return _interrupt; } 134 ExceptionCode exception() const { return _code; } |
135 virtual MiscReg trap_value() const { return 0; } |
|
135 136 virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst); 137 void invoke(ThreadContext *tc, const StaticInstPtr &inst) override; 138}; 139 140class Reset : public FaultBase 141{ 142 --- 11 unchanged lines hidden (view full) --- 154 void 155 invoke(ThreadContext *tc, const StaticInstPtr &inst = 156 StaticInst::nullStaticInstPtr) override; 157 158 private: 159 const FaultName _name; 160}; 161 | 136 137 virtual void invokeSE(ThreadContext *tc, const StaticInstPtr &inst); 138 void invoke(ThreadContext *tc, const StaticInstPtr &inst) override; 139}; 140 141class Reset : public FaultBase 142{ 143 --- 11 unchanged lines hidden (view full) --- 155 void 156 invoke(ThreadContext *tc, const StaticInstPtr &inst = 157 StaticInst::nullStaticInstPtr) override; 158 159 private: 160 const FaultName _name; 161}; 162 |
162class UnknownInstFault : public RiscvFault | 163class InstFault : public RiscvFault |
163{ | 164{ |
165 protected: 166 const ExtMachInst _inst; 167 |
|
164 public: | 168 public: |
165 UnknownInstFault() : RiscvFault("Unknown instruction", false, INST_ILLEGAL) | 169 InstFault(FaultName n, const ExtMachInst inst) 170 : RiscvFault(n, false, INST_ILLEGAL), _inst(inst) |
166 {} 167 | 171 {} 172 |
173 MiscReg trap_value() const override { return _inst; } 174}; 175 176class UnknownInstFault : public InstFault 177{ 178 public: 179 UnknownInstFault(const ExtMachInst inst) 180 : InstFault("Unknown instruction", inst) 181 {} 182 |
|
168 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 169}; 170 | 183 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 184}; 185 |
171class IllegalInstFault : public RiscvFault | 186class IllegalInstFault : public InstFault |
172{ 173 private: 174 const std::string reason; 175 176 public: | 187{ 188 private: 189 const std::string reason; 190 191 public: |
177 IllegalInstFault(std::string r) 178 : RiscvFault("Illegal instruction", false, INST_ILLEGAL) | 192 IllegalInstFault(std::string r, const ExtMachInst inst) 193 : InstFault("Illegal instruction", inst) |
179 {} 180 181 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 182}; 183 | 194 {} 195 196 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 197}; 198 |
184class UnimplementedFault : public RiscvFault | 199class UnimplementedFault : public InstFault |
185{ 186 private: 187 const std::string instName; 188 189 public: | 200{ 201 private: 202 const std::string instName; 203 204 public: |
190 UnimplementedFault(std::string name) 191 : RiscvFault("Unimplemented instruction", false, INST_ILLEGAL), | 205 UnimplementedFault(std::string name, const ExtMachInst inst) 206 : InstFault("Unimplemented instruction", inst), |
192 instName(name) 193 {} 194 195 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 196}; 197 | 207 instName(name) 208 {} 209 210 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 211}; 212 |
198class IllegalFrmFault: public RiscvFault | 213class IllegalFrmFault: public InstFault |
199{ 200 private: 201 const uint8_t frm; 202 203 public: | 214{ 215 private: 216 const uint8_t frm; 217 218 public: |
204 IllegalFrmFault(uint8_t r) 205 : RiscvFault("Illegal floating-point rounding mode", false, 206 INST_ILLEGAL), | 219 IllegalFrmFault(uint8_t r, const ExtMachInst inst) 220 : InstFault("Illegal floating-point rounding mode", inst), |
207 frm(r) 208 {} 209 210 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 211}; 212 | 221 frm(r) 222 {} 223 224 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 225}; 226 |
227class AddressFault : public RiscvFault 228{ 229 private: 230 const Addr _addr; 231 232 public: 233 AddressFault(const Addr addr, ExceptionCode code) 234 : RiscvFault("Address", false, code), _addr(addr) 235 {} 236 237 MiscReg trap_value() const override { return _addr; } 238}; 239 |
|
213class BreakpointFault : public RiscvFault 214{ | 240class BreakpointFault : public RiscvFault 241{ |
242 private: 243 const PCState pcState; 244 |
|
215 public: | 245 public: |
216 BreakpointFault() : RiscvFault("Breakpoint", false, BREAKPOINT) {} | 246 BreakpointFault(const PCState &pc) 247 : RiscvFault("Breakpoint", false, BREAKPOINT), pcState(pc) 248 {} 249 250 MiscReg trap_value() const override { return pcState.pc(); } |
217 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 218}; 219 220class SyscallFault : public RiscvFault 221{ 222 public: 223 // TODO: replace ECALL_USER with the appropriate privilege level of the 224 // caller 225 SyscallFault() : RiscvFault("System call", false, ECALL_USER) {} 226 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 227}; 228 229} // namespace RiscvISA 230 231#endif // __ARCH_RISCV_FAULTS_HH__ | 251 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 252}; 253 254class SyscallFault : public RiscvFault 255{ 256 public: 257 // TODO: replace ECALL_USER with the appropriate privilege level of the 258 // caller 259 SyscallFault() : RiscvFault("System call", false, ECALL_USER) {} 260 void invokeSE(ThreadContext *tc, const StaticInstPtr &inst) override; 261}; 262 263} // namespace RiscvISA 264 265#endif // __ARCH_RISCV_FAULTS_HH__ |