1 /* $NetBSD: asm.h,v 1.11 2025/01/06 10:46:44 martin Exp $ */ 2 3 /* - 4 * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University 5 * All Rights Reserved. 6 * 7 * Permission to use, copy, modify and distribute this software and its 8 * documentation is hereby granted, provided that both the copyright 9 * notice and this permission notice appear in all copies of the 10 * software, derivative works or modified versions, and any portions 11 * thereof, and that both notices appear in supporting documentation. 12 * 13 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 14 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 15 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 16 * 17 * Carnegie Mellon requests users of this software to return to 18 * 19 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 20 * School of Computer Science 21 * Carnegie Mellon University 22 * Pittsburgh PA 15213-3890 23 * 24 * any improvements or extensions that they make and grant Carnegie Mellon 25 * the rights to redistribute these changes. 26 */ 27 28 /* 29 * Assembly coding style 30 * 31 * This file contains macros and register defines to 32 * aid in writing more readable assembly code. 33 * Some rules to make assembly code understandable by 34 * a debugger are also noted. 35 */ 36 37 #define _C_LABEL(x) x 38 39 /* 40 * Macro to make a local label name. 41 */ 42 #define LLABEL(name,num) L ## name ## num 43 44 /* 45 * MCOUNT 46 */ 47 #if defined(GPROF) 48 #define MCOUNT \ 49 alloc out0 = ar.pfs, 8, 0, 4, 0; \ 50 mov out1 = r1; \ 51 mov out2 = b0;; \ 52 mov out3 = r0; \ 53 br.call.sptk b0 = _mcount;; 54 #else 55 #define MCOUNT /* nothing */ 56 #endif 57 58 /* 59 * ENTRY 60 * Declare a global leaf function. 61 * A leaf function does not call other functions. 62 */ 63 #define ENTRY(_name_, _n_args_) \ 64 .global _name_; \ 65 .align 16; \ 66 .proc _name_; \ 67 _name_:; \ 68 .regstk _n_args_, 0, 0, 0; \ 69 MCOUNT 70 71 #define ENTRY_NOPROFILE(_name_, _n_args_) \ 72 .global _name_; \ 73 .align 16; \ 74 .proc _name_; \ 75 _name_:; \ 76 .regstk _n_args_, 0, 0, 0 77 78 /* 79 * STATIC_ENTRY 80 * Declare a local leaf function. 81 */ 82 #define STATIC_ENTRY(_name_, _n_args_) \ 83 .align 16; \ 84 .proc _name_; \ 85 _name_:; \ 86 .regstk _n_args_, 0, 0, 0 \ 87 MCOUNT 88 /* 89 * XENTRY 90 * Global alias for a leaf function, or alternate entry point 91 */ 92 #define XENTRY(_name_) \ 93 .globl _name_; \ 94 _name_: 95 96 /* 97 * STATIC_XENTRY 98 * Local alias for a leaf function, or alternate entry point 99 */ 100 #define STATIC_XENTRY(_name_) \ 101 _name_: 102 103 104 /* 105 * END 106 * Function delimiter 107 */ 108 #define END(_name_) \ 109 .endp _name_ 110 111 112 /* 113 * EXPORT 114 * Export a symbol 115 */ 116 #define EXPORT(_name_) \ 117 .global _name_; \ 118 _name_: 119 120 121 /* 122 * IMPORT 123 * Make an external name visible, typecheck the size 124 */ 125 #define IMPORT(_name_, _size_) \ 126 /* .extern _name_,_size_ */ 127 128 129 /* 130 * ABS 131 * Define an absolute symbol 132 */ 133 #define ABS(_name_, _value_) \ 134 .globl _name_; \ 135 _name_ = _value_ 136 137 138 /* 139 * BSS 140 * Allocate un-initialized space for a global symbol 141 */ 142 #define BSS(_name_,_numbytes_) \ 143 .comm _name_,_numbytes_ 144 145 146 /* 147 * MSG 148 * Allocate space for a message (a read-only ascii string) 149 */ 150 #define ASCIZ .asciz 151 #define MSG(msg,reg,label) \ 152 addl reg,@ltoff(label),gp;; \ 153 ld8 reg=[reg];; \ 154 .data; \ 155 label: ASCIZ msg; \ 156 .text; 157 158 159 /* 160 * System call glue. 161 */ 162 #define SYSCALLNUM(name) ___CONCAT(SYS_,name) 163 164 #define CALLSYS_NOERROR(name) \ 165 { .mmi ; \ 166 alloc r9 = ar.pfs, 0, 0, 8, 0 ; \ 167 mov r31 = ar.k5 ; \ 168 mov r10 = b0 ;; } \ 169 { .mib ; \ 170 mov r8 = SYSCALLNUM(name) ; \ 171 mov b7 = r31 ; \ 172 br.call.sptk b0 = b7 ;; } 173 174 175 /* 176 * WEAK_ALIAS: create a weak alias (ELF only). 177 */ 178 #define WEAK_ALIAS(alias,sym) \ 179 .weak alias; \ 180 alias = sym 181 182 /* 183 * STRONG_ALIAS: create a strong alias. 184 */ 185 #define STRONG_ALIAS(alias,sym) \ 186 .globl alias; \ 187 alias = sym 188 189 /* 190 * WARN_REFERENCES: create a warning if the specified symbol is referenced. 191 */ 192 #ifdef __STDC__ 193 #define WARN_REFERENCES(sym,msg) \ 194 .pushsection .gnu.warning. ## sym; \ 195 .ascii msg; \ 196 .popsection 197 #else 198 #define WARN_REFERENCES(sym,msg) \ 199 .pushsection .gnu.warning./**/sym; \ 200 .ascii msg; \ 201 .popsection 202 #endif /* __STDC__ */ 203 204 205 #ifdef __ELF__ 206 #ifdef _NETBSD_REVISIONID 207 #define RCSID(x) .pushsection ".ident","MS",@progbits,1; \ 208 .asciz x; \ 209 .ascii "$"; .ascii "NetBSD: "; .ascii __FILE__; \ 210 .ascii " "; .ascii _NETBSD_REVISIONID; \ 211 .asciz " $"; \ 212 .popsection 213 #else 214 #define RCSID(x) .pushsection ".ident","MS",@progbits,1; \ 215 .asciz x; \ 216 .popsection 217 #endif 218 #else 219 #define RCSID(name) .asciz name 220 #endif 221 222 /* 223 * Kernel RCS ID tag and copyright macros 224 */ 225 226 #ifdef _KERNEL 227 228 #define __KERNEL_SECTIONSTRING(_sec, _str) \ 229 .pushsection _sec ; .asciz _str ; .popsection 230 231 #ifdef _NETBSD_REVISIONID 232 #define __KERNEL_RCSID(_n, _s) __KERNEL_SECTIONSTRING(.ident, \ 233 "$" "NetBSD: " __FILE__ " " \ 234 _NETBSD_REVISIONID " $") 235 #else 236 #define __KERNEL_RCSID(_n, _s) __KERNEL_SECTIONSTRING(.ident, _s) 237 #endif 238 #define __KERNEL_COPYRIGHT(_n, _s) __KERNEL_SECTIONSTRING(.copyright, _s) 239 240 #ifdef NO_KERNEL_RCSIDS 241 #undef __KERNEL_RCSID 242 #define __KERNEL_RCSID(_n, _s) /* nothing */ 243 #endif 244 245 #endif /* _KERNEL */ 246