summaryrefslogtreecommitdiff
path: root/src/vm/i386
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2017-10-12 15:04:52 -0700
committerGitHub <noreply@github.com>2017-10-12 15:04:52 -0700
commit8ecde0f47827e148c2d19ed07e163523b6f555e3 (patch)
treefe83b335938308f2cd2a4d78f64cbdf60cccb427 /src/vm/i386
parent1248d27e661c7cf7bd179f45d6dc45148ae60e0b (diff)
downloadcoreclr-8ecde0f47827e148c2d19ed07e163523b6f555e3.tar.gz
coreclr-8ecde0f47827e148c2d19ed07e163523b6f555e3.tar.bz2
coreclr-8ecde0f47827e148c2d19ed07e163523b6f555e3.zip
Fix Linux x86 break (#14461)
Diffstat (limited to 'src/vm/i386')
-rw-r--r--src/vm/i386/cgenx86.cpp2
-rw-r--r--src/vm/i386/jitinterfacex86.cpp2
-rw-r--r--src/vm/i386/stublinkerx86.cpp37
-rw-r--r--src/vm/i386/stublinkerx86.h2
4 files changed, 35 insertions, 8 deletions
diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp
index c91a716137..19d7bbeea3 100644
--- a/src/vm/i386/cgenx86.cpp
+++ b/src/vm/i386/cgenx86.cpp
@@ -1076,7 +1076,7 @@ Stub *GenerateInitPInvokeFrameHelper()
unsigned negSpace = FrameInfo.offsetOfFrameVptr;
// mov esi, GetThread()
- psl->X86EmitCurrentThreadFetch(kESI);
+ psl->X86EmitCurrentThreadFetch(kESI, (1 << kEDI) | (1 << kEBX) | (1 << kECX) | (1 << kEDX));
// mov [edi + FrameInfo.offsetOfGSCookie], GetProcessGSCookie()
psl->X86EmitOffsetModRM(0xc7, (X86Reg)0x0, kEDI, FrameInfo.offsetOfGSCookie - negSpace);
diff --git a/src/vm/i386/jitinterfacex86.cpp b/src/vm/i386/jitinterfacex86.cpp
index 1b470c9533..3994c2e216 100644
--- a/src/vm/i386/jitinterfacex86.cpp
+++ b/src/vm/i386/jitinterfacex86.cpp
@@ -539,7 +539,7 @@ void JIT_TrialAlloc::EmitCore(CPUSTUBLINKER *psl, CodeLabel *noLock, CodeLabel *
&& "EAX should contain size for allocation and it doesnt!!!");
// Fetch current thread into EDX, preserving EAX and ECX
- psl->X86EmitCurrentThreadFetch(kEDX);
+ psl->X86EmitCurrentThreadFetch(kEDX, (1 << kEAX) | (1 << kECX));
// Try the allocation.
diff --git a/src/vm/i386/stublinkerx86.cpp b/src/vm/i386/stublinkerx86.cpp
index 3b376be26d..e07b6e1c37 100644
--- a/src/vm/i386/stublinkerx86.cpp
+++ b/src/vm/i386/stublinkerx86.cpp
@@ -2360,17 +2360,43 @@ void StubLinkerCPU::EmitJITHelperLoggingThunk(PCODE pJitHelper, LPVOID helperFun
}
#endif // _DEBUG && !FEATURE_PAL
-#if !defined(FEATURE_STUBS_AS_IL)
-VOID StubLinkerCPU::X86EmitCurrentThreadFetch(X86Reg dstreg)
+VOID StubLinkerCPU::X86EmitCurrentThreadFetch(X86Reg dstreg, unsigned preservedRegSet)
{
CONTRACTL
{
STANDARD_VM_CHECK;
+ // It doesn't make sense to have the destination register be preserved
+ PRECONDITION((preservedRegSet & (1 << dstreg)) == 0);
AMD64_ONLY(PRECONDITION(dstreg < 8)); // code below doesn't support high registers
}
CONTRACTL_END;
+#ifdef FEATURE_PAL
+
+ X86EmitPushRegs(preservedRegSet & ((1 << kEAX) | (1 << kEDX) | (1 << kECX)));
+
+ // call GetThread
+ X86EmitCall(NewExternalCodeLabel((LPVOID)GetThread), sizeof(void*));
+
+ // mov dstreg, eax
+ X86EmitMovRegReg(dstreg, kEAX);
+
+ X86EmitPopRegs(preservedRegSet & ((1 << kEAX) | (1 << kEDX) | (1 << kECX)));
+
+#ifdef _DEBUG
+ // Trash caller saved regs that we were not told to preserve, and that aren't the dstreg.
+ preservedRegSet |= 1 << dstreg;
+ if (!(preservedRegSet & (1 << kEAX)))
+ X86EmitDebugTrashReg(kEAX);
+ if (!(preservedRegSet & (1 << kEDX)))
+ X86EmitDebugTrashReg(kEDX);
+ if (!(preservedRegSet & (1 << kECX)))
+ X86EmitDebugTrashReg(kECX);
+#endif // _DEBUG
+
+#else // FEATURE_PAL
+
#ifdef _TARGET_AMD64_
BYTE code[] = { 0x65,0x48,0x8b,0x04,0x25 }; // mov dstreg, qword ptr gs:[IMM32]
static const int regByteIndex = 3;
@@ -2386,8 +2412,9 @@ VOID StubLinkerCPU::X86EmitCurrentThreadFetch(X86Reg dstreg)
X86EmitIndexRegLoad(dstreg, dstreg, sizeof(void *) * (g_TlsIndex & 0xFFFF));
X86EmitIndexRegLoad(dstreg, dstreg, (g_TlsIndex & 0x7FFF0000) >> 16);
+
+#endif // FEATURE_PAL
}
-#endif // !FEATURE_STUBS_AS_IL
#if defined(_TARGET_X86_)
@@ -2716,7 +2743,7 @@ VOID StubLinkerCPU::EmitSetup(CodeLabel *pForwardRef)
{
STANDARD_VM_CONTRACT;
- X86EmitCurrentThreadFetch(kEBX);
+ X86EmitCurrentThreadFetch(kEBX, 0);
// cmp ebx, 0
static const BYTE b[] = { 0x83, 0xFB, 0x0};
@@ -2956,7 +2983,7 @@ VOID StubLinkerCPU::EmitMethodStubProlog(TADDR pFrameVptr, int transitionBlockOf
#endif // _TARGET_X86_
// ebx <-- GetThread()
- X86EmitCurrentThreadFetch(kEBX);
+ X86EmitCurrentThreadFetch(kEBX, 0);
#if _DEBUG
diff --git a/src/vm/i386/stublinkerx86.h b/src/vm/i386/stublinkerx86.h
index d523bb0461..50dc3b35a5 100644
--- a/src/vm/i386/stublinkerx86.h
+++ b/src/vm/i386/stublinkerx86.h
@@ -219,7 +219,7 @@ class StubLinkerCPU : public StubLinker
VOID X86EmitLeaRIP(CodeLabel *target, X86Reg reg);
#endif
- VOID X86EmitCurrentThreadFetch(X86Reg dstreg);
+ VOID X86EmitCurrentThreadFetch(X86Reg dstreg, unsigned preservedRegSet);
VOID X86EmitIndexRegLoad(X86Reg dstreg, X86Reg srcreg, __int32 ofs = 0);
VOID X86EmitIndexRegStore(X86Reg dstreg, __int32 ofs, X86Reg srcreg);