Как gem5 может передать sh всю грязную информацию из кэша в память? - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь расширить некоторые функции до гриппа sh все грязные блки из Cache в память. Мой план таков:

В BaseCache :: recvTimingReq. Я использую wb_pkts для хранения всей обратной записи pkt. My_memWriteback будет проходить через все cacheblk и возвращать количество грязных. Для каждого blk он вызовет my_writebackVisitor для создания нового пакета и поместит его в wb_pkts. Но я встречаю жука и не знаю, что происходит. Баг говорит, что "panic: Tried to read unmapped address 0x8.PC: 0x400ffa, Instr: MOV_R_M : ld rax, DS:[rax + 0x8]PacketList wb_pkts".

И я запускаю с параметром --debug-flags = DRAM, Cache увидит, что кеш никогда не отправляет пакет в контроллер памяти. Мой код расширения показан ниже

BaseCache::recvTimingReq(pkt){
wb_pkts.clear();
dirty_blk_count = my_memWriteback(wb_pkts);
bool satisfied = false;
  {
      PacketList writebacks;
      satisfied = access(pkt, blk, lat, writebacks);
      .....
}


int
BaseCache::my_memWriteback(PacketList &wb_pkts)
{
  int count = 0;
  tags->forEachBlk([this,&count,&wb_pkts](CacheBlk &blk) mutable{
                      if(blk.isDirty()){
                              if(blk.isValid()){
                                      count++;
                              }
                      }
                      my_writebackVisitor(blk,wb_pkts);
                  });
  //printf("NmemWriteback count:%d\n",count);
  return count;
}

BaseCache::my_writebackVisitor(CacheBlk &blk,PacketList &writebacks)
{
  if (blk.isDirty()) {
      assert(blk.isValid());
      RequestPtr request = std::make_shared(
          regenerateBlkAddr(&blk), blkSize, 0, Request::funcMasterId);
      request->taskId(blk.task_id);
      if (blk.isSecure()) {
          request->setFlags(Request::SECURE);
      }

      PacketPtr packet = new Packet(request, MemCmd::WriteReq);
      packet->allocate();
      std::memcpy(packet->getPtr, blk.data, blkSize);
      // packet->dataStatic(blk.data);
      writebacks.push_back(packet);

      blk.status &= ~BlkDirty;
  }
}
...