summaryrefslogtreecommitdiff
path: root/src/vm/tizenasanenv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/tizenasanenv.cpp')
-rw-r--r--src/vm/tizenasanenv.cpp35
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