feature: Register ELF for xe debugger

Related-to:  NEO-9674

Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
Brandon Yates
2024-02-01 22:03:55 +00:00
committed by Compute-Runtime-Automation
parent 00b1f1c5b5
commit 27c089d60d
7 changed files with 117 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2023 Intel Corporation
* Copyright (C) 2022-2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -262,6 +262,8 @@ enum class DrmIoctl {
gemCacheReserve,
version,
vmExport,
metadataCreate,
metadataDestroy,
};
enum class DrmParam {

View File

@@ -1145,6 +1145,13 @@ int IoctlHelperXe::ioctl(DrmIoctl request, void *arg) {
case DrmIoctl::debuggerOpen: {
ret = debuggerOpenIoctl(request, arg);
} break;
case DrmIoctl::metadataCreate: {
ret = debuggerMetadataCreateIoctl(request, arg);
} break;
case DrmIoctl::metadataDestroy: {
ret = debuggerMetadataDestroyIoctl(request, arg);
} break;
default:
xeLog("Not handled 0x%x\n", request);
UNRECOVERABLE_IF(true);

View File

@@ -134,6 +134,8 @@ class IoctlHelperXe : public IoctlHelper {
uint16_t getCpuCachingMode();
void addDebugMetadata(DrmResourceClass type, uint64_t *offset, uint64_t size);
void addDebugMetadataCookie(uint64_t cookie);
uint32_t registerResource(DrmResourceClass classType, const void *data, size_t size) override;
void unregisterResource(uint32_t handle) override;
protected:
const char *xeGetClassName(int className);
@@ -149,6 +151,8 @@ class IoctlHelperXe : public IoctlHelper {
void updateBindInfo(uint32_t handle, uint64_t userPtr, uint64_t size);
void *allocateDebugMetadata();
int debuggerOpenIoctl(DrmIoctl request, void *arg);
int debuggerMetadataCreateIoctl(DrmIoctl request, void *arg);
int debuggerMetadataDestroyIoctl(DrmIoctl request, void *arg);
void *freeDebugMetadata(void *metadata);
int getRunaloneExtProperty();

View File

@@ -23,6 +23,10 @@ unsigned int IoctlHelperXe::getIoctlRequestValueDebugger(DrmIoctl ioctlRequest)
switch (ioctlRequest) {
case DrmIoctl::debuggerOpen:
RETURN_ME(DRM_IOCTL_XE_EUDEBUG_CONNECT);
case DrmIoctl::metadataCreate:
RETURN_ME(DRM_IOCTL_XE_DEBUG_METADATA_CREATE);
case DrmIoctl::metadataDestroy:
RETURN_ME(DRM_IOCTL_XE_DEBUG_METADATA_DESTROY);
default:
UNRECOVERABLE_IF(true);
@@ -38,6 +42,22 @@ int IoctlHelperXe::debuggerOpenIoctl(DrmIoctl request, void *arg) {
return ret;
}
int IoctlHelperXe::debuggerMetadataCreateIoctl(DrmIoctl request, void *arg) {
drm_xe_debug_metadata_create *metadata = static_cast<drm_xe_debug_metadata_create *>(arg);
auto ret = IoctlHelper::ioctl(request, arg);
xeLog(" -> IoctlHelperXe::ioctl metadataCreate type=%llu user_addr=%uul len=%uul\n id=%uul ret=%d, errno=%d\n",
metadata->type, metadata->user_addr, metadata->len, metadata->id, ret, errno);
return ret;
}
int IoctlHelperXe::debuggerMetadataDestroyIoctl(DrmIoctl request, void *arg) {
drm_xe_debug_metadata_destroy *metadata = static_cast<drm_xe_debug_metadata_destroy *>(arg);
auto ret = IoctlHelper::ioctl(request, arg);
xeLog(" -> IoctlHelperXe::ioctl metadataDestroy id=%llu r=%d\n",
metadata->id, ret);
return ret;
}
void *IoctlHelperXe::allocateDebugMetadata() {
drm_xe_ext_vm_set_debug_metadata *prev = nullptr;
drm_xe_ext_vm_set_debug_metadata *xeMetadataRoot = nullptr;
@@ -134,4 +154,32 @@ int IoctlHelperXe::getEuDebugSysFsEnable() {
return enabledEuDebug - '0';
}
uint32_t IoctlHelperXe::registerResource(DrmResourceClass classType, const void *data, size_t size) {
drm_xe_debug_metadata_create metadata = {};
if (classType == DrmResourceClass::elf) {
metadata.type = DRM_XE_DEBUG_METADATA_ELF_BINARY;
metadata.user_addr = reinterpret_cast<uintptr_t>(data);
metadata.len = size;
} else if (classType == DrmResourceClass::l0ZebinModule) {
metadata.type = DRM_XE_DEBUG_METADATA_PROGRAM_MODULE;
metadata.user_addr = reinterpret_cast<uintptr_t>(data);
metadata.len = size;
} else {
UNRECOVERABLE_IF(true);
}
[[maybe_unused]] auto retVal = IoctlHelperXe::ioctl(DrmIoctl::metadataCreate, &metadata);
PRINT_DEBUGGER_INFO_LOG("DRM_XE_DEBUG_METADATA_CREATE: type=%llu user_addr=%llu len=%llu id=%llu\n",
metadata.type, metadata.user_addr, metadata.len, metadata.id);
DEBUG_BREAK_IF(retVal != 0);
return static_cast<uint32_t>(metadata.id);
}
void IoctlHelperXe::unregisterResource(uint32_t handle) {
drm_xe_debug_metadata_destroy metadata = {};
metadata.id = handle;
[[maybe_unused]] auto retVal = IoctlHelperXe::ioctl(DrmIoctl::metadataDestroy, &metadata);
DEBUG_BREAK_IF(retVal != 0);
PRINT_DEBUGGER_INFO_LOG("DRM_XE_DEBUG_METADATA_DESTROY: id=%llu\n", metadata.id);
}
} // namespace NEO

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023 Intel Corporation
* Copyright (C) 2023-2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -43,6 +43,8 @@ unsigned int IoctlHelperXe::getIoctlRequestValue(DrmIoctl ioctlRequest) const {
case DrmIoctl::primeHandleToFd:
RETURN_ME(DRM_IOCTL_PRIME_HANDLE_TO_FD);
case DrmIoctl::debuggerOpen:
case DrmIoctl::metadataCreate:
case DrmIoctl::metadataDestroy:
return getIoctlRequestValueDebugger(ioctlRequest);
default:
UNRECOVERABLE_IF(true);
@@ -80,6 +82,10 @@ std::string IoctlHelperXe::getIoctlString(DrmIoctl ioctlRequest) const {
STRINGIFY_ME(DRM_IOCTL_PRIME_HANDLE_TO_FD);
case DrmIoctl::debuggerOpen:
STRINGIFY_ME(DRM_IOCTL_XE_EUDEBUG_CONNECT);
case DrmIoctl::metadataCreate:
STRINGIFY_ME(DRM_IOCTL_XE_DEBUG_METADATA_CREATE);
case DrmIoctl::metadataDestroy:
STRINGIFY_ME(DRM_IOCTL_XE_DEBUG_METADATA_DESTROY);
default:
return "???";
}