faults.hh revision 4695
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Gabe Black 29 * Kevin Lim 30 */ 31 32#ifndef __ALPHA_FAULTS_HH__ 33#define __ALPHA_FAULTS_HH__ 34 35#include "config/full_system.hh" 36#include "sim/faults.hh" 37 38#if FULL_SYSTEM 39#include "arch/alpha/pagetable.hh" 40#endif 41 42// The design of the "name" and "vect" functions is in sim/faults.hh 43 44namespace AlphaISA 45{ 46 47typedef const Addr FaultVect; 48 49class AlphaFault : public FaultBase 50{ 51 protected: 52 virtual bool skipFaultingInstruction() {return false;} 53 virtual bool setRestartAddress() {return true;} 54 public: 55#if FULL_SYSTEM 56 void invoke(ThreadContext * tc); 57#endif 58 virtual FaultVect vect() = 0; 59 virtual FaultStat & countStat() = 0; 60}; 61 62class MachineCheckFault : public AlphaFault 63{ 64 private: 65 static FaultName _name; 66 static FaultVect _vect; 67 static FaultStat _count; 68 public: 69 FaultName name() const {return _name;} 70 FaultVect vect() {return _vect;} 71 FaultStat & countStat() {return _count;} 72 bool isMachineCheckFault() const {return true;} 73}; 74 75class AlignmentFault : public AlphaFault 76{ 77 private: 78 static FaultName _name; 79 static FaultVect _vect; 80 static FaultStat _count; 81 public: 82 FaultName name() const {return _name;} 83 FaultVect vect() {return _vect;} 84 FaultStat & countStat() {return _count;} 85 bool isAlignmentFault() const {return true;} 86}; 87 88static inline Fault genMachineCheckFault() 89{ 90 return new MachineCheckFault; 91} 92 93static inline Fault genAlignmentFault() 94{ 95 return new AlignmentFault; 96} 97 98class ResetFault : public AlphaFault 99{ 100 private: 101 static FaultName _name; 102 static FaultVect _vect; 103 static FaultStat _count; 104 public: 105 FaultName name() const {return _name;} 106 FaultVect vect() {return _vect;} 107 FaultStat & countStat() {return _count;} 108}; 109 110class ArithmeticFault : public AlphaFault 111{ 112 protected: 113 bool skipFaultingInstruction() {return true;} 114 private: 115 static FaultName _name; 116 static FaultVect _vect; 117 static FaultStat _count; 118 public: 119 FaultName name() const {return _name;} 120 FaultVect vect() {return _vect;} 121 FaultStat & countStat() {return _count;} 122#if FULL_SYSTEM 123 void invoke(ThreadContext * tc); 124#endif 125}; 126 127class InterruptFault : public AlphaFault 128{ 129 protected: 130 bool setRestartAddress() {return false;} 131 private: 132 static FaultName _name; 133 static FaultVect _vect; 134 static FaultStat _count; 135 public: 136 FaultName name() const {return _name;} 137 FaultVect vect() {return _vect;} 138 FaultStat & countStat() {return _count;} 139}; 140 141class DtbFault : public AlphaFault 142{ 143#if FULL_SYSTEM 144 private: 145 AlphaISA::VAddr vaddr; 146 uint32_t reqFlags; 147 uint64_t flags; 148 public: 149 DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 150 : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 151 { } 152#endif 153 FaultName name() const = 0; 154 FaultVect vect() = 0; 155 FaultStat & countStat() = 0; 156#if FULL_SYSTEM 157 void invoke(ThreadContext * tc); 158#endif 159}; 160 161class NDtbMissFault : public DtbFault 162{ 163 private: 164 static FaultName _name; 165 static FaultVect _vect; 166 static FaultStat _count; 167 public: 168#if FULL_SYSTEM 169 NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 170 : DtbFault(vaddr, reqFlags, flags) 171 { } 172#endif 173 FaultName name() const {return _name;} 174 FaultVect vect() {return _vect;} 175 FaultStat & countStat() {return _count;} 176}; 177 178class PDtbMissFault : public DtbFault 179{ 180 private: 181 static FaultName _name; 182 static FaultVect _vect; 183 static FaultStat _count; 184 public: 185#if FULL_SYSTEM 186 PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 187 : DtbFault(vaddr, reqFlags, flags) 188 { } 189#endif 190 FaultName name() const {return _name;} 191 FaultVect vect() {return _vect;} 192 FaultStat & countStat() {return _count;} 193}; 194 195class DtbPageFault : public DtbFault 196{ 197 private: 198 static FaultName _name; 199 static FaultVect _vect; 200 static FaultStat _count; 201 public: 202#if FULL_SYSTEM 203 DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 204 : DtbFault(vaddr, reqFlags, flags) 205 { } 206#endif 207 FaultName name() const {return _name;} 208 FaultVect vect() {return _vect;} 209 FaultStat & countStat() {return _count;} 210}; 211 212class DtbAcvFault : public DtbFault 213{ 214 private: 215 static FaultName _name; 216 static FaultVect _vect; 217 static FaultStat _count; 218 public: 219#if FULL_SYSTEM 220 DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 221 : DtbFault(vaddr, reqFlags, flags) 222 { } 223#endif 224 FaultName name() const {return _name;} 225 FaultVect vect() {return _vect;} 226 FaultStat & countStat() {return _count;} 227}; 228 229class DtbAlignmentFault : public DtbFault 230{ 231 private: 232 static FaultName _name; 233 static FaultVect _vect; 234 static FaultStat _count; 235 public: 236#if FULL_SYSTEM 237 DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 238 : DtbFault(vaddr, reqFlags, flags) 239 { } 240#endif 241 FaultName name() const {return _name;} 242 FaultVect vect() {return _vect;} 243 FaultStat & countStat() {return _count;} 244}; 245 246class ItbFault : public AlphaFault 247{ 248 private: 249 Addr pc; 250 public: 251 ItbFault(Addr _pc) 252 : pc(_pc) 253 { } 254 FaultName name() const = 0; 255 FaultVect vect() = 0; 256 FaultStat & countStat() = 0; 257#if FULL_SYSTEM 258 void invoke(ThreadContext * tc); 259#endif 260}; 261 262class ItbMissFault : public ItbFault 263{ 264 private: 265 static FaultName _name; 266 static FaultVect _vect; 267 static FaultStat _count; 268 public: 269 ItbMissFault(Addr pc) 270 : ItbFault(pc) 271 { } 272 FaultName name() const {return _name;} 273 FaultVect vect() {return _vect;} 274 FaultStat & countStat() {return _count;} 275}; 276 277class ItbPageFault : public ItbFault 278{ 279 private: 280 static FaultName _name; 281 static FaultVect _vect; 282 static FaultStat _count; 283 public: 284 ItbPageFault(Addr pc) 285 : ItbFault(pc) 286 { } 287 FaultName name() const {return _name;} 288 FaultVect vect() {return _vect;} 289 FaultStat & countStat() {return _count;} 290}; 291 292class ItbAcvFault : public ItbFault 293{ 294 private: 295 static FaultName _name; 296 static FaultVect _vect; 297 static FaultStat _count; 298 public: 299 ItbAcvFault(Addr pc) 300 : ItbFault(pc) 301 { } 302 FaultName name() const {return _name;} 303 FaultVect vect() {return _vect;} 304 FaultStat & countStat() {return _count;} 305}; 306 307class UnimplementedOpcodeFault : public AlphaFault 308{ 309 private: 310 static FaultName _name; 311 static FaultVect _vect; 312 static FaultStat _count; 313 public: 314 FaultName name() const {return _name;} 315 FaultVect vect() {return _vect;} 316 FaultStat & countStat() {return _count;} 317}; 318 319class FloatEnableFault : public AlphaFault 320{ 321 private: 322 static FaultName _name; 323 static FaultVect _vect; 324 static FaultStat _count; 325 public: 326 FaultName name() const {return _name;} 327 FaultVect vect() {return _vect;} 328 FaultStat & countStat() {return _count;} 329}; 330 331class PalFault : public AlphaFault 332{ 333 protected: 334 bool skipFaultingInstruction() {return true;} 335 private: 336 static FaultName _name; 337 static FaultVect _vect; 338 static FaultStat _count; 339 public: 340 FaultName name() const {return _name;} 341 FaultVect vect() {return _vect;} 342 FaultStat & countStat() {return _count;} 343}; 344 345class IntegerOverflowFault : public AlphaFault 346{ 347 private: 348 static FaultName _name; 349 static FaultVect _vect; 350 static FaultStat _count; 351 public: 352 FaultName name() const {return _name;} 353 FaultVect vect() {return _vect;} 354 FaultStat & countStat() {return _count;} 355}; 356 357} // AlphaISA namespace 358 359#endif // __FAULTS_HH__ 360