diff options
Diffstat (limited to 'packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch')
-rw-r--r-- | packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch b/packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch new file mode 100644 index 0000000000..3e7810004c --- /dev/null +++ b/packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch @@ -0,0 +1,287 @@ +From e287cde7c10795853e1c5504ef0bdffd62d696dc Mon Sep 17 00:00:00 2001 +From: Konstantin Baladurin <k.baladurin@partner.samsung.com> +Date: Thu, 5 Oct 2017 11:31:44 +0300 +Subject: [PATCH] Fix clrstack command of lldb sosplugin on x86 (#13973) + +* [x86/Linux][SOS] Add support for x86 in GetContextFromFrame + +It's need for 'clrstack -f' command of SOS plugin on x86. + +* [x86/Linux] Fix RtlpGetFunctionEndAddress function + +We should use PTR_UNWIND_INFO instead of PUNWIND_INFO for pointer to +UNWIND_INFO structure because it's pointer from other process and +we need to use DAC to read data using it. + +* [x86/Linux][SOS] Define DEBUG_STACK_CONTEXT for x86 + +It's needed for 'clrstack -f' command in libsosplugin. + +* [x86/Linux] Fix undefined references in libmscordbi.so on x86 + +Asm block like following: +__asm fnsave currentFPUState + +where currentFPUState is structure works with MSVC but leads to +undefined reference currentFPUState in the binary with other +compilers. So rewrite such asm blocks for them. + +This patch fixes error "Unable to load 'libmscordbi.so'" during +execution of 'clrstack -f' command of SOS plugin on x86. + +* [x86/Linux] Fix calling convention inconsistency + +WINAPI and STDAPI are defined as __cdecl but in some cases functions +with these attributes are called using stdcall calling convention. + +It leads to crashes during execution of 'clrstack -i' command of +SOS plugin on x86. +--- + src/ToolBox/SOS/Strike/strike.cpp | 4 +++- + src/ToolBox/SOS/lldbplugin/services.cpp | 19 +++++++++++++++++ + src/debug/di/rsthread.cpp | 30 ++++++++++++++++++++++++++- + src/debug/di/valuehome.cpp | 36 +++++++++++++++++++++++++++++++++ + src/debug/shim/debugshim.cpp | 4 ++-- + src/dlls/mscordbi/mscordbi.cpp | 2 +- + src/inc/clrnt.h | 2 +- + 7 files changed, 91 insertions(+), 6 deletions(-) + +diff --git a/src/ToolBox/SOS/Strike/strike.cpp b/src/ToolBox/SOS/Strike/strike.cpp +index 2e20b28..6d659f9 100644 +--- a/src/ToolBox/SOS/Strike/strike.cpp ++++ b/src/ToolBox/SOS/Strike/strike.cpp +@@ -324,7 +324,9 @@ DECLARE_API(IP2MD) + #define DEBUG_STACK_CONTEXT AMD64_CONTEXT + #elif defined(_TARGET_ARM_) // _TARGET_WIN64_ + #define DEBUG_STACK_CONTEXT ARM_CONTEXT +-#endif // _TARGET_ARM_ ++#elif defined(_TARGET_X86_) // _TARGET_ARM_ ++#define DEBUG_STACK_CONTEXT X86_CONTEXT ++#endif // _TARGET_X86_ + + #ifdef DEBUG_STACK_CONTEXT + // I use a global set of frames for stack walking on win64 because the debugger's +diff --git a/src/ToolBox/SOS/lldbplugin/services.cpp b/src/ToolBox/SOS/lldbplugin/services.cpp +index e3eee4f..262f814 100644 +--- a/src/ToolBox/SOS/lldbplugin/services.cpp ++++ b/src/ToolBox/SOS/lldbplugin/services.cpp +@@ -1554,6 +1554,25 @@ LLDBServices::GetContextFromFrame( + dtcontext->R10 = GetRegister(frame, "r10"); + dtcontext->R11 = GetRegister(frame, "r11"); + dtcontext->R12 = GetRegister(frame, "r12"); ++#elif DBG_TARGET_X86 ++ dtcontext->Eip = frame.GetPC(); ++ dtcontext->Esp = frame.GetSP(); ++ dtcontext->Ebp = frame.GetFP(); ++ dtcontext->EFlags = GetRegister(frame, "eflags"); ++ ++ dtcontext->Edi = GetRegister(frame, "edi"); ++ dtcontext->Esi = GetRegister(frame, "esi"); ++ dtcontext->Ebx = GetRegister(frame, "ebx"); ++ dtcontext->Edx = GetRegister(frame, "edx"); ++ dtcontext->Ecx = GetRegister(frame, "ecx"); ++ dtcontext->Eax = GetRegister(frame, "eax"); ++ ++ dtcontext->SegCs = GetRegister(frame, "cs"); ++ dtcontext->SegSs = GetRegister(frame, "ss"); ++ dtcontext->SegDs = GetRegister(frame, "ds"); ++ dtcontext->SegEs = GetRegister(frame, "es"); ++ dtcontext->SegFs = GetRegister(frame, "fs"); ++ dtcontext->SegGs = GetRegister(frame, "gs"); + #endif + } + +diff --git a/src/debug/di/rsthread.cpp b/src/debug/di/rsthread.cpp +index 02fae00..aa85de8 100644 +--- a/src/debug/di/rsthread.cpp ++++ b/src/debug/di/rsthread.cpp +@@ -1471,7 +1471,15 @@ void CordbThread::Get32bitFPRegisters(CONTEXT * pContext) + + FLOATING_SAVE_AREA currentFPUState; + ++#ifdef _MSC_VER + __asm fnsave currentFPUState // save the current FPU state. ++#else ++ __asm__ __volatile__ ++ ( ++ " fnsave %0\n" \ ++ : "=m"(currentFPUState) ++ ); ++#endif + + floatarea.StatusWord &= 0xFF00; // remove any error codes. + floatarea.ControlWord |= 0x3F; // mask all exceptions. +@@ -1482,12 +1490,22 @@ void CordbThread::Get32bitFPRegisters(CONTEXT * pContext) + // @dbgtodo Microsoft crossplat: the conversion from a series of bytes to a floating + // point value will need to be done with an explicit conversion routine to unpack + // the IEEE format and compute the real number value represented. +- ++ ++#ifdef _MSC_VER + __asm + { + fninit + frstor floatarea ;; reload the threads FPU state. + } ++#else ++ __asm__ ++ ( ++ " fninit\n" \ ++ " frstor %0\n" \ ++ : /* no outputs */ ++ : "m"(floatarea) ++ ); ++#endif + + unsigned int i; + +@@ -1498,11 +1516,21 @@ void CordbThread::Get32bitFPRegisters(CONTEXT * pContext) + m_floatValues[i] = td; + } + ++#ifdef _MSC_VER + __asm + { + fninit + frstor currentFPUState ;; restore our saved FPU state. + } ++#else ++ __asm__ ++ ( ++ " fninit\n" \ ++ " frstor %0\n" \ ++ : /* no outputs */ ++ : "m"(currentFPUState) ++ ); ++#endif + + m_fFloatStateValid = true; + m_floatStackTop = floatStackTop; +diff --git a/src/debug/di/valuehome.cpp b/src/debug/di/valuehome.cpp +index 837afd5..6cae8c1 100644 +--- a/src/debug/di/valuehome.cpp ++++ b/src/debug/di/valuehome.cpp +@@ -481,18 +481,36 @@ void FloatRegValueHome::SetEnregisteredValue(MemoryRange newValue, + // restore our original state. + DT_FLOATING_SAVE_AREA currentFPUState; + ++ #ifdef _MSC_VER + __asm fnsave currentFPUState // save the current FPU state. ++ #else ++ __asm__ __volatile__ ++ ( ++ " fnsave %0\n" \ ++ : "=m"(currentFPUState) ++ ); ++ #endif + + // Copy the state out of the context. + DT_FLOATING_SAVE_AREA floatarea = pContext->FloatSave; + floatarea.StatusWord &= 0xFF00; // remove any error codes. + floatarea.ControlWord |= 0x3F; // mask all exceptions. + ++ #ifdef _MSC_VER + __asm + { + fninit + frstor floatarea ;; reload the threads FPU state. + } ++ #else ++ __asm__ ++ ( ++ " fninit\n" \ ++ " frstor %0\n" \ ++ : /* no outputs */ ++ : "m"(floatarea) ++ ); ++ #endif + + double td; // temp double + double popArea[DebuggerIPCE_FloatCount]; +@@ -519,17 +537,35 @@ void FloatRegValueHome::SetEnregisteredValue(MemoryRange newValue, + } + + // Save out the modified float area. ++ #ifdef _MSC_VER + __asm fnsave floatarea ++ #else ++ __asm__ __volatile__ ++ ( ++ " fnsave %0\n" \ ++ : "=m"(floatarea) ++ ); ++ #endif + + // Put it into the context. + pContext->FloatSave= floatarea; + + // Restore our FPU state ++ #ifdef _MSC_VER + __asm + { + fninit + frstor currentFPUState ;; restore our saved FPU state. + } ++ #else ++ __asm__ ++ ( ++ " fninit\n" \ ++ " frstor %0\n" \ ++ : /* no outputs */ ++ : "m"(currentFPUState) ++ ); ++ #endif + #endif // DBG_TARGET_X86 + + // update the thread's floating point stack +diff --git a/src/debug/shim/debugshim.cpp b/src/debug/shim/debugshim.cpp +index 03b9c5f..08f1ec5 100644 +--- a/src/debug/shim/debugshim.cpp ++++ b/src/debug/shim/debugshim.cpp +@@ -38,7 +38,7 @@ + // CLRDebuggingImpl implementation (ICLRDebugging) + //***************************************************************************** + +-typedef HRESULT (__stdcall *OpenVirtualProcessImplFnPtr)(ULONG64 clrInstanceId, ++typedef HRESULT (STDAPICALLTYPE *OpenVirtualProcessImplFnPtr)(ULONG64 clrInstanceId, + IUnknown * pDataTarget, + HMODULE hDacDll, + CLR_DEBUGGING_VERSION * pMaxDebuggerSupportedVersion, +@@ -46,7 +46,7 @@ typedef HRESULT (__stdcall *OpenVirtualProcessImplFnPtr)(ULONG64 clrInstanceId, + IUnknown ** ppInstance, + CLR_DEBUGGING_PROCESS_FLAGS * pdwFlags); + +-typedef HRESULT (__stdcall *OpenVirtualProcess2FnPtr)(ULONG64 clrInstanceId, ++typedef HRESULT (STDAPICALLTYPE *OpenVirtualProcess2FnPtr)(ULONG64 clrInstanceId, + IUnknown * pDataTarget, + HMODULE hDacDll, + REFIID riid, +diff --git a/src/dlls/mscordbi/mscordbi.cpp b/src/dlls/mscordbi/mscordbi.cpp +index 4ef92c7..0197d13 100644 +--- a/src/dlls/mscordbi/mscordbi.cpp ++++ b/src/dlls/mscordbi/mscordbi.cpp +@@ -11,7 +11,7 @@ + //***************************************************************************** + #include "stdafx.h" + +-extern BOOL STDMETHODCALLTYPE DbgDllMain(HINSTANCE hInstance, DWORD dwReason, ++extern BOOL WINAPI DbgDllMain(HINSTANCE hInstance, DWORD dwReason, + LPVOID lpReserved); + + //***************************************************************************** +diff --git a/src/inc/clrnt.h b/src/inc/clrnt.h +index ebea066..487a370 100644 +--- a/src/inc/clrnt.h ++++ b/src/inc/clrnt.h +@@ -862,7 +862,7 @@ RtlpGetFunctionEndAddress ( + __in TADDR ImageBase + ) + { +- PUNWIND_INFO pUnwindInfo = (PUNWIND_INFO)(ImageBase + FunctionEntry->UnwindData); ++ PTR_UNWIND_INFO pUnwindInfo = (PTR_UNWIND_INFO)(ImageBase + FunctionEntry->UnwindData); + + return FunctionEntry->BeginAddress + pUnwindInfo->FunctionLength; + } +-- +2.7.4 + |