//===-- xray_trampoline_s390x.s ---------------------------------*- ASM -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of XRay, a dynamic runtime instrumentation system. // // This implements the s390x-specific assembler for the trampolines. // 2 versions of the functions are provided: one which does not store the // vector registers, and one which does store them. The compiler decides // which to call based on the availability of the vector extension. // //===----------------------------------------------------------------------===// .text // Minimal stack frame size #define STACKSZ 160 // Minimal stack frame size (160) plus space for 8 vector registers a 16 bytes. #define STACKSZ_VEC 288 //===----------------------------------------------------------------------===// .globl __xray_FunctionEntry .p2align 4 .type __xray_FunctionEntry,@function __xray_FunctionEntry: # The registers r2-15 of the instrumented function are already saved in the # stack frame. On entry, r2 contains the function id, and %r14 the address # of the first instruction of the instrumented function. # Register r14 will be stored in the slot reserved for compiler use. stg %r14, 8(%r15) std %f0, 128(%r15) std %f2, 136(%r15) std %f4, 144(%r15) std %f6, 152(%r15) aghi %r15, -STACKSZ lgrl %r1, _ZN6__xray19XRayPatchedFunctionE@GOT ltg %r1, 0(%r1) je .Lrestore0 # Set r3 to XRayEntryType::ENTRY = 0. # The FuncId is still stored in r2. lghi %r3, 0 basr %r14, %r1 .Lrestore0: ld %f6, STACKSZ+152(%r15) ld %f4, STACKSZ+144(%r15) ld %f2, STACKSZ+136(%r15) ld %f0, STACKSZ+128(%r15) lmg %r1, %r15, STACKSZ+8(%r15) br %r1 .Lfunc_end0: .size __xray_FunctionEntry, .Lfunc_end0-__xray_FunctionEntry //===----------------------------------------------------------------------===// .globl __xray_FunctionEntryVec .p2align 4 .type __xray_FunctionEntryVec,@function __xray_FunctionEntryVec: # The registers r2-15 of the instrumented function are already saved in the # stack frame. On entry, r2 contains the function id, and %r14 the address # of the first instruction of the instrumented function. # Register r14 will be stored in the slot reserved for compiler use. stg %r14, 8(%r15) std %f0, 128(%r15) std %f2, 136(%r15) std %f4, 144(%r15) std %f6, 152(%r15) aghi %r15, -STACKSZ_VEC vstm %v24, %v31, 160(%r15) lgrl %r1, _ZN6__xray19XRayPatchedFunctionE@GOT ltg %r1, 0(%r1) je .Lrestore1 # Set r3 to XRayEntryType::ENTRY = 0. # The FuncId is still stored in r2. lghi %r3, 0 basr %r14, %r1 .Lrestore1: vlm %v24, %v31, 160(%r15) ld %f6, STACKSZ_VEC+152(%r15) ld %f4, STACKSZ_VEC+144(%r15) ld %f2, STACKSZ_VEC+136(%r15) ld %f0, STACKSZ_VEC+128(%r15) lmg %r1, %r15, STACKSZ_VEC+8(%r15) br %r1 .Lfunc_end1: .size __xray_FunctionEntryVec, .Lfunc_end1-__xray_FunctionEntryVec //===----------------------------------------------------------------------===// .globl __xray_FunctionExit .p2align 4 .type __xray_FunctionExit,@function __xray_FunctionExit: # The registers r2-15 of the instrumented function are already saved in the # stack frame. On entry, the register r2 contains the function id. # At the end, the function jumps to the address saved in the slot for r14, # which contains the return address into the caller of the instrumented # function. std %f0, 128(%r15) std %f2, 136(%r15) std %f4, 144(%r15) std %f6, 152(%r15) aghi %r15, -STACKSZ lgrl %r1, _ZN6__xray19XRayPatchedFunctionE@GOT ltg %r1, 0(%r1) je .Lrestore2 # Set r3 to XRayEntryType::EXIT = 1. # The FuncId is still stored in r2. lghi %r3, 1 basr %r14, %r1 .Lrestore2: ld %f6, STACKSZ+152(%r15) ld %f4, STACKSZ+144(%r15) ld %f2, STACKSZ+136(%r15) ld %f0, STACKSZ+128(%r15) lmg %r2, %r15, STACKSZ+16(%r15) br %r14 .Lfunc_end2: .size __xray_FunctionExit, .Lfunc_end2-__xray_FunctionExit //===----------------------------------------------------------------------===// .globl __xray_FunctionExitVec .p2align 4 .type __xray_FunctionExitVec,@function __xray_FunctionExitVec: # The registers r2-15 of the instrumented function are already saved in the # stack frame. On entry, the register r2 contains the function id. # At the end, the function jumps to the address saved in the slot for r14, # which contains the return address into the caller of the instrumented # function. std %f0, 128(%r15) std %f2, 136(%r15) std %f4, 144(%r15) std %f6, 152(%r15) aghi %r15, -STACKSZ_VEC vstm %v24, %v31, 160(%r15) lgrl %r1, _ZN6__xray19XRayPatchedFunctionE@GOT ltg %r1, 0(%r1) je .Lrestore3 # Set r3 to XRayEntryType::EXIT = 1. # The FuncId is still stored in r2. lghi %r3, 1 basr %r14, %r1 .Lrestore3: vlm %v24, %v31, 160(%r15) ld %f6, STACKSZ_VEC+152(%r15) ld %f4, STACKSZ_VEC+144(%r15) ld %f2, STACKSZ_VEC+136(%r15) ld %f0, STACKSZ_VEC+128(%r15) lmg %r2, %r15, STACKSZ_VEC+16(%r15) br %r14 .Lfunc_end3: .size __xray_FunctionExit, .Lfunc_end3-__xray_FunctionExit //===----------------------------------------------------------------------===// .section ".note.GNU-stack","",@progbits