Annotation of researchv9/sys/sun3/asm_linkage.h, revision 1.1.1.1

1.1       root        1: /*     @(#)asm_linkage.h 1.1 86/02/03 SMI      */
                      2: 
                      3: /*
                      4:  * Copyright (c) 1985 by Sun Microsystems, Inc.
                      5:  */
                      6: 
                      7: /*
                      8:  * Entry macros for assembler subroutines.
                      9:  */
                     10: #define        IDENTITY(x) x
                     11: #define        NAME(x) IDENTITY(_)x
                     12: 
                     13: #ifdef GPROF
                     14: #define ENTRY(x)  \
                     15:        .globl  NAME(x); \
                     16: NAME(x): \
                     17:        link a6,#0; \
                     18:        movl #1f,a0; \
                     19:        jbsr mcount; \
                     20:        unlk a6; \
                     21:        .bss; \
                     22:        .even; \
                     23: 1:     .skip 4; \
                     24:        .text
                     25: 
                     26: #define ENTRY2(x,y)  \
                     27:        .globl  NAME(x), NAME(y); \
                     28: NAME(x): ; \
                     29: NAME(y):   \
                     30:        link a6,#0; \
                     31:        movl #1f,a0; \
                     32:        jbsr mcount; \
                     33:        unlk a6; \
                     34:        .bss; \
                     35:        .even; \
                     36: 1:     .skip 4; \
                     37:        .text
                     38: 
                     39: /*
                     40:  * CCENTRY is for cc known subroutines like ldivt which
                     41:  * know and use a0, a1, d0 and d1.  This means we have to
                     42:  * save them.
                     43:  */
                     44: #define CCENTRY(x)  \
                     45:        .globl  x; \
                     46: x: \
                     47:        link a6,#-16; \
                     48:        moveml #0x0303,sp@; \
                     49:        movl #1f,a0; \
                     50:        jbsr mcount; \
                     51:        moveml sp@,#0x0303; \
                     52:        unlk a6; \
                     53:        .bss; \
                     54:        .even; \
                     55: 1:     .skip 4; \
                     56:        .text
                     57: #else GPROF
                     58: #define ENTRY(x)  \
                     59:        .globl  NAME(x); \
                     60: NAME(x):
                     61: 
                     62: #define ENTRY2(x,y)  \
                     63:        .globl  NAME(x), NAME(y); \
                     64: NAME(x): \
                     65: NAME(y):
                     66: 
                     67: #define CCENTRY(x)  \
                     68:        .globl  x; \
                     69: x:
                     70: #endif GPROF
                     71: 
                     72: /*
                     73:  * Macro for autovectored interrupts.
                     74:  */
                     75: #define IOINTR(LEVEL) \
                     76:        moveml  #0xE0E0,sp@-    /* save regs we trash <d0,d1,d2,a0,a1,a2> */;\
                     77:        movl    sp,d2           /* save copy of previous sp */;\
                     78:        cmpl    #eintstack,sp   /* on interrupt stack? */;\
                     79:        jls     1f              /* yes, skip */;\
                     80:        lea     eintstack,sp    /* no, switch to interrupt stack */;\
                     81: 1:     movl    #_level/**/LEVEL/**/_vector,a2  /* get vector ptr */;\
                     82: 2:     movl    a2@+,a1         /* get routine address */;\
                     83:        jsr     a1@             /* go there */;\
                     84:        tstl    d0              /* success? */;\
                     85:        beqs    2b              /* no, try next one */;\
                     86:        movl    d2,sp           /* restore stack pointer */;\
                     87:        cmpl    #0x80000000,d0  /* spurious? */;\
                     88:        jeq     rei_iop         /* yes */;\
                     89:        clrl    _level/**/LEVEL/**/_spurious    /* no, clr spurious cnt */;\
                     90:        jra     rei_iop
                     91: 
                     92: /*
                     93:  * Macro for vectored interrupts.
                     94:  */
                     95: #define VECINTR(ifunc, cfunc, carg) \
                     96:        .globl  ifunc;\
                     97: ifunc:;\
                     98:        moveml  #0xE0C0,sp@-    /* save regs we trash <d0,d1,d2,a0,a1> */;\
                     99:        movl    sp,d2           /* save copy of previous sp */;\
                    100:        cmpl    #eintstack,sp   /* on interrupt stack? */;\
                    101:        jls     1f              /* yes, skip */;\
                    102:        lea     eintstack,sp    /* no, switch to interrupt stack */;\
                    103: 1:     movl    carg,sp@-       /* push arg to interrupt routine */;\
                    104:        jsr     cfunc           /* go to it */;\
                    105:        movl    d2,sp           /* restore stack pointer */;\
                    106:         moveml  sp@+,#0x0307    /* restore saved registers <a1,a0,d2,d1,d0> */;\
                    107:        jra     rei_io

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.