diff options
Diffstat (limited to 'src/vm/tizenasanenv.cpp')
-rw-r--r-- | src/vm/tizenasanenv.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/vm/tizenasanenv.cpp b/src/vm/tizenasanenv.cpp index afb78aeaec..9c34c67174 100644 --- a/src/vm/tizenasanenv.cpp +++ b/src/vm/tizenasanenv.cpp @@ -54,6 +54,12 @@ extern LPVOID tizenASanWrapper; extern UINT32 tizenASanWrapperSize; extern UINT32 tizenASanWrapperEntryOffset; +#ifdef _AMD64_ +extern LPVOID tizenASanWrapperJmp; +extern UINT32 tizenASanWrapperJmpSize; +extern UINT32 tizenASanWrapperJmpEntryOffset; +#endif // _AMD64_ + static __thread StaticStack<LPVOID, 128> s_retaddrStack; static __thread int s_enableCounter; @@ -170,4 +176,33 @@ LPVOID CreateWrapper(LPVOID target, void (*pushAddr)(LPVOID addr), LPVOID (*popA dprintf(1, "#### CreateWrapper E\n"); return entryPointer; } + +#ifdef _AMD64_ +LPVOID CreateWrapperJmp(LPVOID target, void (*pushAddr)(LPVOID addr), LPVOID (*popAddr)()) +{ + _ASSERTE(tizenASanWrapperJmpEntryOffset == sizeof(AuxiliaryCalls)); + + LPVOID wrapperSpace = (LPVOID)SystemDomain::GetGlobalLoaderAllocator()->GetExecutableHeap()->AllocMem(S_SIZE_T(tizenASanWrapperJmpSize)); + + AuxiliaryCalls calls = { + .target = target, + .pushAddr = pushAddr, + .popAddr = popAddr, + }; + + // copy auxiliary calls + memcpy(wrapperSpace, &calls, sizeof(calls)); + + LPVOID entryPointer = (LPVOID)((UINT_PTR)wrapperSpace + tizenASanWrapperJmpEntryOffset); + LPVOID wrapperEntryPointer = (LPVOID)((UINT_PTR)&tizenASanWrapperJmp + tizenASanWrapperJmpEntryOffset); + UINT32 wrapperCodeSize = tizenASanWrapperJmpSize - tizenASanWrapperJmpEntryOffset; + + // copy executable code wrapper + memcpy(entryPointer, wrapperEntryPointer, wrapperCodeSize); + + FlushInstructionCache(GetCurrentProcess(), wrapperSpace, tizenASanWrapperJmpSize); + + return entryPointer; +} +#endif // _AMD64_ } // namespace TizenASanEnv |