diff --git a/include/hsakmt.h b/include/hsakmt.h index 615ebafef8..ff2d023760 100644 --- a/include/hsakmt.h +++ b/include/hsakmt.h @@ -633,6 +633,17 @@ hsaKmtDbgAddressWatch( HsaEvent* WatchEvent[] //IN, optional ); +HSAKMT_STATUS +HSAKMTAPI +hsaKmtRuntimeEnable( + void* rDebug, // IN + bool setupTtmp + ); + +HSAKMT_STATUS +HSAKMTAPI +hsaKmtRuntimeDisable(void); + /** Get the major and minor version of the kernel debugger support. */ diff --git a/src/debug.c b/src/debug.c index 484fd4d16e..e9e6b1406f 100644 --- a/src/debug.c +++ b/src/debug.c @@ -25,6 +25,7 @@ #include "libhsakmt.h" #include "linux/kfd_ioctl.h" +#include #include #include #include @@ -294,3 +295,66 @@ hsaKmtGetKernelDebugTrapVersionInfo( *Minor = args.data2; return HSAKMT_STATUS_SUCCESS; } + +#define HSA_RUNTIME_ENABLE_MIN_MAJOR 9 +#define HSA_RUNTIME_ENABLE_MIN_MINOR 0 +HSAKMT_STATUS HSAKMTAPI hsaKmtRuntimeEnable(void *rDebug, + bool setupTtmp) +{ + struct kfd_ioctl_dbg_trap_args args = {0}; + HSAuint32 kMajor, kMinor; + HSAKMT_STATUS result; + + result = hsaKmtGetKernelDebugTrapVersionInfo(&kMajor, &kMinor); + + if (result) + return HSAKMT_STATUS_NOT_SUPPORTED; + + if (kMajor != HSA_RUNTIME_ENABLE_MIN_MAJOR || + (int)kMinor < HSA_RUNTIME_ENABLE_MIN_MINOR) + return HSAKMT_STATUS_NOT_SUPPORTED; + + memset(&args, 0x00, sizeof(args)); + args.op = KFD_IOC_DBG_TRAP_RUNTIME_ENABLE; + args.pid = getpid(); + args.data1 = 1; //enable + args.data2 = setupTtmp; + args.ptr = (HSAuint64)rDebug; + + long err = kmtIoctl(kfd_fd, AMDKFD_IOC_DBG_TRAP, &args); + + if (err) { + if (err == EBUSY) + return HSAKMT_STATUS_UNAVAILABLE; + else + return HSAKMT_STATUS_ERROR; + } + + return HSAKMT_STATUS_SUCCESS; +} + +HSAKMT_STATUS HSAKMTAPI hsaKmtRuntimeDisable(void) +{ + struct kfd_ioctl_dbg_trap_args args = {0}; + HSAuint32 kMajor, kMinor; + HSAKMT_STATUS result; + + result = hsaKmtGetKernelDebugTrapVersionInfo(&kMajor, &kMinor); + + if (result) + return HSAKMT_STATUS_NOT_SUPPORTED; + + if (kMajor != HSA_RUNTIME_ENABLE_MIN_MAJOR || + (int)kMinor < HSA_RUNTIME_ENABLE_MIN_MINOR) + return HSAKMT_STATUS_NOT_SUPPORTED; + + memset(&args, 0x00, sizeof(args)); + args.op = KFD_IOC_DBG_TRAP_RUNTIME_ENABLE; + args.pid = getpid(); + args.data1 = 0; //disable + + if (kmtIoctl(kfd_fd, AMDKFD_IOC_DBG_TRAP, &args)) + return HSAKMT_STATUS_ERROR; + + return HSAKMT_STATUS_SUCCESS; +} diff --git a/src/libhsakmt.ver b/src/libhsakmt.ver index f423e505cf..2d63d22d15 100644 --- a/src/libhsakmt.ver +++ b/src/libhsakmt.ver @@ -59,6 +59,8 @@ hsaKmtSetMemoryUserData; hsaKmtGetQueueInfo; hsaKmtAllocQueueGWS; hsaKmtGetKernelDebugTrapVersionInfo; +hsaKmtRuntimeEnable; +hsaKmtRuntimeDisable; hsaKmtSPMAcquire; hsaKmtSPMRelease; hsaKmtSPMSetDestBuffer;