1#include "../builtins/assembly.h" 2 3 .syntax unified 4 .arch armv6t2 5 .fpu vfpv2 6 .code 32 7 .global _ZN6__xray19XRayPatchedFunctionE 8 9 @ Word-aligned function entry point 10 .p2align 2 11 @ Let C/C++ see the symbol 12 .global __xray_FunctionEntry 13 .hidden __xray_FunctionEntry 14 @ It preserves all registers except r0, r12(ip), r14(lr) and r15(pc) 15 @ Assume that "q" part of the floating-point registers is not used 16 @ for passing parameters to C/C++ functions. 17 .type __xray_FunctionEntry, %function 18 @ In C++ it is void extern "C" __xray_FunctionEntry(uint32_t FuncId) with 19 @ FuncId passed in r0 register. 20__xray_FunctionEntry: 21 PUSH {r1-r3,lr} 22 @ Save floating-point parameters of the instrumented function 23 VPUSH {d0-d7} 24 MOVW r1, #:lower16:_ZN6__xray19XRayPatchedFunctionE - (. + 16) 25 MOVT r1, #:upper16:_ZN6__xray19XRayPatchedFunctionE - (. + 12) 26 LDR r2, [pc, r1] 27 @ Handler address is nullptr if handler is not set 28 CMP r2, #0 29 BEQ FunctionEntry_restore 30 @ Function ID is already in r0 (the first parameter). 31 @ r1=0 means that we are tracing an entry event 32 MOV r1, #0 33 @ Call the handler with 2 parameters in r0 and r1 34 BLX r2 35FunctionEntry_restore: 36 @ Restore floating-point parameters of the instrumented function 37 VPOP {d0-d7} 38 POP {r1-r3,pc} 39 40 @ Word-aligned function entry point 41 .p2align 2 42 @ Let C/C++ see the symbol 43 .global __xray_FunctionExit 44 .hidden __xray_FunctionExit 45 @ Assume that d1-d7 are not used for the return value. 46 @ Assume that "q" part of the floating-point registers is not used for the 47 @ return value in C/C++. 48 .type __xray_FunctionExit, %function 49 @ In C++ it is extern "C" void __xray_FunctionExit(uint32_t FuncId) with 50 @ FuncId passed in r0 register. 51__xray_FunctionExit: 52 PUSH {r1-r3,lr} 53 @ Save the floating-point return value of the instrumented function 54 VPUSH {d0} 55 @ Load the handler address 56 MOVW r1, #:lower16:_ZN6__xray19XRayPatchedFunctionE - (. + 16) 57 MOVT r1, #:upper16:_ZN6__xray19XRayPatchedFunctionE - (. + 12) 58 LDR r2, [pc, r1] 59 @ Handler address is nullptr if handler is not set 60 CMP r2, #0 61 BEQ FunctionExit_restore 62 @ Function ID is already in r0 (the first parameter). 63 @ 1 means that we are tracing an exit event 64 MOV r1, #1 65 @ Call the handler with 2 parameters in r0 and r1 66 BLX r2 67FunctionExit_restore: 68 @ Restore the floating-point return value of the instrumented function 69 VPOP {d0} 70 POP {r1-r3,pc} 71 72 @ Word-aligned function entry point 73 .p2align 2 74 @ Let C/C++ see the symbol 75 .global __xray_FunctionTailExit 76 .hidden __xray_FunctionTailExit 77 @ It preserves all registers except r0, r12(ip), r14(lr) and r15(pc) 78 @ Assume that "q" part of the floating-point registers is not used 79 @ for passing parameters to C/C++ functions. 80 .type __xray_FunctionTailExit, %function 81 @ In C++ it is void extern "C" __xray_FunctionTailExit(uint32_t FuncId) 82 @ with FuncId passed in r0 register. 83__xray_FunctionTailExit: 84 PUSH {r1-r3,lr} 85 @ Save floating-point parameters of the instrumented function 86 VPUSH {d0-d7} 87 MOVW r1, #:lower16:_ZN6__xray19XRayPatchedFunctionE - (. + 16) 88 MOVT r1, #:upper16:_ZN6__xray19XRayPatchedFunctionE - (. + 12) 89 LDR r2, [pc, r1] 90 @ Handler address is nullptr if handler is not set 91 CMP r2, #0 92 BEQ FunctionTailExit_restore 93 @ Function ID is already in r0 (the first parameter). 94 @ r1=2 means that we are tracing a tail exit event 95 @ But before the logging part of XRay is ready, we pretend that here a 96 @ normal function exit happens, so we give the handler code 1 97 MOV r1, #1 98 @ Call the handler with 2 parameters in r0 and r1 99 BLX r2 100FunctionTailExit_restore: 101 @ Restore floating-point parameters of the instrumented function 102 VPOP {d0-d7} 103 POP {r1-r3,pc} 104 105NO_EXEC_STACK_DIRECTIVE 106