Add a flag to the DeviceState, when a device is engaged in PIO/MMIO/DMA. This flag should be set/checked prior to calling a device's MemoryRegion handlers, and set when device code initiates DMA. The purpose of this flag is to prevent DMA reentrancy issues. E.g.: sdhci pio -> dma write -> sdhci mmio nvme bh -> dma write -> nvme mmio
These issues have led to problems such as stack-exhaustion and use-after-frees. Assumptions: * Devices do not interact with their own PIO/MMIO memory-regions using DMA. * There is now way for there to be multiple simultaneous accesses to a device's PIO/MMIO memory-regions, or for multiple threads to perform DMA accesses simultaneously on behalf of a single device. Signed-off-by: Alexander Bulekov <alx...@bu.edu> --- include/hw/qdev-core.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 92c3d65208..6474dc51fa 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -193,6 +193,9 @@ struct DeviceState { int instance_id_alias; int alias_required_for_version; ResettableState reset; + + /* Is the device currently in mmio/pio/dma? Used to prevent re-entrancy */ + int engaged_in_io; }; struct DeviceListener { -- 2.33.0