From 1e3d57b29a99f1760954cd34d6e892e383d7fc8f Mon Sep 17 00:00:00 2001 From: Brandon Yates Date: Fri, 9 Feb 2024 22:02:00 +0000 Subject: [PATCH] refactor: Move Debugger Mem Access to generic linux implementation Related-to: NEO-9669 Signed-off-by: Brandon Yates --- .../source/debug/linux/debug_session.cpp | 216 ++++++++++++++++++ .../tools/source/debug/linux/debug_session.h | 22 ++ .../debug/linux/prelim/debug_session.cpp | 215 ----------------- .../source/debug/linux/prelim/debug_session.h | 23 +- .../source/debug/linux/xe/debug_session.h | 5 + 5 files changed, 247 insertions(+), 234 deletions(-) diff --git a/level_zero/tools/source/debug/linux/debug_session.cpp b/level_zero/tools/source/debug/linux/debug_session.cpp index 5df090c540..0bd809b18e 100644 --- a/level_zero/tools/source/debug/linux/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/debug_session.cpp @@ -9,6 +9,7 @@ #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/aligned_memory.h" +#include "shared/source/helpers/basic_math.h" #include "shared/source/helpers/hw_info.h" #include "shared/source/helpers/sleep.h" #include "shared/source/memory_manager/memory_manager.h" @@ -393,4 +394,219 @@ int DebugSessionLinux::threadControl(const std::vector &thre return euControlRetVal; } +ze_result_t DebugSessionLinux::readElfSpace(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, + const char *&elfData, const uint64_t offset) { + + int retVal = -1; + elfData += offset; + retVal = memcpy_s(buffer, size, elfData, size); + return (retVal == 0) ? ZE_RESULT_SUCCESS : ZE_RESULT_ERROR_UNKNOWN; +} + +ze_result_t DebugSessionLinux::readMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) { + ze_result_t status = validateThreadAndDescForMemoryAccess(thread, desc); + if (status != ZE_RESULT_SUCCESS) { + return status; + } + + if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { + status = readDefaultMemory(thread, desc, size, buffer); + } else { + auto threadId = convertToThreadId(thread); + status = slmMemoryAccess(threadId, desc, size, buffer); + } + + return status; +} + +ze_result_t DebugSessionLinux::readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) { + ze_result_t status = ZE_RESULT_SUCCESS; + + bool isa = tryReadIsa(connectedDevice->getNEODevice()->getDeviceBitfield(), desc, size, buffer, status); + if (isa) { + return status; + } + + bool elf = tryReadElf(desc, size, buffer, status); + if (elf) { + return status; + } + + if (DebugSession::isThreadAll(thread)) { + return accessDefaultMemForThreadAll(desc, size, const_cast(buffer), false); + } + + auto threadId = convertToThreadId(thread); + auto vmHandle = allThreads[threadId]->getMemoryHandle(); + if (vmHandle == invalidHandle) { + return ZE_RESULT_ERROR_NOT_AVAILABLE; + } + + return readGpuMemory(vmHandle, static_cast(buffer), size, desc->address); +} + +ze_result_t DebugSessionLinux::writeMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) { + ze_result_t status = validateThreadAndDescForMemoryAccess(thread, desc); + if (status != ZE_RESULT_SUCCESS) { + return status; + } + + if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { + status = writeDefaultMemory(thread, desc, size, buffer); + } else { + auto threadId = convertToThreadId(thread); + status = slmMemoryAccess(threadId, desc, size, buffer); + } + + return status; +} + +ze_result_t DebugSessionLinux::writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) { + ze_result_t status = ZE_RESULT_SUCCESS; + + auto deviceBitfield = connectedDevice->getNEODevice()->getDeviceBitfield(); + + bool isa = tryWriteIsa(deviceBitfield, desc, size, buffer, status); + if (isa) { + return status; + } + + if (DebugSession::isThreadAll(thread)) { + return accessDefaultMemForThreadAll(desc, size, const_cast(buffer), true); + } + + auto threadId = convertToThreadId(thread); + auto threadVmHandle = allThreads[threadId]->getMemoryHandle(); + if (threadVmHandle == invalidHandle) { + return ZE_RESULT_ERROR_NOT_AVAILABLE; + } + + return writeGpuMemory(threadVmHandle, static_cast(buffer), size, desc->address); +} + +bool DebugSessionLinux::tryWriteIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer, ze_result_t &status) { + return tryAccessIsa(deviceBitfield, desc, size, const_cast(buffer), true, status); +} + +bool DebugSessionLinux::tryReadIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status) { + return tryAccessIsa(deviceBitfield, desc, size, buffer, false, status); +} + +bool DebugSessionLinux::tryReadElf(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status) { + const char *elfData = nullptr; + uint64_t offset = 0; + + std::lock_guard memLock(asyncThreadMutex); + + status = getElfOffset(desc, size, elfData, offset); + if (status == ZE_RESULT_ERROR_INVALID_ARGUMENT) { + return true; + } + + if (elfData) { + status = readElfSpace(desc, size, buffer, elfData, offset); + return true; + } + return false; +} + +ze_result_t DebugSessionLinux::accessDefaultMemForThreadAll(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write) { + auto status = ZE_RESULT_ERROR_UNINITIALIZED; + std::vector allVms; + + allVms = getAllMemoryHandles(); + + if (allVms.size() > 0) { + for (auto vmHandle : allVms) { + if (write) { + status = writeGpuMemory(vmHandle, static_cast(buffer), size, desc->address); + } else { + status = readGpuMemory(vmHandle, static_cast(buffer), size, desc->address); + } + if (status == ZE_RESULT_SUCCESS) { + return status; + } + } + + status = ZE_RESULT_ERROR_NOT_AVAILABLE; + } + return status; +} + +bool DebugSessionLinux::tryAccessIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write, ze_result_t &status) { + status = ZE_RESULT_ERROR_NOT_AVAILABLE; + uint64_t vmHandle[NEO::EngineLimits::maxHandleCount] = {invalidHandle}; + uint32_t deviceIndex = Math::getMinLsbSet(static_cast(deviceBitfield.to_ulong())); + + bool isaAccess = false; + + auto checkIfAnyFailed = [](const auto &result) { return result != ZE_RESULT_SUCCESS; }; + + { + std::lock_guard memLock(asyncThreadMutex); + + if (deviceBitfield.count() == 1) { + status = getISAVMHandle(deviceIndex, desc, size, vmHandle[deviceIndex]); + if (status == ZE_RESULT_SUCCESS) { + isaAccess = true; + } + if (status == ZE_RESULT_ERROR_INVALID_ARGUMENT) { + return true; + } + } else { + isaAccess = getIsaInfoForAllInstances(deviceBitfield, desc, size, vmHandle, status); + } + } + + if (isaAccess && status == ZE_RESULT_SUCCESS) { + + if (write) { + if (deviceBitfield.count() == 1) { + if (vmHandle[deviceIndex] != invalidHandle) { + status = writeGpuMemory(vmHandle[deviceIndex], static_cast(buffer), size, desc->address); + } else { + status = ZE_RESULT_ERROR_UNINITIALIZED; + } + } else { + std::vector results(NEO::EngineLimits::maxHandleCount); + + for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) { + results[i] = ZE_RESULT_SUCCESS; + + if (deviceBitfield.test(i) && vmHandle[i] != invalidHandle) { + results[i] = writeGpuMemory(vmHandle[i], static_cast(buffer), size, desc->address); + + if (results[i] != ZE_RESULT_SUCCESS) { + break; + } + } + } + + const bool anyFailed = std::any_of(results.begin(), results.end(), checkIfAnyFailed); + + if (anyFailed) { + status = ZE_RESULT_ERROR_UNKNOWN; + } + } + } else { + + if (deviceBitfield.count() > 1) { + for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) { + if (vmHandle[i] != invalidHandle) { + deviceIndex = i; + break; + } + } + } + + if (vmHandle[deviceIndex] != invalidHandle) { + status = readGpuMemory(vmHandle[deviceIndex], static_cast(buffer), size, desc->address); + } else { + status = ZE_RESULT_ERROR_UNINITIALIZED; + } + } + } + return isaAccess; +} + } // namespace L0 diff --git a/level_zero/tools/source/debug/linux/debug_session.h b/level_zero/tools/source/debug/linux/debug_session.h index e3a0302769..326528f71e 100644 --- a/level_zero/tools/source/debug/linux/debug_session.h +++ b/level_zero/tools/source/debug/linux/debug_session.h @@ -83,6 +83,9 @@ struct DebugSessionLinux : DebugSessionImp { } }; + ze_result_t readMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) override; + ze_result_t writeMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) override; + protected: enum class ThreadControlCmd { interrupt, @@ -100,6 +103,25 @@ struct DebugSessionLinux : DebugSessionImp { MOCKABLE_VIRTUAL bool checkForceExceptionBit(uint64_t memoryHandle, EuThread::ThreadId threadId, uint32_t *cr0, const SIP::regset_desc *regDesc); ze_result_t resumeImp(const std::vector &threads, uint32_t deviceIndex) override; ze_result_t interruptImp(uint32_t deviceIndex) override; + + virtual ze_result_t getElfOffset(const zet_debug_memory_space_desc_t *desc, size_t size, const char *&elfData, uint64_t &offset) = 0; + ze_result_t readElfSpace(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, + const char *&elfData, const uint64_t offset); + virtual bool tryReadElf(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status); + + bool tryWriteIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer, ze_result_t &status); + bool tryReadIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status); + ze_result_t accessDefaultMemForThreadAll(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write); + ze_result_t readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, + size_t size, void *buffer); + ze_result_t writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, + size_t size, const void *buffer); + virtual bool tryAccessIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write, ze_result_t &status); + virtual ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) = 0; + virtual bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) = 0; + + virtual std::vector getAllMemoryHandles() = 0; + std::unique_ptr ioctlHandler; uint64_t euControlInterruptSeqno[NEO::EngineLimits::maxHandleCount]; }; diff --git a/level_zero/tools/source/debug/linux/prelim/debug_session.cpp b/level_zero/tools/source/debug/linux/prelim/debug_session.cpp index 72687dd0b9..bb80f3898b 100644 --- a/level_zero/tools/source/debug/linux/prelim/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/prelim/debug_session.cpp @@ -1445,24 +1445,6 @@ void DebugSessionLinuxi915::printContextVms() { } } -bool DebugSessionLinuxi915::tryReadElf(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status) { - const char *elfData = nullptr; - uint64_t offset = 0; - - std::lock_guard memLock(asyncThreadMutex); - - status = getElfOffset(desc, size, elfData, offset); - if (status == ZE_RESULT_ERROR_INVALID_ARGUMENT) { - return true; - } - - if (elfData) { - status = readElfSpace(desc, size, buffer, elfData, offset); - return true; - } - return false; -} - ze_result_t DebugSessionLinuxi915::getElfOffset(const zet_debug_memory_space_desc_t *desc, size_t size, const char *&elfData, uint64_t &offset) { auto &elfMap = clientHandleToConnection[clientHandle]->elfMap; auto accessVA = desc->address; @@ -1492,203 +1474,6 @@ ze_result_t DebugSessionLinuxi915::getElfOffset(const zet_debug_memory_space_des return status; } -ze_result_t DebugSessionLinuxi915::readElfSpace(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, - const char *&elfData, const uint64_t offset) { - - int retVal = -1; - elfData += offset; - retVal = memcpy_s(buffer, size, elfData, size); - return (retVal == 0) ? ZE_RESULT_SUCCESS : ZE_RESULT_ERROR_UNKNOWN; -} - -ze_result_t DebugSessionLinuxi915::readMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) { - ze_result_t status = validateThreadAndDescForMemoryAccess(thread, desc); - if (status != ZE_RESULT_SUCCESS) { - return status; - } - - if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { - status = readDefaultMemory(thread, desc, size, buffer); - } else { - auto threadId = convertToThreadId(thread); - status = slmMemoryAccess(threadId, desc, size, buffer); - } - - return status; -} - -ze_result_t DebugSessionLinuxi915::readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) { - ze_result_t status = ZE_RESULT_SUCCESS; - - bool isa = tryReadIsa(connectedDevice->getNEODevice()->getDeviceBitfield(), desc, size, buffer, status); - if (isa) { - return status; - } - - bool elf = tryReadElf(desc, size, buffer, status); - if (elf) { - return status; - } - - if (DebugSession::isThreadAll(thread)) { - return accessDefaultMemForThreadAll(desc, size, const_cast(buffer), false); - } - - auto threadId = convertToThreadId(thread); - auto vmHandle = allThreads[threadId]->getMemoryHandle(); - if (vmHandle == invalidHandle) { - return ZE_RESULT_ERROR_NOT_AVAILABLE; - } - - return readGpuMemory(vmHandle, static_cast(buffer), size, desc->address); -} - -ze_result_t DebugSessionLinuxi915::writeMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) { - ze_result_t status = validateThreadAndDescForMemoryAccess(thread, desc); - if (status != ZE_RESULT_SUCCESS) { - return status; - } - - if (desc->type == ZET_DEBUG_MEMORY_SPACE_TYPE_DEFAULT) { - status = writeDefaultMemory(thread, desc, size, buffer); - } else { - auto threadId = convertToThreadId(thread); - status = slmMemoryAccess(threadId, desc, size, buffer); - } - - return status; -} - -ze_result_t DebugSessionLinuxi915::writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) { - ze_result_t status = ZE_RESULT_SUCCESS; - - auto deviceBitfield = connectedDevice->getNEODevice()->getDeviceBitfield(); - - bool isa = tryWriteIsa(deviceBitfield, desc, size, buffer, status); - if (isa) { - return status; - } - - if (DebugSession::isThreadAll(thread)) { - return accessDefaultMemForThreadAll(desc, size, const_cast(buffer), true); - } - - auto threadId = convertToThreadId(thread); - auto threadVmHandle = allThreads[threadId]->getMemoryHandle(); - if (threadVmHandle == invalidHandle) { - return ZE_RESULT_ERROR_NOT_AVAILABLE; - } - - return writeGpuMemory(threadVmHandle, static_cast(buffer), size, desc->address); -} - -bool DebugSessionLinuxi915::tryWriteIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer, ze_result_t &status) { - return tryAccessIsa(deviceBitfield, desc, size, const_cast(buffer), true, status); -} - -bool DebugSessionLinuxi915::tryReadIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status) { - return tryAccessIsa(deviceBitfield, desc, size, buffer, false, status); -} - -bool DebugSessionLinuxi915::tryAccessIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write, ze_result_t &status) { - status = ZE_RESULT_ERROR_NOT_AVAILABLE; - uint64_t vmHandle[NEO::EngineLimits::maxHandleCount] = {invalidHandle}; - uint32_t deviceIndex = Math::getMinLsbSet(static_cast(deviceBitfield.to_ulong())); - - bool isaAccess = false; - - auto checkIfAnyFailed = [](const auto &result) { return result != ZE_RESULT_SUCCESS; }; - - { - std::lock_guard memLock(asyncThreadMutex); - - if (deviceBitfield.count() == 1) { - status = getISAVMHandle(deviceIndex, desc, size, vmHandle[deviceIndex]); - if (status == ZE_RESULT_SUCCESS) { - isaAccess = true; - } - if (status == ZE_RESULT_ERROR_INVALID_ARGUMENT) { - return true; - } - } else { - isaAccess = getIsaInfoForAllInstances(deviceBitfield, desc, size, vmHandle, status); - } - } - - if (isaAccess && status == ZE_RESULT_SUCCESS) { - - if (write) { - if (deviceBitfield.count() == 1) { - if (vmHandle[deviceIndex] != invalidHandle) { - status = writeGpuMemory(vmHandle[deviceIndex], static_cast(buffer), size, desc->address); - } else { - status = ZE_RESULT_ERROR_UNINITIALIZED; - } - } else { - std::vector results(NEO::EngineLimits::maxHandleCount); - - for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) { - results[i] = ZE_RESULT_SUCCESS; - - if (deviceBitfield.test(i) && vmHandle[i] != invalidHandle) { - results[i] = writeGpuMemory(vmHandle[i], static_cast(buffer), size, desc->address); - - if (results[i] != ZE_RESULT_SUCCESS) { - break; - } - } - } - - const bool anyFailed = std::any_of(results.begin(), results.end(), checkIfAnyFailed); - - if (anyFailed) { - status = ZE_RESULT_ERROR_UNKNOWN; - } - } - } else { - - if (deviceBitfield.count() > 1) { - for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) { - if (vmHandle[i] != invalidHandle) { - deviceIndex = i; - break; - } - } - } - - if (vmHandle[deviceIndex] != invalidHandle) { - status = readGpuMemory(vmHandle[deviceIndex], static_cast(buffer), size, desc->address); - } else { - status = ZE_RESULT_ERROR_UNINITIALIZED; - } - } - } - return isaAccess; -} - -ze_result_t DebugSessionLinuxi915::accessDefaultMemForThreadAll(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write) { - auto status = ZE_RESULT_ERROR_UNINITIALIZED; - std::vector allVms; - - allVms = getAllMemoryHandles(); - - if (allVms.size() > 0) { - for (auto vmHandle : allVms) { - if (write) { - status = writeGpuMemory(vmHandle, static_cast(buffer), size, desc->address); - } else { - status = readGpuMemory(vmHandle, static_cast(buffer), size, desc->address); - } - if (status == ZE_RESULT_SUCCESS) { - return status; - } - } - - status = ZE_RESULT_ERROR_NOT_AVAILABLE; - } - return status; -} - bool DebugSessionLinuxi915::ackIsaEvents(uint32_t deviceIndex, uint64_t isaVa) { std::lock_guard lock(asyncThreadMutex); diff --git a/level_zero/tools/source/debug/linux/prelim/debug_session.h b/level_zero/tools/source/debug/linux/prelim/debug_session.h index 83269efe9c..5c95cc9306 100644 --- a/level_zero/tools/source/debug/linux/prelim/debug_session.h +++ b/level_zero/tools/source/debug/linux/prelim/debug_session.h @@ -42,8 +42,6 @@ struct DebugSessionLinuxi915 : DebugSessionLinux { ze_result_t initialize() override; bool closeConnection() override; - ze_result_t readMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer) override; - ze_result_t writeMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer) override; ze_result_t acknowledgeEvent(const zet_debug_event_t *event) override; struct IoctlHandleri915 : DebugSessionLinux::IoctlHandler { @@ -183,7 +181,7 @@ struct DebugSessionLinuxi915 : DebugSessionLinux { static void *asyncThreadFunction(void *arg); void startAsyncThread() override; - virtual std::vector getAllMemoryHandles() { + std::vector getAllMemoryHandles() override { std::vector allVms; std::unique_lock memLock(asyncThreadMutex); @@ -203,6 +201,7 @@ struct DebugSessionLinuxi915 : DebugSessionLinux { void handlePageFaultEvent(prelim_drm_i915_debug_event_page_fault *pf); virtual bool ackIsaEvents(uint32_t deviceIndex, uint64_t isaVa); virtual bool ackModuleEvents(uint32_t deviceIndex, uint64_t moduleUuidHandle); + ze_result_t getElfOffset(const zet_debug_memory_space_desc_t *desc, size_t size, const char *&elfData, uint64_t &offset) override; MOCKABLE_VIRTUAL void processPendingVmBindEvents(); @@ -222,22 +221,8 @@ struct DebugSessionLinuxi915 : DebugSessionLinux { void readStateSaveAreaHeader() override; int openVmFd(uint64_t vmHandle, bool readOnly) override; - ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle); - bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status); - - ze_result_t getElfOffset(const zet_debug_memory_space_desc_t *desc, size_t size, const char *&elfData, uint64_t &offset); - ze_result_t readElfSpace(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, - const char *&elfData, const uint64_t offset); - virtual bool tryReadElf(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status); - - bool tryWriteIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, const void *buffer, ze_result_t &status); - bool tryReadIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, ze_result_t &status); - virtual bool tryAccessIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write, ze_result_t &status); - ze_result_t accessDefaultMemForThreadAll(const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write); - ze_result_t readDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, - size_t size, void *buffer); - ze_result_t writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc, - size_t size, const void *buffer); + ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) override; + bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) override; int euControlIoctl(ThreadControlCmd threadCmd, const NEO::EngineClassInstance *classInstance, diff --git a/level_zero/tools/source/debug/linux/xe/debug_session.h b/level_zero/tools/source/debug/linux/xe/debug_session.h index ac50176787..faeaa14053 100644 --- a/level_zero/tools/source/debug/linux/xe/debug_session.h +++ b/level_zero/tools/source/debug/linux/xe/debug_session.h @@ -156,8 +156,13 @@ struct DebugSessionLinuxXe : DebugSessionLinux { MOCKABLE_VIRTUAL void handleEvent(drm_xe_eudebug_event *event); void readInternalEventsAsync() override; void pushApiEvent(zet_debug_event_t &debugEvent); + ze_result_t getElfOffset(const zet_debug_memory_space_desc_t *desc, size_t size, const char *&elfData, uint64_t &offset) override { return ZE_RESULT_ERROR_UNKNOWN; }; + ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) override { return ZE_RESULT_ERROR_UNKNOWN; }; + bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) override { return false; }; + std::unordered_map> clientHandleToConnection; std::atomic detached{false}; + std::vector getAllMemoryHandles() override { return {}; }; ze_result_t readEventImp(drm_xe_eudebug_event *drmDebugEvent); int ioctl(unsigned long request, void *arg);