faults.hh revision 12110:c24ee249b8ba
17503Snate@binkert.org/* 27503Snate@binkert.org * Copyright (c) 2003-2005 The Regents of The University of Michigan 37503Snate@binkert.org * All rights reserved. 47503Snate@binkert.org * 57503Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67503Snate@binkert.org * modification, are permitted provided that the following conditions are 77503Snate@binkert.org * met: redistributions of source code must retain the above copyright 87503Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97503Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107503Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117503Snate@binkert.org * documentation and/or other materials provided with the distribution; 127503Snate@binkert.org * neither the name of the copyright holders nor the names of its 137503Snate@binkert.org * contributors may be used to endorse or promote products derived from 147503Snate@binkert.org * this software without specific prior written permission. 157503Snate@binkert.org * 167503Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177503Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187503Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197503Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207503Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217503Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227503Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237503Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247503Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257503Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267503Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712563Sgabeblack@google.com * 2813714Sandreas.sandberg@arm.com * Authors: Gabe Black 2912563Sgabeblack@google.com * Kevin Lim 308223Snate@binkert.org */ 318223Snate@binkert.org 327503Snate@binkert.org#ifndef __ARCH_ALPHA_FAULTS_HH__ 337503Snate@binkert.org#define __ARCH_ALPHA_FAULTS_HH__ 347503Snate@binkert.org 357503Snate@binkert.org#include "arch/alpha/pagetable.hh" 367503Snate@binkert.org#include "mem/request.hh" 377503Snate@binkert.org#include "sim/faults.hh" 387503Snate@binkert.org 397503Snate@binkert.org// The design of the "name" and "vect" functions is in sim/faults.hh 407503Snate@binkert.org 417503Snate@binkert.orgnamespace AlphaISA { 427503Snate@binkert.org 437503Snate@binkert.orgtypedef Addr FaultVect; 447503Snate@binkert.org 4513709Sandreas.sandberg@arm.comclass AlphaFault : public FaultBase 467503Snate@binkert.org{ 477503Snate@binkert.org protected: 487503Snate@binkert.org virtual bool skipFaultingInstruction() {return false;} 498223Snate@binkert.org virtual bool setRestartAddress() {return true;} 508223Snate@binkert.org public: 518223Snate@binkert.org virtual ~AlphaFault() {} 528223Snate@binkert.org void invoke(ThreadContext * tc, const StaticInstPtr &inst = 538223Snate@binkert.org StaticInst::nullStaticInstPtr); 548223Snate@binkert.org virtual FaultVect vect() = 0; 558223Snate@binkert.org virtual FaultStat & countStat() = 0; 568223Snate@binkert.org}; 578223Snate@binkert.org 588223Snate@binkert.orgclass MachineCheckFault : public AlphaFault 598223Snate@binkert.org{ 608223Snate@binkert.org private: 618223Snate@binkert.org static FaultName _name; 628223Snate@binkert.org static FaultVect _vect; 638223Snate@binkert.org static FaultStat _count; 648223Snate@binkert.org 658223Snate@binkert.org public: 668223Snate@binkert.org FaultName name() const {return _name;} 678223Snate@binkert.org FaultVect vect() {return _vect;} 688223Snate@binkert.org FaultStat & countStat() {return _count;} 698223Snate@binkert.org}; 708223Snate@binkert.org 718223Snate@binkert.orgclass AlignmentFault : public AlphaFault 728223Snate@binkert.org{ 738223Snate@binkert.org private: 748223Snate@binkert.org static FaultName _name; 758223Snate@binkert.org static FaultVect _vect; 768223Snate@binkert.org static FaultStat _count; 778223Snate@binkert.org 788223Snate@binkert.org public: 798223Snate@binkert.org FaultName name() const {return _name;} 808223Snate@binkert.org FaultVect vect() {return _vect;} 818223Snate@binkert.org FaultStat & countStat() {return _count;} 828223Snate@binkert.org bool isAlignmentFault() const {return true;} 838223Snate@binkert.org}; 848223Snate@binkert.org 857503Snate@binkert.orgclass ResetFault : public AlphaFault 867503Snate@binkert.org{ 877503Snate@binkert.org private: 887503Snate@binkert.org static FaultName _name; 897503Snate@binkert.org static FaultVect _vect; 907503Snate@binkert.org static FaultStat _count; 917503Snate@binkert.org 927503Snate@binkert.org public: 9313709Sandreas.sandberg@arm.com FaultName name() const {return _name;} 947503Snate@binkert.org FaultVect vect() {return _vect;} 957503Snate@binkert.org FaultStat & countStat() {return _count;} 967503Snate@binkert.org}; 977503Snate@binkert.org 987503Snate@binkert.orgclass ArithmeticFault : public AlphaFault 997503Snate@binkert.org{ 1007503Snate@binkert.org private: 1017503Snate@binkert.org static FaultName _name; 1027503Snate@binkert.org static FaultVect _vect; 1037503Snate@binkert.org static FaultStat _count; 1047503Snate@binkert.org 1057503Snate@binkert.org protected: 1067503Snate@binkert.org bool skipFaultingInstruction() {return true;} 1077503Snate@binkert.org 1087503Snate@binkert.org public: 1097503Snate@binkert.org FaultName name() const {return _name;} 1107503Snate@binkert.org FaultVect vect() {return _vect;} 11113709Sandreas.sandberg@arm.com FaultStat & countStat() {return _count;} 1127503Snate@binkert.org void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1137503Snate@binkert.org StaticInst::nullStaticInstPtr); 1147503Snate@binkert.org}; 1157503Snate@binkert.org 1167503Snate@binkert.orgclass InterruptFault : public AlphaFault 11713709Sandreas.sandberg@arm.com{ 1187503Snate@binkert.org private: 1197503Snate@binkert.org static FaultName _name; 1207503Snate@binkert.org static FaultVect _vect; 1218223Snate@binkert.org static FaultStat _count; 1228223Snate@binkert.org 1238223Snate@binkert.org protected: 1248223Snate@binkert.org bool setRestartAddress() {return false;} 1258223Snate@binkert.org 1268223Snate@binkert.org public: 1278223Snate@binkert.org FaultName name() const {return _name;} 1288223Snate@binkert.org FaultVect vect() {return _vect;} 1298223Snate@binkert.org FaultStat & countStat() {return _count;} 1308223Snate@binkert.org}; 1318223Snate@binkert.org 1328223Snate@binkert.orgclass DtbFault : public AlphaFault 1338223Snate@binkert.org{ 1348223Snate@binkert.org protected: 1358223Snate@binkert.org VAddr vaddr; 1368223Snate@binkert.org Request::Flags reqFlags; 1378223Snate@binkert.org uint64_t flags; 1388223Snate@binkert.org 1398223Snate@binkert.org public: 1408223Snate@binkert.org DtbFault(VAddr _vaddr, Request::Flags _reqFlags, uint64_t _flags) 1417503Snate@binkert.org : vaddr(_vaddr), reqFlags(_reqFlags), flags(_flags) 1427503Snate@binkert.org { } 1437503Snate@binkert.org FaultName name() const = 0; 1447503Snate@binkert.org FaultVect vect() = 0; 1457503Snate@binkert.org FaultStat & countStat() = 0; 1467503Snate@binkert.org void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1477503Snate@binkert.org StaticInst::nullStaticInstPtr); 1487503Snate@binkert.org}; 1497503Snate@binkert.org 1507503Snate@binkert.orgclass NDtbMissFault : public DtbFault 1517503Snate@binkert.org{ 1527503Snate@binkert.org private: 1537503Snate@binkert.org static FaultName _name; 1547503Snate@binkert.org static FaultVect _vect; 1557503Snate@binkert.org static FaultStat _count; 1567503Snate@binkert.org 1577503Snate@binkert.org public: 1587503Snate@binkert.org NDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1597503Snate@binkert.org : DtbFault(vaddr, reqFlags, flags) 1607503Snate@binkert.org { } 1617503Snate@binkert.org FaultName name() const {return _name;} 1627503Snate@binkert.org FaultVect vect() {return _vect;} 1637503Snate@binkert.org FaultStat & countStat() {return _count;} 1647503Snate@binkert.org void invoke(ThreadContext * tc, const StaticInstPtr &inst = 1657503Snate@binkert.org StaticInst::nullStaticInstPtr); 1667503Snate@binkert.org}; 1677503Snate@binkert.org 1687503Snate@binkert.orgclass PDtbMissFault : public DtbFault 1697503Snate@binkert.org{ 1707503Snate@binkert.org private: 1717503Snate@binkert.org static FaultName _name; 1727503Snate@binkert.org static FaultVect _vect; 1737503Snate@binkert.org static FaultStat _count; 1747503Snate@binkert.org 1757503Snate@binkert.org public: 1767503Snate@binkert.org PDtbMissFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1777503Snate@binkert.org : DtbFault(vaddr, reqFlags, flags) 17812563Sgabeblack@google.com { } 17913709Sandreas.sandberg@arm.com FaultName name() const {return _name;} 18013709Sandreas.sandberg@arm.com FaultVect vect() {return _vect;} 18113709Sandreas.sandberg@arm.com FaultStat & countStat() {return _count;} 18213709Sandreas.sandberg@arm.com}; 18313709Sandreas.sandberg@arm.com 18413709Sandreas.sandberg@arm.comclass DtbPageFault : public DtbFault 1857503Snate@binkert.org{ 1867503Snate@binkert.org private: 1877503Snate@binkert.org static FaultName _name; 1887503Snate@binkert.org static FaultVect _vect; 18912563Sgabeblack@google.com static FaultStat _count; 1907503Snate@binkert.org 1917503Snate@binkert.org public: 19212563Sgabeblack@google.com DtbPageFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 1937503Snate@binkert.org : DtbFault(vaddr, reqFlags, flags) 1947503Snate@binkert.org { } 1957503Snate@binkert.org FaultName name() const {return _name;} 1967503Snate@binkert.org FaultVect vect() {return _vect;} 1977503Snate@binkert.org FaultStat & countStat() {return _count;} 1987503Snate@binkert.org}; 1997503Snate@binkert.org 2007503Snate@binkert.orgclass DtbAcvFault : public DtbFault 2017503Snate@binkert.org{ 2027503Snate@binkert.org private: 2037503Snate@binkert.org static FaultName _name; 2047503Snate@binkert.org static FaultVect _vect; 2057503Snate@binkert.org static FaultStat _count; 2067503Snate@binkert.org 2077503Snate@binkert.org public: 2087503Snate@binkert.org DtbAcvFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 20913682Sandreas.sandberg@arm.com : DtbFault(vaddr, reqFlags, flags) 2107503Snate@binkert.org { } 21112563Sgabeblack@google.com FaultName name() const {return _name;} 2128223Snate@binkert.org FaultVect vect() {return _vect;} 2138223Snate@binkert.org FaultStat & countStat() {return _count;} 21412563Sgabeblack@google.com}; 215 216class DtbAlignmentFault : public DtbFault 217{ 218 private: 219 static FaultName _name; 220 static FaultVect _vect; 221 static FaultStat _count; 222 223 public: 224 DtbAlignmentFault(VAddr vaddr, Request::Flags reqFlags, uint64_t flags) 225 : DtbFault(vaddr, reqFlags, flags) 226 { } 227 FaultName name() const {return _name;} 228 FaultVect vect() {return _vect;} 229 FaultStat & countStat() {return _count;} 230}; 231 232class ItbFault : public AlphaFault 233{ 234 protected: 235 Addr pc; 236 237 public: 238 ItbFault(Addr _pc) : pc(_pc) { } 239 FaultName name() const = 0; 240 FaultVect vect() = 0; 241 FaultStat & countStat() = 0; 242 void invoke(ThreadContext * tc, const StaticInstPtr &inst = 243 StaticInst::nullStaticInstPtr); 244}; 245 246class ItbPageFault : public ItbFault 247{ 248 private: 249 static FaultName _name; 250 static FaultVect _vect; 251 static FaultStat _count; 252 253 public: 254 ItbPageFault(Addr pc) : ItbFault(pc) { } 255 FaultName name() const {return _name;} 256 FaultVect vect() {return _vect;} 257 FaultStat & countStat() {return _count;} 258 void invoke(ThreadContext * tc, const StaticInstPtr &inst = 259 StaticInst::nullStaticInstPtr); 260}; 261 262class ItbAcvFault : public ItbFault 263{ 264 private: 265 static FaultName _name; 266 static FaultVect _vect; 267 static FaultStat _count; 268 269 public: 270 ItbAcvFault(Addr pc) : ItbFault(pc) { } 271 FaultName name() const {return _name;} 272 FaultVect vect() {return _vect;} 273 FaultStat & countStat() {return _count;} 274}; 275 276class UnimplementedOpcodeFault : public AlphaFault 277{ 278 private: 279 static FaultName _name; 280 static FaultVect _vect; 281 static FaultStat _count; 282 283 public: 284 FaultName name() const {return _name;} 285 FaultVect vect() {return _vect;} 286 FaultStat & countStat() {return _count;} 287}; 288 289class FloatEnableFault : public AlphaFault 290{ 291 private: 292 static FaultName _name; 293 static FaultVect _vect; 294 static FaultStat _count; 295 296 public: 297 FaultName name() const {return _name;} 298 FaultVect vect() {return _vect;} 299 FaultStat & countStat() {return _count;} 300}; 301 302class VectorEnableFault : public AlphaFault 303{ 304 private: 305 static FaultName _name; 306 static FaultVect _vect; 307 static FaultStat _count; 308 309 public: 310 FaultName name() const {return _name;} 311 FaultVect vect() {return _vect;} 312 FaultStat & countStat() {return _count;} 313}; 314 315class PalFault : public AlphaFault 316{ 317 private: 318 static FaultName _name; 319 static FaultVect _vect; 320 static FaultStat _count; 321 322 protected: 323 bool skipFaultingInstruction() {return true;} 324 325 public: 326 FaultName name() const {return _name;} 327 FaultVect vect() {return _vect;} 328 FaultStat & countStat() {return _count;} 329}; 330 331class IntegerOverflowFault : public AlphaFault 332{ 333 private: 334 static FaultName _name; 335 static FaultVect _vect; 336 static FaultStat _count; 337 338 public: 339 FaultName name() const {return _name;} 340 FaultVect vect() {return _vect;} 341 FaultStat & countStat() {return _count;} 342}; 343 344} // namespace AlphaISA 345 346#endif // __ARCH_ALPHA_FAULTS_HH__ 347