tsunami_cchip.cc

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

CC
529
字号
/* * Copyright (c) 2004, 2005 * 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: Ali G. Saidi *          Ronald G. Dreslinski Jr *//** @file * Emulation of the Tsunami CChip CSRs */#include <deque>#include <string>#include <vector>#include "arch/alpha/ev5.hh"#include "base/trace.hh"#include "cpu/intr_control.hh"#include "cpu/thread_context.hh"#include "dev/alpha/tsunami.hh"#include "dev/alpha/tsunami_cchip.hh"#include "dev/alpha/tsunamireg.h"#include "mem/packet.hh"#include "mem/packet_access.hh"#include "mem/port.hh"#include "params/TsunamiCChip.hh"#include "sim/system.hh"using namespace std;//Should this be AlphaISA?using namespace TheISA;TsunamiCChip::TsunamiCChip(const Params *p)    : BasicPioDevice(p), tsunami(p->tsunami){    pioSize = 0x10000000;    drir = 0;    ipint = 0;    itint = 0;    for (int x = 0; x < Tsunami::Max_CPUs; x++)    {        dim[x] = 0;        dir[x] = 0;    }    //Put back pointer in tsunami    tsunami->cchip = this;}TickTsunamiCChip::read(PacketPtr pkt){    DPRINTF(Tsunami, "read  va=%#x size=%d\n", pkt->getAddr(), pkt->getSize());    assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);    Addr regnum = (pkt->getAddr() - pioAddr) >> 6;    Addr daddr = (pkt->getAddr() - pioAddr);    pkt->allocate();    switch (pkt->getSize()) {      case sizeof(uint64_t):          pkt->set<uint64_t>(0);          if (daddr & TSDEV_CC_BDIMS)          {              pkt->set(dim[(daddr >> 4) & 0x3F]);              break;          }          if (daddr & TSDEV_CC_BDIRS)          {              pkt->set(dir[(daddr >> 4) & 0x3F]);              break;          }          switch(regnum) {              case TSDEV_CC_CSR:                  pkt->set(0x0);                  break;              case TSDEV_CC_MTR:                  panic("TSDEV_CC_MTR not implemeted\n");                   break;              case TSDEV_CC_MISC:                  pkt->set((ipint << 8) & 0xF | (itint << 4) & 0xF |                                     (pkt->req->getCpuNum() & 0x3));                  break;              case TSDEV_CC_AAR0:              case TSDEV_CC_AAR1:              case TSDEV_CC_AAR2:              case TSDEV_CC_AAR3:                  pkt->set(0);                  break;              case TSDEV_CC_DIM0:                  pkt->set(dim[0]);                  break;              case TSDEV_CC_DIM1:                  pkt->set(dim[1]);                  break;              case TSDEV_CC_DIM2:                  pkt->set(dim[2]);                  break;              case TSDEV_CC_DIM3:                  pkt->set(dim[3]);                  break;              case TSDEV_CC_DIR0:                  pkt->set(dir[0]);                  break;              case TSDEV_CC_DIR1:                  pkt->set(dir[1]);                  break;              case TSDEV_CC_DIR2:                  pkt->set(dir[2]);                  break;              case TSDEV_CC_DIR3:                  pkt->set(dir[3]);                  break;              case TSDEV_CC_DRIR:                  pkt->set(drir);                  break;              case TSDEV_CC_PRBEN:                  panic("TSDEV_CC_PRBEN not implemented\n");                  break;              case TSDEV_CC_IIC0:              case TSDEV_CC_IIC1:              case TSDEV_CC_IIC2:              case TSDEV_CC_IIC3:                  panic("TSDEV_CC_IICx not implemented\n");                  break;              case TSDEV_CC_MPR0:              case TSDEV_CC_MPR1:              case TSDEV_CC_MPR2:              case TSDEV_CC_MPR3:                  panic("TSDEV_CC_MPRx not implemented\n");                  break;              case TSDEV_CC_IPIR:                  pkt->set(ipint);                  break;              case TSDEV_CC_ITIR:                  pkt->set(itint);                  break;              default:                  panic("default in cchip read reached, accessing 0x%x\n");           } // uint64_t      break;      case sizeof(uint32_t):      case sizeof(uint16_t):      case sizeof(uint8_t):      default:        panic("invalid access size(?) for tsunami register!\n");    }    DPRINTF(Tsunami, "Tsunami CChip: read  regnum=%#x size=%d data=%lld\n",            regnum, pkt->getSize(), pkt->get<uint64_t>());    pkt->makeAtomicResponse();    return pioDelay;}TickTsunamiCChip::write(PacketPtr pkt){    assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);    Addr daddr = pkt->getAddr() - pioAddr;    Addr regnum = (pkt->getAddr() - pioAddr) >> 6 ;    assert(pkt->getSize() == sizeof(uint64_t));    DPRINTF(Tsunami, "write - addr=%#x value=%#x\n", pkt->getAddr(), pkt->get<uint64_t>());    bool supportedWrite = false;    if (daddr & TSDEV_CC_BDIMS)    {        int number = (daddr >> 4) & 0x3F;        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 < Tsunami::Max_CPUs; 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))                {                    tsunami->intrctrl->post(number, TheISA::INTLEVEL_IRQ1, x);                    DPRINTF(Tsunami, "dim write resulting in posting dir"                            " interrupt to cpu %d\n", number);                }                else if ((olddir & bitvector) &&                        !(dir[number] & bitvector))                {                    // The bit was set and now its now clear and                    // we were interrupting on that bit before                    tsunami->intrctrl->clear(number, TheISA::INTLEVEL_IRQ1, x);                    DPRINTF(Tsunami, "dim write resulting in clear"                            " dir interrupt to cpu %d\n", number);                }            }        }    } else {        switch(regnum) {          case TSDEV_CC_CSR:              panic("TSDEV_CC_CSR write\n");          case TSDEV_CC_MTR:              panic("TSDEV_CC_MTR write not implemented\n");          case TSDEV_CC_MISC:            uint64_t ipreq;            ipreq = (pkt->get<uint64_t>() >> 12) & 0xF;            //If it is bit 12-15, this is an IPI post            if (ipreq) {                reqIPI(ipreq);                supportedWrite = true;            }            //If it is bit 8-11, this is an IPI clear            uint64_t ipintr;            ipintr = (pkt->get<uint64_t>() >> 8) & 0xF;            if (ipintr) {                clearIPI(ipintr);                supportedWrite = true;            }            //If it is the 4-7th bit, clear the RTC interrupt            uint64_t itintr;

⌨️ 快捷键说明

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