|  | @@ -1,408 +0,0 @@
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * This file contains Original Code and/or Modifications of Original Code
 | 
	
		
			
				|  |  | - * as defined in and that are subject to the Apple Public Source License
 | 
	
		
			
				|  |  | - * Version 2.0 (the 'License'). You may not use this file except in
 | 
	
		
			
				|  |  | - * compliance with the License. The rights granted to you under the License
 | 
	
		
			
				|  |  | - * may not be used to create, or enable the creation or redistribution of,
 | 
	
		
			
				|  |  | - * unlawful or unlicensed copies of an Apple operating system, or to
 | 
	
		
			
				|  |  | - * circumvent, violate, or enable the circumvention or violation of, any
 | 
	
		
			
				|  |  | - * terms of an Apple operating system software license agreement.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Please obtain a copy of the License at
 | 
	
		
			
				|  |  | - * http://www.opensource.apple.com/apsl/ and read it before using this file.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * The Original Code and all software distributed under the License are
 | 
	
		
			
				|  |  | - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 | 
	
		
			
				|  |  | - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 | 
	
		
			
				|  |  | - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 | 
	
		
			
				|  |  | - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 | 
	
		
			
				|  |  | - * Please see the License for the specific language governing rights and
 | 
	
		
			
				|  |  | - * limitations under the License.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * @OSF_COPYRIGHT@
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * Mach Operating System
 | 
	
		
			
				|  |  | - * Copyright (c) 1991,1990,1989 Carnegie Mellon University
 | 
	
		
			
				|  |  | - * All Rights Reserved.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Permission to use, copy, modify and distribute this software and its
 | 
	
		
			
				|  |  | - * documentation is hereby granted, provided that both the copyright
 | 
	
		
			
				|  |  | - * notice and this permission notice appear in all copies of the
 | 
	
		
			
				|  |  | - * software, derivative works or modified versions, and any portions
 | 
	
		
			
				|  |  | - * thereof, and that both notices appear in supporting documentation.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 | 
	
		
			
				|  |  | - * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 | 
	
		
			
				|  |  | - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Carnegie Mellon requests users of this software to return to
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 | 
	
		
			
				|  |  | - *  School of Computer Science
 | 
	
		
			
				|  |  | - *  Carnegie Mellon University
 | 
	
		
			
				|  |  | - *  Pittsburgh PA 15213-3890
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * any improvements or extensions that they make and grant Carnegie Mellon
 | 
	
		
			
				|  |  | - * the rights to redistribute these changes.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifndef	_I386_ASM_H_
 | 
	
		
			
				|  |  | -#define	_I386_ASM_H_
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifdef _KERNEL
 | 
	
		
			
				|  |  | -#include <gprof.h>
 | 
	
		
			
				|  |  | -#endif	/* _KERNEL */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifdef MACH_KERNEL
 | 
	
		
			
				|  |  | -#include <mach_kdb.h>
 | 
	
		
			
				|  |  | -#else	/* !MACH_KERNEL */
 | 
	
		
			
				|  |  | -#define	MACH_KDB 0
 | 
	
		
			
				|  |  | -#endif	/* !MACH_KERNEL */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#if	defined(MACH_KERNEL) || defined(_KERNEL)
 | 
	
		
			
				|  |  | -#include <gprof.h>
 | 
	
		
			
				|  |  | -#endif	/* MACH_KERNEL || _KERNEL */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#if defined(__i386__)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define S_PC	 (%esp)
 | 
	
		
			
				|  |  | -#define S_ARG0	 4(%esp)
 | 
	
		
			
				|  |  | -#define S_ARG1	 8(%esp)
 | 
	
		
			
				|  |  | -#define S_ARG2	12(%esp)
 | 
	
		
			
				|  |  | -#define S_ARG3	16(%esp)
 | 
	
		
			
				|  |  | -#define S_ARG4	20(%esp)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define FRAME	pushl %ebp; movl %esp, %ebp
 | 
	
		
			
				|  |  | -#define EMARF	leave
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define B_LINK	 (%ebp)
 | 
	
		
			
				|  |  | -#define B_PC	 4(%ebp)
 | 
	
		
			
				|  |  | -#define B_ARG0	 8(%ebp)
 | 
	
		
			
				|  |  | -#define B_ARG1	12(%ebp)
 | 
	
		
			
				|  |  | -#define B_ARG2	16(%ebp)
 | 
	
		
			
				|  |  | -#define B_ARG3	20(%ebp)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#elif defined(__x86_64__)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define S_PC	 (%rsp)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define FRAME	pushq %rbp; movq %rsp, %rbp
 | 
	
		
			
				|  |  | -#define EMARF	leave
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define B_LINK	 (%rbp)
 | 
	
		
			
				|  |  | -#define B_PC	 8(%rbp)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#error unsupported architecture
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* There is another definition of ALIGN for .c sources */
 | 
	
		
			
				|  |  | -#ifdef ASSEMBLER
 | 
	
		
			
				|  |  | -#define ALIGN 4,0x90
 | 
	
		
			
				|  |  | -#endif /* ASSEMBLER */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifndef FALIGN
 | 
	
		
			
				|  |  | -#define FALIGN ALIGN
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define LB(x,n) n
 | 
	
		
			
				|  |  | -#if	__STDC__
 | 
	
		
			
				|  |  | -#ifndef __NO_UNDERSCORES__
 | 
	
		
			
				|  |  | -#define	LCL(x)	L ## x
 | 
	
		
			
				|  |  | -#define EXT(x) _ ## x
 | 
	
		
			
				|  |  | -#define LEXT(x) _ ## x ## :
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#define	LCL(x)	.L ## x
 | 
	
		
			
				|  |  | -#define EXT(x) x
 | 
	
		
			
				|  |  | -#define LEXT(x) x ## :
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -#define LBc(x,n) n ## :
 | 
	
		
			
				|  |  | -#define LBb(x,n) n ## b
 | 
	
		
			
				|  |  | -#define LBf(x,n) n ## f
 | 
	
		
			
				|  |  | -#else /* __STDC__ */
 | 
	
		
			
				|  |  | -#ifndef __NO_UNDERSCORES__
 | 
	
		
			
				|  |  | -#define LCL(x) L/**/x
 | 
	
		
			
				|  |  | -#define EXT(x) _/**/x
 | 
	
		
			
				|  |  | -#define LEXT(x) _/**/x/**/:
 | 
	
		
			
				|  |  | -#else /* __NO_UNDERSCORES__ */
 | 
	
		
			
				|  |  | -#define	LCL(x)	.L/**/x
 | 
	
		
			
				|  |  | -#define EXT(x) x
 | 
	
		
			
				|  |  | -#define LEXT(x) x/**/:
 | 
	
		
			
				|  |  | -#endif /* __NO_UNDERSCORES__ */
 | 
	
		
			
				|  |  | -#define LBc(x,n) n/**/:
 | 
	
		
			
				|  |  | -#define LBb(x,n) n/**/b
 | 
	
		
			
				|  |  | -#define LBf(x,n) n/**/f
 | 
	
		
			
				|  |  | -#endif /* __STDC__ */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define SVC .byte 0x9a; .long 0; .word 0x7
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define RPC_SVC .byte 0x9a; .long 0; .word 0xf
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define String	.asciz
 | 
	
		
			
				|  |  | -#define Value	.word
 | 
	
		
			
				|  |  | -#define Times(a,b) (a*b)
 | 
	
		
			
				|  |  | -#define Divide(a,b) (a/b)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define INB	inb	%dx, %al
 | 
	
		
			
				|  |  | -#define OUTB	outb	%al, %dx
 | 
	
		
			
				|  |  | -#define INL	inl	%dx, %eax
 | 
	
		
			
				|  |  | -#define OUTL	outl	%eax, %dx
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define data16	.byte 0x66
 | 
	
		
			
				|  |  | -#define addr16	.byte 0x67
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#if !GPROF
 | 
	
		
			
				|  |  | -#define MCOUNT
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#elif defined(__SHARED__)
 | 
	
		
			
				|  |  | -#define MCOUNT		; .data;\
 | 
	
		
			
				|  |  | -            .align ALIGN;\
 | 
	
		
			
				|  |  | -            LBc(x, 8) .long 0;\
 | 
	
		
			
				|  |  | -            .text;\
 | 
	
		
			
				|  |  | -            Gpush;\
 | 
	
		
			
				|  |  | -            Gload;\
 | 
	
		
			
				|  |  | -            leal Gotoff(LBb(x,8)),%edx;\
 | 
	
		
			
				|  |  | -            Egaddr(%eax,_mcount_ptr);\
 | 
	
		
			
				|  |  | -            Gpop;\
 | 
	
		
			
				|  |  | -            call *(%eax);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else	/* !GPROF, !__SHARED__ */
 | 
	
		
			
				|  |  | -#define MCOUNT		; call mcount;
 | 
	
		
			
				|  |  | -#endif /* GPROF */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifdef __ELF__
 | 
	
		
			
				|  |  | -#define ELF_FUNC(x)	.type x,@function
 | 
	
		
			
				|  |  | -#define ELF_DATA(x)	.type x,@object
 | 
	
		
			
				|  |  | -#define ELF_SIZE(x,s)	.size x,s
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#define ELF_FUNC(x)
 | 
	
		
			
				|  |  | -#define ELF_DATA(x)
 | 
	
		
			
				|  |  | -#define ELF_SIZE(x,s)
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define	Entry(x)	.globl EXT(x); ELF_FUNC(EXT(x)); .align FALIGN; LEXT(x)
 | 
	
		
			
				|  |  | -#define	ENTRY(x)	Entry(x) MCOUNT
 | 
	
		
			
				|  |  | -#define	ENTRY2(x,y)	.globl EXT(x); .globl EXT(y); \
 | 
	
		
			
				|  |  | -            ELF_FUNC(EXT(x)); ELF_FUNC(EXT(y)); \
 | 
	
		
			
				|  |  | -            .align FALIGN; LEXT(x); LEXT(y) \
 | 
	
		
			
				|  |  | -            MCOUNT
 | 
	
		
			
				|  |  | -#if __STDC__
 | 
	
		
			
				|  |  | -#define	ASENTRY(x) 	.globl x; .align FALIGN; x ## : ELF_FUNC(x) MCOUNT
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#define	ASENTRY(x) 	.globl x; .align FALIGN; x: ELF_FUNC(x) MCOUNT
 | 
	
		
			
				|  |  | -#endif /* __STDC__ */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define	DATA(x)		.globl EXT(x); ELF_DATA(EXT(x)); .align ALIGN; LEXT(x)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define End(x)		ELF_SIZE(x,.-x)
 | 
	
		
			
				|  |  | -#define END(x)		End(EXT(x))
 | 
	
		
			
				|  |  | -#define ENDDATA(x)	END(x)
 | 
	
		
			
				|  |  | -#define Enddata(x)	End(x)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * ELF shared library accessor macros.
 | 
	
		
			
				|  |  | - * Gpush saves the %ebx register used for the GOT address
 | 
	
		
			
				|  |  | - * Gpop pops %ebx if we need a GOT
 | 
	
		
			
				|  |  | - * Gload loads %ebx with the GOT address if shared libraries are used
 | 
	
		
			
				|  |  | - * Gcall calls an external function.
 | 
	
		
			
				|  |  | - * Gotoff allows you to reference local labels.
 | 
	
		
			
				|  |  | - * Gotoff2 allows you to reference local labels with an index reg.
 | 
	
		
			
				|  |  | - * Gotoff3 allows you to reference local labels with an index reg & size.
 | 
	
		
			
				|  |  | - * Gaddr loads up a register with an address of an external item.
 | 
	
		
			
				|  |  | - * Gstack is the number of bytes that Gpush pushes on the stack.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * Varients of the above with E or L prefixes do EXT(name) or LCL(name)
 | 
	
		
			
				|  |  | - * respectively.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifndef __SHARED__
 | 
	
		
			
				|  |  | -#define Gpush
 | 
	
		
			
				|  |  | -#define Gpop
 | 
	
		
			
				|  |  | -#define Gload
 | 
	
		
			
				|  |  | -#define Gcall(func)		call func
 | 
	
		
			
				|  |  | -#define Gotoff(lab)		lab
 | 
	
		
			
				|  |  | -#define Gotoff2(l,r)		l(r)
 | 
	
		
			
				|  |  | -#define Gotoff3(l,r,s)		l(,r,s)
 | 
	
		
			
				|  |  | -#define Gaddr(to,lab)		movl $lab,to
 | 
	
		
			
				|  |  | -#define Gcmp(lab,reg)		cmpl $lab,reg
 | 
	
		
			
				|  |  | -#define Gmemload(lab,reg)	movl lab,reg
 | 
	
		
			
				|  |  | -#define Gmemstore(reg,lab,tmp)	movl reg,lab
 | 
	
		
			
				|  |  | -#define Gstack			0
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#ifdef __ELF__			/* ELF shared libraries */
 | 
	
		
			
				|  |  | -#define Gpush			pushl %ebx
 | 
	
		
			
				|  |  | -#define Gpop			popl %ebx
 | 
	
		
			
				|  |  | -#define Gload			call 9f; 9: popl %ebx; addl $_GLOBAL_OFFSET_TABLE_+[.-9b],%ebx
 | 
	
		
			
				|  |  | -#define Gcall(func)		call EXT(func)@PLT
 | 
	
		
			
				|  |  | -#define Gotoff(lab)		lab@GOTOFF(%ebx)
 | 
	
		
			
				|  |  | -#define Gotoff2(l,r)		l@GOTOFF(%ebx,r)
 | 
	
		
			
				|  |  | -#define Gotoff3(l,r,s)		l@GOTOFF(%ebx,r,s)
 | 
	
		
			
				|  |  | -#define Gaddr(to,lab)		movl lab@GOT(%ebx),to
 | 
	
		
			
				|  |  | -#define Gcmp(lab,reg)		cmpl reg,lab@GOT(%ebx)
 | 
	
		
			
				|  |  | -#define Gmemload(lab,reg)	movl lab@GOT(%ebx),reg; movl (reg),reg
 | 
	
		
			
				|  |  | -#define Gmemstore(reg,lab,tmp)	movl lab@GOT(%ebx),tmp; movl reg,(tmp)
 | 
	
		
			
				|  |  | -#define Gstack			4
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else				/* ROSE shared libraries */
 | 
	
		
			
				|  |  | -#define Gpush
 | 
	
		
			
				|  |  | -#define Gpop
 | 
	
		
			
				|  |  | -#define Gload
 | 
	
		
			
				|  |  | -#define Gcall(func)		call *9f; .data; .align ALIGN; 9: .long func; .text
 | 
	
		
			
				|  |  | -#define Gotoff(lab)		lab
 | 
	
		
			
				|  |  | -#define Gotoff2(l,r)		l(r)
 | 
	
		
			
				|  |  | -#define Gotoff3(l,r,s)		l(,r,s)
 | 
	
		
			
				|  |  | -#define Gaddr(to,lab)		movl 9f,to; .data; .align ALIGN; 9: .long lab; .text
 | 
	
		
			
				|  |  | -#define Gcmp(lab,reg)		cmpl reg,9f; .data; .align ALIGN; 9: .long lab; .text
 | 
	
		
			
				|  |  | -#define Gmemload(lab,reg)	movl 9f,reg; movl (reg),reg; .data; .align ALIGN; 9: .long lab; .text
 | 
	
		
			
				|  |  | -#define Gmemstore(reg,lab,tmp)	movl 9f,tmp; movl reg,(tmp); .data; .align ALIGN; 9: .long lab; .text
 | 
	
		
			
				|  |  | -#define Gstack			0
 | 
	
		
			
				|  |  | -#endif	/* __ELF__ */
 | 
	
		
			
				|  |  | -#endif	/* __SHARED__ */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* Egotoff is not provided, since external symbols should not use @GOTOFF
 | 
	
		
			
				|  |  | -   relocations.  */
 | 
	
		
			
				|  |  | -#define Egcall(func)		Gcall(EXT(func))
 | 
	
		
			
				|  |  | -#define Egaddr(to,lab)		Gaddr(to,EXT(lab))
 | 
	
		
			
				|  |  | -#define Egcmp(lab,reg)		Gcmp(EXT(lab),reg)
 | 
	
		
			
				|  |  | -#define Egmemload(lab,reg)	Gmemload(EXT(lab),reg)
 | 
	
		
			
				|  |  | -#define Egmemstore(reg,lab,tmp)	Gmemstore(reg,EXT(lab),tmp)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define Lgotoff(lab)		Gotoff(LCL(lab))
 | 
	
		
			
				|  |  | -#define Lgotoff2(l,r)		Gotoff2(LCL(l),r)
 | 
	
		
			
				|  |  | -#define Lgotoff3(l,r,s)		Gotoff3(LCL(l),r,s)
 | 
	
		
			
				|  |  | -#define Lgcmp(lab,reg)		Gcmp(LCL(lab),reg)
 | 
	
		
			
				|  |  | -#define Lgmemload(lab,reg)	movl Lgotoff(lab),reg
 | 
	
		
			
				|  |  | -#define Lgmemstore(reg,lab,tmp)	movl reg,Lgotoff(lab)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#ifdef ASSEMBLER
 | 
	
		
			
				|  |  | -#if	MACH_KDB
 | 
	
		
			
				|  |  | -#include <ddb/stab.h>
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * This pseudo-assembler line is added so that there will be at least
 | 
	
		
			
				|  |  | - *	one N_SO entry in the symbol stable to define the current file name.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -#endif	/* MACH_KDB */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else /* NOT ASSEMBLER */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* These defines are here for .c files that wish to reference global symbols
 | 
	
		
			
				|  |  | - * within __asm__ statements.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -#ifndef __NO_UNDERSCORES__
 | 
	
		
			
				|  |  | -#define CC_SYM_PREFIX "_"
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#define CC_SYM_PREFIX ""
 | 
	
		
			
				|  |  | -#endif /* __NO_UNDERSCORES__ */
 | 
	
		
			
				|  |  | -#endif /* ASSEMBLER */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * The following macros make calls into C code.
 | 
	
		
			
				|  |  | - * They dynamically align the stack to 16 bytes.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -#if defined(__i386__)
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * Arguments are moved (not pushed) onto the correctly aligned stack.
 | 
	
		
			
				|  |  | - * NOTE: ESI is destroyed in the process, and hence cannot
 | 
	
		
			
				|  |  | - * be directly used as a parameter. Users of this macro must
 | 
	
		
			
				|  |  | - * independently preserve ESI (a non-volatile) if the routine is
 | 
	
		
			
				|  |  | - * intended to be called from C, for instance.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL(fn)			\
 | 
	
		
			
				|  |  | -    movl	%esp, %esi		;\
 | 
	
		
			
				|  |  | -    andl	$0xFFFFFFF0, %esp	;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)			;\
 | 
	
		
			
				|  |  | -    movl	%esi, %esp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL1(fn, arg1)		\
 | 
	
		
			
				|  |  | -    movl	%esp, %esi		;\
 | 
	
		
			
				|  |  | -    subl	$4, %esp		;\
 | 
	
		
			
				|  |  | -    andl	$0xFFFFFFF0, %esp	;\
 | 
	
		
			
				|  |  | -    movl	arg1, (%esp)		;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)			;\
 | 
	
		
			
				|  |  | -    movl	%esi, %esp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL2(fn, arg1, arg2)		\
 | 
	
		
			
				|  |  | -    movl	%esp, %esi		;\
 | 
	
		
			
				|  |  | -    subl	$8, %esp		;\
 | 
	
		
			
				|  |  | -    andl	$0xFFFFFFF0, %esp	;\
 | 
	
		
			
				|  |  | -    movl	arg2, 4(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	arg1, (%esp)		;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)			;\
 | 
	
		
			
				|  |  | -    movl	%esi, %esp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* This variant exists to permit adjustment of the stack by "dtrace" */
 | 
	
		
			
				|  |  | -#define CCALL1WITHSP(fn, arg1)		\
 | 
	
		
			
				|  |  | -    movl	%esp, %esi		;\
 | 
	
		
			
				|  |  | -    subl	$12, %esp		;\
 | 
	
		
			
				|  |  | -    andl	$0xFFFFFFF0, %esp	;\
 | 
	
		
			
				|  |  | -    movl	%esi, 8(%esp)		;\
 | 
	
		
			
				|  |  | -    leal	8(%esp), %esi		;\
 | 
	
		
			
				|  |  | -    movl	%esi, 4(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	arg1, (%esp)		;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)			;\
 | 
	
		
			
				|  |  | -    movl	8(%esp), %esp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/*
 | 
	
		
			
				|  |  | - * CCALL5 is used for callee functions with 3 arguments but
 | 
	
		
			
				|  |  | - * where arg2 (a3:a2) and arg3 (a5:a4) are 64-bit values.
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -#define CCALL5(fn, a1, a2, a3, a4, a5)	\
 | 
	
		
			
				|  |  | -    movl	%esp, %esi		;\
 | 
	
		
			
				|  |  | -    subl	$20, %esp		;\
 | 
	
		
			
				|  |  | -    andl	$0xFFFFFFF0, %esp	;\
 | 
	
		
			
				|  |  | -    movl	a5, 16(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	a4, 12(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	a3,  8(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	a2,  4(%esp)		;\
 | 
	
		
			
				|  |  | -    movl	a1,  (%esp)		;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)			;\
 | 
	
		
			
				|  |  | -    movl	%esi, %esp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#elif defined(__x86_64__)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/* This variant exists to permit adjustment of the stack by "dtrace" */
 | 
	
		
			
				|  |  | -#define CCALLWITHSP(fn)				 \
 | 
	
		
			
				|  |  | -    mov	%rsp, %r12			;\
 | 
	
		
			
				|  |  | -    sub	$8, %rsp			;\
 | 
	
		
			
				|  |  | -    and	$0xFFFFFFFFFFFFFFF0, %rsp	;\
 | 
	
		
			
				|  |  | -    mov	%r12, (%rsp)			;\
 | 
	
		
			
				|  |  | -    leaq	(%rsp), %rsi			;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)				;\
 | 
	
		
			
				|  |  | -    mov	(%rsp), %rsp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL(fn)				 \
 | 
	
		
			
				|  |  | -    mov	%rsp, %r12			;\
 | 
	
		
			
				|  |  | -    and	$0xFFFFFFFFFFFFFFF0, %rsp	;\
 | 
	
		
			
				|  |  | -    call	EXT(fn)				;\
 | 
	
		
			
				|  |  | -    mov	%r12, %rsp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL1(fn, arg1) 			 \
 | 
	
		
			
				|  |  | -    mov	arg1, %rdi 			;\
 | 
	
		
			
				|  |  | -    CCALL(fn)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL2(fn, arg1, arg2)		 	 \
 | 
	
		
			
				|  |  | -    mov	arg1, %rdi 			;\
 | 
	
		
			
				|  |  | -    CCALL(fn)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#define CCALL3(fn, arg1, arg2, arg3) 		 \
 | 
	
		
			
				|  |  | -    mov	arg1, %rdi 			;\
 | 
	
		
			
				|  |  | -    mov	arg2, %rsi 			;\
 | 
	
		
			
				|  |  | -    mov	arg3, %rdx 			;\
 | 
	
		
			
				|  |  | -    CCALL(fn)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#error unsupported architecture
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -#endif /* _I386_ASM_H_ */
 |