V9/sys/sun3/asm_linkage.h

Compare this file to the similar file:
Show the results in this format:

/*	@(#)asm_linkage.h 1.1 86/02/03 SMI	*/

/*
 * Copyright (c) 1985 by Sun Microsystems, Inc.
 */

/*
 * Entry macros for assembler subroutines.
 */
#define	IDENTITY(x) x
#define	NAME(x) IDENTITY(_)x

#ifdef GPROF
#define ENTRY(x)  \
	.globl	NAME(x); \
NAME(x): \
	link a6,#0; \
	movl #1f,a0; \
	jbsr mcount; \
	unlk a6; \
	.bss; \
	.even; \
1:	.skip 4; \
	.text

#define ENTRY2(x,y)  \
	.globl	NAME(x), NAME(y); \
NAME(x): ; \
NAME(y):   \
	link a6,#0; \
	movl #1f,a0; \
	jbsr mcount; \
	unlk a6; \
	.bss; \
	.even; \
1:	.skip 4; \
	.text

/*
 * CCENTRY is for cc known subroutines like ldivt which
 * know and use a0, a1, d0 and d1.  This means we have to
 * save them.
 */
#define CCENTRY(x)  \
	.globl	x; \
x: \
	link a6,#-16; \
	moveml #0x0303,sp@; \
	movl #1f,a0; \
	jbsr mcount; \
	moveml sp@,#0x0303; \
	unlk a6; \
	.bss; \
	.even; \
1:	.skip 4; \
	.text
#else GPROF
#define ENTRY(x)  \
	.globl	NAME(x); \
NAME(x):

#define ENTRY2(x,y)  \
	.globl	NAME(x), NAME(y); \
NAME(x): \
NAME(y):

#define CCENTRY(x)  \
	.globl	x; \
x:
#endif GPROF

/*
 * Macro for autovectored interrupts.
 */
#define IOINTR(LEVEL) \
	moveml	#0xE0E0,sp@-	/* save regs we trash <d0,d1,d2,a0,a1,a2> */;\
	movl	sp,d2		/* save copy of previous sp */;\
	cmpl	#eintstack,sp	/* on interrupt stack? */;\
	jls	1f		/* yes, skip */;\
	lea	eintstack,sp	/* no, switch to interrupt stack */;\
1:	movl	#_level/**/LEVEL/**/_vector,a2	/* get vector ptr */;\
2:	movl	a2@+,a1		/* get routine address */;\
	jsr	a1@		/* go there */;\
	tstl	d0		/* success? */;\
	beqs	2b		/* no, try next one */;\
	movl	d2,sp		/* restore stack pointer */;\
	cmpl	#0x80000000,d0	/* spurious? */;\
	jeq	rei_iop		/* yes */;\
	clrl	_level/**/LEVEL/**/_spurious	/* no, clr spurious cnt */;\
	jra	rei_iop

/*
 * Macro for vectored interrupts.
 */
#define VECINTR(ifunc, cfunc, carg) \
	.globl	ifunc;\
ifunc:;\
	moveml	#0xE0C0,sp@-	/* save regs we trash <d0,d1,d2,a0,a1> */;\
	movl	sp,d2		/* save copy of previous sp */;\
	cmpl	#eintstack,sp	/* on interrupt stack? */;\
	jls	1f		/* yes, skip */;\
	lea	eintstack,sp	/* no, switch to interrupt stack */;\
1:	movl	carg,sp@-	/* push arg to interrupt routine */;\
	jsr	cfunc		/* go to it */;\
	movl	d2,sp		/* restore stack pointer */;\
        moveml  sp@+,#0x0307    /* restore saved registers <a1,a0,d2,d1,d0> */;\
	jra	rei_io