ev5.cc

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

CC
600
字号
      case AlphaISA::IPR_PALtemp4:      case AlphaISA::IPR_PALtemp5:      case AlphaISA::IPR_PALtemp6:      case AlphaISA::IPR_PALtemp7:      case AlphaISA::IPR_PALtemp8:      case AlphaISA::IPR_PALtemp9:      case AlphaISA::IPR_PALtemp10:      case AlphaISA::IPR_PALtemp11:      case AlphaISA::IPR_PALtemp12:      case AlphaISA::IPR_PALtemp13:      case AlphaISA::IPR_PALtemp14:      case AlphaISA::IPR_PALtemp15:      case AlphaISA::IPR_PALtemp16:      case AlphaISA::IPR_PALtemp17:      case AlphaISA::IPR_PALtemp18:      case AlphaISA::IPR_PALtemp19:      case AlphaISA::IPR_PALtemp20:      case AlphaISA::IPR_PALtemp21:      case AlphaISA::IPR_PALtemp22:      case AlphaISA::IPR_PAL_BASE:      case AlphaISA::IPR_IC_PERR_STAT:      case AlphaISA::IPR_DC_PERR_STAT:      case AlphaISA::IPR_PMCTR:        // write entire quad w/ no side-effect        ipr[idx] = val;        break;      case AlphaISA::IPR_CC_CTL:        // This IPR resets the cycle counter.  We assume this only        // happens once... let's verify that.        assert(ipr[idx] == 0);        ipr[idx] = 1;        break;      case AlphaISA::IPR_CC:        // This IPR only writes the upper 64 bits.  It's ok to write        // all 64 here since we mask out the lower 32 in rpcc (see        // isa_desc).        ipr[idx] = val;        break;      case AlphaISA::IPR_PALtemp23:        // write entire quad w/ no side-effect        old = ipr[idx];        ipr[idx] = val;#if FULL_SYSTEM        if (tc->getKernelStats())            tc->getKernelStats()->context(old, val, tc);#endif        break;      case AlphaISA::IPR_DTB_PTE:        // write entire quad w/ no side-effect, tag is forthcoming        ipr[idx] = val;        break;      case AlphaISA::IPR_EXC_ADDR:        // second least significant bit in PC is always zero        ipr[idx] = val & ~2;        break;      case AlphaISA::IPR_ASTRR:      case AlphaISA::IPR_ASTER:        // only write least significant four bits - privilege mask        ipr[idx] = val & 0xf;        break;      case AlphaISA::IPR_IPLR:#ifdef DEBUG        if (break_ipl != -1 && break_ipl == (val & 0x1f))            debug_break();#endif        // only write least significant five bits - interrupt level        ipr[idx] = val & 0x1f;#if FULL_SYSTEM        if (tc->getKernelStats())            tc->getKernelStats()->swpipl(ipr[idx]);#endif        break;      case AlphaISA::IPR_DTB_CM:#if FULL_SYSTEM        if (val & 0x18) {            if (tc->getKernelStats())                tc->getKernelStats()->mode(TheISA::Kernel::user, tc);        } else {            if (tc->getKernelStats())                tc->getKernelStats()->mode(TheISA::Kernel::kernel, tc);        }#endif      case AlphaISA::IPR_ICM:        // only write two mode bits - processor mode        ipr[idx] = val & 0x18;        break;      case AlphaISA::IPR_ALT_MODE:        // only write two mode bits - processor mode        ipr[idx] = val & 0x18;        break;      case AlphaISA::IPR_MCSR:        // more here after optimization...        ipr[idx] = val;        break;      case AlphaISA::IPR_SIRR:        // only write software interrupt mask        ipr[idx] = val & 0x7fff0;        break;      case AlphaISA::IPR_ICSR:        ipr[idx] = val & ULL(0xffffff0300);        break;      case AlphaISA::IPR_IVPTBR:      case AlphaISA::IPR_MVPTBR:        ipr[idx] = val & ULL(0xffffffffc0000000);        break;      case AlphaISA::IPR_DC_TEST_CTL:        ipr[idx] = val & 0x1ffb;        break;      case AlphaISA::IPR_DC_MODE:      case AlphaISA::IPR_MAF_MODE:        ipr[idx] = val & 0x3f;        break;      case AlphaISA::IPR_ITB_ASN:        ipr[idx] = val & 0x7f0;        break;      case AlphaISA::IPR_DTB_ASN:        ipr[idx] = val & ULL(0xfe00000000000000);        break;      case AlphaISA::IPR_EXC_SUM:      case AlphaISA::IPR_EXC_MASK:        // any write to this register clears it        ipr[idx] = 0;        break;      case AlphaISA::IPR_INTID:      case AlphaISA::IPR_SL_RCV:      case AlphaISA::IPR_MM_STAT:      case AlphaISA::IPR_ITB_PTE_TEMP:      case AlphaISA::IPR_DTB_PTE_TEMP:        // read-only registers        panic("Tried to write read only ipr %d\n", idx);      case AlphaISA::IPR_HWINT_CLR:      case AlphaISA::IPR_SL_XMIT:      case AlphaISA::IPR_DC_FLUSH:      case AlphaISA::IPR_IC_FLUSH:        // the following are write only        ipr[idx] = val;        break;      case AlphaISA::IPR_DTB_IA:        // really a control write        ipr[idx] = 0;        tc->getDTBPtr()->flushAll();        break;      case AlphaISA::IPR_DTB_IAP:        // really a control write        ipr[idx] = 0;        tc->getDTBPtr()->flushProcesses();        break;      case AlphaISA::IPR_DTB_IS:        // really a control write        ipr[idx] = val;        tc->getDTBPtr()->flushAddr(val,                EV5::DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN]));        break;      case AlphaISA::IPR_DTB_TAG: {          struct AlphaISA::TlbEntry entry;          // FIXME: granularity hints NYI...          if (EV5::DTB_PTE_GH(ipr[AlphaISA::IPR_DTB_PTE]) != 0)              panic("PTE GH field != 0");          // write entire quad          ipr[idx] = val;          // construct PTE for new entry          entry.ppn = EV5::DTB_PTE_PPN(ipr[AlphaISA::IPR_DTB_PTE]);          entry.xre = EV5::DTB_PTE_XRE(ipr[AlphaISA::IPR_DTB_PTE]);          entry.xwe = EV5::DTB_PTE_XWE(ipr[AlphaISA::IPR_DTB_PTE]);          entry.fonr = EV5::DTB_PTE_FONR(ipr[AlphaISA::IPR_DTB_PTE]);          entry.fonw = EV5::DTB_PTE_FONW(ipr[AlphaISA::IPR_DTB_PTE]);          entry.asma = EV5::DTB_PTE_ASMA(ipr[AlphaISA::IPR_DTB_PTE]);          entry.asn = EV5::DTB_ASN_ASN(ipr[AlphaISA::IPR_DTB_ASN]);          // insert new TAG/PTE value into data TLB          tc->getDTBPtr()->insert(val, entry);      }        break;      case AlphaISA::IPR_ITB_PTE: {          struct AlphaISA::TlbEntry entry;          // FIXME: granularity hints NYI...          if (EV5::ITB_PTE_GH(val) != 0)              panic("PTE GH field != 0");          // write entire quad          ipr[idx] = val;          // construct PTE for new entry          entry.ppn = EV5::ITB_PTE_PPN(val);          entry.xre = EV5::ITB_PTE_XRE(val);          entry.xwe = 0;          entry.fonr = EV5::ITB_PTE_FONR(val);          entry.fonw = EV5::ITB_PTE_FONW(val);          entry.asma = EV5::ITB_PTE_ASMA(val);          entry.asn = EV5::ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN]);          // insert new TAG/PTE value into data TLB          tc->getITBPtr()->insert(ipr[AlphaISA::IPR_ITB_TAG], entry);      }        break;      case AlphaISA::IPR_ITB_IA:        // really a control write        ipr[idx] = 0;        tc->getITBPtr()->flushAll();        break;      case AlphaISA::IPR_ITB_IAP:        // really a control write        ipr[idx] = 0;        tc->getITBPtr()->flushProcesses();        break;      case AlphaISA::IPR_ITB_IS:        // really a control write        ipr[idx] = val;        tc->getITBPtr()->flushAddr(val,                EV5::ITB_ASN_ASN(ipr[AlphaISA::IPR_ITB_ASN]));        break;      default:        // invalid IPR        panic("Tried to write to invalid ipr %d\n", idx);    }    // no error...}voidAlphaISA::copyIprs(ThreadContext *src, ThreadContext *dest){    for (int i = 0; i < NumInternalProcRegs; ++i) {        dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i));    }}#if FULL_SYSTEM/** * Check for special simulator handling of specific PAL calls. * If return value is false, actual PAL call will be suppressed. */boolSimpleThread::simPalCheck(int palFunc){    if (kernelStats)        kernelStats->callpal(palFunc, tc);    switch (palFunc) {      case PAL::halt:        halt();        if (--System::numSystemsRunning == 0)            exitSimLoop("all cpus halted");        break;      case PAL::bpt:      case PAL::bugchk:        if (system->breakpoint())            return false;        break;    }    return true;}#endif // FULL_SYSTEM

⌨️ 快捷键说明

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