misc_regfile.cc

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

CC
638
字号
/* * Copyright (c) 2006 * 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: 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. (∪MIPS∩) 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.∩  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: Korey Sewell *          Jaidev Patwardhan * */#include "base/bitfield.hh"#include "arch/mips/regfile/misc_regfile.hh"#include "arch/mips/mt_constants.hh"#include "arch/mips/pra_constants.hh"#include "cpu/thread_context.hh"#include "cpu/base.hh"#include "cpu/exetrace.hh"using namespace std;std::string MiscRegFile::miscRegNames[NumMiscRegs] ={"Index", "MVPControl", "MVPConf0", "MVPConf1", "", "", "", "", "Random", "VPEControl", "VPEConf0", "VPEConf1", "YQMask", "VPESchedule", "VPEScheFBack", "VPEOpt", "EntryLo0", "TCStatus", "TCBind", "TCRestart", "TCHalt", "TCContext", "TCSchedule", "TCScheFBack", "EntryLo1", "", "", "", "", "", "", "", "Context", "ContextConfig", "", "", "", "", "", "", "PageMask", "PageGrain", "", "", "", "", "", "", "Wired", "SRSConf0", "SRCConf1", "SRSConf2", "SRSConf3", "SRSConf4", "", "", "HWREna", "", "", "", "", "", "", "", "BadVAddr", "", "", "", "", "", "", "", "Count", "", "", "", "", "", "", "", "EntryHi", "", "", "", "", "", "", "", "Compare", "", "", "", "", "", "", "", "Status", "IntCtl", "SRSCtl", "SRSMap", "", "", "", "", "Cause", "", "", "", "", "", "", "", "EPC", "", "", "", "", "", "", "", "PRId", "EBase", "", "", "", "", "", "", "Config", "Config1", "Config2", "Config3", "", "", "", "", "LLAddr", "", "", "", "", "", "", "", "WatchLo0", "WatchLo1", "WatchLo2", "WatchLo3", "WatchLo4", "WatchLo5", "WatchLo6", "WatchLo7", "WatchHi0", "WatchHi1", "WatchHi2", "WatchHi3", "WatchHi4", "WatchHi5", "WatchHi6", "WatchHi7", "XCContext64", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Debug", "TraceControl1", "TraceControl2", "UserTraceData", "TraceBPC", "", "", "", "DEPC", "", "", "", "", "", "", "", "PerfCnt0", "PerfCnt1", "PerfCnt2", "PerfCnt3", "PerfCnt4", "PerfCnt5", "PerfCnt6", "PerfCnt7", "ErrCtl", "", "", "", "", "", "", "", "CacheErr0", "CacheErr1", "CacheErr2", "CacheErr3", "", "", "", "", "TagLo0", "DataLo1", "TagLo2", "DataLo3", "TagLo4", "DataLo5", "TagLo6", "DataLo7", "TagHi0", "DataHi1", "TagHi2", "DataHi3", "TagHi4", "DataHi5", "TagHi6", "DataHi7", "ErrorEPC", "", "", "", "", "", "", "", "DESAVE", "", "", "", "", "", "", "", "LLFlag"};MiscRegFile::MiscRegFile(){    init();}MiscRegFile::MiscRegFile(BaseCPU *_cpu){    cpu = _cpu;    init();}voidMiscRegFile::init(){    miscRegFile.resize(NumMiscRegs);    bankType.resize(NumMiscRegs);    for (int i=0; i < NumMiscRegs; i++) {        miscRegFile[i].resize(1);        bankType[i] = perProcessor;    }    miscRegFile_WriteMask.resize(NumMiscRegs);    for (int i=0; i < NumMiscRegs; i++) {      miscRegFile_WriteMask[i].push_back(0);    }    clear(0);}voidMiscRegFile::clear(unsigned tid_or_vpn){    for(int i = 0; i < NumMiscRegs; i++) {        miscRegFile[i][tid_or_vpn] = 0;        miscRegFile_WriteMask[i][tid_or_vpn] = (long unsigned int)(-1);    }}voidMiscRegFile::expandForMultithreading(unsigned num_threads, unsigned num_vpes){    // Initialize all Per-VPE regs    uint32_t per_vpe_regs[] = { VPEControl, VPEConf0, VPEConf1, YQMask,                                VPESchedule, VPEScheFBack, VPEOpt, SRSConf0,                                SRSConf1, SRSConf2, SRSConf3, SRSConf4,                                EBase                              };    uint32_t num_vpe_regs = sizeof(per_vpe_regs) / 4;    for (int i = 0; i < num_vpe_regs; i++) {        if (num_vpes > 1) {            miscRegFile[per_vpe_regs[i]].resize(num_vpes);        }        bankType[per_vpe_regs[i]] = perVirtProcessor;    }    // Initialize all Per-TC regs    uint32_t per_tc_regs[] = { Status, TCStatus, TCBind, TCRestart, TCHalt,                               TCContext, TCSchedule, TCScheFBack, Debug,                               LLAddr                             };    uint32_t num_tc_regs = sizeof(per_tc_regs) /  4;    for (int i = 0; i < num_tc_regs; i++) {        miscRegFile[per_tc_regs[i]].resize(num_threads);        bankType[per_tc_regs[i]] = perThreadContext;    }    if (num_vpes > 1) {        for (int i=1; i < num_vpes; i++) {            clear(i);        }    }}int MiscRegFile::getInstAsid(){  MiscReg Entry_Hi = readRegNoEffect(EntryHi);  return bits(Entry_Hi,EntryHi_ASID_HI,EntryHi_ASID_LO);}int MiscRegFile:: getDataAsid(){  MiscReg EHi = readRegNoEffect(EntryHi);  return bits(EHi,EntryHi_ASID_HI,EntryHi_ASID_LO);}//@TODO: Use MIPS STYLE CONSTANTS (e.g. TCHALT_H instead of TCH_H)voidMiscRegFile::reset(std::string core_name, unsigned num_threads,                   unsigned num_vpes, BaseCPU *_cpu){    DPRINTF(MipsPRA, "Resetting CP0 State with %i TCs and %i VPEs\n",            num_threads, num_vpes);    cpu = _cpu;    const BaseCPU::Params *p = _cpu->params;    // Do Default CP0 initialization HERE    // Do Initialization for MT cores here (eventually use    // core_name parameter to toggle this initialization)    // ===================================================    DPRINTF(MipsPRA, "Initializing CP0 State.... ");    MiscReg ProcID = readRegNoEffect(PRId);    replaceBits(ProcID,PRIdCoOp_HI,PRIdCoOp_LO,p->coreParams.CP0_PRId_CompanyOptions);    replaceBits(ProcID,PRIdCoID_HI,PRIdCoID_LO,p->coreParams.CP0_PRId_CompanyID);    replaceBits(ProcID,PRIdProc_ID_HI,PRIdProc_ID_LO,p->coreParams.CP0_PRId_ProcessorID);    replaceBits(ProcID,PRIdRev_HI,PRIdRev_LO,p->coreParams.CP0_PRId_Revision);    setRegNoEffect(PRId,ProcID);    // Now, create Write Mask for ProcID register    MiscReg ProcID_Mask = 0; // Read-Only register    replaceBits(ProcID_Mask,0,32,0);    setRegMask(PRId,ProcID_Mask);    // Config    MiscReg cfg = readRegNoEffect(Config);    replaceBits(cfg, Config_BE_HI, Config_BE_LO, p->coreParams.CP0_Config_BE);    replaceBits(cfg, Config_AT_HI, Config_AT_LO, p->coreParams.CP0_Config_AT);    replaceBits(cfg, Config_AR_HI, Config_AR_LO, p->coreParams.CP0_Config_AR);    replaceBits(cfg, Config_MT_HI, Config_MT_LO, p->coreParams.CP0_Config_MT);    replaceBits(cfg, Config_VI_HI, Config_VI_LO, p->coreParams.CP0_Config_VI);    replaceBits(cfg, Config_M, 1);    setRegNoEffect(Config, cfg);    // Now, create Write Mask for Config register    MiscReg cfg_Mask = 0x7FFF0007;    replaceBits(cfg_Mask,0,32,0);    setRegMask(Config,cfg_Mask);    // Config1    MiscReg cfg1 = readRegNoEffect(Config1);    replaceBits(cfg1, Config1_MMUSize_HI, Config1_MMUSize_LO, p->coreParams.CP0_Config1_MMU);    replaceBits(cfg1, Config1_IS_HI, Config1_IS_LO, p->coreParams.CP0_Config1_IS);    replaceBits(cfg1, Config1_IL_HI, Config1_IL_LO, p->coreParams.CP0_Config1_IL);    replaceBits(cfg1, Config1_IA_HI, Config1_IA_LO, p->coreParams.CP0_Config1_IA);    replaceBits(cfg1, Config1_DS_HI, Config1_DS_LO, p->coreParams.CP0_Config1_DS);    replaceBits(cfg1, Config1_DL_HI, Config1_DL_LO, p->coreParams.CP0_Config1_DL);    replaceBits(cfg1, Config1_DA_HI, Config1_DA_LO, p->coreParams.CP0_Config1_DA);    replaceBits(cfg1, Config1_FP_HI, Config1_FP_LO, p->coreParams.CP0_Config1_FP);    replaceBits(cfg1, Config1_EP_HI, Config1_EP_LO, p->coreParams.CP0_Config1_EP);    replaceBits(cfg1, Config1_WR_HI, Config1_WR_LO, p->coreParams.CP0_Config1_WR);    replaceBits(cfg1, Config1_MD_HI, Config1_MD_LO, p->coreParams.CP0_Config1_MD);    replaceBits(cfg1, Config1_C2_HI, Config1_C2_LO, p->coreParams.CP0_Config1_C2);    replaceBits(cfg1, Config1_PC_HI, Config1_PC_LO, p->coreParams.CP0_Config1_PC);    replaceBits(cfg1, Config1_M, p->coreParams.CP0_Config1_M);    setRegNoEffect(Config1, cfg1);    // Now, create Write Mask for Config register    MiscReg cfg1_Mask = 0; // Read Only Register    replaceBits(cfg1_Mask,0,32,0);    setRegMask(Config1,cfg1_Mask);    // Config2    MiscReg cfg2 = readRegNoEffect(Config2);    replaceBits(cfg2, Config2_TU_HI, Config2_TU_LO, p->coreParams.CP0_Config2_TU);    replaceBits(cfg2, Config2_TS_HI, Config2_TS_LO, p->coreParams.CP0_Config2_TS);    replaceBits(cfg2, Config2_TL_HI, Config2_TL_LO, p->coreParams.CP0_Config2_TL);    replaceBits(cfg2, Config2_TA_HI, Config2_TA_LO, p->coreParams.CP0_Config2_TA);    replaceBits(cfg2, Config2_SU_HI, Config2_SU_LO, p->coreParams.CP0_Config2_SU);    replaceBits(cfg2, Config2_SS_HI, Config2_SS_LO, p->coreParams.CP0_Config2_SS);    replaceBits(cfg2, Config2_SL_HI, Config2_SL_LO, p->coreParams.CP0_Config2_SL);    replaceBits(cfg2, Config2_SA_HI, Config2_SA_LO, p->coreParams.CP0_Config2_SA);    replaceBits(cfg2, Config2_M, p->coreParams.CP0_Config2_M);    setRegNoEffect(Config2, cfg2);    // Now, create Write Mask for Config register    MiscReg cfg2_Mask = 0x7000F000; // Read Only Register    replaceBits(cfg2_Mask,0,32,0);    setRegMask(Config2,cfg2_Mask);    // Config3    MiscReg cfg3 = readRegNoEffect(Config3);    replaceBits(cfg3, Config3_DSPP_HI, Config3_DSPP_LO, p->coreParams.CP0_Config3_DSPP);    replaceBits(cfg3, Config3_LPA_HI, Config3_LPA_LO, p->coreParams.CP0_Config3_LPA);    replaceBits(cfg3, Config3_VEIC_HI, Config3_VEIC_LO, p->coreParams.CP0_Config3_VEIC);    replaceBits(cfg3, Config3_VINT_HI, Config3_VINT_LO, p->coreParams.CP0_Config3_VInt);    replaceBits(cfg3, Config3_SP_HI, Config3_SP_LO, p->coreParams.CP0_Config3_SP);    replaceBits(cfg3, Config3_MT_HI, Config3_MT_LO, p->coreParams.CP0_Config3_MT);    replaceBits(cfg3, Config3_SM_HI, Config3_SM_LO, p->coreParams.CP0_Config3_SM);    replaceBits(cfg3, Config3_TL_HI, Config3_TL_LO, p->coreParams.CP0_Config3_TL);    setRegNoEffect(Config3, cfg3);    // Now, create Write Mask for Config register    MiscReg cfg3_Mask = 0; // Read Only Register    replaceBits(cfg3_Mask,0,32,0);    setRegMask(Config3,cfg3_Mask);    // EBase - CPUNum    MiscReg EB = readRegNoEffect(EBase);    replaceBits(EB, EBase_CPUNum_HI, EBase_CPUNum_LO, p->coreParams.CP0_EBase_CPUNum);    replaceBits(EB, 31, 31, 1);    setRegNoEffect(EBase, EB);    // Now, create Write Mask for Config register    MiscReg EB_Mask = 0x3FFFF000;// Except Exception Base, the                                 // entire register is read only    replaceBits(EB_Mask,0,32,0);    setRegMask(EBase,EB_Mask);    // SRS Control - HSS (Highest Shadow Set)    MiscReg SC = readRegNoEffect(SRSCtl);    replaceBits(SC, SRSCtl_HSS_HI,SRSCtl_HSS_LO,p->coreParams.CP0_SrsCtl_HSS);    setRegNoEffect(SRSCtl, SC);    // Now, create Write Mask for the SRS Ctl register    MiscReg SC_Mask = 0x0000F3C0;

⌨️ 快捷键说明

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