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 + -
显示快捷键?