2022-05-17 09:26:26 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2022 Intel Corporation
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2022-06-07 17:30:54 +08:00
|
|
|
#pragma once
|
|
|
|
|
2022-05-17 09:26:26 +08:00
|
|
|
#include "shared/test/common/mocks/mock_wddm.h"
|
|
|
|
|
2022-05-25 19:54:20 +08:00
|
|
|
#include "KmEscape.h"
|
|
|
|
|
2022-05-17 09:26:26 +08:00
|
|
|
namespace NEO {
|
|
|
|
|
|
|
|
struct WddmEuDebugInterfaceMock : public WddmMock {
|
|
|
|
WddmEuDebugInterfaceMock(RootDeviceEnvironment &rootDeviceEnvironment) : WddmMock(rootDeviceEnvironment) {}
|
|
|
|
|
|
|
|
bool isDebugAttachAvailable() override {
|
2022-05-25 19:54:20 +08:00
|
|
|
return debugAttachAvailable;
|
2022-05-17 09:26:26 +08:00
|
|
|
}
|
2022-05-25 19:54:20 +08:00
|
|
|
|
|
|
|
NTSTATUS escape(D3DKMT_ESCAPE &escapeCommand) override {
|
|
|
|
auto pEscapeInfo = static_cast<KM_ESCAPE_INFO *>(escapeCommand.pPrivateDriverData);
|
2022-06-07 23:35:22 +08:00
|
|
|
if (pEscapeInfo->EscapeOperation == KM_ESCAPE_EUDBG_UMD_REGISTER_ALLOCATION_TYPE) {
|
|
|
|
++registerAllocationTypeCalled;
|
|
|
|
GFX_ALLOCATION_DEBUG_DATA_INFO *allocDataInfo = reinterpret_cast<GFX_ALLOCATION_DEBUG_DATA_INFO *>(pEscapeInfo->KmEuDbgUmdRegisterAllocationData.DebugDataBufferPtr);
|
|
|
|
registerAllocationTypePassedParams.allocDataSize = allocDataInfo->DataSize;
|
|
|
|
memcpy_s(registerAllocationTypePassedParams.allocData, 100, reinterpret_cast<uint8_t *>(allocDataInfo->DataPointer), allocDataInfo->DataSize);
|
|
|
|
return ntStatus;
|
|
|
|
}
|
|
|
|
|
2022-05-25 19:54:20 +08:00
|
|
|
if (pEscapeInfo->EscapeOperation != KM_ESCAPE_EUDBG_L0_DBGUMD_HANDLER) {
|
2022-06-07 23:35:22 +08:00
|
|
|
return ntStatus;
|
2022-05-25 19:54:20 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
++dbgUmdEscapeActionCalled[pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeActionType];
|
|
|
|
|
2022-06-07 23:35:22 +08:00
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeReturnStatus = escapeReturnStatus;
|
2022-05-25 19:54:20 +08:00
|
|
|
switch (pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeActionType) {
|
|
|
|
case DBGUMD_ACTION_ATTACH_DEBUGGER: {
|
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.AttachDebuggerParams.hDebugHandle = debugHandle;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case DBGUMD_ACTION_DETACH_DEBUGGER:
|
|
|
|
break;
|
2022-05-29 04:23:42 +08:00
|
|
|
case DBGUMD_ACTION_READ_EVENT: {
|
2022-06-07 23:35:22 +08:00
|
|
|
if (curEvent >= numEvents) {
|
2022-05-29 04:23:42 +08:00
|
|
|
// KMD event queue is empty
|
2022-06-07 23:35:22 +08:00
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeReturnStatus = DBGUMD_RETURN_READ_EVENT_TIMEOUT_EXPIRED;
|
2022-05-29 04:23:42 +08:00
|
|
|
break;
|
|
|
|
}
|
2022-06-07 23:35:22 +08:00
|
|
|
|
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeReturnStatus = eventQueue[curEvent].escapeReturnStatus;
|
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.ReadEventParams.ReadEventType = eventQueue[curEvent].readEventType;
|
2022-05-29 04:23:42 +08:00
|
|
|
auto paramBuffer = reinterpret_cast<uint8_t *>(pEscapeInfo->KmEuDbgL0EscapeInfo.ReadEventParams.EventParamBufferPtr);
|
2022-06-07 23:35:22 +08:00
|
|
|
memcpy_s(paramBuffer, pEscapeInfo->KmEuDbgL0EscapeInfo.ReadEventParams.EventParamsBufferSize, &eventQueue[curEvent].eventParamsBuffer, sizeof(READ_EVENT_PARAMS_BUFFER));
|
|
|
|
return eventQueue[curEvent++].ntStatus;
|
|
|
|
}
|
|
|
|
case DBGUMD_ACTION_READ_ALLOCATION_DATA: {
|
|
|
|
pEscapeInfo->KmEuDbgL0EscapeInfo.EscapeReturnStatus = readAllocationDataOutParams.escapeReturnStatus;
|
|
|
|
if (readAllocationDataOutParams.outData != nullptr) {
|
|
|
|
auto outBuffer = reinterpret_cast<uint8_t *>(pEscapeInfo->KmEuDbgL0EscapeInfo.ReadAdditionalAllocDataParams.OutputBufferPtr);
|
|
|
|
memcpy_s(outBuffer, pEscapeInfo->KmEuDbgL0EscapeInfo.ReadAdditionalAllocDataParams.OutputBufferSize, readAllocationDataOutParams.outData, readAllocationDataOutParams.outDataSize);
|
|
|
|
}
|
2022-05-29 04:23:42 +08:00
|
|
|
break;
|
|
|
|
}
|
2022-05-25 19:54:20 +08:00
|
|
|
}
|
2022-06-07 23:35:22 +08:00
|
|
|
return ntStatus;
|
2022-05-25 19:54:20 +08:00
|
|
|
};
|
|
|
|
|
2022-06-07 23:35:22 +08:00
|
|
|
uint32_t numEvents = 0;
|
|
|
|
uint32_t curEvent = 0;
|
2022-05-29 04:23:42 +08:00
|
|
|
struct {
|
2022-06-07 23:35:22 +08:00
|
|
|
NTSTATUS ntStatus = STATUS_SUCCESS;
|
2022-05-29 04:23:42 +08:00
|
|
|
EUDBG_L0DBGUMD_ESCAPE_RETURN_TYPE escapeReturnStatus = DBGUMD_RETURN_ESCAPE_SUCCESS;
|
|
|
|
EUDBG_DBGUMD_READ_EVENT_TYPE readEventType = DBGUMD_READ_EVENT_MAX;
|
2022-06-07 23:35:22 +08:00
|
|
|
union {
|
|
|
|
READ_EVENT_PARAMS_BUFFER eventParamsBuffer;
|
|
|
|
uint8_t rawBytes[READ_EVENT_PARAMS_BUFFER_MIN_SIZE_BYTES] = {0};
|
|
|
|
} eventParamsBuffer;
|
|
|
|
} eventQueue[10] = {0};
|
|
|
|
|
|
|
|
struct {
|
|
|
|
EUDBG_L0DBGUMD_ESCAPE_RETURN_TYPE escapeReturnStatus = DBGUMD_RETURN_ESCAPE_SUCCESS;
|
|
|
|
void *outData = nullptr;
|
|
|
|
size_t outDataSize = 0;
|
|
|
|
} readAllocationDataOutParams;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
uint32_t allocDataSize = 0;
|
|
|
|
uint32_t allocData[100] = {0};
|
|
|
|
} registerAllocationTypePassedParams;
|
2022-05-29 04:23:42 +08:00
|
|
|
|
2022-05-25 19:54:20 +08:00
|
|
|
bool debugAttachAvailable = true;
|
2022-06-07 23:35:22 +08:00
|
|
|
NTSTATUS ntStatus = STATUS_SUCCESS;
|
|
|
|
uint32_t escapeReturnStatus = DBGUMD_RETURN_ESCAPE_SUCCESS;
|
|
|
|
|
2022-05-25 19:54:20 +08:00
|
|
|
uint64_t debugHandle = 0x0DEB0DEB;
|
|
|
|
uint32_t dbgUmdEscapeActionCalled[DBGUMD_ACTION_MAX] = {0};
|
2022-06-07 23:35:22 +08:00
|
|
|
uint32_t registerAllocationTypeCalled = 0;
|
2022-05-17 09:26:26 +08:00
|
|
|
};
|
2022-05-25 19:54:20 +08:00
|
|
|
|
2022-05-28 00:48:47 +08:00
|
|
|
} // namespace NEO
|