1*0ee2ce67Sguenther /* $OpenBSD: asm.h,v 1.10 2022/12/08 02:11:27 guenther Exp $ */ 295c7671fSmiod /* $NetBSD: asm.h,v 1.25 2006/01/20 22:02:40 christos Exp $ */ 395c7671fSmiod 495c7671fSmiod /*- 595c7671fSmiod * Copyright (c) 1990 The Regents of the University of California. 695c7671fSmiod * All rights reserved. 795c7671fSmiod * 895c7671fSmiod * This code is derived from software contributed to Berkeley by 995c7671fSmiod * William Jolitz. 1095c7671fSmiod * 1195c7671fSmiod * Redistribution and use in source and binary forms, with or without 1295c7671fSmiod * modification, are permitted provided that the following conditions 1395c7671fSmiod * are met: 1495c7671fSmiod * 1. Redistributions of source code must retain the above copyright 1595c7671fSmiod * notice, this list of conditions and the following disclaimer. 1695c7671fSmiod * 2. Redistributions in binary form must reproduce the above copyright 1795c7671fSmiod * notice, this list of conditions and the following disclaimer in the 1895c7671fSmiod * documentation and/or other materials provided with the distribution. 1995c7671fSmiod * 3. Neither the name of the University nor the names of its contributors 2095c7671fSmiod * may be used to endorse or promote products derived from this software 2195c7671fSmiod * without specific prior written permission. 2295c7671fSmiod * 2395c7671fSmiod * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2495c7671fSmiod * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2595c7671fSmiod * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2695c7671fSmiod * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2795c7671fSmiod * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2895c7671fSmiod * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2995c7671fSmiod * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3095c7671fSmiod * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3195c7671fSmiod * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3295c7671fSmiod * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3395c7671fSmiod * SUCH DAMAGE. 3495c7671fSmiod * 3595c7671fSmiod * @(#)asm.h 5.5 (Berkeley) 5/7/91 3695c7671fSmiod */ 3795c7671fSmiod 3895c7671fSmiod #ifndef _SH_ASM_H_ 3995c7671fSmiod #define _SH_ASM_H_ 4095c7671fSmiod 4195c7671fSmiod #define _C_LABEL(x) x 4295c7671fSmiod #define _ASM_LABEL(x) x 4395c7671fSmiod 4495c7671fSmiod #ifdef __STDC__ 4595c7671fSmiod # define __CONCAT(x,y) x ## y 4695c7671fSmiod # define __STRING(x) #x 4795c7671fSmiod #else 4895c7671fSmiod # define __CONCAT(x,y) x/**/y 4995c7671fSmiod # define __STRING(x) "x" 5095c7671fSmiod #endif 5195c7671fSmiod 5295c7671fSmiod /* let kernels and others override entrypoint alignment */ 5395c7671fSmiod #ifndef _ALIGN_TEXT 5495c7671fSmiod # define _ALIGN_TEXT .align 2 5595c7671fSmiod #endif 5695c7671fSmiod 5795c7671fSmiod #define _ENTRY(x) \ 5895c7671fSmiod .text ;\ 5995c7671fSmiod _ALIGN_TEXT ;\ 6095c7671fSmiod .globl x ;\ 6195c7671fSmiod .type x,@function ;\ 6295c7671fSmiod x: 6395c7671fSmiod 64f5d1667bSmpi #if defined(PROF) || defined(GPROF) 6595c7671fSmiod #define _PROF_PROLOGUE \ 6695c7671fSmiod mov.l 1f,r1 ; \ 6795c7671fSmiod mova 2f,r0 ; \ 6895c7671fSmiod jmp @r1 ; \ 6995c7671fSmiod nop ; \ 7095c7671fSmiod .align 2 ; \ 7195c7671fSmiod 1: .long __mcount ; \ 7295c7671fSmiod 2: 7395c7671fSmiod #else /* !GPROF */ 7495c7671fSmiod #define _PROF_PROLOGUE 7595c7671fSmiod #endif /* !GPROF */ 7695c7671fSmiod 77*0ee2ce67Sguenther #define ENTRY(y) _ENTRY(y) _PROF_PROLOGUE 78*0ee2ce67Sguenther #define NENTRY(y) _ENTRY(y) 79*0ee2ce67Sguenther #define ASENTRY(y) _ENTRY(y) _PROF_PROLOGUE 8095c7671fSmiod 8181a5d5c8Sguenther #define END(y) .size y, . - y 8281a5d5c8Sguenther 8395c7671fSmiod #define SET_ENTRY_SIZE(y) \ 84*0ee2ce67Sguenther .size y, . - y 8595c7671fSmiod 8695c7671fSmiod #define SET_ASENTRY_SIZE(y) \ 87*0ee2ce67Sguenther .size y, . - y 8895c7671fSmiod 8995c7671fSmiod #define ALTENTRY(name) \ 90*0ee2ce67Sguenther .globl name ;\ 91*0ee2ce67Sguenther .type name,@function ;\ 92*0ee2ce67Sguenther name: 9395c7671fSmiod 9495c7671fSmiod /* 9595c7671fSmiod * Hide the gory details of PIC calls vs. normal calls. Use as in the 9695c7671fSmiod * following example: 9795c7671fSmiod * 9895c7671fSmiod * sts.l pr, @-sp 9995c7671fSmiod * PIC_PROLOGUE(.L_got, r0) ! saves old r12 on stack 10095c7671fSmiod * ... 10195c7671fSmiod * mov.l .L_function_1, r0 10295c7671fSmiod * 1: CALL r0 ! each call site needs a label 10395c7671fSmiod * nop 10495c7671fSmiod * ... 10595c7671fSmiod * mov.l .L_function_2, r0 10695c7671fSmiod * 2: CALL r0 10795c7671fSmiod * nop 10895c7671fSmiod * ... 10995c7671fSmiod * PIC_EPILOGUE ! restores r12 from stack 11095c7671fSmiod * lds.l @sp+, pr ! so call in right order 11195c7671fSmiod * rts 11295c7671fSmiod * nop 11395c7671fSmiod * 11495c7671fSmiod * .align 2 11595c7671fSmiod * .L_got: 11695c7671fSmiod * PIC_GOT_DATUM 11795c7671fSmiod * .L_function_1: ! if you call the same function twice 11895c7671fSmiod * CALL_DATUM(function, 1b) ! provide call datum for each call 11995c7671fSmiod * .L_function_2: 12095c7671fSmiod * CALL_DATUM(function, 2b) 12195c7671fSmiod */ 12295c7671fSmiod 12332b97dedSpascal #ifdef __PIC__ 12495c7671fSmiod 12595c7671fSmiod #define PIC_PLT(x) x@PLT 12695c7671fSmiod #define PIC_GOT(x) x@GOT 12795c7671fSmiod #define PIC_GOTOFF(x) x@GOTOFF 12895c7671fSmiod 12995c7671fSmiod #define PIC_PROLOGUE(got) \ 13095c7671fSmiod mov.l r12, @-sp; \ 13195c7671fSmiod PIC_PROLOGUE_NOSAVE(got) 13295c7671fSmiod 13395c7671fSmiod /* 13495c7671fSmiod * Functions that do non local jumps don't need to preserve r12, 13595c7671fSmiod * so we can shave off two instructions to save/restore it. 13695c7671fSmiod */ 13795c7671fSmiod #define PIC_PROLOGUE_NOSAVE(got) \ 13895c7671fSmiod mov.l got, r12; \ 13995c7671fSmiod mova got, r0; \ 14095c7671fSmiod add r0, r12 14195c7671fSmiod 14295c7671fSmiod #define PIC_EPILOGUE \ 14395c7671fSmiod mov.l @sp+, r12 14495c7671fSmiod 14595c7671fSmiod #define PIC_EPILOGUE_SLOT \ 14695c7671fSmiod PIC_EPILOGUE 14795c7671fSmiod 14895c7671fSmiod #define PIC_GOT_DATUM \ 14995c7671fSmiod .long _GLOBAL_OFFSET_TABLE_ 15095c7671fSmiod 15195c7671fSmiod #define CALL bsrf 15295c7671fSmiod #define JUMP braf 15395c7671fSmiod 15495c7671fSmiod #define CALL_DATUM(function, lpcs) \ 15595c7671fSmiod .long PIC_PLT(function) - ((lpcs) + 4 - (.)) 15695c7671fSmiod 15795c7671fSmiod /* 15895c7671fSmiod * This will result in text relocations in the shared library, 15995c7671fSmiod * unless the function is local or has hidden or protected visibility. 16095c7671fSmiod * Does not require PIC prologue. 16195c7671fSmiod */ 16295c7671fSmiod #define CALL_DATUM_LOCAL(function, lpcs) \ 16395c7671fSmiod .long function - ((lpcs) + 4) 16495c7671fSmiod 16595c7671fSmiod #else /* !PIC */ 16695c7671fSmiod 16795c7671fSmiod #define PIC_PROLOGUE(label) 16895c7671fSmiod #define PIC_PROLOGUE_NOSAVE(label) 16995c7671fSmiod #define PIC_EPILOGUE 17095c7671fSmiod #define PIC_EPILOGUE_SLOT nop 17195c7671fSmiod #define PIC_GOT_DATUM 17295c7671fSmiod 17395c7671fSmiod #define CALL jsr @ 17495c7671fSmiod #define JUMP jmp @ 17595c7671fSmiod 17695c7671fSmiod #define CALL_DATUM(function, lpcs) \ 17795c7671fSmiod .long function 17895c7671fSmiod 17995c7671fSmiod #define CALL_DATUM_LOCAL(function, lpcs) \ 18095c7671fSmiod .long function 18195c7671fSmiod 18295c7671fSmiod #endif /* !PIC */ 18395c7671fSmiod 1845a25e2caSmartynas #define STRONG_ALIAS(alias,sym) \ 185*0ee2ce67Sguenther .global alias; \ 186*0ee2ce67Sguenther alias = sym 18795c7671fSmiod #define WEAK_ALIAS(alias,sym) \ 188*0ee2ce67Sguenther .weak alias; \ 189*0ee2ce67Sguenther alias = sym 19095c7671fSmiod 19195c7671fSmiod #endif /* !_SH_ASM_H_ */ 192