diff options
author | Jan Kotas <jkotas@microsoft.com> | 2017-10-12 15:04:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-12 15:04:52 -0700 |
commit | 8ecde0f47827e148c2d19ed07e163523b6f555e3 (patch) | |
tree | fe83b335938308f2cd2a4d78f64cbdf60cccb427 /src/vm/i386 | |
parent | 1248d27e661c7cf7bd179f45d6dc45148ae60e0b (diff) | |
download | coreclr-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.cpp | 2 | ||||
-rw-r--r-- | src/vm/i386/jitinterfacex86.cpp | 2 | ||||
-rw-r--r-- | src/vm/i386/stublinkerx86.cpp | 37 | ||||
-rw-r--r-- | src/vm/i386/stublinkerx86.h | 2 |
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); |