summaryrefslogtreecommitdiff
path: root/packaging/0001-Fix-clrstack-command-of-lldb-sosplugin-on-x86-13973.patch
diff options
context:
space:
mode:
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.patch287
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
+