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