Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #ifndef _SYS_ASM_LINKAGE_H
     28 #define	_SYS_ASM_LINKAGE_H
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 #include <sys/stack.h>
     33 #include <sys/trap.h>
     34 
     35 #ifdef	__cplusplus
     36 extern "C" {
     37 #endif
     38 
     39 #ifdef _ASM	/* The remainder of this file is only for assembly files */
     40 
     41 /*
     42  * C pointers are different sizes between V8 and V9.
     43  * These constants can be used to compute offsets into pointer arrays.
     44  */
     45 #ifdef __sparcv9
     46 #define	CPTRSHIFT	3
     47 #define	CLONGSHIFT	3
     48 #else
     49 #define	CPTRSHIFT	2
     50 #define	CLONGSHIFT	2
     51 #endif
     52 #define	CPTRSIZE	(1<<CPTRSHIFT)
     53 #define	CLONGSIZE	(1<<CLONGSHIFT)
     54 #define	CPTRMASK	(CPTRSIZE - 1)
     55 #define	CLONGMASK	(CLONGSIZE - 1)
     56 
     57 /*
     58  * Symbolic section definitions.
     59  */
     60 #define	RODATA	".rodata"
     61 
     62 /*
     63  * profiling causes defintions of the MCOUNT and RTMCOUNT
     64  * particular to the type
     65  */
     66 #ifdef GPROF
     67 
     68 #define	MCOUNT_SIZE	(4*4)	/* 4 instructions */
     69 #define	MCOUNT(x) \
     70 	save	%sp, -SA(MINFRAME), %sp; \
     71 	call	_mcount; \
     72 	nop; \
     73 	restore;
     74 
     75 #endif /* GPROF */
     76 
     77 #ifdef PROF
     78 
     79 #if defined(__sparcv9)
     80 
     81 #define	MCOUNT_SIZE	(9*4)	/* 9 instructions */
     82 #define	MCOUNT(x) \
     83 	save	%sp, -SA(MINFRAME), %sp; \
     84 /* CSTYLED */ \
     85 	sethi	%hh(.L_/**/x/**/1), %o0; \
     86 /* CSTYLED */ \
     87 	sethi	%lm(.L_/**/x/**/1), %o1; \
     88 /* CSTYLED */ \
     89 	or	%o0, %hm(.L_/**/x/**/1), %o0; \
     90 /* CSTYLED */ \
     91 	or	%o1, %lo(.L_/**/x/**/1), %o1; \
     92 	sllx	%o0, 32, %o0; \
     93 	call	_mcount; \
     94 	or	%o0, %o1, %o0; \
     95 	restore; \
     96 /* CSTYLED */ \
     97 	.common .L_/**/x/**/1, 8, 8
     98 
     99 #else	/* __sparcv9 */
    100 
    101 #define	MCOUNT_SIZE	(5*4)	/* 5 instructions */
    102 #define	MCOUNT(x) \
    103 	save	%sp, -SA(MINFRAME), %sp; \
    104 /* CSTYLED */ \
    105 	sethi	%hi(.L_/**/x/**/1), %o0; \
    106 	call	_mcount; \
    107 /* CSTYLED */ \
    108 	or	%o0, %lo(.L_/**/x/**/1), %o0; \
    109 	restore; \
    110 /* CSTYLED */ \
    111 	.common .L_/**/x/**/1, 4, 4
    112 
    113 #endif	/* __sparcv9 */
    114 
    115 #endif /* PROF */
    116 
    117 /*
    118  * if we are not profiling, MCOUNT should be defined to nothing
    119  */
    120 #if !defined(PROF) && !defined(GPROF)
    121 #define	MCOUNT_SIZE	0	/* no instructions inserted */
    122 #define	MCOUNT(x)
    123 #endif /* !defined(PROF) && !defined(GPROF) */
    124 
    125 #define	RTMCOUNT(x)	MCOUNT(x)
    126 
    127 /*
    128  * Macro to define weak symbol aliases. These are similar to the ANSI-C
    129  *	#pragma weak _name = name
    130  * except a compiler can determine type. The assembler must be told. Hence,
    131  * the second parameter must be the type of the symbol (i.e.: function,...)
    132  */
    133 #define	ANSI_PRAGMA_WEAK(sym, stype)	\
    134 /* CSTYLED */ \
    135 	.weak	_/**/sym; \
    136 /* CSTYLED */ \
    137 	.type	_/**/sym, #stype; \
    138 /* CSTYLED */ \
    139 _/**/sym = sym
    140 
    141 /*
    142  * Like ANSI_PRAGMA_WEAK(), but for unrelated names, as in:
    143  *	#pragma weak sym1 = sym2
    144  */
    145 #define	ANSI_PRAGMA_WEAK2(sym1, sym2, stype)	\
    146 	.weak	sym1; \
    147 	.type sym1, #stype; \
    148 sym1	= sym2
    149 
    150 /*
    151  * ENTRY provides the standard procedure entry code and an easy way to
    152  * insert the calls to mcount for profiling. ENTRY_NP is identical, but
    153  * never calls mcount.
    154  */
    155 #define	ENTRY(x) \
    156 	.section	".text"; \
    157 	.align	4; \
    158 	.global	x; \
    159 	.type	x, #function; \
    160 x:	MCOUNT(x)
    161 
    162 #define	ENTRY_SIZE	MCOUNT_SIZE
    163 
    164 #define	ENTRY_NP(x) \
    165 	.section	".text"; \
    166 	.align	4; \
    167 	.global	x; \
    168 	.type	x, #function; \
    169 x:
    170 
    171 #define	RTENTRY(x) \
    172 	.section	".text"; \
    173 	.align	4; \
    174 	.global	x; \
    175 	.type	x, #function; \
    176 x:	RTMCOUNT(x)
    177 
    178 /*
    179  * ENTRY2 is identical to ENTRY but provides two labels for the entry point.
    180  */
    181 #define	ENTRY2(x, y) \
    182 	.section	".text"; \
    183 	.align	4; \
    184 	.global	x, y; \
    185 	.type	x, #function; \
    186 	.type	y, #function; \
    187 /* CSTYLED */ \
    188 x:	; \
    189 y:	MCOUNT(x)
    190 
    191 #define	ENTRY_NP2(x, y) \
    192 	.section	".text"; \
    193 	.align	4; \
    194 	.global	x, y; \
    195 	.type	x, #function; \
    196 	.type	y, #function; \
    197 /* CSTYLED */ \
    198 x:	; \
    199 y:
    200 
    201 
    202 /*
    203  * ALTENTRY provides for additional entry points.
    204  */
    205 #define	ALTENTRY(x) \
    206 	.global x; \
    207 	.type	x, #function; \
    208 x:
    209 
    210 /*
    211  * DGDEF and DGDEF2 provide global data declarations.
    212  *
    213  * DGDEF provides a word aligned word of storage.
    214  *
    215  * DGDEF2 allocates "sz" bytes of storage with **NO** alignment.  This
    216  * implies this macro is best used for byte arrays.
    217  *
    218  * DGDEF3 allocates "sz" bytes of storage with "algn" alignment.
    219  */
    220 #define	DGDEF2(name, sz) \
    221 	.section	".data"; \
    222 	.global name; \
    223 	.type	name, #object; \
    224 	.size	name, sz; \
    225 name:
    226 
    227 #define	DGDEF3(name, sz, algn) \
    228 	.section	".data"; \
    229 	.align	algn; \
    230 	.global name; \
    231 	.type	name, #object; \
    232 	.size	name, sz; \
    233 name:
    234 
    235 #define	DGDEF(name)	DGDEF3(name, 4, 4)
    236 
    237 /*
    238  * SET_SIZE trails a function and set the size for the ELF symbol table.
    239  */
    240 #define	SET_SIZE(x) \
    241 	.size	x, (.-x)
    242 
    243 #endif /* _ASM */
    244 
    245 #ifdef	__cplusplus
    246 }
    247 #endif
    248 
    249 #endif	/* _SYS_ASM_LINKAGE_H */
    250