diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 16:56:39 -0500 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 16:56:39 -0500 |
commit | 8480615d8d148ad81ac6242a96edf77293c93078 (patch) | |
tree | 25eaeff2c13af810cd4812eeb5622d991494286a | |
parent | 35be32b7ea9748cd061e01d5329e95dfafa4a2e1 (diff) | |
download | gem5-8480615d8d148ad81ac6242a96edf77293c93078.tar.xz |
dev: Fix infinite recursion in DMA devices
The DMA device sometimes calls the process() method on a completion
event directly instead of scheduling it on the current tick. This
breaks some devices that assume that the completion handler won't be
called until the current event handler has returned. Specifically, it
causes infinite recursion in the IdeDisk component because it does not
advance its chunk generator until after a dmaRead()/dmaWrite() has
returned. This changeset removes this mico-optimization and schedules
the event in the current tick instead. This way the semantics event
handling stay the same even when the delay is 0.
-rw-r--r-- | src/dev/dma_device.cc | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/src/dev/dma_device.cc b/src/dev/dma_device.cc index 952d6f622..770370320 100644 --- a/src/dev/dma_device.cc +++ b/src/dev/dma_device.cc @@ -85,10 +85,7 @@ DmaPort::handleResp(PacketPtr pkt, Tick delay) if (state->totBytes == state->numBytes) { if (state->completionEvent) { delay += state->delay; - if (delay) - device->schedule(state->completionEvent, curTick() + delay); - else - state->completionEvent->process(); + device->schedule(state->completionEvent, curTick() + delay); } delete state; } |