mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-21 09:14:47 +08:00
refactor: Move Debugger Mem Access to generic linux implementation
Related-to: NEO-9669 Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
098e2e76fb
commit
1e3d57b29a
@@ -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<EuThread::ThreadId> &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<void *, false>(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<void *>(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<char *>(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<const void *, true>(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<void *>(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<const char *>(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<void *>(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<std::mutex> 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<uint64_t> allVms;
|
||||
|
||||
allVms = getAllMemoryHandles();
|
||||
|
||||
if (allVms.size() > 0) {
|
||||
for (auto vmHandle : allVms) {
|
||||
if (write) {
|
||||
status = writeGpuMemory(vmHandle, static_cast<char *>(buffer), size, desc->address);
|
||||
} else {
|
||||
status = readGpuMemory(vmHandle, static_cast<char *>(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<uint32_t>(deviceBitfield.to_ulong()));
|
||||
|
||||
bool isaAccess = false;
|
||||
|
||||
auto checkIfAnyFailed = [](const auto &result) { return result != ZE_RESULT_SUCCESS; };
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> 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<char *>(buffer), size, desc->address);
|
||||
} else {
|
||||
status = ZE_RESULT_ERROR_UNINITIALIZED;
|
||||
}
|
||||
} else {
|
||||
std::vector<ze_result_t> 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<char *>(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<char *>(buffer), size, desc->address);
|
||||
} else {
|
||||
status = ZE_RESULT_ERROR_UNINITIALIZED;
|
||||
}
|
||||
}
|
||||
}
|
||||
return isaAccess;
|
||||
}
|
||||
|
||||
} // namespace L0
|
||||
|
||||
@@ -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<EuThread::ThreadId> &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<uint64_t> getAllMemoryHandles() = 0;
|
||||
|
||||
std::unique_ptr<IoctlHandler> ioctlHandler;
|
||||
uint64_t euControlInterruptSeqno[NEO::EngineLimits::maxHandleCount];
|
||||
};
|
||||
|
||||
@@ -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<std::mutex> 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<void *, false>(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<void *>(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<char *>(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<const void *, true>(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<void *>(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<const char *>(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<void *>(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<uint32_t>(deviceBitfield.to_ulong()));
|
||||
|
||||
bool isaAccess = false;
|
||||
|
||||
auto checkIfAnyFailed = [](const auto &result) { return result != ZE_RESULT_SUCCESS; };
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> 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<char *>(buffer), size, desc->address);
|
||||
} else {
|
||||
status = ZE_RESULT_ERROR_UNINITIALIZED;
|
||||
}
|
||||
} else {
|
||||
std::vector<ze_result_t> 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<char *>(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<char *>(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<uint64_t> allVms;
|
||||
|
||||
allVms = getAllMemoryHandles();
|
||||
|
||||
if (allVms.size() > 0) {
|
||||
for (auto vmHandle : allVms) {
|
||||
if (write) {
|
||||
status = writeGpuMemory(vmHandle, static_cast<char *>(buffer), size, desc->address);
|
||||
} else {
|
||||
status = readGpuMemory(vmHandle, static_cast<char *>(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<std::mutex> lock(asyncThreadMutex);
|
||||
|
||||
|
||||
@@ -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<uint64_t> getAllMemoryHandles() {
|
||||
std::vector<uint64_t> getAllMemoryHandles() override {
|
||||
std::vector<uint64_t> allVms;
|
||||
std::unique_lock<std::mutex> 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,
|
||||
|
||||
@@ -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<uint64_t, std::unique_ptr<ClientConnection>> clientHandleToConnection;
|
||||
std::atomic<bool> detached{false};
|
||||
std::vector<uint64_t> getAllMemoryHandles() override { return {}; };
|
||||
|
||||
ze_result_t readEventImp(drm_xe_eudebug_event *drmDebugEvent);
|
||||
int ioctl(unsigned long request, void *arg);
|
||||
|
||||
Reference in New Issue
Block a user