--- /dev/null
+From 1c963b8694365c7e31605fda0939fe7564c38716 Mon Sep 17 00:00:00 2001
+From: Konstantin Baladurin <k.baladurin@partner.samsung.com>
+Date: Fri, 29 Sep 2017 11:08:01 +0300
+Subject: [PATCH] Fix assert in HelperMethodFrame::UpdateRegDisplay (#14235)
+
+In some cases during execution of the SOS command 'clrstack -i'
+portability assert in HelperMethodFrame::UpdateRegDisplay occurs.
+This patch removes this assert and adds corresponding implementation.
+---
+ src/vm/i386/cgenx86.cpp | 25 ++++++++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp
+index ca81bb7..b4277db 100644
+--- a/src/vm/i386/cgenx86.cpp
++++ b/src/vm/i386/cgenx86.cpp
+@@ -379,7 +379,30 @@ void HelperMethodFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
+ pRD->IsCallerSPValid = FALSE; // Don't add usage of this field. This is only temporary.
+
+ #ifdef DACCESS_COMPILE
+- PORTABILITY_ASSERT("HelperMethodFrame::UpdateRegDisplay");
++ // For DAC, we may get here when the HMF is still uninitialized.
++ // So we may need to unwind here.
++ if (!m_MachState.isValid())
++ {
++ // This allocation throws on OOM.
++ MachState* pUnwoundState = (MachState*)DacAllocHostOnlyInstance(sizeof(*pUnwoundState), true);
++
++ InsureInit(false, pUnwoundState);
++
++ pRD->pCurrentContext->Eip = pRD->ControlPC = pUnwoundState->GetRetAddr();
++ pRD->pCurrentContext->Esp = pRD->SP = pUnwoundState->esp();
++
++#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = *((DWORD*) pUnwoundState->p##regname());
++ ENUM_CALLEE_SAVED_REGISTERS();
++#undef CALLEE_SAVED_REGISTER
++
++#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContextPointers->regname = (DWORD*) pUnwoundState->p##regname();
++ ENUM_CALLEE_SAVED_REGISTERS();
++#undef CALLEE_SAVED_REGISTER
++
++ ClearRegDisplayArgumentAndScratchRegisters(pRD);
++
++ return;
++ }
+ #endif // DACCESS_COMPILE
+
+ pRD->pCurrentContext->Eip = pRD->ControlPC = m_MachState.GetRetAddr();
+--
+2.7.4
+
--- /dev/null
+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
+
--- /dev/null
+From 388e7b4e98367cbdf03858817da7d756ea4247a3 Mon Sep 17 00:00:00 2001
+From: Konstantin Baladurin <k.baladurin@partner.samsung.com>
+Date: Tue, 3 Oct 2017 21:28:06 +0300
+Subject: [PATCH] Use addresses without sign extension in lldb plugin (#14009)
+
+lldb doesn't expect sign-extended addresses so we need to convert
+them before using with lldb API.
+
+This patch allows to use SOS plugin for core files in lldb on 32-bit
+platforms and also fixes output of the 'clrstack -f' command.
+---
+ src/ToolBox/SOS/lldbplugin/services.cpp | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+diff --git a/src/ToolBox/SOS/lldbplugin/services.cpp b/src/ToolBox/SOS/lldbplugin/services.cpp
+index 262f814..3186920 100644
+--- a/src/ToolBox/SOS/lldbplugin/services.cpp
++++ b/src/ToolBox/SOS/lldbplugin/services.cpp
+@@ -8,6 +8,8 @@
+ #include <string.h>
+ #include <string>
+
++#define CONVERT_FROM_SIGN_EXTENDED(offset) ((ULONG_PTR)(offset))
++
+ ULONG g_currentThreadIndex = -1;
+ ULONG g_currentThreadSystemId = -1;
+ char *g_coreclrDirectory;
+@@ -545,6 +547,9 @@ LLDBServices::Disassemble(
+ uint8_t byte;
+ int cch;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ if (buffer == NULL)
+ {
+ hr = E_INVALIDARG;
+@@ -750,6 +755,9 @@ LLDBServices::ReadVirtual(
+ lldb::SBError error;
+ size_t read = 0;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ lldb::SBProcess process = GetCurrentProcess();
+ if (!process.IsValid())
+ {
+@@ -776,6 +784,9 @@ LLDBServices::WriteVirtual(
+ lldb::SBError error;
+ size_t written = 0;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ lldb::SBProcess process = GetCurrentProcess();
+ if (!process.IsValid())
+ {
+@@ -822,6 +833,9 @@ LLDBServices::GetNameByOffset(
+ lldb::SBSymbol symbol;
+ std::string str;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ target = m_debugger.GetSelectedTarget();
+ if (!target.IsValid())
+ {
+@@ -1012,6 +1026,9 @@ LLDBServices::GetModuleByOffset(
+ lldb::SBTarget target;
+ int numModules;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ target = m_debugger.GetSelectedTarget();
+ if (!target.IsValid())
+ {
+@@ -1076,6 +1093,9 @@ LLDBServices::GetModuleNames(
+ lldb::SBFileSpec fileSpec;
+ HRESULT hr = S_OK;
+
++ // lldb doesn't expect sign-extended address
++ base = CONVERT_FROM_SIGN_EXTENDED(base);
++
+ target = m_debugger.GetSelectedTarget();
+ if (!target.IsValid())
+ {
+@@ -1167,6 +1187,9 @@ LLDBServices::GetLineByOffset(
+ lldb::SBLineEntry lineEntry;
+ std::string str;
+
++ // lldb doesn't expect sign-extended address
++ offset = CONVERT_FROM_SIGN_EXTENDED(offset);
++
+ target = m_debugger.GetSelectedTarget();
+ if (!target.IsValid())
+ {
+--
+2.7.4
+