231 lines
5.3 KiB
C
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
|