faults.hh revision 3614
16145Snate@binkert.org/* 26145Snate@binkert.org * Copyright (c) 2003-2005 The Regents of The University of Michigan 36145Snate@binkert.org * All rights reserved. 46145Snate@binkert.org * 56145Snate@binkert.org * Redistribution and use in source and binary forms, with or without 66145Snate@binkert.org * modification, are permitted provided that the following conditions are 76145Snate@binkert.org * met: redistributions of source code must retain the above copyright 86145Snate@binkert.org * notice, this list of conditions and the following disclaimer; 96145Snate@binkert.org * redistributions in binary form must reproduce the above copyright 106145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 116145Snate@binkert.org * documentation and/or other materials provided with the distribution; 126145Snate@binkert.org * neither the name of the copyright holders nor the names of its 136145Snate@binkert.org * contributors may be used to endorse or promote products derived from 146145Snate@binkert.org * this software without specific prior written permission. 156145Snate@binkert.org * 166145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276145Snate@binkert.org * 286145Snate@binkert.org * Authors: Gabe Black 296145Snate@binkert.org * Kevin Lim 307054Snate@binkert.org */ 317054Snate@binkert.org 327054Snate@binkert.org#ifndef __ALPHA_FAULTS_HH__ 337054Snate@binkert.org#define __ALPHA_FAULTS_HH__ 347054Snate@binkert.org 357054Snate@binkert.org#include "config/full_system.hh" 367054Snate@binkert.org#include "sim/faults.hh" 377054Snate@binkert.org 387054Snate@binkert.org#if FULL_SYSTEM 396145Snate@binkert.org#include "arch/alpha/pagetable.hh" 407054Snate@binkert.org#endif 417054Snate@binkert.org 426145Snate@binkert.org// The design of the "name" and "vect" functions is in sim/faults.hh 437055Snate@binkert.org 447055Snate@binkert.orgnamespace AlphaISA 457454Snate@binkert.org{ 467055Snate@binkert.org 478257SBrad.Beckmann@amd.comtypedef const Addr FaultVect; 487054Snate@binkert.org 498645Snilay@cs.wisc.educlass AlphaFault : public FaultBase 509594Snilay@cs.wisc.edu{ 519594Snilay@cs.wisc.edu protected: 527054Snate@binkert.org virtual bool skipFaultingInstruction() {return false;} 539465Snilay@cs.wisc.edu virtual bool setRestartAddress() {return true;} 546145Snate@binkert.org public: 556145Snate@binkert.org#if FULL_SYSTEM 566145Snate@binkert.org void invoke(ThreadContext * tc); 576145Snate@binkert.org#endif 589465Snilay@cs.wisc.edu virtual FaultVect vect() = 0; 597054Snate@binkert.org virtual FaultStat & countStat() = 0; 607054Snate@binkert.org}; 616876Ssteve.reinhardt@amd.com 626876Ssteve.reinhardt@amd.comclass MachineCheckFault : public AlphaFault 639594Snilay@cs.wisc.edu{ 6410917Sbrandon.potter@amd.com private: 656145Snate@binkert.org static FaultName _name; 6610303Snilay@cs.wisc.edu static FaultVect _vect; 677054Snate@binkert.org static FaultStat _count; 686145Snate@binkert.org public: 699497Snilay@cs.wisc.edu FaultName name() {return _name;} 7010303Snilay@cs.wisc.edu FaultVect vect() {return _vect;} 7110303Snilay@cs.wisc.edu FaultStat & countStat() {return _count;} 729275Snilay@cs.wisc.edu bool isMachineCheckFault() {return true;} 736493STushar.Krishna@amd.com}; 747054Snate@binkert.org 7511113Sjoe.gross@amd.comclass AlignmentFault : public AlphaFault 7611113Sjoe.gross@amd.com{ 7710311Snilay@cs.wisc.edu private: 7811113Sjoe.gross@amd.com static FaultName _name; 7911113Sjoe.gross@amd.com static FaultVect _vect; 8011113Sjoe.gross@amd.com static FaultStat _count; 8111113Sjoe.gross@amd.com public: 826145Snate@binkert.org FaultName name() {return _name;} 8311663Stushar@ece.gatech.edu FaultVect vect() {return _vect;} 849799Snilay@cs.wisc.edu FaultStat & countStat() {return _count;} 8511663Stushar@ece.gatech.edu bool isAlignmentFault() {return true;} 869799Snilay@cs.wisc.edu}; 878257SBrad.Beckmann@amd.com 8811664Stushar@ece.gatech.edu#if !FULL_SYSTEM 8911664Stushar@ece.gatech.educlass PageTableFault : public AlphaFault 9011664Stushar@ece.gatech.edu{ 916145Snate@binkert.org private: 929863Snilay@cs.wisc.edu Addr vaddr; 937055Snate@binkert.org static FaultName _name; 946145Snate@binkert.org static FaultVect _vect; 959302Snilay@cs.wisc.edu static FaultStat _count; 969302Snilay@cs.wisc.edu public: 979302Snilay@cs.wisc.edu PageTableFault(Addr va) 989302Snilay@cs.wisc.edu : vaddr(va) {} 999302Snilay@cs.wisc.edu FaultName name() {return _name;} 1009302Snilay@cs.wisc.edu FaultVect vect() {return _vect;} 1019302Snilay@cs.wisc.edu FaultStat & countStat() {return _count;} 1029302Snilay@cs.wisc.edu void invoke(ThreadContext * tc); 1039302Snilay@cs.wisc.edu}; 1049302Snilay@cs.wisc.edu 1057054Snate@binkert.orgstatic inline Fault genPageTableFault(Addr va) 1067054Snate@binkert.org{ 1077054Snate@binkert.org return new PageTableFault(va); 1087054Snate@binkert.org} 1096145Snate@binkert.org#endif 1109863Snilay@cs.wisc.edu 1119275Snilay@cs.wisc.edustatic inline Fault genMachineCheckFault() 11211113Sjoe.gross@amd.com{ 1137054Snate@binkert.org return new MachineCheckFault; 1149275Snilay@cs.wisc.edu} 1159275Snilay@cs.wisc.edu 1169863Snilay@cs.wisc.edustatic inline Fault genAlignmentFault() 11710082Snilay@cs.wisc.edu{ 11810370Snilay@cs.wisc.edu return new AlignmentFault; 11910370Snilay@cs.wisc.edu} 12010082Snilay@cs.wisc.edu 12110082Snilay@cs.wisc.educlass ResetFault : public AlphaFault 1229863Snilay@cs.wisc.edu{ 1239863Snilay@cs.wisc.edu private: 1249863Snilay@cs.wisc.edu static FaultName _name; 1259863Snilay@cs.wisc.edu static FaultVect _vect; 1269863Snilay@cs.wisc.edu static FaultStat _count; 1279863Snilay@cs.wisc.edu public: 1289863Snilay@cs.wisc.edu FaultName name() {return _name;} 1299863Snilay@cs.wisc.edu FaultVect vect() {return _vect;} 1309863Snilay@cs.wisc.edu FaultStat & countStat() {return _count;} 1319863Snilay@cs.wisc.edu}; 1329863Snilay@cs.wisc.edu 1339863Snilay@cs.wisc.educlass ArithmeticFault : public AlphaFault 1349863Snilay@cs.wisc.edu{ 1359863Snilay@cs.wisc.edu protected: 1369863Snilay@cs.wisc.edu bool skipFaultingInstruction() {return true;} 1379863Snilay@cs.wisc.edu private: 1389863Snilay@cs.wisc.edu static FaultName _name; 1399863Snilay@cs.wisc.edu static FaultVect _vect; 1406145Snate@binkert.org static FaultStat _count; 1416145Snate@binkert.org public: 1427055Snate@binkert.org FaultName name() {return _name;} 1437055Snate@binkert.org FaultVect vect() {return _vect;} 1446145Snate@binkert.org FaultStat & countStat() {return _count;} 1457054Snate@binkert.org#if FULL_SYSTEM 1467055Snate@binkert.org void invoke(ThreadContext * tc); 1477054Snate@binkert.org#endif 1486145Snate@binkert.org}; 1496145Snate@binkert.org 1507054Snate@binkert.orgclass InterruptFault : public AlphaFault 151{ 152 protected: 153 bool setRestartAddress() {return false;} 154 private: 155 static FaultName _name; 156 static FaultVect _vect; 157 static FaultStat _count; 158 public: 159 FaultName name() {return _name;} 160 FaultVect vect() {return _vect;} 161 FaultStat & countStat() {return _count;} 162}; 163 164class DtbFault : public AlphaFault 165{ 166#if FULL_SYSTEM 167 private: 168 AlphaISA::VAddr vaddr; 169 uint32_t reqFlags; 170 uint64_t flags; 171 public: 172 DtbFault(AlphaISA::VAddr _vaddr, uint32_t _reqFlags, uint64_t _flags) 173 : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 174 { } 175#endif 176 FaultName name() = 0; 177 FaultVect vect() = 0; 178 FaultStat & countStat() = 0; 179#if FULL_SYSTEM 180 void invoke(ThreadContext * tc); 181#endif 182}; 183 184class NDtbMissFault : public DtbFault 185{ 186 private: 187 static FaultName _name; 188 static FaultVect _vect; 189 static FaultStat _count; 190 public: 191#if FULL_SYSTEM 192 NDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 193 : DtbFault(vaddr, reqFlags, flags) 194 { } 195#endif 196 FaultName name() {return _name;} 197 FaultVect vect() {return _vect;} 198 FaultStat & countStat() {return _count;} 199}; 200 201class PDtbMissFault : public DtbFault 202{ 203 private: 204 static FaultName _name; 205 static FaultVect _vect; 206 static FaultStat _count; 207 public: 208#if FULL_SYSTEM 209 PDtbMissFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 210 : DtbFault(vaddr, reqFlags, flags) 211 { } 212#endif 213 FaultName name() {return _name;} 214 FaultVect vect() {return _vect;} 215 FaultStat & countStat() {return _count;} 216}; 217 218class DtbPageFault : public DtbFault 219{ 220 private: 221 static FaultName _name; 222 static FaultVect _vect; 223 static FaultStat _count; 224 public: 225#if FULL_SYSTEM 226 DtbPageFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 227 : DtbFault(vaddr, reqFlags, flags) 228 { } 229#endif 230 FaultName name() {return _name;} 231 FaultVect vect() {return _vect;} 232 FaultStat & countStat() {return _count;} 233}; 234 235class DtbAcvFault : public DtbFault 236{ 237 private: 238 static FaultName _name; 239 static FaultVect _vect; 240 static FaultStat _count; 241 public: 242#if FULL_SYSTEM 243 DtbAcvFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 244 : DtbFault(vaddr, reqFlags, flags) 245 { } 246#endif 247 FaultName name() {return _name;} 248 FaultVect vect() {return _vect;} 249 FaultStat & countStat() {return _count;} 250}; 251 252class DtbAlignmentFault : public DtbFault 253{ 254 private: 255 static FaultName _name; 256 static FaultVect _vect; 257 static FaultStat _count; 258 public: 259#if FULL_SYSTEM 260 DtbAlignmentFault(AlphaISA::VAddr vaddr, uint32_t reqFlags, uint64_t flags) 261 : DtbFault(vaddr, reqFlags, flags) 262 { } 263#endif 264 FaultName name() {return _name;} 265 FaultVect vect() {return _vect;} 266 FaultStat & countStat() {return _count;} 267}; 268 269class ItbFault : public AlphaFault 270{ 271 private: 272 Addr pc; 273 public: 274 ItbFault(Addr _pc) 275 : pc(_pc) 276 { } 277 FaultName name() = 0; 278 FaultVect vect() = 0; 279 FaultStat & countStat() = 0; 280#if FULL_SYSTEM 281 void invoke(ThreadContext * tc); 282#endif 283}; 284 285class ItbMissFault : public ItbFault 286{ 287 private: 288 static FaultName _name; 289 static FaultVect _vect; 290 static FaultStat _count; 291 public: 292 ItbMissFault(Addr pc) 293 : ItbFault(pc) 294 { } 295 FaultName name() {return _name;} 296 FaultVect vect() {return _vect;} 297 FaultStat & countStat() {return _count;} 298}; 299 300class ItbPageFault : public ItbFault 301{ 302 private: 303 static FaultName _name; 304 static FaultVect _vect; 305 static FaultStat _count; 306 public: 307 ItbPageFault(Addr pc) 308 : ItbFault(pc) 309 { } 310 FaultName name() {return _name;} 311 FaultVect vect() {return _vect;} 312 FaultStat & countStat() {return _count;} 313}; 314 315class ItbAcvFault : public ItbFault 316{ 317 private: 318 static FaultName _name; 319 static FaultVect _vect; 320 static FaultStat _count; 321 public: 322 ItbAcvFault(Addr pc) 323 : ItbFault(pc) 324 { } 325 FaultName name() {return _name;} 326 FaultVect vect() {return _vect;} 327 FaultStat & countStat() {return _count;} 328}; 329 330class UnimplementedOpcodeFault : public AlphaFault 331{ 332 private: 333 static FaultName _name; 334 static FaultVect _vect; 335 static FaultStat _count; 336 public: 337 FaultName name() {return _name;} 338 FaultVect vect() {return _vect;} 339 FaultStat & countStat() {return _count;} 340}; 341 342class FloatEnableFault : public AlphaFault 343{ 344 private: 345 static FaultName _name; 346 static FaultVect _vect; 347 static FaultStat _count; 348 public: 349 FaultName name() {return _name;} 350 FaultVect vect() {return _vect;} 351 FaultStat & countStat() {return _count;} 352}; 353 354class PalFault : public AlphaFault 355{ 356 protected: 357 bool skipFaultingInstruction() {return true;} 358 private: 359 static FaultName _name; 360 static FaultVect _vect; 361 static FaultStat _count; 362 public: 363 FaultName name() {return _name;} 364 FaultVect vect() {return _vect;} 365 FaultStat & countStat() {return _count;} 366}; 367 368class IntegerOverflowFault : public AlphaFault 369{ 370 private: 371 static FaultName _name; 372 static FaultVect _vect; 373 static FaultStat _count; 374 public: 375 FaultName name() {return _name;} 376 FaultVect vect() {return _vect;} 377 FaultStat & countStat() {return _count;} 378}; 379 380} // AlphaISA namespace 381 382#endif // __FAULTS_HH__ 383