[Spice-devel] [PATCH qxl-wddm-dod 2/8] Mark all functions that should go to non paged sections

Sameeh Jubran sameeh at daynix.com
Wed Sep 28 14:03:31 UTC 2016


This is extremely dangerous!, this can be working without any errors most
of the time but in a rare cases this could
cause a crash - in case a non pageable function made pageable by this patch
- which can be hard to troubleshoot!

On Wed, Sep 28, 2016 at 4:55 PM, Frediano Ziglio <fziglio at redhat.com> wrote:

> This make sure that these function goes into the non
> paged section.
> Also this change is much shorter than marking code if
> can be paged as almost code can be paged.
> It's also coherent with other source files.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  qxldod/QxlDod.cpp | 39 ++++++++++++++++++++++++---------------
>  qxldod/QxlDod.h   | 50 ++++++++++++++++++++++++++------------------------
>  2 files changed, 50 insertions(+), 39 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index d7830e5..b890a9a 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -2,8 +2,7 @@
>  #include "qxldod.h"
>  #include "qxl_windows.h"
>
> -#pragma code_seg(push)
> -#pragma code_seg()
> +#pragma code_seg("PAGE")
>
>  #define WIN_QXL_INT_MASK ((QXL_INTERRUPT_DISPLAY) | \
>                            (QXL_INTERRUPT_CURSOR) | \
> @@ -47,8 +46,6 @@ BYTE PixelMask[BITS_PER_BYTE]  = {0x80, 0x40, 0x20,
> 0x10, 0x08, 0x04, 0x02, 0x01
>                                         ((ULONG)LOWER_5_BITS((Pixel)) <<
> SHIFT_LOWER_5_IN_565_BACK))
>
>
> -#pragma code_seg(pop)
> -
>  struct QXLEscape {
>      uint32_t ioctl;
>      union {
> @@ -1645,9 +1642,7 @@ NTSTATUS QxlDod::UpdateActiveVidPnPresentPath(_In_
> CONST DXGKARG_UPDATEACTIVEVID
>  //
>  // Non-Paged Code
>  //
> -#pragma code_seg(push)
> -#pragma code_seg()
> -
> +QXL_NON_PAGED
>  VOID QxlDod::DpcRoutine(VOID)
>  {
>      DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s\n", __FUNCTION__));
> @@ -1656,6 +1651,7 @@ VOID QxlDod::DpcRoutine(VOID)
>      DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s\n", __FUNCTION__));
>  }
>
> +QXL_NON_PAGED
>  BOOLEAN QxlDod::InterruptRoutine(_In_  ULONG MessageNumber)
>  {
>      DbgPrint(TRACE_LEVEL_INFORMATION, ("<--> 0 %s\n", __FUNCTION__));
> @@ -1665,6 +1661,7 @@ BOOLEAN QxlDod::InterruptRoutine(_In_  ULONG
> MessageNumber)
>      return FALSE;
>  }
>
> +QXL_NON_PAGED
>  VOID QxlDod::ResetDevice(VOID)
>  {
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("<---> %s\n", __FUNCTION__));
> @@ -1672,6 +1669,7 @@ VOID QxlDod::ResetDevice(VOID)
>  }
>
>  // Must be Non-Paged, as it sets up the display for a bugcheck
> +QXL_NON_PAGED
>  NTSTATUS QxlDod::SystemDisplayEnable(_In_
> D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
>                                                     _In_
> PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS Flags,
>                                                     _Out_ UINT* pWidth,
> @@ -1728,6 +1726,7 @@ NTSTATUS QxlDod::SystemDisplayEnable(_In_
> D3DDDI_VIDEO_PRESENT_TARGET_ID Target
>  }
>
>  // Must be Non-Paged, as it is called to display the bugcheck screen
> +QXL_NON_PAGED
>  VOID QxlDod::SystemDisplayWrite(_In_reads_bytes_(SourceHeight *
> SourceStride) VOID* pSource,
>                                                _In_ UINT SourceWidth,
>                                                _In_ UINT SourceHeight,
> @@ -1774,7 +1773,7 @@ VOID QxlDod::SystemDisplayWrite(_In_reads_bytes_(SourceHeight
> * SourceStride) VO
>
>  }
>
> -#pragma code_seg(pop) // End Non-Paged Code
> +// End Non-Paged Code
>
>  NTSTATUS QxlDod::WriteHWInfoStr(_In_ HANDLE DevInstRegKeyHandle, _In_
> PCWSTR pszwValueName, _In_ PCSTR pszValue)
>  {
> @@ -1949,11 +1948,7 @@ NTSTATUS QxlDod::ReadConfiguration()
>      return Status;
>  }
>
> -//
> -// Non-Paged Code
> -//
> -#pragma code_seg(push)
> -#pragma code_seg()
> +QXL_NON_PAGED
>  D3DDDI_VIDEO_PRESENT_SOURCE_ID QxlDod::FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID
> TargetId, BOOLEAN DefaultToZero)
>  {
>      UNREFERENCED_PARAMETER(TargetId);
> @@ -1968,8 +1963,6 @@ D3DDDI_VIDEO_PRESENT_SOURCE_ID
> QxlDod::FindSourceForTarget(D3DDDI_VIDEO_PRESENT_
>      return DefaultToZero ? 0 : D3DDDI_ID_UNINITIALIZED;
>  }
>
> -#pragma code_seg(pop) // End Non-Paged Code
> -
>  //
>  // Frame buffer map/unmap
>  //
> @@ -2049,6 +2042,7 @@ UnmapFrameBuffer(
>
>  // HW specific code
>
> +QXL_NON_PAGED
>  VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch,
> _Out_ LONG* pRowPitch)
>  {
>      switch (pBltInfo->Rotation)
> @@ -2087,6 +2081,7 @@ VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_
> LONG* pPixelPitch, _Out_ LO
>      }
>  }
>
> +QXL_NON_PAGED
>  BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect)
>  {
>      BYTE* pRet = NULL;
> @@ -2150,6 +2145,7 @@ BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo,
> CONST RECT* pRect)
>   *
>  \***********************************************************
> ***************/
>
> +QXL_NON_PAGED
>  VOID CopyBitsGeneric(
>      BLT_INFO* pDst,
>      CONST BLT_INFO* pSrc,
> @@ -2244,6 +2240,7 @@ VOID CopyBitsGeneric(
>  }
>
>
> +QXL_NON_PAGED
>  VOID CopyBits32_32(
>      BLT_INFO* pDst,
>      CONST BLT_INFO* pSrc,
> @@ -2285,6 +2282,7 @@ VOID CopyBits32_32(
>  }
>
>
> +QXL_NON_PAGED
>  VOID BltBits (
>      BLT_INFO* pDst,
>      CONST BLT_INFO* pSrc,
> @@ -2913,6 +2911,7 @@ VOID VgaDevice::BlackOutScreen(CURRENT_BDD_MODE*
> pCurrentBddMod)
>      pCurrentBddMod->ZeroedOutEnd.QuadPart = NewPhysAddrEnd.QuadPart;
>  }
>
> +QXL_NON_PAGED
>  BOOLEAN VgaDevice::InterruptRoutine(_In_ PDXGKRNL_INTERFACE
> pDxgkInterface, _In_  ULONG MessageNumber)
>  {
>      UNREFERENCED_PARAMETER(pDxgkInterface);
> @@ -2920,10 +2919,12 @@ BOOLEAN VgaDevice::InterruptRoutine(_In_
> PDXGKRNL_INTERFACE pDxgkInterface, _In_
>      return FALSE;
>  }
>
> +QXL_NON_PAGED
>  VOID VgaDevice::DpcRoutine(PVOID)
>  {
>  }
>
> +QXL_NON_PAGED
>  VOID VgaDevice::ResetDevice(VOID)
>  {
>  }
> @@ -3652,6 +3653,7 @@ void QxlDevice::InitMspace(UINT32 mspace_type, UINT8
> *start, size_t capacity)
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s _mspace = %p\n",
> __FUNCTION__, m_MSInfo[mspace_type]._mspace));
>  }
>
> +QXL_NON_PAGED
>  void QxlDevice::ResetDevice(void)
>  {
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
> @@ -4717,6 +4719,7 @@ VOID QxlDevice::PushCursor(VOID)
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s notify = %d\n", __FUNCTION__,
> notify));
>  }
>
> +QXL_NON_PAGED
>  BOOLEAN QxlDevice::InterruptRoutine(_In_ PDXGKRNL_INTERFACE
> pDxgkInterface, _In_  ULONG MessageNumber)
>  {
>      UNREFERENCED_PARAMETER(MessageNumber);
> @@ -4737,6 +4740,7 @@ BOOLEAN QxlDevice::InterruptRoutine(_In_
> PDXGKRNL_INTERFACE pDxgkInterface, _In_
>      return TRUE;
>  }
>
> +QXL_NON_PAGED
>  VOID QxlDevice::DpcRoutine(PVOID ptr)
>  {
>      PDXGKRNL_INTERFACE pDxgkInterface = (PDXGKRNL_INTERFACE)ptr;
> @@ -4773,6 +4777,7 @@ VOID QxlDevice::DpcRoutine(PVOID ptr)
>
>  VOID QxlDevice::UpdateArea(CONST RECT* area, UINT32 surface_id)
>  {
> +    PAGED_CODE();
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
>      CopyRect(&m_RamHdr->update_area, area);
>      m_RamHdr->update_surface = surface_id;
> @@ -4781,6 +4786,7 @@ VOID QxlDevice::UpdateArea(CONST RECT* area, UINT32
> surface_id)
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
>  }
>
> +QXL_NON_PAGED
>  BOOLEAN QxlDevice:: DpcCallbackEx(PVOID ptr)
>  {
>      DbgPrint(TRACE_LEVEL_VERBOSE, ("<--> %s\n", __FUNCTION__));
> @@ -4790,6 +4796,7 @@ BOOLEAN QxlDevice:: DpcCallbackEx(PVOID ptr)
>      return TRUE;
>  }
>
> +QXL_NON_PAGED
>  VOID QxlDevice::DpcCallback(PDPC_CB_CONTEXT ctx)
>  {
>      ctx->data = m_Pending;
> @@ -4797,6 +4804,7 @@ VOID QxlDevice::DpcCallback(PDPC_CB_CONTEXT ctx)
>
>  }
>
> +QXL_NON_PAGED
>  UINT BPPFromPixelFormat(D3DDDIFORMAT Format)
>  {
>      switch (Format)
> @@ -4812,6 +4820,7 @@ UINT BPPFromPixelFormat(D3DDDIFORMAT Format)
>  }
>
>  // Given bits per pixel, return the pixel format at the same bpp
> +QXL_NON_PAGED
>  D3DDDIFORMAT PixelFormatFromBPP(UINT BPP)
>  {
>      switch (BPP)
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index bf16724..90d7937 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -14,6 +14,8 @@
>  #define QXL_BPP                    32
>  #define VGA_BPP                    24
>
> +#define QXL_NON_PAGED __declspec(code_seg(".text"))
> +
>  typedef struct _QXL_FLAGS
>  {
>      UINT DriverStarted           : 1; // ( 1) 1 after StartDevice and 0
> after StopDevice
> @@ -222,9 +224,9 @@ public:
>      virtual NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState,
> DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
>      virtual NTSTATUS HWInit(PCM_RESOURCE_LIST pResList,
> DXGK_DISPLAY_INFORMATION* pDispInfo) = 0;
>      virtual NTSTATUS HWClose(void) = 0;
> -    virtual BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE
> pDxgkInterface, _In_  ULONG MessageNumber) = 0;
> -    virtual VOID DpcRoutine(PVOID) = 0;
> -    virtual VOID ResetDevice(void) = 0;
> +    QXL_NON_PAGED virtual BOOLEAN InterruptRoutine(_In_
> PDXGKRNL_INTERFACE pDxgkInterface, _In_  ULONG MessageNumber) = 0;
> +    QXL_NON_PAGED virtual VOID DpcRoutine(PVOID) = 0;
> +    QXL_NON_PAGED virtual VOID ResetDevice(void) = 0;
>      virtual NTSTATUS AcquireFrameBuffer(CURRENT_BDD_MODE*
> pCurrentBddMode) { return STATUS_SUCCESS; }
>      virtual NTSTATUS ReleaseFrameBuffer(CURRENT_BDD_MODE*
> pCurrentBddMode) { return STATUS_SUCCESS; }
>
> @@ -289,9 +291,9 @@ public:
>                                   _In_ D3DKMDT_VIDPN_PRESENT_PATH_ROTATION
> Rotation,
>                                   _In_ const CURRENT_BDD_MODE* pModeCur);
>      VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod);
> -    BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface,
> _In_  ULONG MessageNumber);
> -    VOID DpcRoutine(PVOID);
> -    VOID ResetDevice(VOID);
> +    QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE
> pDxgkInterface, _In_  ULONG MessageNumber);
> +    QXL_NON_PAGED VOID DpcRoutine(PVOID);
> +    QXL_NON_PAGED VOID ResetDevice(VOID);
>      NTSTATUS AcquireFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode);
>      NTSTATUS ReleaseFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode);
>      NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE*
> pSetPointerShape);
> @@ -464,9 +466,9 @@ public:
>                      _In_ D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation,
>                      _In_ const CURRENT_BDD_MODE* pModeCur);
>      VOID BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod);
> -    BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface,
> _In_  ULONG MessageNumber);
> -    VOID DpcRoutine(PVOID);
> -    VOID ResetDevice(VOID);
> +    QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE
> pDxgkInterface, _In_  ULONG MessageNumber);
> +    QXL_NON_PAGED VOID DpcRoutine(PVOID);
> +    QXL_NON_PAGED VOID ResetDevice(VOID);
>      NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE*
> pSetPointerShape);
>      NTSTATUS SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION*
> pSetPointerPosition);
>      NTSTATUS Escape(_In_ CONST DXGKARG_ESCAPE* pEscap);
> @@ -534,8 +536,8 @@ private:
>      void PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
>                              UINT8 **end_ptr, UINT8 *src, int size,
>                              size_t alloc_size, uint32_t alignment);
> -    BOOLEAN static DpcCallbackEx(PVOID);
> -    void DpcCallback(PDPC_CB_CONTEXT);
> +    QXL_NON_PAGED BOOLEAN static DpcCallbackEx(PVOID);
> +    QXL_NON_PAGED void DpcCallback(PDPC_CB_CONTEXT);
>      void AsyncIo(UCHAR  Port, UCHAR Value);
>      void SyncIo(UCHAR  Port, UCHAR Value);
>      NTSTATUS UpdateChildStatus(BOOLEAN connect);
> @@ -628,7 +630,7 @@ public:
>                           _Out_ ULONG*             pNumberOfChildren);
>      NTSTATUS StopDevice(VOID);
>      // Must be Non-Paged
> -    VOID ResetDevice(VOID);
> +    QXL_NON_PAGED VOID ResetDevice(VOID);
>
>      NTSTATUS DispatchIoRequest(_In_  ULONG VidPnSourceId,
>                                 _In_  VIDEO_REQUEST_PACKET*
> pVideoRequestPacket);
> @@ -648,9 +650,9 @@ public:
>
>      // Must be Non-Paged
>      // BDD doesn't have interrupts, so just returns false
> -    BOOLEAN InterruptRoutine(_In_  ULONG MessageNumber);
> +    QXL_NON_PAGED BOOLEAN InterruptRoutine(_In_  ULONG MessageNumber);
>
> -    VOID DpcRoutine(VOID);
> +    QXL_NON_PAGED VOID DpcRoutine(VOID);
>
>      // Return DriverCaps, doesn't support other queries though
>      NTSTATUS QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO*
> pQueryAdapterInfo);
> @@ -689,7 +691,7 @@ public:
>
>      // Must be Non-Paged
>      // Call to initialize as part of bugcheck
> -    NTSTATUS SystemDisplayEnable(_In_  D3DDDI_VIDEO_PRESENT_TARGET_ID
>    TargetId,
> +    QXL_NON_PAGED NTSTATUS SystemDisplayEnable(_In_
> D3DDDI_VIDEO_PRESENT_TARGET_ID       TargetId,
>                                   _In_  PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS
> Flags,
>                                   _Out_ UINT*
>   pWidth,
>                                   _Out_ UINT*
>   pHeight,
> @@ -697,7 +699,7 @@ public:
>
>      // Must be Non-Paged
>      // Write out pixels as part of bugcheck
> -    VOID SystemDisplayWrite(_In_reads_bytes_(SourceHeight *
> SourceStride) VOID* pSource,
> +    QXL_NON_PAGED VOID SystemDisplayWrite(_In_reads_bytes_(SourceHeight
> * SourceStride) VOID* pSource,
>                                   _In_
>  UINT  SourceWidth,
>                                   _In_
>  UINT  SourceHeight,
>                                   _In_
>  UINT  SourceStride,
> @@ -725,7 +727,7 @@ private:
>                                   D3DKMDT_HVIDPNTARGETMODESET
> hVidPnTargetModeSet,
>                                   _In_opt_ CONST
> D3DKMDT_VIDPN_SOURCE_MODE* pVidPnPinnedSourceModeInfo,
>                                   D3DDDI_VIDEO_PRESENT_SOURCE_ID SourceId);
> -    D3DDDI_VIDEO_PRESENT_SOURCE_ID FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID
> TargetId, BOOLEAN DefaultToZero);
> +    QXL_NON_PAGED D3DDDI_VIDEO_PRESENT_SOURCE_ID
> FindSourceForTarget(D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId, BOOLEAN
> DefaultToZero);
>      NTSTATUS IsVidPnSourceModeFieldsValid(CONST
> D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode) const;
>      NTSTATUS IsVidPnPathFieldsValid(CONST D3DKMDT_VIDPN_PRESENT_PATH*
> pPath) const;
>      NTSTATUS RegisterHWInfo(_In_ ULONG Id);
> @@ -743,26 +745,26 @@ UnmapFrameBuffer(
>      _In_reads_bytes_(Length) VOID* VirtualAddress,
>      _In_                ULONG Length);
>
> -UINT BPPFromPixelFormat(D3DDDIFORMAT Format);
> -D3DDDIFORMAT PixelFormatFromBPP(UINT BPP);
> +QXL_NON_PAGED UINT BPPFromPixelFormat(D3DDDIFORMAT Format);
> +QXL_NON_PAGED D3DDDIFORMAT PixelFormatFromBPP(UINT BPP);
>  UINT SpiceFromPixelFormat(D3DDDIFORMAT Format);
>
> -VOID CopyBitsGeneric(
> +QXL_NON_PAGED VOID CopyBitsGeneric(
>                          BLT_INFO* pDst,
>                          CONST BLT_INFO* pSrc,
>                          UINT  NumRects,
>                          _In_reads_(NumRects) CONST RECT *pRects);
>
> -VOID CopyBits32_32(
> +QXL_NON_PAGED VOID CopyBits32_32(
>                          BLT_INFO* pDst,
>                          CONST BLT_INFO* pSrc,
>                          UINT  NumRects,
>                          _In_reads_(NumRects) CONST RECT *pRects);
> -VOID BltBits (
> +QXL_NON_PAGED VOID BltBits (
>                          BLT_INFO* pDst,
>                          CONST BLT_INFO* pSrc,
>                          UINT  NumRects,
>                          _In_reads_(NumRects) CONST RECT *pRects);
>
> -BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST RECT* pRect);
> -VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG* pPixelPitch,
> _Out_ LONG* pRowPitch);
> +QXL_NON_PAGED BYTE* GetRowStart(_In_ CONST BLT_INFO* pBltInfo, CONST
> RECT* pRect);
> +QXL_NON_PAGED VOID GetPitches(_In_ CONST BLT_INFO* pBltInfo, _Out_ LONG*
> pPixelPitch, _Out_ LONG* pRowPitch);
> --
> 2.7.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
>



-- 
Respectfully,
*Sameeh Jubran*
*Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>*
*Junior Software Engineer @ Daynix <http://www.daynix.com>.*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20160928/a01ea932/attachment-0001.html>


More information about the Spice-devel mailing list