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