xref: /openbsd-src/lib/libc/arch/i386/DEFS.h (revision 5bcead818ba71dc1c4fad02a24986a5b47ae1c58)
1*5bcead81Skettenis /*	$OpenBSD: DEFS.h,v 1.5 2023/12/11 22:24:15 kettenis Exp $ */
2ea6088e7Sguenther /*
3ea6088e7Sguenther  * Copyright (c) 2017 Philip Guenther <guenther@openbsd.org>
4ea6088e7Sguenther  *
5ea6088e7Sguenther  * Permission to use, copy, modify, and distribute this software for any
6ea6088e7Sguenther  * purpose with or without fee is hereby granted, provided that the above
7ea6088e7Sguenther  * copyright notice and this permission notice appear in all copies.
8ea6088e7Sguenther  *
9ea6088e7Sguenther  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10ea6088e7Sguenther  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11ea6088e7Sguenther  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12ea6088e7Sguenther  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13ea6088e7Sguenther  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14ea6088e7Sguenther  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15ea6088e7Sguenther  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16ea6088e7Sguenther  */
17df930be7Sderaadt 
18df930be7Sderaadt #include <machine/asm.h>
19ea6088e7Sguenther 
20ea6088e7Sguenther /*
21ea6088e7Sguenther  * We define a hidden alias with the prefix "_libc_" for each global symbol
22ea6088e7Sguenther  * that may be used internally.  By referencing _libc_x instead of x, other
23ea6088e7Sguenther  * parts of libc prevent overriding by the application and avoid unnecessary
24ea6088e7Sguenther  * relocations.
25ea6088e7Sguenther  */
26ea6088e7Sguenther #define _HIDDEN(x)		_libc_##x
27ea6088e7Sguenther #define _HIDDEN_ALIAS(x,y)			\
28ea6088e7Sguenther 	STRONG_ALIAS(_HIDDEN(x),y);		\
29ea6088e7Sguenther 	.hidden _HIDDEN(x)
30ea6088e7Sguenther #define _HIDDEN_FALIAS(x,y)			\
31ea6088e7Sguenther 	_HIDDEN_ALIAS(x,y);			\
32ea6088e7Sguenther 	.type _HIDDEN(x),@function
33ea6088e7Sguenther 
34ea6088e7Sguenther /*
35ea6088e7Sguenther  * For functions implemented in ASM that aren't syscalls.
36ea6088e7Sguenther  *   END_STRONG(x)	Like DEF_STRONG() in C; for standard/reserved C names
37ea6088e7Sguenther  *   END_WEAK(x)	Like DEF_WEAK() in C; for non-ISO C names
38ea6088e7Sguenther  *   END_BUILTIN(x)	If compiling with clang, then just END() and
39ea6088e7Sguenther  *			mark it .protected, else be like END_STRONG();
40ea6088e7Sguenther  *			for clang builtins like memcpy
41ea6088e7Sguenther  */
42ea6088e7Sguenther #define	END_STRONG(x)	END(x); _HIDDEN_FALIAS(x,x); END(_HIDDEN(x))
43ea6088e7Sguenther #define	END_WEAK(x)	END_STRONG(x); .weak x
44ea6088e7Sguenther 
45ea6088e7Sguenther #ifdef __clang__
46ea6088e7Sguenther #define	END_BUILTIN(x)	END(x); .protected x
47ea6088e7Sguenther #else
48ea6088e7Sguenther #define	END_BUILTIN(x)	END_STRONG(x)
49ea6088e7Sguenther #endif
5083762a71Sderaadt 
5183762a71Sderaadt #define PINSYSCALL(sysno, label)					\
5283762a71Sderaadt 	.pushsection .openbsd.syscalls,"",@progbits;			\
53*5bcead81Skettenis 	.p2align 2;							\
5483762a71Sderaadt 	.long label;							\
5583762a71Sderaadt 	.long sysno;							\
5683762a71Sderaadt 	.popsection;
57