feature: add eudebug interface class

eudebug interface is now hidden under EuDebugInterface class
shared code uses generic object and param values

layout of structs is guarded by static asserts

eudebug support is guarded by cmake flags:
- NEO_ENABLE_XE_EU_DEBUG_SUPPORT - enables eudebug in general
- NEO_USE_XE_EU_DEBUG_EXP_UPSTREAM - registers exp upstream uAPI support
- NEO_ENABLE_XE_PRELIM_DETECTION - registers prelim uAPI support

This way we can support two different xe-eudebug interfaces within
single binary.

In unit tests there is mock eudebug interface enabled (even if no
eudebug support is enabled by cmake flag).

Related-To: NEO-13472
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2024-12-12 13:26:54 +00:00
committed by Compute-Runtime-Automation
parent 49c028858a
commit 8f7bacdd95
42 changed files with 2134 additions and 1144 deletions

View File

@@ -14,17 +14,19 @@
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "shared/source/os_interface/linux/memory_info.h"
#include "shared/source/os_interface/linux/xe/ioctl_helper_xe.h"
#include "shared/source/os_interface/linux/xe/xedrm.h"
#include "shared/source/os_interface/product_helper.h"
#include "shared/test/common/helpers/debug_manager_state_restore.h"
#include "shared/test/common/helpers/default_hw_info.h"
#include "shared/test/common/helpers/variable_backup.h"
#include "shared/test/common/libult/linux/drm_mock.h"
#include "shared/test/common/mocks/linux/mock_os_time_linux.h"
#include "shared/test/common/mocks/mock_execution_environment.h"
#include "shared/test/common/mocks/mock_io_functions.h"
#include "shared/test/common/os_interface/linux/sys_calls_linux_ult.h"
#include "shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h"
#include "shared/test/common/test_macros/test.h"
#include "debug_xe_includes.h"
using namespace NEO;
struct MockIoctlHelperXeDebug : IoctlHelperXe {
@@ -54,6 +56,7 @@ struct DrmMockXeDebug : public DrmMockCustom {
drm->reset();
drm->ioctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_EQ(1, drm->ioctlHelper->getEuDebugSysFsEnable());
auto xeQueryEngines = reinterpret_cast<drm_xe_query_engines *>(drm->queryEngines);
xeQueryEngines->num_engines = 11;
xeQueryEngines->engines[0] = {{DRM_XE_ENGINE_CLASS_RENDER, 0, 0}, {}};
@@ -122,7 +125,7 @@ struct DrmMockXeDebug : public DrmMockCustom {
ret = 0;
} break;
case DrmIoctl::debuggerOpen: {
auto debuggerOpen = reinterpret_cast<drm_xe_eudebug_connect *>(arg);
auto debuggerOpen = reinterpret_cast<EuDebugConnect *>(arg);
if (debuggerOpen->version != 0) {
return -1;
@@ -133,16 +136,16 @@ struct DrmMockXeDebug : public DrmMockCustom {
return debuggerOpenRetval;
} break;
case DrmIoctl::metadataCreate: {
auto metadata = reinterpret_cast<drm_xe_debug_metadata_create *>(arg);
metadataAddr = reinterpret_cast<void *>(metadata->user_addr);
auto metadata = reinterpret_cast<DebugMetadataCreate *>(arg);
metadataAddr = reinterpret_cast<void *>(metadata->userAddr);
metadataSize = metadata->len;
metadataType = metadata->type;
metadata->metadata_id = metadataID;
metadata->metadataId = metadataID;
return 0;
} break;
case DrmIoctl::metadataDestroy: {
auto metadata = reinterpret_cast<drm_xe_debug_metadata_destroy *>(arg);
metadataID = metadata->metadata_id;
auto metadata = reinterpret_cast<DebugMetadataDestroy *>(arg);
metadataID = metadata->metadataId;
return 0;
} break;
case DrmIoctl::gemWaitUserFence: {
@@ -182,6 +185,8 @@ struct DrmMockXeDebug : public DrmMockCustom {
}
return allowDebugAttach;
}
static constexpr const char *mockSysFsPciPath = "mock_sys_fs_pci_path";
std::string getSysFsPciPath() override { return mockSysFsPciPath; }
static_assert(sizeof(drm_xe_engine) == 4 * sizeof(uint64_t), "");
uint64_t queryEngines[45]{}; // 1 qword for num engines and 4 qwords per engine
@@ -204,6 +209,8 @@ struct DrmMockXeDebug : public DrmMockCustom {
std::vector<drm_xe_engine_class_instance> execQueueEngineInstances;
drm_xe_exec_queue_create execQueueCreateParams = {};
StackVec<drm_xe_wait_user_fence, 1> waitUserFenceInputs;
VariableBackup<decltype(NEO::IoFunctions::fopenPtr)> mockFopen{&NEO::IoFunctions::fopenPtr};
VariableBackup<size_t (*)(void *, size_t, size_t, FILE *)> mockFread{&NEO::IoFunctions::freadPtr};
// Debugger ioctls
int debuggerOpenRetval = 10; // debugFd
@@ -212,5 +219,23 @@ struct DrmMockXeDebug : public DrmMockCustom {
protected:
// Don't call directly, use the create() function
DrmMockXeDebug(RootDeviceEnvironment &rootDeviceEnvironment)
: DrmMockCustom(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {}
: DrmMockCustom(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {
NEO::IoFunctions::fopenPtr = [](const char *filename, const char *mode) -> FILE * {
std::string fsEntry(filename);
std::string expectedPath = std::string(DrmMockXeDebug::mockSysFsPciPath) + MockEuDebugInterface::sysFsXeEuDebugFile;
if (fsEntry == expectedPath) {
return reinterpret_cast<FILE *>(MockEuDebugInterface::sysFsFd);
}
return NEO::IoFunctions::mockFopen(filename, mode);
};
NEO::IoFunctions::freadPtr = [](void *ptr, size_t size, size_t count, FILE *stream) -> size_t {
if (stream == reinterpret_cast<FILE *>(MockEuDebugInterface::sysFsFd)) {
memcpy_s(ptr, size, &MockEuDebugInterface::sysFsContent, sizeof(MockEuDebugInterface::sysFsContent));
return sizeof(MockEuDebugInterface::sysFsContent);
}
return NEO::IoFunctions::mockFread(ptr, size, count, stream);
};
}
};

View File

@@ -0,0 +1,17 @@
#
# Copyright (C) 2024 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
set(neo_libult_common_SRCS_LIB_ULT_LINUX_XE_EUDEBUG
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/mock_eudebug_interface.h
${CMAKE_CURRENT_SOURCE_DIR}/mock_eudebug_interface.cpp
)
if(UNIX)
target_sources(neo_libult_common PRIVATE ${neo_libult_common_SRCS_LIB_ULT_LINUX_XE_EUDEBUG})
endif()
set_property(GLOBAL APPEND PROPERTY neo_libult_common_SRCS_LIB_ULT_LINUX_XE_EUDEBUG ${neo_libult_common_SRCS_LIB_ULT_LINUX_XE_EUDEBUG})
add_subdirectories()

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/test/common/os_interface/linux/xe/eudebug/mock_eudebug_interface.h"
#define RETURN_AS_IS(X) \
case X: \
return static_cast<uint32_t>(X)
#define RETURN_AS_BIT_UINT16(X) \
case X: \
static_assert(static_cast<uint32_t>(X) < 16u); \
return static_cast<uint32_t>(1 << static_cast<uint32_t>(X))
namespace NEO {
uint32_t MockEuDebugInterface::getParamValue(EuDebugParam param) const {
switch (param) {
RETURN_AS_BIT_UINT16(EuDebugParam::eventBitCreate);
RETURN_AS_BIT_UINT16(EuDebugParam::eventBitDestroy);
RETURN_AS_BIT_UINT16(EuDebugParam::eventBitStateChange);
RETURN_AS_BIT_UINT16(EuDebugParam::eventBitNeedAck);
RETURN_AS_IS(EuDebugParam::connect);
RETURN_AS_IS(EuDebugParam::euControlCmdInterruptAll);
RETURN_AS_IS(EuDebugParam::euControlCmdResume);
RETURN_AS_IS(EuDebugParam::euControlCmdStopped);
RETURN_AS_IS(EuDebugParam::execQueueSetPropertyEuDebug);
RETURN_AS_IS(EuDebugParam::eventTypeEuAttention);
RETURN_AS_IS(EuDebugParam::eventTypeExecQueue);
RETURN_AS_IS(EuDebugParam::eventTypeMetadata);
RETURN_AS_IS(EuDebugParam::eventTypeOpen);
RETURN_AS_IS(EuDebugParam::eventTypePagefault);
RETURN_AS_IS(EuDebugParam::eventTypeRead);
RETURN_AS_IS(EuDebugParam::eventTypeVm);
RETURN_AS_IS(EuDebugParam::eventTypeVmBind);
RETURN_AS_IS(EuDebugParam::eventTypeVmBindOp);
RETURN_AS_IS(EuDebugParam::eventTypeVmBindOpMetadata);
RETURN_AS_IS(EuDebugParam::eventTypeVmBindUfence);
RETURN_AS_IS(EuDebugParam::eventVmBindFlagUfence);
RETURN_AS_IS(EuDebugParam::ioctlAckEvent);
RETURN_AS_IS(EuDebugParam::ioctlEuControl);
RETURN_AS_IS(EuDebugParam::ioctlReadEvent);
RETURN_AS_IS(EuDebugParam::ioctlReadMetadata);
RETURN_AS_IS(EuDebugParam::ioctlVmOpen);
RETURN_AS_IS(EuDebugParam::metadataCreate);
RETURN_AS_IS(EuDebugParam::metadataDestroy);
RETURN_AS_IS(EuDebugParam::metadataElfBinary);
RETURN_AS_IS(EuDebugParam::metadataModuleArea);
RETURN_AS_IS(EuDebugParam::metadataProgramModule);
RETURN_AS_IS(EuDebugParam::metadataSbaArea);
RETURN_AS_IS(EuDebugParam::metadataSipArea);
RETURN_AS_IS(EuDebugParam::vmBindOpExtensionsAttachDebug);
}
return 0;
}
char MockEuDebugInterface::sysFsContent = '1';
[[maybe_unused]] static EnableEuDebugInterface enableMockEuDebug(MockEuDebugInterface::euDebugInterfaceType, MockEuDebugInterface::sysFsXeEuDebugFile, []() -> std::unique_ptr<EuDebugInterface> { return std::make_unique<MockEuDebugInterface>(); });
} // namespace NEO

View File

@@ -0,0 +1,21 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/os_interface/linux/xe/eudebug/eudebug_interface.h"
namespace NEO {
class MockEuDebugInterface : public EuDebugInterface {
public:
static char sysFsContent;
static constexpr const char *sysFsXeEuDebugFile = "/mock_eudebug";
static constexpr uintptr_t sysFsFd = 0xE0DEB0;
static constexpr EuDebugInterfaceType euDebugInterfaceType = EuDebugInterfaceType::upstream;
uint32_t getParamValue(EuDebugParam param) const override;
};
} // namespace NEO

View File

@@ -0,0 +1,29 @@
#
# Copyright (C) 2024 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
set(NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE_EUDEBUG
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
)
if(NEO_ENABLE_XE_EU_DEBUG_SUPPORT)
if(NEO_USE_XE_EU_DEBUG_EXP_UPSTREAM)
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE_EUDEBUG
${CMAKE_CURRENT_SOURCE_DIR}/eudebug_interface_upstream_tests.cpp
)
endif()
if(NEO_ENABLE_XE_PRELIM_DETECTION)
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE_EUDEBUG
${CMAKE_CURRENT_SOURCE_DIR}/eudebug_interface_prelim_tests.cpp
)
endif()
endif()
set_property(GLOBAL APPEND PROPERTY NEO_CORE_OS_INTERFACE_TESTS_LINUX ${NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE_EUDEBUG})
if(UNIX)
target_sources(neo_shared_tests PRIVATE ${NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE_EUDEBUG})
endif()
add_subdirectories()

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/xe/eudebug/eudebug_interface_prelim.h"
#include "shared/source/os_interface/linux/xe/xedrm_prelim.h"
#include "shared/test/common/test_macros/test.h"
using namespace NEO;
TEST(EuDebugInterfacePrelimTest, whenGettingParamValueThenCorrectValueIsReturned) {
EuDebugInterfacePrelim euDebugInterface{};
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_IOCTL_XE_EUDEBUG_CONNECT), euDebugInterface.getParamValue(EuDebugParam::connect));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL), euDebugInterface.getParamValue(EuDebugParam::euControlCmdInterruptAll));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME), euDebugInterface.getParamValue(EuDebugParam::euControlCmdResume));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED), euDebugInterface.getParamValue(EuDebugParam::euControlCmdStopped));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_CREATE), euDebugInterface.getParamValue(EuDebugParam::eventBitCreate));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_DESTROY), euDebugInterface.getParamValue(EuDebugParam::eventBitDestroy));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_NEED_ACK), euDebugInterface.getParamValue(EuDebugParam::eventBitNeedAck));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_STATE_CHANGE), euDebugInterface.getParamValue(EuDebugParam::eventBitStateChange));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_EU_ATTENTION), euDebugInterface.getParamValue(EuDebugParam::eventTypeEuAttention));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE), euDebugInterface.getParamValue(EuDebugParam::eventTypeExecQueue));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_METADATA), euDebugInterface.getParamValue(EuDebugParam::eventTypeMetadata));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_OPEN), euDebugInterface.getParamValue(EuDebugParam::eventTypeOpen));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_PAGEFAULT), euDebugInterface.getParamValue(EuDebugParam::eventTypePagefault));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_READ), euDebugInterface.getParamValue(EuDebugParam::eventTypeRead));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM), euDebugInterface.getParamValue(EuDebugParam::eventTypeVm));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM_BIND), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBind));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM_BIND_OP), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindOp));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindOpMetadata));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindUfence));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE), euDebugInterface.getParamValue(EuDebugParam::eventVmBindFlagUfence));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG), euDebugInterface.getParamValue(EuDebugParam::execQueueSetPropertyEuDebug));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_IOCTL_ACK_EVENT), euDebugInterface.getParamValue(EuDebugParam::ioctlAckEvent));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_IOCTL_EU_CONTROL), euDebugInterface.getParamValue(EuDebugParam::ioctlEuControl));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_IOCTL_READ_EVENT), euDebugInterface.getParamValue(EuDebugParam::ioctlReadEvent));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_IOCTL_READ_METADATA), euDebugInterface.getParamValue(EuDebugParam::ioctlReadMetadata));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_EUDEBUG_IOCTL_VM_OPEN), euDebugInterface.getParamValue(EuDebugParam::ioctlVmOpen));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_IOCTL_XE_DEBUG_METADATA_CREATE), euDebugInterface.getParamValue(EuDebugParam::metadataCreate));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_IOCTL_XE_DEBUG_METADATA_DESTROY), euDebugInterface.getParamValue(EuDebugParam::metadataDestroy));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_DEBUG_METADATA_ELF_BINARY), euDebugInterface.getParamValue(EuDebugParam::metadataElfBinary));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataModuleArea));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_DRM_XE_DEBUG_METADATA_PROGRAM_MODULE), euDebugInterface.getParamValue(EuDebugParam::metadataProgramModule));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataSbaArea));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataSipArea));
EXPECT_EQ(static_cast<uint32_t>(PRELIM_XE_VM_BIND_OP_EXTENSIONS_ATTACH_DEBUG), euDebugInterface.getParamValue(EuDebugParam::vmBindOpExtensionsAttachDebug));
}

View File

@@ -0,0 +1,51 @@
/*
* Copyright (C) 2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/xe/eudebug/eudebug_interface_upstream.h"
#include "shared/test/common/test_macros/test.h"
#include "third_party/uapi-eudebug/drm/xe_drm.h"
using namespace NEO;
TEST(EuDebugInterfaceUpstreamTest, whenGettingParamValueThenCorrectValueIsReturned) {
EuDebugInterfaceUpstream euDebugInterface{};
EXPECT_EQ(static_cast<uint32_t>(DRM_IOCTL_XE_EUDEBUG_CONNECT), euDebugInterface.getParamValue(EuDebugParam::connect));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL), euDebugInterface.getParamValue(EuDebugParam::euControlCmdInterruptAll));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME), euDebugInterface.getParamValue(EuDebugParam::euControlCmdResume));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED), euDebugInterface.getParamValue(EuDebugParam::euControlCmdStopped));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_CREATE), euDebugInterface.getParamValue(EuDebugParam::eventBitCreate));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_DESTROY), euDebugInterface.getParamValue(EuDebugParam::eventBitDestroy));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_NEED_ACK), euDebugInterface.getParamValue(EuDebugParam::eventBitNeedAck));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_STATE_CHANGE), euDebugInterface.getParamValue(EuDebugParam::eventBitStateChange));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_EU_ATTENTION), euDebugInterface.getParamValue(EuDebugParam::eventTypeEuAttention));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE), euDebugInterface.getParamValue(EuDebugParam::eventTypeExecQueue));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_METADATA), euDebugInterface.getParamValue(EuDebugParam::eventTypeMetadata));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_OPEN), euDebugInterface.getParamValue(EuDebugParam::eventTypeOpen));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_PAGEFAULT), euDebugInterface.getParamValue(EuDebugParam::eventTypePagefault));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_READ), euDebugInterface.getParamValue(EuDebugParam::eventTypeRead));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM), euDebugInterface.getParamValue(EuDebugParam::eventTypeVm));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM_BIND), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBind));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM_BIND_OP), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindOp));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindOpMetadata));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE), euDebugInterface.getParamValue(EuDebugParam::eventTypeVmBindUfence));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE), euDebugInterface.getParamValue(EuDebugParam::eventVmBindFlagUfence));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG), euDebugInterface.getParamValue(EuDebugParam::execQueueSetPropertyEuDebug));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_IOCTL_ACK_EVENT), euDebugInterface.getParamValue(EuDebugParam::ioctlAckEvent));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_IOCTL_EU_CONTROL), euDebugInterface.getParamValue(EuDebugParam::ioctlEuControl));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_IOCTL_READ_EVENT), euDebugInterface.getParamValue(EuDebugParam::ioctlReadEvent));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_IOCTL_READ_METADATA), euDebugInterface.getParamValue(EuDebugParam::ioctlReadMetadata));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_EUDEBUG_IOCTL_VM_OPEN), euDebugInterface.getParamValue(EuDebugParam::ioctlVmOpen));
EXPECT_EQ(static_cast<uint32_t>(DRM_IOCTL_XE_DEBUG_METADATA_CREATE), euDebugInterface.getParamValue(EuDebugParam::metadataCreate));
EXPECT_EQ(static_cast<uint32_t>(DRM_IOCTL_XE_DEBUG_METADATA_DESTROY), euDebugInterface.getParamValue(EuDebugParam::metadataDestroy));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_DEBUG_METADATA_ELF_BINARY), euDebugInterface.getParamValue(EuDebugParam::metadataElfBinary));
EXPECT_EQ(static_cast<uint32_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataModuleArea));
EXPECT_EQ(static_cast<uint32_t>(DRM_XE_DEBUG_METADATA_PROGRAM_MODULE), euDebugInterface.getParamValue(EuDebugParam::metadataProgramModule));
EXPECT_EQ(static_cast<uint32_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataSbaArea));
EXPECT_EQ(static_cast<uint32_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA), euDebugInterface.getParamValue(EuDebugParam::metadataSipArea));
EXPECT_EQ(static_cast<uint32_t>(XE_VM_BIND_OP_EXTENSIONS_ATTACH_DEBUG), euDebugInterface.getParamValue(EuDebugParam::vmBindOpExtensionsAttachDebug));
}

View File

@@ -24,8 +24,6 @@
#include "shared/test/common/test_macros/hw_test.h"
#include "shared/test/common/test_macros/test.h"
#include "debug_xe_includes.h"
using namespace NEO;
TEST(IoctlHelperXeTest, whenCallingDebuggerOpenIoctlThenProperValueIsReturned) {
@@ -36,7 +34,7 @@ TEST(IoctlHelperXeTest, whenCallingDebuggerOpenIoctlThenProperValueIsReturned) {
auto mockXeIoctlHelper = drm->ioctlHelper.get();
drm->reset();
drm_xe_eudebug_connect test = {};
EuDebugConnect test = {};
ret = mockXeIoctlHelper->ioctl(DrmIoctl::debuggerOpen, &test);
EXPECT_EQ(ret, drm->debuggerOpenRetval);
@@ -44,8 +42,8 @@ TEST(IoctlHelperXeTest, whenCallingDebuggerOpenIoctlThenProperValueIsReturned) {
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetIoctForDebuggerThenCorrectValueReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = drm->getIoctlHelper();
auto verifyIoctlRequestValue = [&xeIoctlHelper](auto value, DrmIoctl drmIoctl) {
EXPECT_EQ(xeIoctlHelper->getIoctlRequestValue(drmIoctl), static_cast<unsigned int>(value));
};
@@ -55,7 +53,7 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetIoctForDebuggerThenCorre
verifyIoctlString(DrmIoctl::debuggerOpen, "DRM_IOCTL_XE_EUDEBUG_CONNECT");
verifyIoctlRequestValue(DRM_IOCTL_XE_EUDEBUG_CONNECT, DrmIoctl::debuggerOpen);
verifyIoctlRequestValue(EuDebugParam::connect, DrmIoctl::debuggerOpen);
}
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetEudebugExtPropertyThenCorrectValueReturned) {
@@ -63,7 +61,7 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetEudebugExtPropertyThenCo
executionEnvironment->setDebuggingMode(DebuggingMode::offline);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
EXPECT_EQ(xeIoctlHelper->getEudebugExtProperty(), DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG);
EXPECT_EQ(xeIoctlHelper->getEudebugExtProperty(), static_cast<int>(EuDebugParam::execQueueSetPropertyEuDebug));
}
using IoctlHelperXeTestFixture = ::testing::Test;
@@ -86,7 +84,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenDebuggingDisabledWhenCreateDrmContextThe
xeIoctlHelper->createDrmContext(*drm, osContext, 0, deviceIndex, false);
auto ext = drm->receivedContextCreateSetParam;
EXPECT_NE(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
EXPECT_NE(ext.property, static_cast<uint32_t>(EuDebugParam::execQueueSetPropertyEuDebug));
}
HWTEST_F(IoctlHelperXeTestFixture, givenDeviceIndexWhenCreatingContextThenSetCorrectGtId) {
@@ -138,7 +136,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenDebuggingEnabledWhenCreateDrmContextThen
auto ext = drm->receivedContextCreateSetParam;
EXPECT_EQ(ext.base.name, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY));
EXPECT_EQ(ext.base.next_extension, 0ULL);
EXPECT_EQ(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
EXPECT_EQ(ext.property, static_cast<uint32_t>(EuDebugParam::execQueueSetPropertyEuDebug));
EXPECT_EQ(ext.value, 1ULL);
}
@@ -161,7 +159,7 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenContextCreatedForCopyEngineWhenCreateDrm
xeIoctlHelper->createDrmContext(*drm, osContext, 0, 0, false);
auto ext = drm->receivedContextCreateSetParam;
EXPECT_NE(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
EXPECT_NE(ext.property, static_cast<uint32_t>(EuDebugParam::execQueueSetPropertyEuDebug));
}
TEST(IoctlHelperXeTest, GivenXeDriverThenDebugAttachReturnsTrue) {
@@ -173,34 +171,30 @@ TEST(IoctlHelperXeTest, GivenXeDriverThenDebugAttachReturnsTrue) {
TEST(IoctlHelperXeTest, givenXeEnableEuDebugThenReturnCorrectValue) {
VariableBackup<size_t> mockFreadReturnBackup(&IoFunctions::mockFreadReturn, 1);
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(IoFunctions::mockFreadReturn);
VariableBackup<char *> mockFreadBufferBackup(&IoFunctions::mockFreadBuffer, buffer.get());
VariableBackup<char> euDebugAvailabilityBackup(&MockEuDebugInterface::sysFsContent);
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
buffer[0] = '1';
MockEuDebugInterface::sysFsContent = '1';
int enableEuDebug = xeIoctlHelper->getEuDebugSysFsEnable();
EXPECT_EQ(1, enableEuDebug);
buffer[0] = '0';
MockEuDebugInterface::sysFsContent = '0';
enableEuDebug = xeIoctlHelper->getEuDebugSysFsEnable();
EXPECT_EQ(0, enableEuDebug);
}
TEST(IoctlHelperXeTest, givenXeEnableEuDebugWithInvalidPathThenReturnCorrectValue) {
VariableBackup<size_t> mockFreadReturnBackup(&IoFunctions::mockFreadReturn, 1);
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(IoFunctions::mockFreadReturn);
VariableBackup<char *> mockFreadBufferBackup(&IoFunctions::mockFreadBuffer, buffer.get());
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
buffer[0] = '1';
VariableBackup<FILE *> mockFopenReturnBackup(&IoFunctions::mockFopenReturned, nullptr);
VariableBackup<size_t> mockFreadReturnBackup(&IoFunctions::mockFreadReturn, 0);
VariableBackup<const char *> eudebugSysFsEntryBackup(&eudebugSysfsEntry[static_cast<uint32_t>(MockEuDebugInterface::euDebugInterfaceType)], "invalidEntry");
int enableEuDebug = xeIoctlHelper->getEuDebugSysFsEnable();
EXPECT_EQ(0, enableEuDebug);
@@ -217,7 +211,7 @@ TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_ELF_BINARY));
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(EuDebugParam::metadataElfBinary));
drm->metadataID = 0;
drm->metadataAddr = nullptr;
@@ -226,7 +220,7 @@ TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_PROGRAM_MODULE));
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(EuDebugParam::metadataProgramModule));
drm->metadataID = 0;
drm->metadataAddr = nullptr;
@@ -235,7 +229,7 @@ TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA));
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(EuDebugParam::metadataSipArea));
drm->metadataID = 0;
drm->metadataAddr = nullptr;
@@ -244,7 +238,7 @@ TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA));
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(EuDebugParam::metadataSbaArea));
drm->metadataID = 0;
drm->metadataAddr = nullptr;
@@ -253,7 +247,7 @@ TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA));
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(EuDebugParam::metadataModuleArea));
}
TEST(IoctlHelperXeTest, givenXeunregisterResourceThenCorrectIoctlCalled) {
@@ -274,16 +268,16 @@ TEST(IoctlHelperXeTest, whenGettingVmBindExtFromHandlesThenProperStructsAreRetur
bindExtHandles.push_back(2u);
bindExtHandles.push_back(3u);
auto retVal = xeIoctlHelper->prepareVmBindExt(bindExtHandles);
auto vmBindExt = reinterpret_cast<drm_xe_vm_bind_op_ext_attach_debug *>(retVal.get());
auto vmBindExt = reinterpret_cast<VmBindOpExtAttachDebug *>(retVal.get());
for (size_t i = 0; i < bindExtHandles.size(); i++) {
EXPECT_EQ(bindExtHandles[i], vmBindExt[i].metadata_id);
EXPECT_EQ(static_cast<uint32_t>(XE_VM_BIND_OP_EXTENSIONS_ATTACH_DEBUG), vmBindExt[i].base.name);
EXPECT_EQ(bindExtHandles[i], vmBindExt[i].metadataId);
EXPECT_EQ(static_cast<uint32_t>(EuDebugParam::vmBindOpExtensionsAttachDebug), vmBindExt[i].base.name);
}
EXPECT_EQ(reinterpret_cast<uintptr_t>(&vmBindExt[1]), vmBindExt[0].base.next_extension);
EXPECT_EQ(reinterpret_cast<uintptr_t>(&vmBindExt[2]), vmBindExt[1].base.next_extension);
EXPECT_EQ(reinterpret_cast<uintptr_t>(&vmBindExt[1]), vmBindExt[0].base.nextExtension);
EXPECT_EQ(reinterpret_cast<uintptr_t>(&vmBindExt[2]), vmBindExt[1].base.nextExtension);
}
TEST(IoctlHelperXeTest, givenResourceRegistrationEnabledWhenAllocationTypeShouldBeRegisteredThenBoHasBindExtHandleAdded) {