Skip to content

Commit 0ad3a4d

Browse files
jiafengy1intel-mediadev
authored andcommittedNov 28, 2024
[VP] Fix 3DLut/HVS kernel copy overflow
paddingSize will lead to copy kernel (3DLUT/HVS) overflow
1 parent 7fcf470 commit 0ad3a4d

File tree

10 files changed

+19
-5
lines changed

10 files changed

+19
-5
lines changed
 

‎media_common/agnostic/common/hw/mhw_state_heap.h

+1
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ typedef struct _MHW_KERNEL_PARAM
253253
void *pExtra; //!< Kernel parameter
254254
uint8_t *pBinary; //!< Pointer to kernel binary
255255
int32_t iSize; //!< Kernel size
256+
int32_t iPaddingSize; //!< Padding size
256257
int32_t iGrfCount; //!< Number of registers
257258
int32_t iBTCount; //!< Number of BT entries
258259
int32_t iThreadCount; //!< Number of threads (max)

‎media_common/agnostic/common/vp/kdll/hal_kerneldll_next.h

+1
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,7 @@ typedef struct tagKdll_CacheEntry
636636
// Kernel binary
637637
uint8_t *pBinary; // kernel binary
638638
int iSize; // kernel size
639+
int iPaddingSize; //kernel padding size
639640

640641
// Component kernel information
641642
int iKUID; // kernel unique id (static kernel)

‎media_driver/agnostic/common/vp/hal/vphal_render_common.h

+1
Original file line numberDiff line numberDiff line change
@@ -2417,6 +2417,7 @@ typedef struct _VPHAL_VEBOX_EXEC_STATE
24172417
(MhwKernelParam).iSize = (_pKernelEntry)->iSize; \
24182418
(MhwKernelParam).iKUID = (_pKernelEntry)->iKUID; \
24192419
(MhwKernelParam).iKCID = (_pKernelEntry)->iKCID; \
2420+
(MhwKernelParam).iPaddingSize = (_pKernelEntry)->iPaddingSize; \
24202421
} while(0)
24212422

24222423
//!

‎media_softlet/agnostic/common/renderhal/renderhal.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -2354,6 +2354,9 @@ int32_t RenderHal_LoadKernel(
23542354
// To reload the kernel forcibly if needed
23552355
if (pKernel->bForceReload)
23562356
{
2357+
// The ForceReload function is only utilized in legacy code.
2358+
// Since APO does not follow this execution path,
2359+
// there is no need to include padding size code here.
23572360
dwOffset = pKernelAllocation->dwOffset;
23582361
MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
23592362

@@ -2398,6 +2401,9 @@ int32_t RenderHal_LoadKernel(
23982401
// To reload the kernel forcibly if needed
23992402
if (pKernel->bForceReload)
24002403
{
2404+
// The ForceReload function is only utilized in legacy code.
2405+
// Since APO does not follow this execution path,
2406+
// there is no need to include padding size code here.
24012407
dwOffset = pKernelAllocation->dwOffset;
24022408
MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
24032409

@@ -2533,10 +2539,11 @@ int32_t RenderHal_LoadKernel(
25332539
pKernelAllocation->iAllocIndex = iKernelAllocationID;
25342540

25352541
// Copy kernel data
2536-
MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iKernelSize, pKernelPtr, iKernelSize);
2537-
if (iKernelSize < iSize)
2542+
int32_t iCopyKernelSize = iKernelSize - pKernel->iPaddingSize;
2543+
MOS_SecureMemcpy(pStateHeap->pIshBuffer + dwOffset, iCopyKernelSize, pKernelPtr, iCopyKernelSize);
2544+
if (iCopyKernelSize < iSize)
25382545
{
2539-
MOS_ZeroMemory(pStateHeap->pIshBuffer + dwOffset + iKernelSize, iSize - iKernelSize);
2546+
MOS_ZeroMemory(pStateHeap->pIshBuffer + dwOffset + iCopyKernelSize, iSize - iCopyKernelSize);
25402547
}
25412548
} while (false);
25422549

‎media_softlet/agnostic/common/shared/mediacopy/media_render_copy_next.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
(MhwKernelParam).iSize = (_pKernelEntry)->iSize; \
4141
(MhwKernelParam).iKUID = (_pKernelEntry)->iKUID; \
4242
(MhwKernelParam).iKCID = (_pKernelEntry)->iKCID; \
43+
(MhwKernelParam).iPaddingSize = (_pKernelEntry)->iPaddingSize; \
4344
} while(0)
4445

4546

‎media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.h

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class MhwCpInterface;
7878
(MhwKernelParam).iSize = (_pKernelEntry)->iSize; \
7979
(MhwKernelParam).iKUID = (_pKernelEntry)->iKUID; \
8080
(MhwKernelParam).iKCID = (_pKernelEntry)->iKCID; \
81+
(MhwKernelParam).iPaddingSize = (_pKernelEntry)->iPaddingSize; \
8182
} while(0)
8283

8384
typedef struct _PIPECONTRL_PARAMS

‎media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ MOS_STATUS VpRenderKernelObj::GetKernelEntry(Kdll_CacheEntry &entry)
7272
entry.iFilterSize = 2;
7373
entry.pFilter = nullptr;
7474
entry.iSize = m_kernelSize;
75+
entry.iPaddingSize = m_kernelPaddingSize;
7576
entry.pBinary = (uint8_t *)m_kernelBinary;
7677
return MOS_STATUS_SUCCESS;
7778
}

‎media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.h

+1
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ class VpRenderKernelObj
596596
void * m_kernelBinary = nullptr;
597597
uint32_t m_kernelBinaryID = 0;
598598
uint32_t m_kernelSize = 0;
599+
uint32_t m_kernelPaddingSize = 0;
599600
VpKernelID m_kernelId = kernelCombinedFc;
600601
DelayLoadedKernelType m_kernelType = KernelNone;
601602
KernelIndex m_kernelIndex = 0; // index of current kernel in KERNEL_PARAMS_LIST

‎media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_kernel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ MOS_STATUS VpRenderHdr3DLutKernelCM::Init(VpRenderKernel &kernel)
456456
{
457457
VP_FUNC_CALL();
458458
m_kernelSize = kernel.GetKernelSize() + KERNEL_BINARY_PADDING_SIZE;
459-
459+
m_kernelPaddingSize = KERNEL_BINARY_PADDING_SIZE;
460460
uint8_t *pKernelBin = (uint8_t *)kernel.GetKernelBinPointer();
461461
VP_RENDER_CHK_NULL_RETURN(pKernelBin);
462462

‎media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hvs_kernel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ MOS_STATUS VpRenderHVSKernel::Init(VpRenderKernel &kernel)
4949
{
5050
VP_FUNC_CALL();
5151
m_kernelSize = kernel.GetKernelSize() + KERNEL_BINARY_PADDING_SIZE;
52-
52+
m_kernelPaddingSize = KERNEL_BINARY_PADDING_SIZE;
5353
uint8_t *pKernelBin = (uint8_t *)kernel.GetKernelBinPointer();
5454
VP_RENDER_CHK_NULL_RETURN(pKernelBin);
5555

0 commit comments

Comments
 (0)
Please sign in to comment.