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