diff --git a/rocclr/runtime/device/gpu/gpudebugmanager.cpp b/rocclr/runtime/device/gpu/gpudebugmanager.cpp index 66d6c0889e..95b74769b7 100644 --- a/rocclr/runtime/device/gpu/gpudebugmanager.cpp +++ b/rocclr/runtime/device/gpu/gpudebugmanager.cpp @@ -97,8 +97,11 @@ GpuDebugManager::executePreDispatchCallBack(void* aqlPacket, preDispatchCallBackArgs_); } - // Copy the various info set by the debugger/profiler to the tool info structure - setupTrapInformation(info); + // setup the trap handler information only if the debugger has been registered + if (isRegistered()) { + // Copy the various info set by the debugger/profiler to the tool info structure + setupTrapInformation(info); + } } void @@ -234,12 +237,6 @@ DebugEvent GpuDebugManager::createDebugEvent( const bool autoReset) { - if (!isRegistered()) { - LogError("debugmanager: Failed to flush cache - hw debug is not available"); - return 0; - } - - // create the event object osEventHandle shaderEvent = osEventCreate(!autoReset); @@ -348,8 +345,19 @@ GpuDebugManager::setGlobalMemory( cl_int GpuDebugManager::createRuntimeTrapHandler() { - uint32_t codeSize = sizeof(RuntimeTrapCode); - uint32_t numCodes = sizeof(RuntimeTrapCode) / sizeof(RuntimeTrapCode[0]); + size_t codeSize = 0; + const uint32_t* rtTrapCode = NULL; + + if (device()->settings().viPlus_) { + codeSize = sizeof(RuntimeTrapCodeVi); + rtTrapCode = RuntimeTrapCodeVi; + } + else { + codeSize = sizeof(RuntimeTrapCode); + rtTrapCode = RuntimeTrapCode; + } + + uint32_t numCodes = codeSize / sizeof(uint32_t); // Handle TMA corruption hw bug workaround - // The trap handler buffer has extra 256 bytes allocated, the TMA address @@ -389,7 +397,7 @@ GpuDebugManager::createRuntimeTrapHandler() // save the trap handler code uint32_t* trapHandlerPtr = (uint32_t*)(tbaAddress + TbaStartOffset); for (uint32_t i = 0; i < numCodes; i++) { - trapHandlerPtr[i] = RuntimeTrapCode[i]; + trapHandlerPtr[i] = rtTrapCode[i]; } rtTBA->unmap(NULL); diff --git a/rocclr/runtime/device/gpu/gpudevice.cpp b/rocclr/runtime/device/gpu/gpudevice.cpp index 8a5274a2af..56f19c7e43 100644 --- a/rocclr/runtime/device/gpu/gpudevice.cpp +++ b/rocclr/runtime/device/gpu/gpudevice.cpp @@ -418,6 +418,10 @@ Device::Device() Device::~Device() { + // remove the HW debug manager + delete hwDebugMgr_; + hwDebugMgr_ = NULL; + CondLog(vaCacheList_ == NULL || (vaCacheList_->size() != 0), "Application didn't unmap all host memory!"); @@ -969,6 +973,11 @@ Device::create(CALuint ordinal, CALuint numOfDevices) return false; } + // create the HW debug manager if needed + if (settings().enableHwDebug_) { + hwDebugMgr_ = new GpuDebugManager(this); + } + return true; } @@ -2669,7 +2678,6 @@ Device::SrdManager::fillResourceList(std::vector& memList) cl_int Device::hwDebugManagerInit(amd::Context *context, uintptr_t messageStorage) { - hwDebugMgr_ = new GpuDebugManager(this); cl_int status = hwDebugMgr_->registerDebugger(context, messageStorage); if (CL_SUCCESS != status) { @@ -2680,13 +2688,4 @@ Device::hwDebugManagerInit(amd::Context *context, uintptr_t messageStorage) return status; } -void -Device::hwDebugManagerRemove() -{ - hwDebugMgr_->unregisterDebugger(); - - delete hwDebugMgr_; - hwDebugMgr_ = NULL; -} - } // namespace gpu diff --git a/rocclr/runtime/device/gpu/gpudevice.hpp b/rocclr/runtime/device/gpu/gpudevice.hpp index f2d3732cfc..bf9dd48a58 100644 --- a/rocclr/runtime/device/gpu/gpudevice.hpp +++ b/rocclr/runtime/device/gpu/gpudevice.hpp @@ -563,9 +563,6 @@ public: //! Initial the Hardware Debug Manager cl_int hwDebugManagerInit(amd::Context *context, uintptr_t messageStorage); - //! Remove the Hardware Debug Manager - void hwDebugManagerRemove(); - private: //! Disable copy constructor Device(const Device&); diff --git a/rocclr/runtime/device/gpu/gputrap.hpp b/rocclr/runtime/device/gpu/gputrap.hpp index 7bc0631273..4629905fbf 100644 --- a/rocclr/runtime/device/gpu/gputrap.hpp +++ b/rocclr/runtime/device/gpu/gputrap.hpp @@ -7,7 +7,7 @@ ******************************************************************************* shader main - asic(TAHITI) + asic(TAHITI) // for SI/CI or asic(VI) for VI type(CS) // clear wave exception state @@ -23,9 +23,9 @@ shader main s_mov_b32 ttmp8, tba_lo s_and_b32 ttmp9, tba_hi, 0xffff - // 0x68=104 bytes, which is the size of the buffer to + // 0x100=256 bytes, which is the size of the buffer to // store all the level 2 trap handler info - s_or_b32 ttmp9, ttmp9, 0x06800000 + s_or_b32 ttmp9, ttmp9, 0x01000000 s_mov_b32 ttmp10, 0x00002000 s_mov_b32 ttmp11, 0x18024fac @@ -35,10 +35,10 @@ shader main // Backup the s0 since ttmp registers cannot be target of // buffer read instruction s_mov_b32 ttmp7, s0 - s_buffer_load_dword s0, ttmp8, 0 + s_buffer_load_dword s0, ttmp8, 0x0 // VI: offset=0x0 (bytes) s_waitcnt 0 s_mov_b32 tma_lo, s0 - s_buffer_load_dword s0, ttmp8, 1 + s_buffer_load_dword s0, ttmp8, 0x1 // VI: offset=0x4 (bytes) s_waitcnt 0 s_mov_b32 tma_hi, s0 s_mov_b32 s0, ttmp7 @@ -64,22 +64,22 @@ shader main // setup the TMA for the level-two trap handler // level-two TMA saved in tma_hi, tma_lo s_mov_b32 ttmp3, s0 - s_buffer_load_dword s0, ttmp8, 0x2 + s_buffer_load_dword s0, ttmp8, 0x2 // VI: offset=0x8 (bytes) s_waitcnt 0x0000 s_mov_b32 tma_lo, s0 - s_buffer_load_dword s0, ttmp8, 0x3 + s_buffer_load_dword s0, ttmp8, 0x3 // VI: offset=0xc (bytes) s_waitcnt 0x0000 s_mov_b32 tma_hi, s0 //=================================================== // setup the TBA for the level-two trap handler // level-two TBA saved in ttmp9, ttmp8 - s_buffer_load_dword s0, ttmp8, 0x0 + s_buffer_load_dword s0, ttmp8, 0x0 // VI: offset=0x0 (bytes) s_waitcnt 0x0000 s_mov_b32 ttmp2, s0 - s_buffer_load_dword s0, ttmp8, 0x1 + s_buffer_load_dword s0, ttmp8, 0x1 // VI: offset=0x4 (bytes) s_waitcnt 0x0000 //swap the values of s0 and ttmp3 without using other registers @@ -115,35 +115,73 @@ end *******************************************************************************/ +/// shader codes with "asic(TAHITI)" instruction static const uint32_t RuntimeTrapCode [] = { - 0x7e008200, 0xbf8c0000, - 0xbef8036c, 0x8779ff6d, - 0x0000ffff, 0x8879ff79, - 0x06800000, 0xbefa03ff, - 0x00002000, 0xbefb03ff, - 0x18024fac, 0x80f8ff78, - 0x00000100, 0xbef70300, - 0xc2007900, 0xbf8c0000, - 0xbeee0300, 0xc2007901, - 0xbf8c0000, 0xbeef0300, - 0xbe800377, 0xbef60398, - 0x8078766e, 0x8779ff6f, - 0x0000ffff, 0x8879ff79, - 0x00680000, 0xbefa03ff, - 0x00002000, 0xbefb03ff, - 0x18024fac, 0xbef6036e, - 0xbef7036f, 0xbef30300, - 0xc2007902, 0xbf8c0000, - 0xbeee0300, 0xc2007903, - 0xbf8c0000, 0xbeef0300, - 0xc2007900, 0xbf8c0000, - 0xbef20300, 0xc2007901, - 0xbf8c0000, 0x89737300, - 0x89007300, 0x89737300, - 0xbef80372, 0xbef90373, - 0xbef21f00, 0x80728872, - 0xbe802078, 0xbeef0377, - 0xbeee0376, 0x8771ff71, - 0x0000ffff, 0xbe802270 + 0x7e008200, 0xbf8c0000, + 0xbef8036c, 0x8779ff6d, + 0x0000ffff, 0x8879ff79, + 0x01000000, 0xbefa03ff, + 0x00002000, 0xbefb03ff, + 0x18024fac, 0x80f8ff78, + 0x00000100, 0xbef70300, + 0xc2007900, 0xbf8c0000, + 0xbeee0300, 0xc2007901, + 0xbf8c0000, 0xbeef0300, + 0xbe800377, 0xbef60398, + 0x8078766e, 0x8779ff6f, + 0x0000ffff, 0x8879ff79, + 0x00680000, 0xbefa03ff, + 0x00002000, 0xbefb03ff, + 0x18024fac, 0xbef6036e, + 0xbef7036f, 0xbef30300, + 0xc2007902, 0xbf8c0000, + 0xbeee0300, 0xc2007903, + 0xbf8c0000, 0xbeef0300, + 0xc2007900, 0xbf8c0000, + 0xbef20300, 0xc2007901, + 0xbf8c0000, 0x89737300, + 0x89007300, 0x89737300, + 0xbef80372, 0xbef90373, + 0xbef21f00, 0x80728872, + 0xbe802078, 0xbeef0377, + 0xbeee0376, 0x8771ff71, + 0x0000ffff, 0xbe802270 +}; + + +/// shader codes with "asic(VI)" instruction +static const uint32_t RuntimeTrapCodeVi [] = { + 0x7e006a00, 0xbf8c0000, + 0xbef8006c, 0x8679ff6d, + 0x0000ffff, 0x8779ff79, + 0x01000000, 0xbefa00ff, + 0x00002000, 0xbefb00ff, + 0x18024fac, 0x80f8ff78, + 0x00000100, 0xbef70000, + 0xc022003c, 0x00000000, + 0xbf8c0000, 0xbeee0000, + 0xc022003c, 0x00000004, + 0xbf8c0000, 0xbeef0000, + 0xbe800077, 0xbef60098, + 0x8078766e, 0x8679ff6f, + 0x0000ffff, 0x8779ff79, + 0x00680000, 0xbefa00ff, + 0x00002000, 0xbefb00ff, + 0x18024fac, 0xbef6006e, + 0xbef7006f, 0xbef30000, + 0xc022003c, 0x00000008, + 0xbf8c0000, 0xbeee0000, + 0xc022003c, 0x0000000c, + 0xbf8c0000, 0xbeef0000, + 0xc022003c, 0x00000000, + 0xbf8c0000, 0xbef20000, + 0xc022003c, 0x00000004, + 0xbf8c0000, 0x88737300, + 0x88007300, 0x88737300, + 0xbef80072, 0xbef90073, + 0xbef21c00, 0x80728872, + 0xbe801d78, 0xbeef0077, + 0xbeee0076, 0x8671ff71, + 0x0000ffff, 0xbe801f70 }; diff --git a/rocclr/runtime/device/gpu/gpuvirtual.cpp b/rocclr/runtime/device/gpu/gpuvirtual.cpp index 2754cf4af4..73742a35a0 100644 --- a/rocclr/runtime/device/gpu/gpuvirtual.cpp +++ b/rocclr/runtime/device/gpu/gpuvirtual.cpp @@ -3516,7 +3516,7 @@ VirtualGPU::buildKernelInfo(const HSAILKernel& hsaKernel, // set kernel info for HW debug and call the callback function if (NULL != dbgManager->preDispatchCallBackFunc()) { - DebugToolInfo dbgSetting; + DebugToolInfo dbgSetting = {0}; dbgSetting.scratchAddress_ = kernelInfo.scratchBufAddr; dbgSetting.scratchSize_ = kernelInfo.scratchBufferSizeInBytes; dbgSetting.globalAddress_ = kernelInfo.heapBufAddr;