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 https://opensource.org/licenses/CDDL-1.0.
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 _IA32_SYS_ASM_LINKAGE_H
28 #define _IA32_SYS_ASM_LINKAGE_H
29
30 #if defined(_KERNEL) && defined(__linux__)
31 #include <linux/linkage.h>
32 #endif
33
34 #ifndef ENDBR
35 #if defined(__ELF__) && defined(__CET__) && defined(__has_include)
36 /* CSTYLED */
37 #if __has_include(<cet.h>)
38
39 #include <cet.h>
40
41 #ifdef _CET_ENDBR
42 #define ENDBR _CET_ENDBR
43 #endif /* _CET_ENDBR */
44
45 #endif /* <cet.h> */
46 #endif /* __ELF__ && __CET__ && __has_include */
47 #endif /* !ENDBR */
48
49 #ifndef ENDBR
50 #define ENDBR
51 #endif
52 #ifndef RET
53 #define RET ret
54 #endif
55
56 /* You can set to nothing on Unix platforms */
57 #undef ASMABI
58 #define ASMABI __attribute__((sysv_abi))
59
60 #define SECTION_TEXT .text
61 #define SECTION_STATIC .section .rodata
62
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66
67 #ifdef _ASM /* The remainder of this file is only for assembly files */
68
69 /*
70 * make annoying differences in assembler syntax go away
71 */
72
73 /*
74 * D16 and A16 are used to insert instructions prefixes; the
75 * macros help the assembler code be slightly more portable.
76 */
77 #if !defined(__GNUC_AS__)
78 /*
79 * /usr/ccs/bin/as prefixes are parsed as separate instructions
80 */
81 #define D16 data16;
82 #define A16 addr16;
83
84 /*
85 * (There are some weird constructs in constant expressions)
86 */
87 #define _CONST(const) [const]
88 #define _BITNOT(const) -1!_CONST(const)
89 #define _MUL(a, b) _CONST(a \* b)
90
91 #else
92 /*
93 * Why not use the 'data16' and 'addr16' prefixes .. well, the
94 * assembler doesn't quite believe in real mode, and thus argues with
95 * us about what we're trying to do.
96 */
97 #define D16 .byte 0x66;
98 #define A16 .byte 0x67;
99
100 #define _CONST(const) (const)
101 #define _BITNOT(const) ~_CONST(const)
102 #define _MUL(a, b) _CONST(a * b)
103
104 #endif
105
106 /*
107 * C pointers are different sizes between i386 and amd64.
108 * These constants can be used to compute offsets into pointer arrays.
109 */
110 #if defined(__amd64)
111 #define CLONGSHIFT 3
112 #define CLONGSIZE 8
113 #define CLONGMASK 7
114 #elif defined(__i386)
115 #define CLONGSHIFT 2
116 #define CLONGSIZE 4
117 #define CLONGMASK 3
118 #endif
119
120 /*
121 * Since we know we're either ILP32 or LP64 ..
122 */
123 #define CPTRSHIFT CLONGSHIFT
124 #define CPTRSIZE CLONGSIZE
125 #define CPTRMASK CLONGMASK
126
127 #if CPTRSIZE != (1 << CPTRSHIFT) || CLONGSIZE != (1 << CLONGSHIFT)
128 #error "inconsistent shift constants"
129 #endif
130
131 #if CPTRMASK != (CPTRSIZE - 1) || CLONGMASK != (CLONGSIZE - 1)
132 #error "inconsistent mask constants"
133 #endif
134
135 #define ASM_ENTRY_ALIGN 16
136
137 /*
138 * SSE register alignment and save areas
139 */
140
141 #define XMM_SIZE 16
142 #define XMM_ALIGN 16
143
144 /*
145 * ENTRY provides the standard procedure entry code and an easy way to
146 * insert the calls to mcount for profiling. ENTRY_NP is identical, but
147 * never calls mcount.
148 */
149 #undef ENTRY
150 #define ENTRY(x) \
151 .text; \
152 .balign ASM_ENTRY_ALIGN; \
153 .globl x; \
154 .type x, @function; \
155 x: MCOUNT(x)
156
157 #define ENTRY_NP(x) \
158 .text; \
159 .balign ASM_ENTRY_ALIGN; \
160 .globl x; \
161 .type x, @function; \
162 x:
163
164 #define ENTRY_ALIGN(x, a) \
165 .text; \
166 .balign a; \
167 .globl x; \
168 .type x, @function; \
169 x:
170
171 #define FUNCTION(x) \
172 .type x, @function; \
173 x:
174
175 /*
176 * ENTRY2 is identical to ENTRY but provides two labels for the entry point.
177 */
178 #define ENTRY2(x, y) \
179 .text; \
180 .balign ASM_ENTRY_ALIGN; \
181 .globl x, y; \
182 .type x, @function; \
183 .type y, @function; \
184 x:; \
185 y: MCOUNT(x)
186
187 #define ENTRY_NP2(x, y) \
188 .text; \
189 .balign ASM_ENTRY_ALIGN; \
190 .globl x, y; \
191 .type x, @function; \
192 .type y, @function; \
193 x:; \
194 y:
195
196
197 /*
198 * SET_SIZE trails a function and set the size for the ELF symbol table.
199 */
200 #define SET_SIZE(x) \
201 .size x, [.-x]
202
203 #define SET_OBJ(x) .type x, @object
204
205 #endif /* _ASM */
206
207 #ifdef __cplusplus
208 }
209 #endif
210
211 #endif /* _IA32_SYS_ASM_LINKAGE_H */
Cache object: 4aa7817234e3e3c8316d8dfa2210317c
|