Home | History | Annotate | Line # | Download | only in include
asm.h revision 1.28.12.3
      1  1.28.12.3      yamt /*	$NetBSD: asm.h,v 1.28.12.3 2007/09/03 14:26:46 yamt Exp $	*/
      2        1.7       cgd 
      3        1.1   mycroft /*-
      4        1.1   mycroft  * Copyright (c) 1990 The Regents of the University of California.
      5        1.1   mycroft  * All rights reserved.
      6        1.1   mycroft  *
      7        1.1   mycroft  * This code is derived from software contributed to Berkeley by
      8        1.1   mycroft  * William Jolitz.
      9        1.1   mycroft  *
     10        1.1   mycroft  * Redistribution and use in source and binary forms, with or without
     11        1.1   mycroft  * modification, are permitted provided that the following conditions
     12        1.1   mycroft  * are met:
     13        1.1   mycroft  * 1. Redistributions of source code must retain the above copyright
     14        1.1   mycroft  *    notice, this list of conditions and the following disclaimer.
     15        1.1   mycroft  * 2. Redistributions in binary form must reproduce the above copyright
     16        1.1   mycroft  *    notice, this list of conditions and the following disclaimer in the
     17        1.1   mycroft  *    documentation and/or other materials provided with the distribution.
     18       1.26       agc  * 3. Neither the name of the University nor the names of its contributors
     19        1.1   mycroft  *    may be used to endorse or promote products derived from this software
     20        1.1   mycroft  *    without specific prior written permission.
     21        1.1   mycroft  *
     22        1.1   mycroft  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23        1.1   mycroft  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24        1.1   mycroft  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25        1.1   mycroft  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26        1.1   mycroft  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27        1.1   mycroft  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28        1.1   mycroft  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29        1.1   mycroft  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30        1.1   mycroft  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31        1.1   mycroft  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32        1.1   mycroft  * SUCH DAMAGE.
     33        1.1   mycroft  *
     34        1.7       cgd  *	@(#)asm.h	5.5 (Berkeley) 5/7/91
     35        1.1   mycroft  */
     36        1.1   mycroft 
     37        1.3   mycroft #ifndef _I386_ASM_H_
     38        1.3   mycroft #define _I386_ASM_H_
     39        1.1   mycroft 
     40       1.22      fvdl #ifdef _KERNEL_OPT
     41       1.22      fvdl #include "opt_multiprocessor.h"
     42       1.22      fvdl #endif
     43       1.22      fvdl 
     44        1.4        pk #ifdef PIC
     45        1.4        pk #define PIC_PROLOGUE	\
     46        1.4        pk 	pushl	%ebx;	\
     47        1.4        pk 	call	1f;	\
     48        1.4        pk 1:			\
     49        1.4        pk 	popl	%ebx;	\
     50        1.4        pk 	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
     51        1.4        pk #define PIC_EPILOGUE	\
     52        1.4        pk 	popl	%ebx
     53        1.4        pk #define PIC_PLT(x)	x@PLT
     54        1.4        pk #define PIC_GOT(x)	x@GOT(%ebx)
     55        1.4        pk #define PIC_GOTOFF(x)	x@GOTOFF(%ebx)
     56        1.4        pk #else
     57        1.4        pk #define PIC_PROLOGUE
     58        1.4        pk #define PIC_EPILOGUE
     59        1.4        pk #define PIC_PLT(x)	x
     60        1.4        pk #define PIC_GOT(x)	x
     61        1.4        pk #define PIC_GOTOFF(x)	x
     62        1.4        pk #endif
     63        1.4        pk 
     64       1.13  christos #ifdef __ELF__
     65       1.16   mycroft # define _C_LABEL(x)	x
     66        1.1   mycroft #else
     67       1.13  christos # ifdef __STDC__
     68       1.13  christos #  define _C_LABEL(x)	_ ## x
     69       1.13  christos # else
     70       1.13  christos #  define _C_LABEL(x)	_/**/x
     71       1.13  christos # endif
     72        1.1   mycroft #endif
     73        1.6       jtc #define	_ASM_LABEL(x)	x
     74       1.23      fvdl 
     75       1.24      fvdl #define CVAROFF(x, y)		_C_LABEL(x) + y
     76        1.6       jtc 
     77       1.16   mycroft #ifdef __STDC__
     78       1.16   mycroft # define __CONCAT(x,y)	x ## y
     79       1.16   mycroft # define __STRING(x)	#x
     80       1.16   mycroft #else
     81       1.16   mycroft # define __CONCAT(x,y)	x/**/y
     82       1.16   mycroft # define __STRING(x)	"x"
     83       1.16   mycroft #endif
     84       1.16   mycroft 
     85        1.9      fvdl /* let kernels and others override entrypoint alignment */
     86       1.22      fvdl #if !defined(_ALIGN_TEXT) && !defined(_KERNEL)
     87  1.28.12.3      yamt # ifdef _STANDALONE
     88       1.14    kleink #  define _ALIGN_TEXT .align 4
     89  1.28.12.3      yamt # elif defined __ELF__
     90  1.28.12.3      yamt #  define _ALIGN_TEXT .align 32
     91       1.14    kleink # else
     92  1.28.12.3      yamt #  define _ALIGN_TEXT .align 5
     93       1.14    kleink # endif
     94        1.9      fvdl #endif
     95        1.9      fvdl 
     96        1.6       jtc #define _ENTRY(x) \
     97        1.9      fvdl 	.text; _ALIGN_TEXT; .globl x; .type x,@function; x:
     98  1.28.12.2      yamt #define _LABEL(x) \
     99  1.28.12.2      yamt 	.globl x; x:
    100       1.21   thorpej 
    101       1.21   thorpej #ifdef _KERNEL
    102       1.22      fvdl 
    103       1.22      fvdl #define CPUVAR(off) %fs:__CONCAT(CPU_INFO_,off)
    104       1.22      fvdl 
    105       1.21   thorpej /* XXX Can't use __CONCAT() here, as it would be evaluated incorrectly. */
    106       1.21   thorpej #ifdef __ELF__
    107       1.21   thorpej #ifdef __STDC__
    108       1.25      yamt #define	IDTVEC(name) \
    109       1.25      yamt 	ALIGN_TEXT; .globl X ## name; .type X ## name,@function; X ## name:
    110       1.21   thorpej #else
    111       1.25      yamt #define	IDTVEC(name) \
    112       1.25      yamt 	ALIGN_TEXT; .globl X/**/name; .type X/**/name,@function; X/**/name:
    113       1.21   thorpej #endif /* __STDC__ */
    114       1.21   thorpej #else
    115       1.21   thorpej #ifdef __STDC__
    116       1.25      yamt #define	IDTVEC(name) \
    117       1.25      yamt 	ALIGN_TEXT; .globl _X ## name; .type _X ## name,@function; _X ## name:
    118       1.21   thorpej #else
    119       1.25      yamt #define	IDTVEC(name) \
    120       1.25      yamt 	ALIGN_TEXT; .globl _X/**/name; .type _X/**/name,@function; _X/**/name:
    121       1.21   thorpej #endif /* __STDC__ */
    122       1.21   thorpej #endif /* __ELF__ */
    123       1.22      fvdl 
    124  1.28.12.3      yamt #ifdef _STANDALONE
    125  1.28.12.3      yamt #define ALIGN_DATA	.align	4
    126  1.28.12.3      yamt #define ALIGN_TEXT	.align	4	/* 4-byte boundaries */
    127  1.28.12.3      yamt #define SUPERALIGN_TEXT	.align	32	/* 32-byte boundaries */
    128  1.28.12.3      yamt #elif defined __ELF__
    129       1.22      fvdl #define ALIGN_DATA	.align	4
    130  1.28.12.3      yamt #define ALIGN_TEXT	.align	32	/* 32-byte boundaries */
    131  1.28.12.3      yamt #define SUPERALIGN_TEXT	.align	32	/* 32-byte boundaries */
    132       1.22      fvdl #else
    133       1.22      fvdl #define ALIGN_DATA	.align	2
    134  1.28.12.3      yamt #define ALIGN_TEXT	.align	5	/* 32-byte boundaries */
    135  1.28.12.3      yamt #define SUPERALIGN_TEXT	.align	5	/* 32-byte boundaries */
    136       1.22      fvdl #endif /* __ELF__ */
    137       1.22      fvdl 
    138       1.22      fvdl #define _ALIGN_TEXT ALIGN_TEXT
    139       1.22      fvdl 
    140       1.27      yamt #ifdef GPROF
    141       1.27      yamt #ifdef __ELF__
    142       1.27      yamt #define	MCOUNT_ASM	call	_C_LABEL(__mcount)
    143       1.27      yamt #else /* __ELF__ */
    144       1.27      yamt #define	MCOUNT_ASM	call	_C_LABEL(mcount)
    145       1.27      yamt #endif /* __ELF__ */
    146       1.28      yamt #else /* GPROF */
    147       1.28      yamt #define	MCOUNT_ASM	/* nothing */
    148       1.27      yamt #endif /* GPROF */
    149       1.27      yamt 
    150       1.21   thorpej #endif /* _KERNEL */
    151        1.1   mycroft 
    152       1.22      fvdl 
    153       1.22      fvdl 
    154        1.8       jtc #ifdef GPROF
    155       1.15    kleink # ifdef __ELF__
    156       1.15    kleink #  define _PROF_PROLOGUE	\
    157       1.15    kleink 	pushl %ebp; movl %esp,%ebp; call PIC_PLT(__mcount); popl %ebp
    158       1.15    kleink # else
    159       1.15    kleink #  define _PROF_PROLOGUE	\
    160        1.6       jtc 	pushl %ebp; movl %esp,%ebp; call PIC_PLT(mcount); popl %ebp
    161       1.15    kleink # endif
    162        1.1   mycroft #else
    163        1.6       jtc # define _PROF_PROLOGUE
    164        1.1   mycroft #endif
    165        1.1   mycroft 
    166        1.6       jtc #define	ENTRY(y)	_ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
    167        1.9      fvdl #define	NENTRY(y)	_ENTRY(_C_LABEL(y))
    168        1.6       jtc #define	ASENTRY(y)	_ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
    169  1.28.12.2      yamt #define	LABEL(y)	_LABEL(_C_LABEL(y))
    170        1.1   mycroft 
    171        1.1   mycroft #define	ASMSTR		.asciz
    172        1.5       jtc 
    173       1.20  drochner #ifdef __ELF__
    174       1.20  drochner #define RCSID(x)	.section ".ident"; .asciz x
    175       1.20  drochner #else
    176        1.5       jtc #define RCSID(x)	.text; .asciz x
    177       1.20  drochner #endif
    178       1.20  drochner 
    179       1.20  drochner #ifdef NO_KERNEL_RCSIDS
    180       1.20  drochner #define	__KERNEL_RCSID(_n, _s)	/* nothing */
    181       1.20  drochner #else
    182       1.20  drochner #define	__KERNEL_RCSID(_n, _s)	RCSID(_s)
    183       1.20  drochner #endif
    184       1.18    kleink 
    185       1.18    kleink #ifdef __ELF__
    186       1.18    kleink #define	WEAK_ALIAS(alias,sym)						\
    187       1.18    kleink 	.weak alias;							\
    188       1.18    kleink 	alias = sym
    189       1.18    kleink #endif
    190  1.28.12.1      yamt /*
    191  1.28.12.1      yamt  * STRONG_ALIAS: create a strong alias.
    192  1.28.12.1      yamt  */
    193  1.28.12.1      yamt #define STRONG_ALIAS(alias,sym)						\
    194  1.28.12.1      yamt 	.globl alias;							\
    195  1.28.12.1      yamt 	alias = sym
    196       1.11   thorpej 
    197       1.11   thorpej #ifdef __STDC__
    198       1.11   thorpej #define	WARN_REFERENCES(sym,msg)					\
    199       1.12   thorpej 	.stabs msg ## ,30,0,0,0 ;					\
    200       1.16   mycroft 	.stabs __STRING(_C_LABEL(sym)) ## ,1,0,0,0
    201       1.17      marc #elif defined(__ELF__)
    202       1.16   mycroft #define	WARN_REFERENCES(sym,msg)					\
    203       1.16   mycroft 	.stabs msg,30,0,0,0 ;						\
    204       1.16   mycroft 	.stabs __STRING(sym),1,0,0,0
    205       1.11   thorpej #else
    206       1.11   thorpej #define	WARN_REFERENCES(sym,msg)					\
    207       1.11   thorpej 	.stabs msg,30,0,0,0 ;						\
    208       1.12   thorpej 	.stabs __STRING(_/**/sym),1,0,0,0
    209       1.11   thorpej #endif /* __STDC__ */
    210       1.22      fvdl 
    211        1.3   mycroft #endif /* !_I386_ASM_H_ */
    212