1*6a684a04Sguenther /* $OpenBSD: asm.h,v 1.7 2022/12/07 23:25:59 guenther Exp $ */ 28140d1b9Skettenis 3b54ea104Sdrahn /* 4b54ea104Sdrahn * Copyright (c) 2020 Dale Rahn <drahn@openbsd.org> 5b54ea104Sdrahn * 6b54ea104Sdrahn * Permission to use, copy, modify, and distribute this software for any 7b54ea104Sdrahn * purpose with or without fee is hereby granted, provided that the above 8b54ea104Sdrahn * copyright notice and this permission notice appear in all copies. 9b54ea104Sdrahn * 10b54ea104Sdrahn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11b54ea104Sdrahn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12b54ea104Sdrahn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13b54ea104Sdrahn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14b54ea104Sdrahn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15b54ea104Sdrahn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16b54ea104Sdrahn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17b54ea104Sdrahn */ 18b54ea104Sdrahn 19b54ea104Sdrahn #ifndef _POWERPC64_ASM_H_ 20b54ea104Sdrahn #define _POWERPC64_ASM_H_ 21b54ea104Sdrahn 22b54ea104Sdrahn #define _C_LABEL(x) x 23b54ea104Sdrahn #define _ASM_LABEL(x) x 24b54ea104Sdrahn 25b54ea104Sdrahn #define _TMP_LABEL(x) .L_ ## x 26b54ea104Sdrahn #define _GEP_LABEL(x) .L_ ## x ## _gep0 27b54ea104Sdrahn #define _LEP_LABEL(x) .L_ ## x ## _lep0 28b54ea104Sdrahn 29b54ea104Sdrahn #define _ENTRY(x) \ 30b54ea104Sdrahn .text; .align 2; .globl x; .type x,@function; x: \ 31b54ea104Sdrahn _GEP_LABEL(x): \ 32b54ea104Sdrahn addis %r2, %r12, .TOC.-_GEP_LABEL(x)@ha; \ 33b54ea104Sdrahn addi %r2, %r2, .TOC.-_GEP_LABEL(x)@l; \ 34b54ea104Sdrahn _LEP_LABEL(x): \ 35*6a684a04Sguenther .localentry x, _LEP_LABEL(x)-_GEP_LABEL(x); 36b54ea104Sdrahn 37b54ea104Sdrahn #if defined(PROF) || defined(GPROF) 38b54ea104Sdrahn # define _PROF_PROLOGUE(y) \ 39b54ea104Sdrahn .section ".data"; \ 40b54ea104Sdrahn .align 2; \ 41b54ea104Sdrahn _TMP_LABEL(y):; \ 42b54ea104Sdrahn .long 0; \ 43b54ea104Sdrahn .section ".text"; \ 44b54ea104Sdrahn mflr %r0; \ 45b54ea104Sdrahn addis %r11, %r2, _TMP_LABEL(y)@toc@ha; \ 46b54ea104Sdrahn std %r0, 8(%r1); \ 47b54ea104Sdrahn addi %r0, %r11, _TMP_LABEL(y)@toc@l; \ 48b54ea104Sdrahn bl _mcount; 49b54ea104Sdrahn #else 50b54ea104Sdrahn # define _PROF_PROLOGUE(y) 51b54ea104Sdrahn #endif 52b54ea104Sdrahn 53*6a684a04Sguenther #define ENTRY(y) _ENTRY(y); _PROF_PROLOGUE(y) 54*6a684a04Sguenther #define ASENTRY(y) _ENTRY(y); _PROF_PROLOGUE(y) 55b54ea104Sdrahn #define END(y) .size y, . - y 56b54ea104Sdrahn 57b54ea104Sdrahn #define STRONG_ALIAS(alias,sym) \ 58b54ea104Sdrahn .global alias; .set alias,sym 59b54ea104Sdrahn #define WEAK_ALIAS(alias,sym) \ 60b54ea104Sdrahn .weak alias; .set alias,sym 61b54ea104Sdrahn 62af2f3395Smortimer #if defined(_RET_PROTECTOR) 63af2f3395Smortimer # define RETGUARD_SETUP(x, reg) \ 64af2f3395Smortimer RETGUARD_SYMBOL(x); \ 65af2f3395Smortimer mflr %r0; \ 66af2f3395Smortimer addis reg, %r2, (__retguard_ ## x)@toc@ha; \ 670c8816d3Sderaadt ld reg, ((__retguard_ ## x)@toc@l)(reg); \ 68af2f3395Smortimer xor reg, reg, %r0 69af2f3395Smortimer # define RETGUARD_CHECK(x, reg) \ 70af2f3395Smortimer mflr %r0; \ 71af2f3395Smortimer xor reg, reg, %r0; \ 72af2f3395Smortimer addis %r12, %r2, (__retguard_ ## x)@toc@ha; \ 730c8816d3Sderaadt ld %r12, ((__retguard_ ## x)@toc@l)(%r12); \ 74af2f3395Smortimer tdne reg, %r12 7536507d51Smortimer # define RETGUARD_SAVE(reg, loc) \ 7636507d51Smortimer std reg, loc 7736507d51Smortimer # define RETGUARD_LOAD(reg, loc) \ 7836507d51Smortimer ld reg, loc 79af2f3395Smortimer # define RETGUARD_SYMBOL(x) \ 80af2f3395Smortimer .ifndef __retguard_ ## x; \ 81af2f3395Smortimer .hidden __retguard_ ## x; \ 82af2f3395Smortimer .type __retguard_ ## x,@object; \ 83af2f3395Smortimer .pushsection .openbsd.randomdata.retguard,"aw",@progbits; \ 84af2f3395Smortimer .weak __retguard_ ## x; \ 85af2f3395Smortimer .p2align 3; \ 86af2f3395Smortimer __retguard_ ## x: ; \ 87af2f3395Smortimer .quad 0; \ 88af2f3395Smortimer .size __retguard_ ## x, 8; \ 89af2f3395Smortimer .popsection; \ 90af2f3395Smortimer .endif 91af2f3395Smortimer #else 92af2f3395Smortimer # define RETGUARD_SETUP(x, reg) 93af2f3395Smortimer # define RETGUARD_CHECK(x, reg) 9436507d51Smortimer # define RETGUARD_SAVE(reg, loc) 9536507d51Smortimer # define RETGUARD_LOAD(reg, loc) 96af2f3395Smortimer # define RETGUARD_SYMBOL(x) 97af2f3395Smortimer #endif 98af2f3395Smortimer 99af2f3395Smortimer 100b54ea104Sdrahn #endif /* !_POWERPC64_ASM_H_ */ 101