We zero the memory explicitly for debugging purposes when going to sleep to ensure the return path doesn't rely on any initialization done before.
SetPowerState slightly refactored in the process. --- miniport/qxl.c | 36 ++++++++++++++++++++++++++++++++---- 1 files changed, 32 insertions(+), 4 deletions(-) diff --git a/miniport/qxl.c b/miniport/qxl.c index 37def2d..344f19e 100644 --- a/miniport/qxl.c +++ b/miniport/qxl.c @@ -752,10 +752,29 @@ VP_STATUS GetPowerState(PVOID dev_extension, return ERROR_DEVICE_REINITIALIZATION_NEEDED; } +#ifdef DBG +static void DebugZeroDeviceMemory(QXLExtension *dev_ext) +{ + // don't zero the memory if the ram_start and vram_start are not initialized (a + // device has been installed but the monitor is disabled) + if (dev_ext->ram_start == 0 || dev_ext->vram_start == 0) { + DEBUG_PRINT((dev_ext, 0, "%s: not zeroing memory (addresses not initialized)\n", __FUNCTION__)); + return; + } + VideoPortZeroMemory(dev_ext->ram_start, dev_ext->ram_size); + VideoPortZeroMemory(dev_ext->vram_start, dev_ext->vram_size); +} +#else +static _inline void DebugZeroDeviceMemory(QXLExtension *dev_ext) +{ +} +#endif + VP_STATUS SetPowerState(PVOID dev_extension, ULONG hw_id, PVIDEO_POWER_MANAGEMENT pm_stat) { + QXLExtension *dev_ext = dev_extension; PAGED_CODE(); DEBUG_PRINT((0, "%s: %lu\n", __FUNCTION__, pm_stat->PowerState)); @@ -766,19 +785,28 @@ VP_STATUS SetPowerState(PVOID dev_extension, ResetDeviceWithoutIO(dev_ext); break; case VideoPowerStandBy: + break; case VideoPowerSuspend: + break; case VideoPowerOff: + DebugZeroDeviceMemory(dev_ext); + break; case VideoPowerShutdown: + /* Important: you cannot call out to qxldd.dll here or you get a BSOD. */ + break; case VideoPowerHibernate: - DEBUG_PRINT((0, "%s: OK\n", __FUNCTION__)); - return NO_ERROR; + DebugZeroDeviceMemory(dev_ext); + break; + default: + DEBUG_PRINT((0, "%s: unexpected power state\n", __FUNCTION__)); + return ERROR_DEVICE_REINITIALIZATION_NEEDED; } break; default: DEBUG_PRINT((0, "%s: unexpected hw_id %lu\n", __FUNCTION__, hw_id)); + return ERROR_DEVICE_REINITIALIZATION_NEEDED; } - DEBUG_PRINT((0, "%s: ERROR_DEVICE_REINITIALIZATION_NEEDED\n", __FUNCTION__)); - return ERROR_DEVICE_REINITIALIZATION_NEEDED; + return NO_ERROR; } VP_STATUS GetChildDescriptor(IN PVOID dev_extension, -- 1.7.5.2 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel