home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OpenStep 4.2J (Developer)
/
os42jdev.iso
/
NextDeveloper
/
Headers
/
architecture
/
sparc
/
asm_linkage.h
< prev
next >
Wrap
Text File
|
1994-09-30
|
5KB
|
226 lines
/* @(#)asm_linkage.h 1.11 91/05/22 SMI */
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
/*
* A stack frame looks like:
*
* %fp->| |
* |-------------------------------|
* | Locals, temps, saved floats |
* |-------------------------------|
* | outgoing parameters past 6 |
* |-------------------------------|-\
* | 6 words for callee to dump | |
* | register arguments | |
* |-------------------------------| > minimum stack frame
* | One word struct-ret address | |
* |-------------------------------| |
* | 16 words to save IN and | |
* %sp->| LOCAL register on overflow | |
* |-------------------------------|-/
*/
#ifndef _sparc_asm_linkage_h
#define _sparc_asm_linkage_h
#import <architecture/sparc/reg.h>
/*
* Constants defining a stack frame.
*/
#define WINDOWSIZE (16*4) /* size of window save area */
#define ARGPUSHSIZE (6*4) /* size of arg dump area */
#define ARGPUSH (WINDOWSIZE+4) /* arg dump area offset */
#define MINFRAME (WINDOWSIZE+ARGPUSHSIZE+4) /* min frame */
/*
* Stack alignment macros.
*/
#define STACK_ALIGN 8
#define SA(X) (((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))
/*
* Profiling causes defintions of the MCOUNT and RTMCOUNT
* particular to the type. Note: the nop in the following
* macros allows them to be used in a delay slot.
*/
#ifdef GPROF
#define MCOUNT(x) \
nop; \
save %sp, -SA(MINFRAME), %sp; \
call mcount; \
nop ; \
restore ;
#define RTMCOUNT(x) \
nop; \
save %sp, -SA(MINFRAME), %sp; \
call mcount; \
nop ; \
restore ;
#endif GPROF
#ifdef PROF
#define MCOUNT(x) \
nop; \
save %sp, -SA(MINFRAME), %sp; \
sethi %hi(L_##x##1), %o0; \
call mcount; \
or %o0, %lo(L_##x##1), %o0; \
restore; \
.comm L_##x##1,4
#define RTMCOUNT(x) \
nop; \
save %sp, -SA(MINFRAME), %sp; \
sethi %hi(L##x##1), %o0; \
call mcount; \
or %o0, %lo(L##x##1), %o0; \
restore; \
.comm L##x##1,4
#endif PROF
/*
* if we are not profiling,
* MCOUNT and RTMCOUNT should be defined to nothing
*/
#if !defined(PROF) && !defined(GPROF)
#define MCOUNT(x)
#define RTMCOUNT(x)
#endif !PROF && !GPROF
/*
* Entry macros for assembler subroutines.
* NAME prefixes the underscore before a symbol.
* ENTRY provides a way to insert the calls to mcount for profiling.
* RTENTRY is similar to the above but provided for run-time routines
* whose names should not be prefixed with an underscore.
*/
#define NAME(x) _##x
#define ENTRY(x) \
.global NAME(x); \
.align 2 ; \
NAME(x): MCOUNT(x)
#define ENTRY2(x,y) \
.global NAME(x), NAME(y); \
.align 2 ; \
NAME(x): ; \
NAME(y): MCOUNT(x)
#define RTENTRY(x) \
.global x; x: RTMCOUNT(x)
/*
* For additional entry points.
*/
#define ALTENTRY(x) \
.global NAME(x); \
.align 2 ; \
NAME(x):
#ifdef KERNEL
/*
* Macros for saving/restoring registers.
*/
#define SAVE_GLOBALS(RP) \
st %g1, [RP + G1*4]; \
std %g2, [RP + G2*4]; \
std %g4, [RP + G4*4]; \
std %g6, [RP + G6*4]; \
mov %y, %g1; \
st %g1, [RP + SPARC_Y*4]
#define RESTORE_GLOBALS(RP) \
ld [RP + SPARC_Y*4], %g1; \
mov %g1, %y; \
ld [RP + G1*4], %g1; \
ldd [RP + G2*4], %g2; \
ldd [RP + G4*4], %g4; \
ldd [RP + G6*4], %g6;
#define SAVE_OUTS(RP) \
std %i0, [RP + O0*4]; \
std %i2, [RP + O2*4]; \
std %i4, [RP + O4*4]; \
std %i6, [RP + O6*4]
#define RESTORE_OUTS(RP) \
ldd [RP + O0*4], %i0; \
ldd [RP + O2*4], %i2; \
ldd [RP + O4*4], %i4; \
ldd [RP + O6*4], %i6;
#define SAVE_WINDOW(SBP) \
std %l0, [SBP + (0*4)]; \
std %l2, [SBP + (2*4)]; \
std %l4, [SBP + (4*4)]; \
std %l6, [SBP + (6*4)]; \
std %i0, [SBP + (8*4)]; \
std %i2, [SBP + (10*4)]; \
std %i4, [SBP + (12*4)]; \
std %i6, [SBP + (14*4)]
#define RESTORE_WINDOW(SBP) \
ldd [SBP + (0*4)], %l0; \
ldd [SBP + (2*4)], %l2; \
ldd [SBP + (4*4)], %l4; \
ldd [SBP + (6*4)], %l6; \
ldd [SBP + (8*4)], %i0; \
ldd [SBP + (10*4)], %i2; \
ldd [SBP + (12*4)], %i4; \
ldd [SBP + (14*4)], %i6;
#define STORE_FPREGS(FCP) \
std %f0, [FCP + FPCTX_REGS]; \
std %f2, [FCP + FPCTX_REGS + 8]; \
std %f4, [FCP + FPCTX_REGS + 16]; \
std %f6, [FCP + FPCTX_REGS + 24]; \
std %f8, [FCP + FPCTX_REGS + 32]; \
std %f10, [FCP + FPCTX_REGS + 40]; \
std %f12, [FCP + FPCTX_REGS + 48]; \
std %f14, [FCP + FPCTX_REGS + 56]; \
std %f16, [FCP + FPCTX_REGS + 64]; \
std %f18, [FCP + FPCTX_REGS + 72]; \
std %f20, [FCP + FPCTX_REGS + 80]; \
std %f22, [FCP + FPCTX_REGS + 88]; \
std %f24, [FCP + FPCTX_REGS + 96]; \
std %f26, [FCP + FPCTX_REGS + 104]; \
std %f28, [FCP + FPCTX_REGS + 112]; \
std %f30, [FCP + FPCTX_REGS + 120]
#define LOAD_FPREGS(FCP) \
ldd [FCP + FPCTX_REGS ], %f0; \
ldd [FCP + FPCTX_REGS + 8], %f2; \
ldd [FCP + FPCTX_REGS + 16], %f4; \
ldd [FCP + FPCTX_REGS + 24], %f6; \
ldd [FCP + FPCTX_REGS + 32], %f8; \
ldd [FCP + FPCTX_REGS + 40], %f10; \
ldd [FCP + FPCTX_REGS + 48], %f12; \
ldd [FCP + FPCTX_REGS + 56], %f14; \
ldd [FCP + FPCTX_REGS + 64], %f16; \
ldd [FCP + FPCTX_REGS + 72], %f18; \
ldd [FCP + FPCTX_REGS + 80], %f20; \
ldd [FCP + FPCTX_REGS + 88], %f22; \
ldd [FCP + FPCTX_REGS + 96], %f24; \
ldd [FCP + FPCTX_REGS + 104], %f26; \
ldd [FCP + FPCTX_REGS + 112], %f28; \
ldd [FCP + FPCTX_REGS + 120], %f30; \
#endif KERNEL
#endif /*!_sparc_asm_linkage_h*/