1/*	$NetBSD: asm.h,v 1.34 2020/04/17 14:19:43 joerg Exp $	*/
  2
  3/*-
  4 * Copyright (c) 1997 The NetBSD Foundation, Inc.
  5 * All rights reserved.
  6 *
  7 * This code is derived from software contributed to The NetBSD Foundation
  8 * by Jason R. Thorpe.
  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 *
 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 29 * POSSIBILITY OF SUCH DAMAGE.
 30 */
 31
 32/*
 33 * Copyright (c) 1994 Allen Briggs
 34 * All rights reserved.
 35 *
 36 * Gleaned from locore.s and sun3 asm.h which had the following copyrights:
 37 * locore.s:
 38 * Copyright (c) 1988 University of Utah.
 39 * Copyright (c) 1982, 1990 The Regents of the University of California.
 40 * sun3/include/asm.h:
 41 * Copyright (c) 1993 Adam Glass
 42 * Copyright (c) 1990 The Regents of the University of California.
 43 *
 44 * Redistribution and use in source and binary forms, with or without
 45 * modification, are permitted provided that the following conditions
 46 * are met:
 47 * 1. Redistributions of source code must retain the above copyright
 48 *    notice, this list of conditions and the following disclaimer.
 49 * 2. Redistributions in binary form must reproduce the above copyright
 50 *    notice, this list of conditions and the following disclaimer in the
 51 *    documentation and/or other materials provided with the distribution.
 52 * 3. All advertising materials mentioning features or use of this software
 53 *    must display the following acknowledgement:
 54 *	This product includes software developed by the University of
 55 *	California, Berkeley and its contributors.
 56 * 4. Neither the name of the University nor the names of its contributors
 57 *    may be used to endorse or promote products derived from this software
 58 *    without specific prior written permission.
 59 *
 60 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 61 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 62 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 63 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 64 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 65 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 66 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 67 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 68 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 69 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 70 * SUCH DAMAGE.
 71 */
 72
 73#ifndef _M68K_ASM_H_
 74#define _M68K_ASM_H_
 75
 76#define __IMMEDIATE		#
 77
 78#ifdef __PIC__
 79#define PIC_PLT(name)		name@PLTPC
 80#ifdef __mcoldfire__
 81#define LEA_LCL(name,reg) \
 82	movl	__IMMEDIATE name - .,reg ; \
 83	lea	(-6,%pc,reg),reg
 84#define GOT_SETUP(reg) \
 85	movl	__IMMEDIATE _GLOBAL_OFFSET_TABLE_@GOTPC,reg ; \
 86	lea	(-6,%pc,reg),reg
 87#else
 88#define LEA_LCL(name,reg)	lea	(name,%pc),reg
 89#define GOT_SETUP(reg)		lea	(_GLOBAL_OFFSET_TABLE_@GOTPC,%pc),reg
 90#endif
 91#else
 92#define PIC_PLT(name)		name
 93#define LEA_LCL(name,reg)	movl	__IMMEDIATE name,reg
 94#define GOT_SETUP(reg)		/* nothing */
 95#endif
 96
 97#if __STDC__
 98# define _C_LABEL(name)	name
 99#else
100# define _C_LABEL(name)	name
101#endif /* __STDC__ */
102
103#define	_ASM_LABEL(name)	name
104
105#define	_ENTRY(name) \
106	.text; .even; .globl name; .type name,@function; name:
107#define	END(name)	.size name,.-name
108
109#define	MCOUNT_ENTRY	__mcount
110
111#ifdef GPROF
112#define _PROF_PROLOG	link %a6,#0; jbsr MCOUNT_ENTRY; unlk %a6
113#else
114#define _PROF_PROLOG
115#endif
116
117#define ENTRY(name)		_ENTRY(_C_LABEL(name)) _PROF_PROLOG
118#define	ASENTRY(name)		_ENTRY(_ASM_LABEL(name)) _PROF_PROLOG
119
120#define	ENTRY_NOPROFILE(name)	_ENTRY(_C_LABEL(name))
121#define	ASENTRY_NOPROFILE(name)	_ENTRY(_ASM_LABEL(name))
122
123/*
124 * The m68k ALTENTRY macro is very different than the traditional
125 * implementation used by other NetBSD ports.  Usually ALTENTRY 
126 * simply provides an alternate function entry point.  The m68k
127 * definition takes a second argument and jumps inside the second
128 * function when profiling is enabled.
129 *
130 * The m68k behavior is similar to the ENTRY2 macro found in
131 * solaris' asm_linkage.h.
132 *
133 * Providing ENTRY2 and changing all the code that uses ALTENTRY
134 * to use it would be a desirable change.
135 */
136#ifdef PROF
137#define ALTENTRY(name, rname)	ENTRY(name); jra rname+12
138#else
139#define ALTENTRY(name, rname)	_ENTRY(_C_LABEL(name))
140#endif
141
142#define RCSID(x)	.pushsection ".ident","MS",@progbits,1;		\
143			.asciz x;					\
144			.popsection
145
146/*
147 * Global variables of whatever sort.
148 */
149#define	GLOBAL(x)					\
150		.globl	_C_LABEL(x)		;	\
151	_C_LABEL(x):
152
153#define	ASGLOBAL(x)					\
154		.globl	_ASM_LABEL(x)		;	\
155	_ASM_LABEL(x):
156
157/*
158 * ...and local variables.
159 */
160#define	LOCAL(x)					\
161	_C_LABEL(x):
162
163#define	ASLOCAL(x)					\
164	_ASM_LABEL(x):
165
166/*
167 * Items in the BSS segment.
168 */
169#define	BSS(name, size)					\
170	.comm	_C_LABEL(name),size
171
172#define	ASBSS(name, size)				\
173	.comm	_ASM_LABEL(name),size
174
175/*
176 * Need a better place for these but these are common across
177 * all m68k ports so let's define just once.
178 */
179#ifdef __mcoldfire__
180#define INTERRUPT_SAVEREG	lea -16(%sp),%sp; moveml #0xC0C0,(%sp)
181#define INTERRUPT_RESTOREREG	moveml (%sp),#0x0303; lea 16(%sp),%sp
182#else
183#define INTERRUPT_SAVEREG	moveml	#0xC0C0,-(%sp)
184#define INTERRUPT_RESTOREREG	moveml	(%sp)+,#0x0303
185#endif
186
187#ifdef _KERNEL
188/*
189 * Shorthand for calling panic().
190 * Note the side-effect: it uses up the 9: label, so be careful!
191 */
192#define	PANIC(x)					\
193		pea	9f			;	\
194		jbsr	_C_LABEL(panic)		;	\
195	9:	.asciz	x			;	\
196		.even
197
198/* 64-bit counter increments */
199#define CPUINFO_INCREMENT(n)					\
200	lea	_C_LABEL(cpu_info_store)+(n)+4,%a1;		\
201	addq.l	#1,(%a1);					\
202	clr.l	%d0;		/* doesn't change CCR[X] */	\
203	move.l	-(%a1),%d1;	/* doesn't change CCR[X] */	\
204	addx.l	%d0,%d1;					\
205	move.l	%d1,(%a1)
206
207/* 64-bit counter increments */
208#define CPUINFO_ADD(n, addend)					\
209	lea	_C_LABEL(cpu_info_store)+(n)+4,%a1;		\
210	add.l	addend,(%a1);					\
211	clr.l	%d0;		/* doesn't change CCR[X] */	\
212	move.l	-(%a1),%d1;	/* doesn't change CCR[X] */	\
213	addx.l	%d0,%d1;					\
214	move.l	%d1,(%a1)
215
216#endif /* _KERNEL */
217
218/*
219 * Shorthand for defining vectors for the vector table.
220 */
221#define	VECTOR(x)					\
222	.long	_C_LABEL(x)
223
224#define	ASVECTOR(x)					\
225	.long	_ASM_LABEL(x)
226
227#define	VECTOR_UNUSED					\
228	.long	0
229
230#define	WEAK_ALIAS(alias,sym)						\
231	.weak alias;							\
232	alias = sym
233
234/*
235 * STRONG_ALIAS: create a strong alias.
236 */
237#define STRONG_ALIAS(alias,sym)						\
238	.globl alias;							\
239	alias = sym
240
241#ifdef __STDC__
242#define	WARN_REFERENCES(sym,msg)					\
243	.pushsection .gnu.warning. ## sym;				\
244	.ascii msg;							\
245	.popsection
246#else
247#define	WARN_REFERENCES(sym,msg)					\
248	.pushsection .gnu.warning./**/sym;				\
249	.ascii msg;							\
250	.popsection
251#endif /* __STDC__ */
252
253/*
254 * Macros to hide shortcomings in the 68010.
255 */
256#ifdef __mc68010__
257#define	EXTBL(reg)					\
258	extw	reg		;			\
259	extl	reg
260#else	/* __mc68010__ */
261#define	EXTBL(reg)					\
262	extbl	reg
263#endif	/* __mc68010__ */
264
265#endif /* _M68K_ASM_H_ */