miscregfile.cc

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

CC
744
字号
        break;        /** Privilged Registers */      case MISCREG_TPC:        tpc[tl-1] = val;        break;      case MISCREG_TNPC:        tnpc[tl-1] = val;        break;      case MISCREG_TSTATE:        tstate[tl-1] = val;        break;      case MISCREG_TT:        tt[tl-1] = val;        break;      case MISCREG_PRIVTICK:        panic("Priviliged access to tick regesiters not implemented\n");      case MISCREG_TBA:        // clear lower 7 bits on writes.        tba = val & ULL(~0x7FFF);        break;      case MISCREG_PSTATE:        pstate = (val & PSTATE_MASK);        break;      case MISCREG_TL:        tl = val;        break;      case MISCREG_PIL:        pil = val;        break;      case MISCREG_CWP:        cwp = val;        break;//      case MISCREG_CANSAVE://        cansave = val;//        break;//      case MISCREG_CANRESTORE://        canrestore = val;//        break;//      case MISCREG_CLEANWIN://        cleanwin = val;//        break;//      case MISCREG_OTHERWIN://        otherwin = val;//        break;//      case MISCREG_WSTATE://        wstate = val;//        break;      case MISCREG_GL:        gl = val;        break;        /** Hyper privileged registers */      case MISCREG_HPSTATE:        hpstate = val;        break;      case MISCREG_HTSTATE:        htstate[tl-1] = val;        break;      case MISCREG_HINTP:        hintp = val;      case MISCREG_HTBA:        htba = val;        break;      case MISCREG_STRAND_STS_REG:        strandStatusReg = val;        break;      case MISCREG_HSTICK_CMPR:        hstick_cmpr = val;        break;        /** Floating Point Status Register */      case MISCREG_FSR:        fsr = val;        DPRINTF(Sparc, "FSR written with: %#x\n", fsr);        break;      case MISCREG_MMU_P_CONTEXT:        priContext = val;        break;      case MISCREG_MMU_S_CONTEXT:        secContext = val;        break;      case MISCREG_MMU_PART_ID:        partId = val;        break;      case MISCREG_MMU_LSU_CTRL:        lsuCtrlReg = val;        break;      case MISCREG_SCRATCHPAD_R0:        scratchPad[0] = val;        break;      case MISCREG_SCRATCHPAD_R1:        scratchPad[1] = val;        break;      case MISCREG_SCRATCHPAD_R2:        scratchPad[2] = val;        break;      case MISCREG_SCRATCHPAD_R3:        scratchPad[3] = val;        break;      case MISCREG_SCRATCHPAD_R4:        scratchPad[4] = val;        break;      case MISCREG_SCRATCHPAD_R5:        scratchPad[5] = val;        break;      case MISCREG_SCRATCHPAD_R6:        scratchPad[6] = val;        break;      case MISCREG_SCRATCHPAD_R7:        scratchPad[7] = val;        break;      case MISCREG_QUEUE_CPU_MONDO_HEAD:        cpu_mondo_head = val;        break;      case MISCREG_QUEUE_CPU_MONDO_TAIL:        cpu_mondo_tail = val;        break;      case MISCREG_QUEUE_DEV_MONDO_HEAD:        dev_mondo_head = val;        break;      case MISCREG_QUEUE_DEV_MONDO_TAIL:        dev_mondo_tail = val;        break;      case MISCREG_QUEUE_RES_ERROR_HEAD:        res_error_head = val;        break;      case MISCREG_QUEUE_RES_ERROR_TAIL:        res_error_tail = val;        break;      case MISCREG_QUEUE_NRES_ERROR_HEAD:        nres_error_head = val;        break;      case MISCREG_QUEUE_NRES_ERROR_TAIL:        nres_error_tail = val;        break;      default:        panic("Miscellaneous register %d not implemented\n", miscReg);    }}void MiscRegFile::setReg(int miscReg,        const MiscReg &val, ThreadContext * tc){    MiscReg new_val = val;    switch (miscReg) {      case MISCREG_STICK:      case MISCREG_TICK:        // stick and tick are same thing on niagra        // use stick for offset and tick for holding intrrupt bit        stick = mbits(val,62,0) - tc->getCpuPtr()->instCount();        tick = mbits(val,63,63);        DPRINTF(Timer, "Writing TICK=%#X\n", val);        break;      case MISCREG_FPRS:        //Configure the fpu based on the fprs        break;      case MISCREG_PCR:        //Set up performance counting based on pcr value        break;      case MISCREG_PSTATE:        pstate = val & PSTATE_MASK;        return;      case MISCREG_TL:        tl = val;#if FULL_SYSTEM        if (hpstate & HPSTATE::tlz && tl == 0 && !(hpstate & HPSTATE::hpriv))            tc->getCpuPtr()->post_interrupt(IT_TRAP_LEVEL_ZERO,0);        else            tc->getCpuPtr()->clear_interrupt(IT_TRAP_LEVEL_ZERO,0);#endif        return;      case MISCREG_CWP:        new_val = val >= NWindows ? NWindows - 1 : val;        if (val >= NWindows)            new_val = NWindows - 1;        tc->changeRegFileContext(CONTEXT_CWP, new_val);        break;      case MISCREG_GL:        tc->changeRegFileContext(CONTEXT_GLOBALS, val);        break;      case MISCREG_PIL:      case MISCREG_SOFTINT:      case MISCREG_SOFTINT_SET:      case MISCREG_SOFTINT_CLR:      case MISCREG_TICK_CMPR:      case MISCREG_STICK_CMPR:      case MISCREG_HINTP:      case MISCREG_HTSTATE:      case MISCREG_HTBA:      case MISCREG_HVER:      case MISCREG_STRAND_STS_REG:      case MISCREG_HSTICK_CMPR:      case MISCREG_QUEUE_CPU_MONDO_HEAD:      case MISCREG_QUEUE_CPU_MONDO_TAIL:      case MISCREG_QUEUE_DEV_MONDO_HEAD:      case MISCREG_QUEUE_DEV_MONDO_TAIL:      case MISCREG_QUEUE_RES_ERROR_HEAD:      case MISCREG_QUEUE_RES_ERROR_TAIL:      case MISCREG_QUEUE_NRES_ERROR_HEAD:      case MISCREG_QUEUE_NRES_ERROR_TAIL:#if FULL_SYSTEM      case MISCREG_HPSTATE:        setFSReg(miscReg, val, tc);        return;#else      case MISCREG_HPSTATE:        //HPSTATE is special because normal trap processing saves HPSTATE when        //it goes into a trap, and restores it when it returns.        return;      panic("Accessing Fullsystem register %s to %#x in SE mode\n", getMiscRegName(miscReg), val);#endif    }    setRegNoEffect(miscReg, new_val);}void MiscRegFile::serialize(std::ostream & os){    SERIALIZE_SCALAR(asi);    SERIALIZE_SCALAR(tick);    SERIALIZE_SCALAR(fprs);    SERIALIZE_SCALAR(gsr);    SERIALIZE_SCALAR(softint);    SERIALIZE_SCALAR(tick_cmpr);    SERIALIZE_SCALAR(stick);    SERIALIZE_SCALAR(stick_cmpr);    SERIALIZE_ARRAY(tpc,MaxTL);    SERIALIZE_ARRAY(tnpc,MaxTL);    SERIALIZE_ARRAY(tstate,MaxTL);    SERIALIZE_ARRAY(tt,MaxTL);    SERIALIZE_SCALAR(tba);    SERIALIZE_SCALAR(pstate);    SERIALIZE_SCALAR(tl);    SERIALIZE_SCALAR(pil);    SERIALIZE_SCALAR(cwp);    SERIALIZE_SCALAR(gl);    SERIALIZE_SCALAR(hpstate);    SERIALIZE_ARRAY(htstate,MaxTL);    SERIALIZE_SCALAR(hintp);    SERIALIZE_SCALAR(htba);    SERIALIZE_SCALAR(hstick_cmpr);    SERIALIZE_SCALAR(strandStatusReg);    SERIALIZE_SCALAR(fsr);    SERIALIZE_SCALAR(priContext);    SERIALIZE_SCALAR(secContext);    SERIALIZE_SCALAR(partId);    SERIALIZE_SCALAR(lsuCtrlReg);    SERIALIZE_ARRAY(scratchPad,8);    SERIALIZE_SCALAR(cpu_mondo_head);    SERIALIZE_SCALAR(cpu_mondo_tail);    SERIALIZE_SCALAR(dev_mondo_head);    SERIALIZE_SCALAR(dev_mondo_tail);    SERIALIZE_SCALAR(res_error_head);    SERIALIZE_SCALAR(res_error_tail);    SERIALIZE_SCALAR(nres_error_head);    SERIALIZE_SCALAR(nres_error_tail);#if FULL_SYSTEM    Tick tick_cmp = 0, stick_cmp = 0, hstick_cmp = 0;    ThreadContext *tc = NULL;    BaseCPU *cpu = NULL;    int tc_num = 0;    bool tick_intr_sched = true;    if (tickCompare)        tc = tickCompare->getTC();    else if (sTickCompare)        tc = sTickCompare->getTC();    else if (hSTickCompare)        tc = hSTickCompare->getTC();    else        tick_intr_sched = false;    SERIALIZE_SCALAR(tick_intr_sched);    if (tc) {        cpu = tc->getCpuPtr();        tc_num = cpu->findContext(tc);        if (tickCompare && tickCompare->scheduled())            tick_cmp = tickCompare->when();        if (sTickCompare && sTickCompare->scheduled())            stick_cmp = sTickCompare->when();        if (hSTickCompare && hSTickCompare->scheduled())            hstick_cmp = hSTickCompare->when();        SERIALIZE_OBJPTR(cpu);        SERIALIZE_SCALAR(tc_num);        SERIALIZE_SCALAR(tick_cmp);        SERIALIZE_SCALAR(stick_cmp);        SERIALIZE_SCALAR(hstick_cmp);    }#endif}void MiscRegFile::unserialize(Checkpoint * cp, const std::string & section){    UNSERIALIZE_SCALAR(asi);    UNSERIALIZE_SCALAR(tick);    UNSERIALIZE_SCALAR(fprs);    UNSERIALIZE_SCALAR(gsr);    UNSERIALIZE_SCALAR(softint);    UNSERIALIZE_SCALAR(tick_cmpr);    UNSERIALIZE_SCALAR(stick);    UNSERIALIZE_SCALAR(stick_cmpr);    UNSERIALIZE_ARRAY(tpc,MaxTL);    UNSERIALIZE_ARRAY(tnpc,MaxTL);    UNSERIALIZE_ARRAY(tstate,MaxTL);    UNSERIALIZE_ARRAY(tt,MaxTL);    UNSERIALIZE_SCALAR(tba);    UNSERIALIZE_SCALAR(pstate);    UNSERIALIZE_SCALAR(tl);    UNSERIALIZE_SCALAR(pil);    UNSERIALIZE_SCALAR(cwp);    UNSERIALIZE_SCALAR(gl);    UNSERIALIZE_SCALAR(hpstate);    UNSERIALIZE_ARRAY(htstate,MaxTL);    UNSERIALIZE_SCALAR(hintp);    UNSERIALIZE_SCALAR(htba);    UNSERIALIZE_SCALAR(hstick_cmpr);    UNSERIALIZE_SCALAR(strandStatusReg);    UNSERIALIZE_SCALAR(fsr);    UNSERIALIZE_SCALAR(priContext);    UNSERIALIZE_SCALAR(secContext);    UNSERIALIZE_SCALAR(partId);    UNSERIALIZE_SCALAR(lsuCtrlReg);    UNSERIALIZE_ARRAY(scratchPad,8);    UNSERIALIZE_SCALAR(cpu_mondo_head);    UNSERIALIZE_SCALAR(cpu_mondo_tail);    UNSERIALIZE_SCALAR(dev_mondo_head);    UNSERIALIZE_SCALAR(dev_mondo_tail);    UNSERIALIZE_SCALAR(res_error_head);    UNSERIALIZE_SCALAR(res_error_tail);    UNSERIALIZE_SCALAR(nres_error_head);    UNSERIALIZE_SCALAR(nres_error_tail);#if FULL_SYSTEM    Tick tick_cmp = 0, stick_cmp = 0, hstick_cmp = 0;    ThreadContext *tc = NULL;    BaseCPU *cpu = NULL;    int tc_num;    bool tick_intr_sched;    UNSERIALIZE_SCALAR(tick_intr_sched);    if (tick_intr_sched) {        UNSERIALIZE_OBJPTR(cpu);        if (cpu) {            UNSERIALIZE_SCALAR(tc_num);            UNSERIALIZE_SCALAR(tick_cmp);            UNSERIALIZE_SCALAR(stick_cmp);            UNSERIALIZE_SCALAR(hstick_cmp);            tc = cpu->getContext(tc_num);            if (tick_cmp) {                tickCompare = new TickCompareEvent(this, tc);                tickCompare->schedule(tick_cmp);            }            if (stick_cmp)  {                sTickCompare = new STickCompareEvent(this, tc);                sTickCompare->schedule(stick_cmp);            }            if (hstick_cmp)  {                hSTickCompare = new HSTickCompareEvent(this, tc);                hSTickCompare->schedule(hstick_cmp);            }        }    } #endif}

⌨️ 快捷键说明

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