.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