diff options
Diffstat (limited to 'src/vm/arm')
-rw-r--r-- | src/vm/arm/stubs.cpp | 8 | ||||
-rw-r--r-- | src/vm/arm/tizenasanenv.S | 61 |
2 files changed, 69 insertions, 0 deletions
diff --git a/src/vm/arm/stubs.cpp b/src/vm/arm/stubs.cpp index 6da58b5326..078a16cb8f 100644 --- a/src/vm/arm/stubs.cpp +++ b/src/vm/arm/stubs.cpp @@ -26,6 +26,10 @@ #include "ecall.h" #include "threadsuspend.h" +#if defined(TIZEN_ASAN_ENVIRONMENT) && !defined(CROSS_COMPILE) && !defined(DACCESS_COMPILE) +#include <tizenasanenv.h> +#endif + // target write barriers EXTERN_C void JIT_WriteBarrier(Object **dst, Object *ref); EXTERN_C void JIT_WriteBarrier_End(); @@ -2490,6 +2494,10 @@ class UMEntryThunk * UMEntryThunk::Decode(void *pCallback) void UMEntryThunkCode::Encode(BYTE* pTargetCode, void* pvSecretParam) { +#if defined(TIZEN_ASAN_ENVIRONMENT) && !defined(CROSS_COMPILE) && !defined(DACCESS_COMPILE) + pTargetCode = (BYTE *)TizenASanEnv::CreateWrapperILCode((LPVOID)pTargetCode); +#endif + // ldr r12, [pc + 8] m_code[0] = 0xf8df; m_code[1] = 0xc008; diff --git a/src/vm/arm/tizenasanenv.S b/src/vm/arm/tizenasanenv.S new file mode 100644 index 0000000000..6a8adb94fe --- /dev/null +++ b/src/vm/arm/tizenasanenv.S @@ -0,0 +1,61 @@ +.macro PUSH_REGS + push {r0-r12} + vpush.64 {d0-d7} +.endm + +.macro POP_REGS + vpop.64 {d0-d7} + pop {r0-r12} +.endm + + +// Export symbols +.global tizenASanWrapper +.global tizenASanWrapperSize +.global tizenASanWrapperEntryOffset + +.text +.arm + +tizenASanWrapper: +// !!! ATTENTION !!! +// Don't move this labels (target, pushAddr, popAddr) +// because they mapped to AuxiliaryCalls struct from src/vm/tizenasanenv.cpp +target: .word 0xdeadc0de +pushAddr: .word 0xdeadc0de @ void pushAddr(LPVOID addr) +popAddr: .word 0xdeadc0de @ LPVOID popAddr() + +entryPointer: + // Save context + PUSH_REGS + + // Save the return address and call 'pre handler' + mov r0, lr + ldr r1, pushAddr + blx r1 + + // Restore context + POP_REGS + + // Change the return address + adr lr, postLabel + + // Call original function + ldr pc, target +postLabel: + // Save context + PUSH_REGS + + // Get the return address and call 'post handler' + ldr r0, popAddr + blx r0 + + // Restore the return address + mov lr, r0 + + // Restore context + POP_REGS + bx lr + +tizenASanWrapperSize: .word . - tizenASanWrapper +tizenASanWrapperEntryOffset: .word entryPointer - tizenASanWrapper |