faults.cc revision 2665:a124942bacb8
12SN/A/* 21762SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Gabe Black 292SN/A * Kevin Lim 302SN/A */ 311798SN/A 321798SN/A#include "arch/alpha/faults.hh" 332SN/A#include "cpu/exec_context.hh" 3456SN/A#include "cpu/base.hh" 352SN/A#include "base/trace.hh" 362SN/A#if FULL_SYSTEM 372SN/A#include "arch/alpha/ev5.hh" 382SN/A#endif 392667Sstever@eecs.umich.edu 402SN/Anamespace AlphaISA 412SN/A{ 422SN/A 432SN/AFaultName MachineCheckFault::_name = "mchk"; 442SN/AFaultVect MachineCheckFault::_vect = 0x0401; 452SN/AFaultStat MachineCheckFault::_count; 462SN/A 472797Sktlim@umich.eduFaultName AlignmentFault::_name = "unalign"; 482797Sktlim@umich.eduFaultVect AlignmentFault::_vect = 0x0301; 492797Sktlim@umich.eduFaultStat AlignmentFault::_count; 502797Sktlim@umich.edu 512797Sktlim@umich.eduFaultName ResetFault::_name = "reset"; 522667Sstever@eecs.umich.eduFaultVect ResetFault::_vect = 0x0001; 53396SN/AFaultStat ResetFault::_count; 542SN/A 552667Sstever@eecs.umich.eduFaultName ArithmeticFault::_name = "arith"; 562SN/AFaultVect ArithmeticFault::_vect = 0x0501; 572667Sstever@eecs.umich.eduFaultStat ArithmeticFault::_count; 582667Sstever@eecs.umich.edu 592667Sstever@eecs.umich.eduFaultName InterruptFault::_name = "interrupt"; 602667Sstever@eecs.umich.eduFaultVect InterruptFault::_vect = 0x0101; 612SN/AFaultStat InterruptFault::_count; 622667Sstever@eecs.umich.edu 632667Sstever@eecs.umich.eduFaultName NDtbMissFault::_name = "dtb_miss_single"; 642SN/AFaultVect NDtbMissFault::_vect = 0x0201; 652SN/AFaultStat NDtbMissFault::_count; 662SN/A 672SN/AFaultName PDtbMissFault::_name = "dtb_miss_double"; 682SN/AFaultVect PDtbMissFault::_vect = 0x0281; 692SN/AFaultStat PDtbMissFault::_count; 702839Sktlim@umich.edu 712797Sktlim@umich.eduFaultName DtbPageFault::_name = "dfault"; 722797Sktlim@umich.eduFaultVect DtbPageFault::_vect = 0x0381; 732839Sktlim@umich.eduFaultStat DtbPageFault::_count; 742797Sktlim@umich.edu 752797Sktlim@umich.eduFaultName DtbAcvFault::_name = "dfault"; 762839Sktlim@umich.eduFaultVect DtbAcvFault::_vect = 0x0381; 772797Sktlim@umich.eduFaultStat DtbAcvFault::_count; 782797Sktlim@umich.edu 792797Sktlim@umich.eduFaultName DtbAlignmentFault::_name = "unalign"; 802797Sktlim@umich.eduFaultVect DtbAlignmentFault::_vect = 0x0301; 812797Sktlim@umich.eduFaultStat DtbAlignmentFault::_count; 822797Sktlim@umich.edu 832797Sktlim@umich.eduFaultName ItbMissFault::_name = "itbmiss"; 842797Sktlim@umich.eduFaultVect ItbMissFault::_vect = 0x0181; 852797Sktlim@umich.eduFaultStat ItbMissFault::_count; 862SN/A 872SN/AFaultName ItbPageFault::_name = "itbmiss"; 882SN/AFaultVect ItbPageFault::_vect = 0x0181; 892SN/AFaultStat ItbPageFault::_count; 902SN/A 912SN/AFaultName ItbAcvFault::_name = "iaccvio"; 922SN/AFaultVect ItbAcvFault::_vect = 0x0081; 932SN/AFaultStat ItbAcvFault::_count; 942SN/A 952SN/AFaultName UnimplementedOpcodeFault::_name = "opdec"; 962SN/AFaultVect UnimplementedOpcodeFault::_vect = 0x0481; 972SN/AFaultStat UnimplementedOpcodeFault::_count; 982SN/A 992SN/AFaultName FloatEnableFault::_name = "fen"; 1002SN/AFaultVect FloatEnableFault::_vect = 0x0581; 1012SN/AFaultStat FloatEnableFault::_count; 1022SN/A 1032SN/AFaultName PalFault::_name = "pal"; 1042SN/AFaultVect PalFault::_vect = 0x2001; 1052SN/AFaultStat PalFault::_count; 1062SN/A 1071798SN/AFaultName IntegerOverflowFault::_name = "intover"; 1082SN/AFaultVect IntegerOverflowFault::_vect = 0x0501; 1092SN/AFaultStat IntegerOverflowFault::_count; 1102SN/A 1112SN/A#if FULL_SYSTEM 1122SN/A 1132SN/Avoid AlphaFault::invoke(ExecContext * xc) 1142SN/A{ 1152SN/A FaultBase::invoke(xc); 1162SN/A countStat()++; 1171798SN/A 1182SN/A // exception restart address 1192SN/A if (setRestartAddress() || !xc->inPalMode()) 1202SN/A xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, xc->readPC()); 1212SN/A 1222SN/A if (skipFaultingInstruction()) { 1232SN/A // traps... skip faulting instruction. 1241798SN/A xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, 1251798SN/A xc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4); 1261798SN/A } 1271798SN/A 1281798SN/A xc->setPC(xc->readMiscReg(AlphaISA::IPR_PAL_BASE) + vect()); 1291798SN/A xc->setNextPC(xc->readPC() + sizeof(MachInst)); 1301798SN/A} 1311798SN/A 1321798SN/Avoid ArithmeticFault::invoke(ExecContext * xc) 1331798SN/A{ 1341798SN/A FaultBase::invoke(xc); 1351798SN/A panic("Arithmetic traps are unimplemented!"); 1361798SN/A} 1371798SN/A 1381798SN/Avoid DtbFault::invoke(ExecContext * xc) 1391798SN/A{ 1401798SN/A // Set fault address and flags. Even though we're modeling an 1411798SN/A // EV5, we use the EV6 technique of not latching fault registers 1421798SN/A // on VPTE loads (instead of locking the registers until IPR_VA is 1431798SN/A // read, like the EV5). The EV6 approach is cleaner and seems to 144 // work with EV5 PAL code, but not the other way around. 145 if (!xc->misspeculating() 146 && !(reqFlags & VPTE) && !(reqFlags & NO_FAULT)) { 147 // set VA register with faulting address 148 xc->setMiscReg(AlphaISA::IPR_VA, vaddr); 149 150 // set MM_STAT register flags 151 xc->setMiscReg(AlphaISA::IPR_MM_STAT, 152 (((EV5::Opcode(xc->getInst()) & 0x3f) << 11) 153 | ((EV5::Ra(xc->getInst()) & 0x1f) << 6) 154 | (flags & 0x3f))); 155 156 // set VA_FORM register with faulting formatted address 157 xc->setMiscReg(AlphaISA::IPR_VA_FORM, 158 xc->readMiscReg(AlphaISA::IPR_MVPTBR) | (vaddr.vpn() << 3)); 159 } 160 161 AlphaFault::invoke(xc); 162} 163 164void ItbFault::invoke(ExecContext * xc) 165{ 166 if (!xc->misspeculating()) { 167 xc->setMiscReg(AlphaISA::IPR_ITB_TAG, pc); 168 xc->setMiscReg(AlphaISA::IPR_IFAULT_VA_FORM, 169 xc->readMiscReg(AlphaISA::IPR_IVPTBR) | 170 (AlphaISA::VAddr(pc).vpn() << 3)); 171 } 172 173 AlphaFault::invoke(xc); 174} 175 176#endif 177 178} // namespace AlphaISA 179 180