malta_cchip.cc

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

CC
536
字号
              itintr = (pkt->get<uint64_t>() >> 4) & 0xF;            if (itintr) {                  clearITI(itintr);                supportedWrite = true;            }              // ignore NXMs              if (pkt->get<uint64_t>() & 0x10000000)                  supportedWrite = true;            if(!supportedWrite)                  panic("TSDEV_CC_MISC write not implemented\n");            break;            case TSDEV_CC_AAR0:            case TSDEV_CC_AAR1:            case TSDEV_CC_AAR2:            case TSDEV_CC_AAR3:                panic("TSDEV_CC_AARx write not implemeted\n");            case TSDEV_CC_DIM0:            case TSDEV_CC_DIM1:            case TSDEV_CC_DIM2:            case TSDEV_CC_DIM3:                int number;                if(regnum == TSDEV_CC_DIM0)                    number = 0;                else if(regnum == TSDEV_CC_DIM1)                    number = 1;                else if(regnum == TSDEV_CC_DIM2)                    number = 2;                else                    number = 3;                uint64_t bitvector;                uint64_t olddim;                uint64_t olddir;                olddim = dim[number];                olddir = dir[number];                dim[number] = pkt->get<uint64_t>();                dir[number] = dim[number] & drir;                for(int x = 0; x < 64; x++)                {                    bitvector = ULL(1) << x;                    // Figure out which bits have changed                    if ((dim[number] & bitvector) != (olddim & bitvector))                    {                        // The bit is now set and it wasn't before (set)                        if((dim[number] & bitvector) && (dir[number] & bitvector))                        {                          malta->intrctrl->post(number, TheISA::INTLEVEL_IRQ1, x);                          DPRINTF(Malta, "posting dir interrupt to cpu 0\n");                        }                        else if ((olddir & bitvector) &&                                !(dir[number] & bitvector))                        {                            // The bit was set and now its now clear and                            // we were interrupting on that bit before                            malta->intrctrl->clear(number, TheISA::INTLEVEL_IRQ1, x);                          DPRINTF(Malta, "dim write resulting in clear"                                    " dir interrupt to cpu %d\n",                                    x);                        }                    }                }                break;            case TSDEV_CC_DIR0:            case TSDEV_CC_DIR1:            case TSDEV_CC_DIR2:            case TSDEV_CC_DIR3:                panic("TSDEV_CC_DIR write not implemented\n");            case TSDEV_CC_DRIR:                panic("TSDEV_CC_DRIR write not implemented\n");            case TSDEV_CC_PRBEN:                panic("TSDEV_CC_PRBEN write not implemented\n");            case TSDEV_CC_IIC0:            case TSDEV_CC_IIC1:            case TSDEV_CC_IIC2:            case TSDEV_CC_IIC3:                panic("TSDEV_CC_IICx write not implemented\n");            case TSDEV_CC_MPR0:            case TSDEV_CC_MPR1:            case TSDEV_CC_MPR2:            case TSDEV_CC_MPR3:                panic("TSDEV_CC_MPRx write not implemented\n");            case TSDEV_CC_IPIR:                clearIPI(pkt->get<uint64_t>());                break;            case TSDEV_CC_ITIR:                clearITI(pkt->get<uint64_t>());                break;            case TSDEV_CC_IPIQ:                reqIPI(pkt->get<uint64_t>());                break;            default:              panic("default in cchip read reached, accessing 0x%x\n");        }  // swtich(regnum)    } // not BIG_TSUNAMI write    pkt->result = Packet::Success;    return pioDelay;    */}voidMaltaCChip::clearIPI(uint64_t ipintr){                panic("MaltaCCHIP::clear() not implemented.");                /*    int numcpus = malta->intrctrl->cpu->system->threadContexts.size();    assert(numcpus <= Malta::Max_CPUs);    if (ipintr) {        for (int cpunum=0; cpunum < numcpus; cpunum++) {            // Check each cpu bit            uint64_t cpumask = ULL(1) << cpunum;            if (ipintr & cpumask) {                // Check if there is a pending ipi                if (ipint & cpumask) {                    ipint &= ~cpumask;                    malta->intrctrl->clear(cpunum, TheISA::INTLEVEL_IRQ3, 0);                    DPRINTF(IPI, "clear IPI IPI cpu=%d\n", cpunum);                }                else                    warn("clear IPI for CPU=%d, but NO IPI\n", cpunum);            }        }    }    else        panic("Big IPI Clear, but not processors indicated\n");        */}voidMaltaCChip::clearITI(uint64_t itintr){                panic("MaltaCCHIP::clearITI() not implemented.");                /*    int numcpus = malta->intrctrl->cpu->system->threadContexts.size();    assert(numcpus <= Malta::Max_CPUs);    if (itintr) {        for (int i=0; i < numcpus; i++) {            uint64_t cpumask = ULL(1) << i;            if (itintr & cpumask & itint) {                malta->intrctrl->clear(i, TheISA::INTLEVEL_IRQ2, 0);                itint &= ~cpumask;                DPRINTF(Malta, "clearing rtc interrupt to cpu=%d\n", i);            }        }    }    else        panic("Big ITI Clear, but not processors indicated\n");    */}voidMaltaCChip::reqIPI(uint64_t ipreq){                panic("MaltaCCHIP::reqIPI() not implemented.");                /*    int numcpus = malta->intrctrl->cpu->system->threadContexts.size();    assert(numcpus <= Malta::Max_CPUs);    if (ipreq) {        for (int cpunum=0; cpunum < numcpus; cpunum++) {            // Check each cpu bit            uint64_t cpumask = ULL(1) << cpunum;            if (ipreq & cpumask) {                // Check if there is already an ipi (bits 8:11)                if (!(ipint & cpumask)) {                    ipint  |= cpumask;                    malta->intrctrl->post(cpunum, TheISA::INTLEVEL_IRQ3, 0);                    DPRINTF(IPI, "send IPI cpu=%d\n", cpunum);                }                else                    warn("post IPI for CPU=%d, but IPI already\n", cpunum);            }        }    }    else        panic("Big IPI Request, but not processors indicated\n");   */}voidMaltaCChip::postRTC(){                panic("MaltaCCHIP::postRTC() not implemented.");                /*    int size = malta->intrctrl->cpu->system->threadContexts.size();    assert(size <= Malta::Max_CPUs);    for (int i = 0; i < size; i++) {        uint64_t cpumask = ULL(1) << i;       if (!(cpumask & itint)) {           itint |= cpumask;           malta->intrctrl->post(i, TheISA::INTLEVEL_IRQ2, 0);           DPRINTF(Malta, "Posting RTC interrupt to cpu=%d", i);       }    }    */}voidMaltaCChip::postIntr(uint32_t interrupt){    uint64_t size = sys->threadContexts.size();    assert(size <= Malta::Max_CPUs);    for(int i=0; i < size; i++) {                                        //Note: Malta does not use index, but this was added to use the pre-existing implementation              malta->intrctrl->post(i, interrupt, 0);              DPRINTF(Malta, "posting  interrupt to cpu %d,"                        "interrupt %d\n",i, interrupt);   }}voidMaltaCChip::clearIntr(uint32_t interrupt){    uint64_t size = sys->threadContexts.size();    assert(size <= Malta::Max_CPUs);    for(int i=0; i < size; i++) {                                        //Note: Malta does not use index, but this was added to use the pre-existing implementation              malta->intrctrl->clear(i, interrupt, 0);              DPRINTF(Malta, "clearing interrupt to cpu %d,"                        "interrupt %d\n",i, interrupt);   }}voidMaltaCChip::serialize(std::ostream &os){   // SERIALIZE_ARRAY(dim, Malta::Max_CPUs);    //SERIALIZE_ARRAY(dir, Malta::Max_CPUs);    //SERIALIZE_SCALAR(ipint);    //SERIALIZE_SCALAR(itint);    //SERIALIZE_SCALAR(drir);}voidMaltaCChip::unserialize(Checkpoint *cp, const std::string &section){    //UNSERIALIZE_ARRAY(dim, Malta::Max_CPUs);    //UNSERIALIZE_ARRAY(dir, Malta::Max_CPUs);    //UNSERIALIZE_SCALAR(ipint);    //UNSERIALIZE_SCALAR(itint);    //UNSERIALIZE_SCALAR(drir);}MaltaCChip *MaltaCChipParams::create(){    return new MaltaCChip(this);}

⌨️ 快捷键说明

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