root / lab4 / .minix-src / include / i386 / asm.h @ 13
History | View | Annotate | Download (5.87 KB)
1 |
/* $NetBSD: asm.h,v 1.41 2013/09/12 15:36:17 joerg Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1990 The Regents of the University of California.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to Berkeley by
|
8 |
* William Jolitz.
|
9 |
*
|
10 |
* Redistribution and use in source and binary forms, with or without
|
11 |
* modification, are permitted provided that the following conditions
|
12 |
* are met:
|
13 |
* 1. Redistributions of source code must retain the above copyright
|
14 |
* notice, this list of conditions and the following disclaimer.
|
15 |
* 2. Redistributions in binary form must reproduce the above copyright
|
16 |
* notice, this list of conditions and the following disclaimer in the
|
17 |
* documentation and/or other materials provided with the distribution.
|
18 |
* 3. Neither the name of the University nor the names of its contributors
|
19 |
* may be used to endorse or promote products derived from this software
|
20 |
* without specific prior written permission.
|
21 |
*
|
22 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
23 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
25 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
26 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
27 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
28 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
29 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
30 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
31 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
32 |
* SUCH DAMAGE.
|
33 |
*
|
34 |
* @(#)asm.h 5.5 (Berkeley) 5/7/91
|
35 |
*/
|
36 |
|
37 |
#ifndef _I386_ASM_H_
|
38 |
#define _I386_ASM_H_
|
39 |
|
40 |
#ifdef _KERNEL_OPT
|
41 |
#include "opt_multiprocessor.h" |
42 |
#endif
|
43 |
|
44 |
#ifdef __PIC__
|
45 |
#define PIC_PROLOGUE \
|
46 |
pushl %ebx; \ |
47 |
call 1f; \
|
48 |
1: \
|
49 |
popl %ebx; \ |
50 |
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
|
51 |
#define PIC_EPILOGUE \
|
52 |
popl %ebx |
53 |
#define PIC_PLT(x) x@PLT |
54 |
#define PIC_GOT(x) x@GOT(%ebx) |
55 |
#define PIC_GOTOFF(x) x@GOTOFF(%ebx) |
56 |
#else
|
57 |
#define PIC_PROLOGUE
|
58 |
#define PIC_EPILOGUE
|
59 |
#define PIC_PLT(x) x
|
60 |
#define PIC_GOT(x) x
|
61 |
#define PIC_GOTOFF(x) x
|
62 |
#endif
|
63 |
|
64 |
#ifdef __ELF__
|
65 |
# define _C_LABEL(x) x
|
66 |
#else
|
67 |
# ifdef __STDC__
|
68 |
# define _C_LABEL(x) _ ## x |
69 |
# else
|
70 |
# define _C_LABEL(x) _/**/x |
71 |
# endif
|
72 |
#endif
|
73 |
#define _ASM_LABEL(x) x
|
74 |
|
75 |
#define CVAROFF(x, y) _C_LABEL(x) + y
|
76 |
|
77 |
#ifdef __STDC__
|
78 |
# define __CONCAT(x,y) x ## y |
79 |
# define __STRING(x) #x |
80 |
#else
|
81 |
# define __CONCAT(x,y) x/**/y |
82 |
# define __STRING(x) "x" |
83 |
#endif
|
84 |
|
85 |
/* let kernels and others override entrypoint alignment */
|
86 |
#if !defined(_ALIGN_TEXT) && !defined(_KERNEL)
|
87 |
# ifdef _STANDALONE
|
88 |
# define _ALIGN_TEXT .align 1 |
89 |
# elif defined __ELF__
|
90 |
# define _ALIGN_TEXT .align 16 |
91 |
# else
|
92 |
# define _ALIGN_TEXT .align 4 |
93 |
# endif
|
94 |
#endif
|
95 |
|
96 |
#define _ENTRY(x) \
|
97 |
.text; _ALIGN_TEXT; .globl x; .type x,@function; x:
|
98 |
#define _LABEL(x) \
|
99 |
.globl x; x: |
100 |
|
101 |
#ifdef _KERNEL
|
102 |
|
103 |
#define CPUVAR(off) %fs:__CONCAT(CPU_INFO_,off)
|
104 |
|
105 |
/* XXX Can't use __CONCAT() here, as it would be evaluated incorrectly. */
|
106 |
#ifdef __ELF__
|
107 |
#ifdef __STDC__
|
108 |
#define IDTVEC(name) \
|
109 |
ALIGN_TEXT; .globl X ## name; .type X ## name,@function; X ## name: |
110 |
#define IDTVEC_END(name) \
|
111 |
.size X ## name, . - X ## name |
112 |
#else
|
113 |
#define IDTVEC(name) \
|
114 |
ALIGN_TEXT; .globl X/**/name; .type X/**/name,@function; X/**/name: |
115 |
#define IDTVEC_END(name) \
|
116 |
.size X/**/name, . - X/**/name |
117 |
#endif /* __STDC__ */ |
118 |
#else
|
119 |
#ifdef __STDC__
|
120 |
#define IDTVEC(name) \
|
121 |
ALIGN_TEXT; .globl _X ## name; .type _X ## name,@function; _X ## name: |
122 |
#define IDTVEC_END(name) \
|
123 |
.size _X ## name, . - _X ## name |
124 |
#else
|
125 |
#define IDTVEC(name) \
|
126 |
ALIGN_TEXT; .globl _X/**/name; .type _X/**/name,@function; _X/**/name: |
127 |
#define IDTVEC_END(name) \
|
128 |
.size _X/**/name, . - _X/**/name |
129 |
#endif /* __STDC__ */ |
130 |
#endif /* __ELF__ */ |
131 |
|
132 |
#ifdef _STANDALONE
|
133 |
#define ALIGN_DATA .align 4 |
134 |
#define ALIGN_TEXT .align 4 /* 4-byte boundaries */ |
135 |
#define SUPERALIGN_TEXT .align 16 /* 15-byte boundaries */ |
136 |
#elif defined __ELF__
|
137 |
#define ALIGN_DATA .align 4 |
138 |
#define ALIGN_TEXT .align 16 /* 16-byte boundaries */ |
139 |
#define SUPERALIGN_TEXT .align 16 /* 16-byte boundaries */ |
140 |
#else
|
141 |
#define ALIGN_DATA .align 2 |
142 |
#define ALIGN_TEXT .align 4 /* 16-byte boundaries */ |
143 |
#define SUPERALIGN_TEXT .align 4 /* 16-byte boundaries */ |
144 |
#endif /* __ELF__ */ |
145 |
|
146 |
#define _ALIGN_TEXT ALIGN_TEXT
|
147 |
|
148 |
#ifdef GPROF
|
149 |
#ifdef __ELF__
|
150 |
#define MCOUNT_ASM call _C_LABEL(__mcount)
|
151 |
#else /* __ELF__ */ |
152 |
#define MCOUNT_ASM call _C_LABEL(mcount)
|
153 |
#endif /* __ELF__ */ |
154 |
#else /* GPROF */ |
155 |
#define MCOUNT_ASM /* nothing */ |
156 |
#endif /* GPROF */ |
157 |
|
158 |
#endif /* _KERNEL */ |
159 |
|
160 |
|
161 |
|
162 |
#ifdef GPROF
|
163 |
# ifdef __ELF__
|
164 |
# define _PROF_PROLOGUE \
|
165 |
pushl %ebp; movl %esp,%ebp; call PIC_PLT(__mcount); popl %ebp |
166 |
# else
|
167 |
# define _PROF_PROLOGUE \
|
168 |
pushl %ebp; movl %esp,%ebp; call PIC_PLT(mcount); popl %ebp |
169 |
# endif
|
170 |
#else
|
171 |
# define _PROF_PROLOGUE
|
172 |
#endif
|
173 |
|
174 |
#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
|
175 |
#define NENTRY(y) _ENTRY(_C_LABEL(y))
|
176 |
#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
|
177 |
#define LABEL(y) _LABEL(_C_LABEL(y))
|
178 |
#define END(y) .size y, . - y
|
179 |
|
180 |
#define ASMSTR .asciz
|
181 |
|
182 |
#ifdef __ELF__
|
183 |
#define RCSID(x) .pushsection ".ident"; .asciz x; .popsection |
184 |
#else
|
185 |
#define RCSID(x) .text; .asciz x
|
186 |
#endif
|
187 |
|
188 |
#ifdef NO_KERNEL_RCSIDS
|
189 |
#define __KERNEL_RCSID(_n, _s) /* nothing */ |
190 |
#else
|
191 |
#define __KERNEL_RCSID(_n, _s) RCSID(_s)
|
192 |
#endif
|
193 |
|
194 |
#ifdef __ELF__
|
195 |
#define WEAK_ALIAS(alias,sym) \
|
196 |
.weak alias; \ |
197 |
alias = sym |
198 |
#endif
|
199 |
/*
|
200 |
* STRONG_ALIAS: create a strong alias.
|
201 |
*/
|
202 |
#define STRONG_ALIAS(alias,sym) \
|
203 |
.globl alias; \ |
204 |
alias = sym |
205 |
|
206 |
#ifdef __STDC__
|
207 |
#define WARN_REFERENCES(sym,msg) \
|
208 |
.pushsection .gnu.warning. ## sym; \ |
209 |
.ascii msg; \ |
210 |
.popsection |
211 |
#else
|
212 |
#define WARN_REFERENCES(sym,msg) \
|
213 |
.pushsection .gnu.warning./**/sym; \
|
214 |
.ascii msg; \ |
215 |
.popsection |
216 |
#endif /* __STDC__ */ |
217 |
|
218 |
#if defined(__minix)
|
219 |
#define IMPORT(sym) \
|
220 |
.extern _C_LABEL(sym)
|
221 |
#endif /* defined(__minix) */ |
222 |
|
223 |
#endif /* !_I386_ASM_H_ */ |