faults.hh revision 2665
113531Sjairo.balart@metempsy.com/* 213531Sjairo.balart@metempsy.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 313531Sjairo.balart@metempsy.com * All rights reserved. 413531Sjairo.balart@metempsy.com * 513531Sjairo.balart@metempsy.com * Redistribution and use in source and binary forms, with or without 613531Sjairo.balart@metempsy.com * modification, are permitted provided that the following conditions are 713531Sjairo.balart@metempsy.com * met: redistributions of source code must retain the above copyright 813531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer; 913531Sjairo.balart@metempsy.com * redistributions in binary form must reproduce the above copyright 1013531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer in the 1113531Sjairo.balart@metempsy.com * documentation and/or other materials provided with the distribution; 1213531Sjairo.balart@metempsy.com * neither the name of the copyright holders nor the names of its 1313531Sjairo.balart@metempsy.com * contributors may be used to endorse or promote products derived from 1413531Sjairo.balart@metempsy.com * this software without specific prior written permission. 1513531Sjairo.balart@metempsy.com * 1613531Sjairo.balart@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713531Sjairo.balart@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813531Sjairo.balart@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913531Sjairo.balart@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013531Sjairo.balart@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113531Sjairo.balart@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213531Sjairo.balart@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313531Sjairo.balart@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413531Sjairo.balart@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513531Sjairo.balart@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613531Sjairo.balart@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713531Sjairo.balart@metempsy.com * 2813531Sjairo.balart@metempsy.com * Authors: Gabe Black 2913531Sjairo.balart@metempsy.com * Kevin Lim 3013531Sjairo.balart@metempsy.com */ 3113531Sjairo.balart@metempsy.com 3213531Sjairo.balart@metempsy.com#ifndef __ALPHA_FAULTS_HH__ 3313531Sjairo.balart@metempsy.com#define __ALPHA_FAULTS_HH__ 3413531Sjairo.balart@metempsy.com 3513531Sjairo.balart@metempsy.com#include "arch/alpha/isa_traits.hh" 3613531Sjairo.balart@metempsy.com#include "sim/faults.hh" 3713531Sjairo.balart@metempsy.com 3813531Sjairo.balart@metempsy.com// The design of the "name" and "vect" functions is in sim/faults.hh 3913531Sjairo.balart@metempsy.com 4013531Sjairo.balart@metempsy.comnamespace AlphaISA 4113531Sjairo.balart@metempsy.com{ 4213531Sjairo.balart@metempsy.com 4313531Sjairo.balart@metempsy.comtypedef const Addr FaultVect; 4413531Sjairo.balart@metempsy.com 4513531Sjairo.balart@metempsy.comclass AlphaFault : public FaultBase 4613531Sjairo.balart@metempsy.com{ 4713531Sjairo.balart@metempsy.com protected: 4813531Sjairo.balart@metempsy.com virtual bool skipFaultingInstruction() {return false;} 4913531Sjairo.balart@metempsy.com virtual bool setRestartAddress() {return true;} 5013531Sjairo.balart@metempsy.com public: 5113531Sjairo.balart@metempsy.com#if FULL_SYSTEM 5213531Sjairo.balart@metempsy.com void invoke(ExecContext * xc); 5313531Sjairo.balart@metempsy.com#endif 5413531Sjairo.balart@metempsy.com virtual FaultVect vect() = 0; 5513531Sjairo.balart@metempsy.com virtual FaultStat & countStat() = 0; 5613531Sjairo.balart@metempsy.com}; 5713531Sjairo.balart@metempsy.com 5813531Sjairo.balart@metempsy.comclass MachineCheckFault : public AlphaFault 5913531Sjairo.balart@metempsy.com{ 6013531Sjairo.balart@metempsy.com private: 6113531Sjairo.balart@metempsy.com static FaultName _name; 6213531Sjairo.balart@metempsy.com static FaultVect _vect; 6313531Sjairo.balart@metempsy.com static FaultStat _count; 6413531Sjairo.balart@metempsy.com public: 6513531Sjairo.balart@metempsy.com FaultName name() {return _name;} 6613531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 6713531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 6813531Sjairo.balart@metempsy.com bool isMachineCheckFault() {return true;} 6913531Sjairo.balart@metempsy.com}; 7013531Sjairo.balart@metempsy.com 7113531Sjairo.balart@metempsy.comclass AlignmentFault : public AlphaFault 7213531Sjairo.balart@metempsy.com{ 7313531Sjairo.balart@metempsy.com private: 7413531Sjairo.balart@metempsy.com static FaultName _name; 7513531Sjairo.balart@metempsy.com static FaultVect _vect; 7613531Sjairo.balart@metempsy.com static FaultStat _count; 7713531Sjairo.balart@metempsy.com public: 7813531Sjairo.balart@metempsy.com FaultName name() {return _name;} 7913531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 8013531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 8113531Sjairo.balart@metempsy.com bool isAlignmentFault() {return true;} 8213531Sjairo.balart@metempsy.com}; 8313531Sjairo.balart@metempsy.com 8413531Sjairo.balart@metempsy.comstatic inline Fault genMachineCheckFault() 8513531Sjairo.balart@metempsy.com{ 8613531Sjairo.balart@metempsy.com return new MachineCheckFault; 8713531Sjairo.balart@metempsy.com} 8813531Sjairo.balart@metempsy.com 8913531Sjairo.balart@metempsy.comstatic inline Fault genAlignmentFault() 9013531Sjairo.balart@metempsy.com{ 9113531Sjairo.balart@metempsy.com return new AlignmentFault; 9213531Sjairo.balart@metempsy.com} 9313531Sjairo.balart@metempsy.com 9413531Sjairo.balart@metempsy.comclass ResetFault : public AlphaFault 9513531Sjairo.balart@metempsy.com{ 9613531Sjairo.balart@metempsy.com private: 9713531Sjairo.balart@metempsy.com static FaultName _name; 9813531Sjairo.balart@metempsy.com static FaultVect _vect; 9913531Sjairo.balart@metempsy.com static FaultStat _count; 10013531Sjairo.balart@metempsy.com public: 10113531Sjairo.balart@metempsy.com FaultName name() {return _name;} 10213531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 10313531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 10413531Sjairo.balart@metempsy.com}; 10513531Sjairo.balart@metempsy.com 10613531Sjairo.balart@metempsy.comclass ArithmeticFault : public AlphaFault 10713531Sjairo.balart@metempsy.com{ 10813531Sjairo.balart@metempsy.com protected: 10913756Sjairo.balart@metempsy.com bool skipFaultingInstruction() {return true;} 11013756Sjairo.balart@metempsy.com private: 11113756Sjairo.balart@metempsy.com static FaultName _name; 11213756Sjairo.balart@metempsy.com static FaultVect _vect; 11313756Sjairo.balart@metempsy.com static FaultStat _count; 11413756Sjairo.balart@metempsy.com public: 11513756Sjairo.balart@metempsy.com FaultName name() {return _name;} 11613531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 11713531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 11813756Sjairo.balart@metempsy.com#if FULL_SYSTEM 11913756Sjairo.balart@metempsy.com void invoke(ExecContext * xc); 12013531Sjairo.balart@metempsy.com#endif 12113756Sjairo.balart@metempsy.com}; 12213756Sjairo.balart@metempsy.com 12313756Sjairo.balart@metempsy.comclass InterruptFault : public AlphaFault 12413531Sjairo.balart@metempsy.com{ 12513531Sjairo.balart@metempsy.com protected: 12613531Sjairo.balart@metempsy.com bool setRestartAddress() {return false;} 12713531Sjairo.balart@metempsy.com private: 12813531Sjairo.balart@metempsy.com static FaultName _name; 12913531Sjairo.balart@metempsy.com static FaultVect _vect; 13013531Sjairo.balart@metempsy.com static FaultStat _count; 13113531Sjairo.balart@metempsy.com public: 13213531Sjairo.balart@metempsy.com FaultName name() {return _name;} 13313531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 13413531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 13513531Sjairo.balart@metempsy.com}; 13613531Sjairo.balart@metempsy.com 13713531Sjairo.balart@metempsy.comclass DtbFault : public AlphaFault 13813531Sjairo.balart@metempsy.com{ 13913531Sjairo.balart@metempsy.com#if FULL_SYSTEM 14013531Sjairo.balart@metempsy.com private: 14113531Sjairo.balart@metempsy.com AlphaISA::VAddr vaddr; 14213531Sjairo.balart@metempsy.com uint32_t reqFlags; 14313531Sjairo.balart@metempsy.com uint64_t flags; 14413756Sjairo.balart@metempsy.com public: 14513531Sjairo.balart@metempsy.com DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 14613756Sjairo.balart@metempsy.com : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 14713756Sjairo.balart@metempsy.com { } 14813756Sjairo.balart@metempsy.com#endif 14913756Sjairo.balart@metempsy.com FaultName name() = 0; 15013531Sjairo.balart@metempsy.com FaultVect vect() = 0; 15113756Sjairo.balart@metempsy.com FaultStat & countStat() = 0; 15213756Sjairo.balart@metempsy.com#if FULL_SYSTEM 15313531Sjairo.balart@metempsy.com void invoke(ExecContext * xc); 15413531Sjairo.balart@metempsy.com#endif 15513531Sjairo.balart@metempsy.com}; 15613531Sjairo.balart@metempsy.com 15713531Sjairo.balart@metempsy.comclass NDtbMissFault : public DtbFault 15813531Sjairo.balart@metempsy.com{ 15913531Sjairo.balart@metempsy.com private: 16013531Sjairo.balart@metempsy.com static FaultName _name; 16113531Sjairo.balart@metempsy.com static FaultVect _vect; 16213531Sjairo.balart@metempsy.com static FaultStat _count; 16313531Sjairo.balart@metempsy.com public: 16413531Sjairo.balart@metempsy.com#if FULL_SYSTEM 16513531Sjairo.balart@metempsy.com NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 16613531Sjairo.balart@metempsy.com : DtbFault(vaddr, reqFlags, flags) 16713531Sjairo.balart@metempsy.com { } 16813531Sjairo.balart@metempsy.com#endif 16913531Sjairo.balart@metempsy.com FaultName name() {return _name;} 17013531Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 17113531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 17213531Sjairo.balart@metempsy.com}; 17313531Sjairo.balart@metempsy.com 17413531Sjairo.balart@metempsy.comclass PDtbMissFault : public DtbFault 17513531Sjairo.balart@metempsy.com{ 17613531Sjairo.balart@metempsy.com private: 17713531Sjairo.balart@metempsy.com static FaultName _name; 17813531Sjairo.balart@metempsy.com static FaultVect _vect; 17913531Sjairo.balart@metempsy.com static FaultStat _count; 18013531Sjairo.balart@metempsy.com public: 18113531Sjairo.balart@metempsy.com#if FULL_SYSTEM 18213531Sjairo.balart@metempsy.com PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 18313531Sjairo.balart@metempsy.com : DtbFault(vaddr, reqFlags, flags) 18413531Sjairo.balart@metempsy.com { } 18513756Sjairo.balart@metempsy.com#endif 18613531Sjairo.balart@metempsy.com FaultName name() {return _name;} 18713756Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 18813531Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 18913531Sjairo.balart@metempsy.com}; 19013531Sjairo.balart@metempsy.com 19113531Sjairo.balart@metempsy.comclass DtbPageFault : public DtbFault 19213531Sjairo.balart@metempsy.com{ 19313531Sjairo.balart@metempsy.com private: 19413531Sjairo.balart@metempsy.com static FaultName _name; 19513531Sjairo.balart@metempsy.com static FaultVect _vect; 19613756Sjairo.balart@metempsy.com static FaultStat _count; 19713531Sjairo.balart@metempsy.com public: 19813531Sjairo.balart@metempsy.com#if FULL_SYSTEM 19913531Sjairo.balart@metempsy.com DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 20013531Sjairo.balart@metempsy.com : DtbFault(vaddr, reqFlags, flags) 20113756Sjairo.balart@metempsy.com { } 20213756Sjairo.balart@metempsy.com#endif 20313756Sjairo.balart@metempsy.com FaultName name() {return _name;} 20413756Sjairo.balart@metempsy.com FaultVect vect() {return _vect;} 20513756Sjairo.balart@metempsy.com FaultStat & countStat() {return _count;} 20613531Sjairo.balart@metempsy.com}; 20713756Sjairo.balart@metempsy.com 20813756Sjairo.balart@metempsy.comclass DtbAcvFault : public DtbFault 20913756Sjairo.balart@metempsy.com{ 21013756Sjairo.balart@metempsy.com private: 21113756Sjairo.balart@metempsy.com static FaultName _name; 21213756Sjairo.balart@metempsy.com static FaultVect _vect; 21313756Sjairo.balart@metempsy.com static FaultStat _count; 21413756Sjairo.balart@metempsy.com public: 21513756Sjairo.balart@metempsy.com#if FULL_SYSTEM 21613756Sjairo.balart@metempsy.com DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 21713756Sjairo.balart@metempsy.com : DtbFault(vaddr, reqFlags, flags) 21813531Sjairo.balart@metempsy.com { } 21913531Sjairo.balart@metempsy.com#endif 22013531Sjairo.balart@metempsy.com FaultName name() {return _name;} 221 FaultVect vect() {return _vect;} 222 FaultStat & countStat() {return _count;} 223}; 224 225class DtbAlignmentFault : public DtbFault 226{ 227 private: 228 static FaultName _name; 229 static FaultVect _vect; 230 static FaultStat _count; 231 public: 232#if FULL_SYSTEM 233 DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 234 : DtbFault(vaddr, reqFlags, flags) 235 { } 236#endif 237 FaultName name() {return _name;} 238 FaultVect vect() {return _vect;} 239 FaultStat & countStat() {return _count;} 240}; 241 242class ItbFault : public AlphaFault 243{ 244 private: 245 Addr pc; 246 public: 247 ItbFault(Addr _pc) 248 : pc(_pc) 249 { } 250 FaultName name() = 0; 251 FaultVect vect() = 0; 252 FaultStat & countStat() = 0; 253#if FULL_SYSTEM 254 void invoke(ExecContext * xc); 255#endif 256}; 257 258class ItbMissFault : public ItbFault 259{ 260 private: 261 static FaultName _name; 262 static FaultVect _vect; 263 static FaultStat _count; 264 public: 265 ItbMissFault(Addr pc) 266 : ItbFault(pc) 267 { } 268 FaultName name() {return _name;} 269 FaultVect vect() {return _vect;} 270 FaultStat & countStat() {return _count;} 271}; 272 273class ItbPageFault : public ItbFault 274{ 275 private: 276 static FaultName _name; 277 static FaultVect _vect; 278 static FaultStat _count; 279 public: 280 ItbPageFault(Addr pc) 281 : ItbFault(pc) 282 { } 283 FaultName name() {return _name;} 284 FaultVect vect() {return _vect;} 285 FaultStat & countStat() {return _count;} 286}; 287 288class ItbAcvFault : public ItbFault 289{ 290 private: 291 static FaultName _name; 292 static FaultVect _vect; 293 static FaultStat _count; 294 public: 295 ItbAcvFault(Addr pc) 296 : ItbFault(pc) 297 { } 298 FaultName name() {return _name;} 299 FaultVect vect() {return _vect;} 300 FaultStat & countStat() {return _count;} 301}; 302 303class UnimplementedOpcodeFault : public AlphaFault 304{ 305 private: 306 static FaultName _name; 307 static FaultVect _vect; 308 static FaultStat _count; 309 public: 310 FaultName name() {return _name;} 311 FaultVect vect() {return _vect;} 312 FaultStat & countStat() {return _count;} 313}; 314 315class FloatEnableFault : public AlphaFault 316{ 317 private: 318 static FaultName _name; 319 static FaultVect _vect; 320 static FaultStat _count; 321 public: 322 FaultName name() {return _name;} 323 FaultVect vect() {return _vect;} 324 FaultStat & countStat() {return _count;} 325}; 326 327class PalFault : public AlphaFault 328{ 329 protected: 330 bool skipFaultingInstruction() {return true;} 331 private: 332 static FaultName _name; 333 static FaultVect _vect; 334 static FaultStat _count; 335 public: 336 FaultName name() {return _name;} 337 FaultVect vect() {return _vect;} 338 FaultStat & countStat() {return _count;} 339}; 340 341class IntegerOverflowFault : public AlphaFault 342{ 343 private: 344 static FaultName _name; 345 static FaultVect _vect; 346 static FaultStat _count; 347 public: 348 FaultName name() {return _name;} 349 FaultVect vect() {return _vect;} 350 FaultStat & countStat() {return _count;} 351}; 352 353} // AlphaISA namespace 354 355#endif // __FAULTS_HH__ 356