From 95596795fca69af490bd62e597b402152d75c7eb Mon Sep 17 00:00:00 2001
From: foreman
Date: Wed, 18 Mar 2015 11:26:04 -0400
Subject: [PATCH] P4 to Git Change 1131897 by wchau@wchau_WINDOWS7_OCL on
2015/03/18 10:50:41
ECR #399840 - OpenCL Runtime HW Debug support development - add support to the VI asics & support the use case of debug registeration in a pre-dispatch callback function
** Cross branch check-in with CL1131894
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_debugger_amd.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugmanager.cpp#9 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#501 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.hpp#139 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputrap.hpp#2 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#355 edit
---
rocclr/runtime/device/gpu/gpudebugmanager.cpp | 30 +++--
rocclr/runtime/device/gpu/gpudevice.cpp | 19 ++-
rocclr/runtime/device/gpu/gpudevice.hpp | 3 -
rocclr/runtime/device/gpu/gputrap.hpp | 114 ++++++++++++------
rocclr/runtime/device/gpu/gpuvirtual.cpp | 2 +-
5 files changed, 105 insertions(+), 63 deletions(-)
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;