summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaeHie Park <saehie.park@gmail.com>2017-02-09 18:36:10 +0900
committerJan Vorlicek <janvorli@microsoft.com>2017-02-09 10:36:10 +0100
commiteaee80011c9523ebe82cbadf1a693217e439fbfd (patch)
treeb2d9f0f025b21375691f9e8f9f69caaf14a01e93
parenta7c03fbd28d61fac40d3f51845926af54b41c7be (diff)
downloadcoreclr-eaee80011c9523ebe82cbadf1a693217e439fbfd.tar.gz
coreclr-eaee80011c9523ebe82cbadf1a693217e439fbfd.tar.bz2
coreclr-eaee80011c9523ebe82cbadf1a693217e439fbfd.zip
[x86/Linux] Fix UMThunkStub stack alignment (#9365)
Fixes out going call in UMThunkStub to be 16 byte stack aligned
-rw-r--r--src/vm/i386/umthunkstub.S5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/vm/i386/umthunkstub.S b/src/vm/i386/umthunkstub.S
index 22a4329a8e..5a557d4b32 100644
--- a/src/vm/i386/umthunkstub.S
+++ b/src/vm/i386/umthunkstub.S
@@ -28,7 +28,7 @@ NESTED_ENTRY UMThunkStub, _TEXT, UnhandledExceptionHandlerUnix
#define UMThunkStub_UMENTRYTHUNK_OFFSET (UMThunkStub_SAVEDREG+4)
#define UMThunkStub_THREAD_OFFSET (UMThunkStub_UMENTRYTHUNK_OFFSET+4)
#define UMThunkStub_INT_ARG_OFFSET (UMThunkStub_THREAD_OFFSET+4)
-#define UMThunkStub_FIXEDALLOCSIZE (UMThunkStub_LOCALVARS)
+#define UMThunkStub_FIXEDALLOCSIZE (UMThunkStub_LOCALVARS+4) // extra 4 is for stack alignment
// return address <-- entry ESP
// saved ebp <-- EBP
@@ -37,6 +37,7 @@ NESTED_ENTRY UMThunkStub, _TEXT, UnhandledExceptionHandlerUnix
// saved edi
// UMEntryThunk*
// Thread*
+// dummy 4 byte for 16 byte stack alignment
// {optional stack args passed to callee} <-- new esp
PROLOG_BEG
@@ -122,11 +123,13 @@ LOCAL_LABEL(InvalidTransition):
LOCAL_LABEL(DoTrapReturningThreadsTHROW):
// extern "C" VOID STDCALL UMThunkStubRareDisableWorker(Thread *pThread, UMEntryThunk *pUMEntryThunk)
+ sub esp, (2*4) // add padding to ensure 16 byte stack alignment
mov eax, dword ptr [ebp - UMThunkStub_UMENTRYTHUNK_OFFSET]
push eax
mov eax, dword ptr [ebp - UMThunkStub_THREAD_OFFSET]
push eax
call C_FUNC(UMThunkStubRareDisableWorker)
+ add esp, (2*4) // restore to before stack alignment
jmp LOCAL_LABEL(InCooperativeMode)