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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx> 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@xxxxxxxxxx>
---
 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 = ""> @@ -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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel



--
Respectfully,
Sameeh Jubran
Junior Software Engineer @ Daynix.
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]