mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-08 22:12:59 +08:00
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:
committed by
Compute-Runtime-Automation
parent
49c028858a
commit
8f7bacdd95
@@ -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);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user