1/*-
2 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
3 * Copyright (C) 1995, 1996 TooLs GmbH.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *	This product includes software developed by TooLs GmbH.
17 * 4. The name of TooLs GmbH may not be used to endorse or promote products
18 *    derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 *	$NetBSD: asm.h,v 1.6.18.1 2000/07/25 08:37:14 kleink Exp $
32 * $FreeBSD$
33 */
34
35#ifndef _MACHINE_ASM_H_
36#define	_MACHINE_ASM_H_
37
38#include <sys/cdefs.h>
39
40#if defined(PIC) && !defined(__powerpc64__)
41#define	PIC_PROLOGUE	XXX
42#define	PIC_EPILOGUE	XXX
43#define	PIC_PLT(x)	x@plt
44#ifdef	__STDC__
45#define	PIC_GOT(x)	XXX
46#else	/* not __STDC__ */
47#define	PIC_GOT(x)	XXX
48#endif	/* __STDC__ */
49#else
50#define	PIC_PROLOGUE
51#define	PIC_EPILOGUE
52#define	PIC_PLT(x)	x
53#define PIC_GOT(x)	x
54#endif
55
56#define	CNAME(csym)		csym
57#define	ASMNAME(asmsym)		asmsym
58#ifdef __powerpc64__
59#define	HIDENAME(asmsym)	__CONCAT(_,asmsym)
60#else
61#define	HIDENAME(asmsym)	__CONCAT(.,asmsym)
62#endif
63
64#ifdef _KERNEL
65#define	DOT_LABEL(name)		__CONCAT(.,name)
66#define	TYPE_ENTRY(name)	.size	name,24; \
67				.type	DOT_LABEL(name),@function; \
68				.globl	DOT_LABEL(name);
69#define	END_SIZE(name)		.size	DOT_LABEL(name),.-DOT_LABEL(name);
70#else /* !_KERNEL */
71#define	DOT_LABEL(name)		__CONCAT(.L.,name)
72#define	TYPE_ENTRY(name)	.type	name,@function;
73#define	END_SIZE(name)		.size	name,.-DOT_LABEL(name);
74#endif /* _KERNEL */
75
76#define	_GLOBAL(name) \
77	.data; \
78	.p2align 2; \
79	.globl	name; \
80	name:
81
82#ifdef __powerpc64__
83#define	_ENTRY(name) \
84	.section ".text"; \
85	.p2align 2; \
86	.globl	name; \
87	.section ".opd","aw"; \
88	.p2align 3; \
89	name: \
90	.quad	DOT_LABEL(name),.TOC.@tocbase,0; \
91	.previous; \
92	.p2align 4; \
93	TYPE_ENTRY(name) \
94DOT_LABEL(name):
95
96#define	_END(name) \
97	.long	0; \
98	.byte	0,0,0,0,0,0,0,0; \
99	END_SIZE(name)
100#else /* !__powerpc64__ */
101#define	_ENTRY(name) \
102	.text; \
103	.p2align 4; \
104	.globl	name; \
105	.type	name,@function; \
106	name:
107#define	_END(name)
108#endif /* __powerpc64__ */
109
110#if defined(PROF) || (defined(_KERNEL) && defined(GPROF))
111# ifdef __powerpc64__
112#   define	_PROF_PROLOGUE	mflr 0;					\
113				std 3,48(1);				\
114				std 4,56(1);				\
115				std 5,64(1);				\
116				std 0,16(1);				\
117				stdu 1,-112(1);				\
118				bl _mcount;				\
119				nop;					\
120				ld 0,112+16(1);				\
121				ld 3,112+48(1);				\
122				ld 4,112+56(1);				\
123				ld 5,112+64(1);				\
124				mtlr 0;					\
125				addi 1,1,112
126# else
127#   define	_PROF_PROLOGUE	mflr 0; stw 0,4(1); bl _mcount
128# endif
129#else
130# define	_PROF_PROLOGUE
131#endif
132
133#define	ASENTRY(y)	_ENTRY(ASMNAME(y)); _PROF_PROLOGUE
134#define	END(y)		_END(CNAME(y))
135#define	ENTRY(y)	_ENTRY(CNAME(y)); _PROF_PROLOGUE
136#define	GLOBAL(y)	_GLOBAL(CNAME(y))
137
138#define	ASENTRY_NOPROF(y)	_ENTRY(ASMNAME(y))
139#define	ENTRY_NOPROF(y)		_ENTRY(CNAME(y))
140
141#define	ASMSTR		.asciz
142
143#define	RCSID(x)	.text; .asciz x
144
145#undef __FBSDID
146#if !defined(lint) && !defined(STRIP_FBSDID)
147#define __FBSDID(s)	.ident s
148#else
149#define __FBSDID(s)	/* nothing */
150#endif /* not lint and not STRIP_FBSDID */
151
152#define	WEAK_REFERENCE(sym, alias)				\
153	.weak alias;						\
154	.equ alias,sym
155
156#ifdef __STDC__
157#define	WARN_REFERENCES(_sym,_msg)				\
158	.section .gnu.warning. ## _sym ; .ascii _msg ; .text
159#else
160#define	WARN_REFERENCES(_sym,_msg)				\
161	.section .gnu.warning./**/_sym ; .ascii _msg ; .text
162#endif /* __STDC__ */
163
164#endif /* !_MACHINE_ASM_H_ */
165