Commit 21fc2ff9 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

sims/e1000_gem5: schedule dma events as well to match gem5

Previously we were calling completions etc. directly, but then the
prioritization does not match what gem5 does. This is slightly slower, but we
want to match gem5 exactly here.
parent fd1211c7
...@@ -46,10 +46,15 @@ void IGbE::RegWrite(uint8_t bar, uint64_t addr, const void *src, ...@@ -46,10 +46,15 @@ void IGbE::RegWrite(uint8_t bar, uint64_t addr, const void *src,
void IGbE::DmaComplete(nicbm::DMAOp &op) void IGbE::DmaComplete(nicbm::DMAOp &op)
{ {
Gem5DMAOp *dma = dynamic_cast <Gem5DMAOp *>(&op); Gem5DMAOp *dma = dynamic_cast <Gem5DMAOp *>(&op);
dma->ev_.sched = false; if (dma->write_) {
dma->ev_.callback();
if (dma->write_)
delete[] ((uint8_t *) dma->data_); delete[] ((uint8_t *) dma->data_);
} else {
// schedule callback event. THis is at the current time, but can't call
// directly to ensure event priorities are respected.
dma->ev_.sched = true;
dma->ev_.time_ = runner_->TimePs();
runner_->EventSchedule(dma->ev_);
}
delete dma; delete dma;
} }
...@@ -133,21 +138,18 @@ void IGbE::intrClear() ...@@ -133,21 +138,18 @@ void IGbE::intrClear()
void IGbE::dmaWrite(Addr daddr, size_t len, EventFunctionWrapper &ev, void IGbE::dmaWrite(Addr daddr, size_t len, EventFunctionWrapper &ev,
const void *buf, Tick delay) const void *buf, Tick delay)
{ {
ev.sched = true;
Gem5DMAOp *op = new Gem5DMAOp(ev); Gem5DMAOp *op = new Gem5DMAOp(ev);
op->data_ = new uint8_t[len]; op->data_ = new uint8_t[len];
memcpy(op->data_, buf, len); memcpy(op->data_, buf, len);
op->len_ = len; op->len_ = len;
op->write_ = true; op->write_ = true;
op->dma_addr_ = daddr; op->dma_addr_ = daddr;
op->priority_ = 1;
op->time_ = runner_->TimePs() + delay;
runner_->EventSchedule(*op);
if (delay == 0) { ev.time_ = runner_->TimePs() + delay;
runner_->IssueDma(*op); runner_->EventSchedule(ev);
} else {
op->time_ = runner_->TimePs() + delay;
runner_->EventSchedule(*op);
}
} }
void IGbE::dmaRead(Addr saddr, size_t len, EventFunctionWrapper &ev, void IGbE::dmaRead(Addr saddr, size_t len, EventFunctionWrapper &ev,
...@@ -160,13 +162,10 @@ void IGbE::dmaRead(Addr saddr, size_t len, EventFunctionWrapper &ev, ...@@ -160,13 +162,10 @@ void IGbE::dmaRead(Addr saddr, size_t len, EventFunctionWrapper &ev,
op->len_ = len; op->len_ = len;
op->write_ = false; op->write_ = false;
op->dma_addr_ = saddr; op->dma_addr_ = saddr;
op->time_ = runner_->TimePs() + delay;
op->priority_ = 2;
runner_->EventSchedule(*op);
if (delay == 0) {
runner_->IssueDma(*op);
} else {
op->time_ = runner_->TimePs() + delay;
runner_->EventSchedule(*op);
}
} }
bool IGbE::sendPacket(EthPacketPtr p) bool IGbE::sendPacket(EthPacketPtr p)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment