faults.cc

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 554 行 · 第 1/2 页

CC
554
字号
/* * Copyright (c) 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Gabe M. Black *          Korey L. Sewell * *//* * Copyright (c) 2007 MIPS Technologies, Inc.  All Rights Reserved * * This software is part of the M5 simulator. * * THIS IS A LEGAL AGREEMENT.  BY DOWNLOADING, USING, COPYING, CREATING * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING * TO THESE TERMS AND CONDITIONS. * * Permission is granted to use, copy, create derivative works and * distribute this software and such derivative works for any purpose, * so long as (1) the copyright notice above, this grant of permission, * and the disclaimer below appear in all copies and derivative works * made, (2) the copyright notice above is augmented as appropriate to * reflect the addition of any new copyrightable work in a derivative * work (e.g., Copyright (c) <Publication Year> Copyright Owner), and (3) * the name of MIPS Technologies, Inc. ($B!H(BMIPS$B!I(B) is not used in any * advertising or publicity pertaining to the use or distribution of * this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED $B!H(BAS IS.$B!I(B  MIPS MAKES NO WARRANTIES AND * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE. * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE. * * Authors: Jaidev Patwardhan * */#include "arch/mips/faults.hh"#include "cpu/thread_context.hh"#include "cpu/base.hh"#include "base/trace.hh"#include "arch/mips/pra_constants.hh"#if !FULL_SYSTEM#include "sim/process.hh"#include "mem/page_table.hh"#endifnamespace MipsISA{FaultName MachineCheckFault::_name = "Machine Check";FaultVect MachineCheckFault::_vect = 0x0401;FaultStat MachineCheckFault::_count;FaultName AlignmentFault::_name = "Alignment";FaultVect AlignmentFault::_vect = 0x0301;FaultStat AlignmentFault::_count;FaultName ResetFault::_name = "Reset Fault";#if  FULL_SYSTEMFaultVect ResetFault::_vect = 0xBFC00000;#elseFaultVect ResetFault::_vect = 0x001;#endifFaultStat ResetFault::_count;FaultName AddressErrorFault::_name = "Address Error";FaultVect AddressErrorFault::_vect = 0x0180;FaultStat AddressErrorFault::_count;FaultName StoreAddressErrorFault::_name = "Store Address Error";FaultVect StoreAddressErrorFault::_vect = 0x0180;FaultStat StoreAddressErrorFault::_count;FaultName SystemCallFault::_name = "Syscall";FaultVect SystemCallFault::_vect = 0x0180;FaultStat SystemCallFault::_count;FaultName CoprocessorUnusableFault::_name = "Coprocessor Unusable Fault";FaultVect CoprocessorUnusableFault::_vect = 0x180;FaultStat CoprocessorUnusableFault::_count;FaultName ReservedInstructionFault::_name = "Reserved Instruction Fault";FaultVect ReservedInstructionFault::_vect = 0x0180;FaultStat ReservedInstructionFault::_count;FaultName ThreadFault::_name = "Thread Fault";FaultVect ThreadFault::_vect = 0x00F1;FaultStat ThreadFault::_count;FaultName ArithmeticFault::_name = "Arithmetic Overflow Exception";FaultVect ArithmeticFault::_vect = 0x180;FaultStat ArithmeticFault::_count;FaultName UnimplementedOpcodeFault::_name = "opdec";FaultVect UnimplementedOpcodeFault::_vect = 0x0481;FaultStat UnimplementedOpcodeFault::_count;FaultName InterruptFault::_name = "interrupt";FaultVect InterruptFault::_vect = 0x0180;FaultStat InterruptFault::_count;FaultName TrapFault::_name = "Trap";FaultVect TrapFault::_vect = 0x0180;FaultStat TrapFault::_count;FaultName BreakpointFault::_name = "Breakpoint";FaultVect BreakpointFault::_vect = 0x0180;FaultStat BreakpointFault::_count;FaultName ItbInvalidFault::_name = "Invalid TLB Entry Exception (I-Fetch/LW)";FaultVect ItbInvalidFault::_vect = 0x0180;FaultStat ItbInvalidFault::_count;FaultName ItbPageFault::_name = "itbmiss";FaultVect ItbPageFault::_vect = 0x0181;FaultStat ItbPageFault::_count;FaultName ItbMissFault::_name = "itbmiss";FaultVect ItbMissFault::_vect = 0x0181;FaultStat ItbMissFault::_count;FaultName ItbAcvFault::_name = "iaccvio";FaultVect ItbAcvFault::_vect = 0x0081;FaultStat ItbAcvFault::_count;FaultName ItbRefillFault::_name = "TLB Refill Exception (I-Fetch/LW)";FaultVect ItbRefillFault::_vect = 0x0180;FaultStat ItbRefillFault::_count;FaultName NDtbMissFault::_name = "dtb_miss_single";FaultVect NDtbMissFault::_vect = 0x0201;FaultStat NDtbMissFault::_count;FaultName PDtbMissFault::_name = "dtb_miss_double";FaultVect PDtbMissFault::_vect = 0x0281;FaultStat PDtbMissFault::_count;FaultName DtbPageFault::_name = "dfault";FaultVect DtbPageFault::_vect = 0x0381;FaultStat DtbPageFault::_count;FaultName DtbAcvFault::_name = "dfault";FaultVect DtbAcvFault::_vect = 0x0381;FaultStat DtbAcvFault::_count;FaultName DtbInvalidFault::_name = "Invalid TLB Entry Exception (Store)";FaultVect DtbInvalidFault::_vect = 0x0180;FaultStat DtbInvalidFault::_count;FaultName DtbRefillFault::_name = "TLB Refill Exception (Store)";FaultVect DtbRefillFault::_vect = 0x0180;FaultStat DtbRefillFault::_count;FaultName TLBModifiedFault::_name = "TLB Modified Exception";FaultVect TLBModifiedFault::_vect = 0x0180;FaultStat TLBModifiedFault::_count;FaultName FloatEnableFault::_name = "float_enable_fault";FaultVect FloatEnableFault::_vect = 0x0581;FaultStat FloatEnableFault::_count;FaultName IntegerOverflowFault::_name = "Integer Overflow Fault";FaultVect IntegerOverflowFault::_vect = 0x0501;FaultStat IntegerOverflowFault::_count;FaultName DspStateDisabledFault::_name = "DSP Disabled Fault";FaultVect DspStateDisabledFault::_vect = 0x001a;FaultStat DspStateDisabledFault::_count;#if FULL_SYSTEMvoid MipsFault::setHandlerPC(Addr HandlerBase, ThreadContext *tc){  tc->setPC(HandlerBase);  tc->setNextPC(HandlerBase+sizeof(MachInst));  tc->setNextNPC(HandlerBase+2*sizeof(MachInst));}void MipsFault::setExceptionState(ThreadContext *tc,uint8_t ExcCode){  // modify SRS Ctl - Save CSS, put ESS into CSS  MiscReg stat = tc->readMiscReg(MipsISA::Status);  if(bits(stat,Status_EXL) != 1 && bits(stat,Status_BEV) != 1)    {      // SRS Ctl is modified only if Status_EXL and Status_BEV are not set      MiscReg srs = tc->readMiscReg(MipsISA::SRSCtl);      uint8_t CSS,ESS;      CSS = bits(srs,SRSCtl_CSS_HI,SRSCtl_CSS_LO);      ESS = bits(srs,SRSCtl_ESS_HI,SRSCtl_ESS_LO);      // Move CSS to PSS      replaceBits(srs,SRSCtl_PSS_HI,SRSCtl_PSS_LO,CSS);      // Move ESS to CSS      replaceBits(srs,SRSCtl_CSS_HI,SRSCtl_CSS_LO,ESS);      tc->setMiscRegNoEffect(MipsISA::SRSCtl,srs);      //tc->setShadowSet(ESS);    }  // set EXL bit (don't care if it is already set!)  replaceBits(stat,Status_EXL_HI,Status_EXL_LO,1);  tc->setMiscRegNoEffect(MipsISA::Status,stat);  // write EPC  //  warn("Set EPC to %x\n",tc->readPC());  // CHECK ME  or FIXME or FIX ME or POSSIBLE HACK  // Check to see if the exception occurred in the branch delay slot  DPRINTF(MipsPRA,"PC: %x, NextPC: %x, NNPC: %x\n",tc->readPC(),tc->readNextPC(),tc->readNextNPC());  int C_BD=0;  if(tc->readPC() + sizeof(MachInst) != tc->readNextPC()){    tc->setMiscRegNoEffect(MipsISA::EPC,tc->readPC()-sizeof(MachInst));    // In the branch delay slot? set CAUSE_31    C_BD = 1;  } else {    tc->setMiscRegNoEffect(MipsISA::EPC,tc->readPC());    // In the branch delay slot? reset CAUSE_31    C_BD = 0;  }  // Set Cause_EXCCODE field  MiscReg cause = tc->readMiscReg(MipsISA::Cause);  replaceBits(cause,Cause_EXCCODE_HI,Cause_EXCCODE_LO,ExcCode);  replaceBits(cause,Cause_BD_HI,Cause_BD_LO,C_BD);  replaceBits(cause,Cause_CE_HI,Cause_CE_LO,0);  tc->setMiscRegNoEffect(MipsISA::Cause,cause);}void ArithmeticFault::invoke(ThreadContext *tc){  DPRINTF(MipsPRA,"%s encountered.\n", name());  setExceptionState(tc,0xC);  // Set new PC  Addr HandlerBase;  MiscReg stat = tc->readMiscReg(MipsISA::Status);  // Here, the handler is dependent on BEV, which is not modified by setExceptionState()  if(bits(stat,Status_BEV)==0){ // See MIPS ARM Vol 3, Revision 2, Page 38    HandlerBase= vect() + tc->readMiscReg(MipsISA::EBase);  }else{    HandlerBase = 0xBFC00200;  }  setHandlerPC(HandlerBase,tc);  //      warn("Exception Handler At: %x \n",HandlerBase);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?