mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-21 09:14:47 +08:00
feature: Register ELF for xe debugger
Related-to: NEO-9674 Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
00b1f1c5b5
commit
27c089d60d
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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 "???";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user