NetBSD/sys/arch/pc532/include/asm.h

231 lines
5.3 KiB
C

/* $NetBSD: asm.h,v 1.14 1998/12/02 21:16:46 thorpej Exp $ */
/*
* Mach Operating System
* Copyright (c) 1992 Carnegie Mellon University
* Copyright (c) 1992 Helsinki University of Technology
* 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 AND HELSINKI UNIVERSITY OF TECHNOLOGY ALLOW FREE USE
* OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON AND
* HELSINKI UNIVERSITY OF TECHNOLOGY DISCLAIM 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.
*/
/*
* File: asm.h
* Author: Johannes Helander, Tero Kivinen, Tatu Ylonen
* Modified by Phil Nelson for NetBSD.
* Modified by Matthias Pfaller for PIC.
* Helsinki University of Technology 1992.
*/
#ifndef _MACHINE_ASM_H_
#define _MACHINE_ASM_H_
#ifdef __STDC__
#define CAT(a, b) a ## b
#else
#define CAT(a, b) a/**/b
#endif
#define _C_LABEL(name) CAT(_,name)
#define _ASM_LABEL(name) name
/* let kernels and others override entrypoint alignment */
#ifndef _ALIGN_TEXT
# define _ALIGN_TEXT .align 2,0xa2
#endif
#ifndef _ALIGN_DATA
# define _ALIGN_DATA .align 2
#endif
#define S_ARG0 4(sp)
#define S_ARG1 8(sp)
#define S_ARG2 12(sp)
#define S_ARG3 16(sp)
#define B_ARG0 8(fp)
#define B_ARG1 12(fp)
#define B_ARG2 16(fp)
#define B_ARG3 20(fp)
#ifdef PIC
#define PIC_PROLOGUE \
sprd sb,tos ; \
addr _C_LABEL(_GLOBAL_OFFSET_TABLE_)(pc),r1; \
lprd sb,r1
#define PIC_EPILOGUE \
lprd sb,tos
#define PIC_GOT(name) 0(name(sb))
#define PIC_S_ARG0 8(sp)
#define PIC_S_ARG1 12(sp)
#define PIC_S_ARG2 16(sp)
#define PIC_S_ARG3 20(sp)
#else
#define PIC_PROLOGUE
#define PIC_EPILOGUE
#define PIC_GOT(name) name(pc)
#define PIC_S_ARG0 4(sp)
#define PIC_S_ARG1 8(sp)
#define PIC_S_ARG2 12(sp)
#define PIC_S_ARG3 16(sp)
#endif
#if defined(_KERNEL) && defined(MRTD)
#define _SETARGS(args) \
.set ARGS,args
#else
#define _SETARGS(args) \
.set ARGS,0
#endif
#define _ENTRY(name, args) \
.text ; \
_ALIGN_TEXT ; \
.globl name ; \
.type name,@function ; \
_SETARGS(args) ; \
name:
#ifdef GPROF
# ifndef _SAVELIST
# define _SAVELIST
# endif
# define _PROF_PROLOGUE \
enter [_SAVELIST],0 ; \
bsr _ASM_LABEL(mcount) ; \
exit [_SAVELIST]
#else
# define _PROF_PROLOGUE
#endif
#define ENTRY(y) _ENTRY(_C_LABEL(y), 0); _PROF_PROLOGUE
#define KENTRY(y, n) _ENTRY(_C_LABEL(y), n); _PROF_PROLOGUE
#define ASENTRY(y) _ENTRY(_ASM_LABEL(y), 0); _PROF_PROLOGUE
#define ENTRY_NOPROFILE(name) _ENTRY(_C_LABEL(name), 0)
#define ASENTRY_NOPROFILE(name) _ENTRY(_ASM_LABEL(name), 0)
#define ALTENTRY(name, rname) \
.globl _C_LABEL(name) ; \
.type _C_LABEL(name),@function ; \
.set _C_LABEL(name),_C_LABEL(rname)
#define ASMSTR \
.asciz
#define RCSID(string) \
.text ; \
ASMSTR string
/*
* Global variables of whatever sort.
*/
#define GLOBAL(name) \
.globl _C_LABEL(name) ; \
_C_LABEL(name):
#define ASGLOBAL(name) \
.globl _ASM_LABEL(name) ; \
_ASM_LABEL(name):
/*
* ...and local variables.
*/
#define LOCAL(name) \
_C_LABEL(name):
#define ASLOCAL(name) \
_ASM_LABEL(name):
/*
* Items in the DATA segment.
*/
#define _DATA(name, pseudo, init) \
.data ; \
.globl name ; \
.type name,@object ; \
.size name,9f - name ; \
name: pseudo init ; \
9:
#define DATA_D(name, init) _DATA(_C_LABEL(name), .long, init)
#define DATA_W(name, init) _DATA(_C_LABEL(name), .word, init)
#define DATA_B(name, init) _DATA(_C_LABEL(name), .byte, init)
#define DATA_S(name, init) _DATA(_C_LABEL(name), .asciz, init)
#define ASDATA_D(name, init) _DATA(_ASM_LABEL(name), .long, init)
#define ASDATA_W(name, init) _DATA(_ASM_LABEL(name), .word, init)
#define ASDATA_B(name, init) _DATA(_ASM_LABEL(name), .byte, init)
#define ASDATA_S(name, init) _DATA(_ASM_LABEL(name), .asciz, init)
/*
* Items in the BSS segment.
*/
#define BSS(name, size) \
.comm _C_LABEL(name),size
#define ASBSS(name, size) \
.comm _ASM_LABEL(name),size
#ifdef _KERNEL
/*
* Shorthand for calling panic().
* Note the side-effect: it uses up the 9: label, so be careful!
*/
#define PANIC(message) \
addr 9f,tos ; \
bsr _C_LABEL(panic) ; \
9: .asciz message
/*
* Shorthand for defining vectors for the vector table.
*/
#define VECTOR(name) \
.long _C_LABEL(name)
#define ASVECTOR(name) \
.long _ASM_LABEL(name)
#define VECTOR_UNUSED \
.long 0
#endif
#ifdef __STDC__
#define __STRING(x) #x
#define WARN_REFERENCES(sym,msg) \
.stabs msg ## ,30,0,0,0 ; \
.stabs __STRING(_ ## sym) ## ,1,0,0,0
#else
#define __STRING(x) "x"
#define WARN_REFERENCES(sym,msg) \
.stabs msg,30,0,0,0 ; \
.stabs __STRING(_/**/sym),1,0,0,0
#endif /* __STDC__ */
#endif