1*adc7c282Skettenis /* $OpenBSD: profile.h,v 1.2 2021/02/17 12:11:45 kettenis Exp $ */ 2f24071e5Spatrick /* 3f24071e5Spatrick * Copyright (c) 2015 Dale Rahn <drahn@dalerahn.com> 4f24071e5Spatrick * 5f24071e5Spatrick * Permission to use, copy, modify, and distribute this software for any 6f24071e5Spatrick * purpose with or without fee is hereby granted, provided that the above 7f24071e5Spatrick * copyright notice and this permission notice appear in all copies. 8f24071e5Spatrick * 9f24071e5Spatrick * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10f24071e5Spatrick * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11f24071e5Spatrick * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12f24071e5Spatrick * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13f24071e5Spatrick * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14f24071e5Spatrick * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15f24071e5Spatrick * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16f24071e5Spatrick */ 17f24071e5Spatrick 18f24071e5Spatrick #define _MCOUNT_DECL void _mcount 19f24071e5Spatrick 20f24071e5Spatrick #define MCOUNT_ASM_NAME "__mcount" 21f24071e5Spatrick 22f24071e5Spatrick #ifdef __PIC__ 23f24071e5Spatrick #define PLTSYM "" /* XXX -aarch64 defaults to PLT? */ 24f24071e5Spatrick #else 25f24071e5Spatrick #define PLTSYM "" 26f24071e5Spatrick #endif 27f24071e5Spatrick 28f24071e5Spatrick #define MCOUNT \ 29f24071e5Spatrick __asm__ (".text;" \ 30f24071e5Spatrick ".align 3;" \ 31f24071e5Spatrick ".globl " MCOUNT_ASM_NAME ";" \ 32f24071e5Spatrick ".type " MCOUNT_ASM_NAME ",@function;" \ 33f24071e5Spatrick MCOUNT_ASM_NAME ":;" \ 34f24071e5Spatrick " stp x0, x1, [sp, #-160]!;" \ 35f24071e5Spatrick " stp x2, x3, [sp, #16];" \ 36f24071e5Spatrick " stp x4, x5, [sp, #32];" \ 37f24071e5Spatrick " stp x6, x7, [sp, #48];" \ 38f24071e5Spatrick " stp x8, x9, [sp, #64];" \ 39f24071e5Spatrick " stp x10,x11,[sp, #80];" \ 40f24071e5Spatrick " stp x12,x13,[sp, #96];" \ 41f24071e5Spatrick " stp x14,x15,[sp, #112];" \ 42f24071e5Spatrick " stp x16,x17,[sp, #128];" \ 43f24071e5Spatrick " stp x29,lr, [sp, #144];" \ 44f24071e5Spatrick /* load from pc at 8 off frame pointer */ \ 45f24071e5Spatrick " ldr x0, [x29, #8];" \ 46f24071e5Spatrick " mov x1, lr;" \ 47f24071e5Spatrick " bl " __STRING(_mcount) PLTSYM ";" \ 48f24071e5Spatrick /* restore argument registers */ \ 49f24071e5Spatrick " ldp x2, x3, [sp, #16];" \ 50f24071e5Spatrick " ldp x4, x5, [sp, #32];" \ 51f24071e5Spatrick " ldp x6, x7, [sp, #48];" \ 52f24071e5Spatrick " ldp x8, x9, [sp, #64];" \ 53f24071e5Spatrick " ldp x10,x11,[sp, #80];" \ 54f24071e5Spatrick " ldp x12,x13,[sp, #96];" \ 55f24071e5Spatrick " ldp x14,x15,[sp, #112];" \ 56f24071e5Spatrick " ldp x16,x17,[sp, #128];" \ 57f24071e5Spatrick " ldp x29,lr, [sp, #144];" \ 58f24071e5Spatrick " ldp x0, x1, [sp], #160;" \ 59f24071e5Spatrick " ret;"); 60f24071e5Spatrick 61f24071e5Spatrick #ifdef _KERNEL 62f24071e5Spatrick // Change this to dair read/set, then restore. 63f24071e5Spatrick #define MCOUNT_ENTER \ 64*adc7c282Skettenis __asm__ ("mrs %x0, daif; msr daifset, #0x3": "=r"(s)); 65f24071e5Spatrick #define MCOUNT_EXIT \ 66f24071e5Spatrick __asm__ ("msr daif, %x0":: "r"(s)); 67f24071e5Spatrick 68f24071e5Spatrick #endif // _KERNEL 69