[BACK]Return to asm.h CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / include

Annotation of sys/arch/alpha/include/asm.h, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: asm.h,v 1.10 2002/04/26 19:57:11 fgsch Exp $ */
                      2: /* $NetBSD: asm.h,v 1.23 2000/06/23 12:18:45 kleink Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University
                      6:  * All Rights Reserved.
                      7:  *
                      8:  * Permission to use, copy, modify and distribute this software and its
                      9:  * documentation is hereby granted, provided that both the copyright
                     10:  * notice and this permission notice appear in all copies of the
                     11:  * software, derivative works or modified versions, and any portions
                     12:  * thereof, and that both notices appear in supporting documentation.
                     13:  *
                     14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  *
                     18:  * Carnegie Mellon requests users of this software to return to
                     19:  *
                     20:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     21:  *  School of Computer Science
                     22:  *  Carnegie Mellon University
                     23:  *  Pittsburgh PA 15213-3890
                     24:  *
                     25:  * any improvements or extensions that they make and grant Carnegie Mellon
                     26:  * the rights to redistribute these changes.
                     27:  */
                     28:
                     29: /*
                     30:  *     Assembly coding style
                     31:  *
                     32:  *     This file contains macros and register defines to
                     33:  *     aid in writing more readable assembly code.
                     34:  *     Some rules to make assembly code understandable by
                     35:  *     a debugger are also noted.
                     36:  *
                     37:  *     The document
                     38:  *
                     39:  *             "ALPHA Calling Standard", DEC 27-Apr-90
                     40:  *
                     41:  *     defines (a superset of) the rules and conventions
                     42:  *     we use.  While we make no promise of adhering to
                     43:  *     such standard and its evolution (esp where we
                     44:  *     can get faster code paths) it is certainly intended
                     45:  *     that we be interoperable with such standard.
                     46:  *
                     47:  *     In this sense, this file is a proper part of the
                     48:  *     definition of the (software) Alpha architecture.
                     49:  */
                     50:
                     51: /*
                     52:  *     Symbolic register names and register saving rules
                     53:  *
                     54:  *     Legend:
                     55:  *             T       Saved by caller (Temporaries)
                     56:  *             S       Saved by callee (call-Safe registers)
                     57:  */
                     58:
                     59: #define        v0      $0      /* (T)          return value            */
                     60: #define t0     $1      /* (T)          temporary registers     */
                     61: #define t1     $2
                     62: #define t2     $3
                     63: #define t3     $4
                     64: #define t4     $5
                     65: #define t5     $6
                     66: #define t6     $7
                     67: #define t7     $8
                     68:
                     69: #define s0     $9      /* (S)          call-safe registers     */
                     70: #define s1     $10
                     71: #define s2     $11
                     72: #define s3     $12
                     73: #define s4     $13
                     74: #define s5     $14
                     75: #define s6     $15
                     76: #define a0     $16     /* (T)          argument registers      */
                     77: #define a1     $17
                     78: #define a2     $18
                     79: #define a3     $19
                     80: #define a4     $20
                     81: #define a5     $21
                     82: #define t8     $22     /* (T)          temporary registers     */
                     83: #define t9     $23
                     84: #define t10    $24
                     85: #define t11    $25
                     86: #define ra     $26     /* (T)          return address          */
                     87: #define t12    $27     /* (T)          another temporary       */
                     88: #define at_reg $28     /* (T)          assembler scratch       */
                     89: #define        gp      $29     /* (T)          (local) data pointer    */
                     90: #define sp     $30     /* (S)          stack pointer           */
                     91: #define zero   $31     /*              wired zero              */
                     92:
                     93: /* Floating point registers  (XXXX VERIFY THIS) */
                     94: #define        fv0     $f0     /* (T)          return value (real)     */
                     95: #define        fv1     $f1     /* (T)          return value (imaginary)*/
                     96: #define        ft0     fv1
                     97: #define        fs0     $f2     /* (S)          call-safe registers     */
                     98: #define        fs1     $f3
                     99: #define        fs2     $f4
                    100: #define        fs3     $f5
                    101: #define        fs4     $f6
                    102: #define        fs5     $f7
                    103: #define        fs6     $f8
                    104: #define        fs7     $f9
                    105: #define        ft1     $f10    /* (T)          temporary registers     */
                    106: #define        ft2     $f11
                    107: #define        ft3     $f12
                    108: #define        ft4     $f13
                    109: #define        ft5     $f14
                    110: #define        ft6     $f15
                    111: #define        fa0     $f16    /* (T)          argument registers      */
                    112: #define        fa1     $f17
                    113: #define        fa2     $f18
                    114: #define        fa3     $f19
                    115: #define        fa4     $f20
                    116: #define        fa5     $f21
                    117: #define        ft7     $f22    /* (T)          more temporaries        */
                    118: #define        ft8     $f23
                    119: #define        ft9     $f24
                    120: #define        ft10    $f25
                    121: #define        ft11    $f26
                    122: #define        ft12    $f27
                    123: #define        ft13    $f28
                    124: #define        ft14    $f29
                    125: #define        ft15    $f30
                    126: #define        fzero   $f31    /*              wired zero              */
                    127:
                    128:
                    129: /* Other DEC standard names */
                    130: #define ai     $25     /* (T)          argument information    */
                    131: #define pv     $27     /* (T)          procedure value         */
                    132:
                    133:
                    134: /*
                    135:  * Useful stuff.
                    136:  */
                    137: #ifdef __STDC__
                    138: #define        __CONCAT(a,b)   a ## b
                    139: #else
                    140: #define        __CONCAT(a,b)   a/**/b
                    141: #endif
                    142: #define ___CONCAT(a,b) __CONCAT(a,b)
                    143:
                    144: /*
                    145:  * Macro to make a local label name.
                    146:  */
                    147: #define        LLABEL(name,num)        ___CONCAT(___CONCAT(L,name),num)
                    148:
                    149: /*
                    150:  *
                    151:  * Debuggers need symbol table information to be able to properly
                    152:  * decode a stack trace.  The minimum that should be provided is:
                    153:  *
                    154:  *     name:
                    155:  *             .proc   name,numargs
                    156:  *
                    157:  * where "name"        is the function's name;
                    158:  *      "numargs"      how many arguments it expects. For varargs
                    159:  *                     procedures this should be a negative number,
                    160:  *                     indicating the minimum required number of
                    161:  *                     arguments (which is at least 1);
                    162:  *
                    163:  * NESTED functions (functions that call other functions) should define
                    164:  * how they handle their stack frame in a .frame directive:
                    165:  *
                    166:  *             .frame  framesize, pc_reg, i_mask, f_mask
                    167:  *
                    168:  * where "framesize"   is the size of the frame for this function, in bytes.
                    169:  *                     That is:
                    170:  *                             new_sp + framesize == old_sp
                    171:  *                     Framesizes should be rounded to a cacheline size.
                    172:  *                     Note that old_sp plays the role of a conventional
                    173:  *                     "frame pointer";
                    174:  *      "pc_reg"       is either a register which preserves the caller's PC
                    175:  *                     or 'std', if std the saved PC should be stored at
                    176:  *                             old_sp-8
                    177:  *      "i_mask"       is a bitmask that indicates which of the integer
                    178:  *                     registers are saved. See the M_xx defines at the
                    179:  *                     end for the encoding of this 32bit value.
                    180:  *      "f_mask"       is the same, for floating point registers.
                    181:  *
                    182:  * Note, 10/31/97: This is interesting but it isn't the way gcc outputs
                    183:  * frame directives and it isn't the way the macros below output them
                    184:  * either. Frame directives look like this:
                    185:  *
                    186:  *             .frame  $15,framesize,$26,0
                    187:  *
                    188:  * If no fp is set up then $30 should be used instead of $15.
                    189:  * Also, gdb expects to find a <lda sp,-framesize(sp)> at the beginning
                    190:  * of a procedure. Don't use things like sub sp,framesize,sp for this
                    191:  * reason. End Note 10/31/97. ross@netbsd.org
                    192:  *
                    193:  * Note that registers should be saved starting at "old_sp-8", where the
                    194:  * return address should be stored. Other registers follow at -16-24-32..
                    195:  * starting from register 0 (if saved) and up. Then float registers (ifany)
                    196:  * are saved.
                    197:  *
                    198:  * If you need to alias a leaf function, or to provide multiple entry points
                    199:  * use the LEAF() macro for the main entry point and XLEAF() for the other
                    200:  * additional/alternate entry points.
                    201:  * "XLEAF"s must be nested within a "LEAF" and a ".end".
                    202:  * Similar rules for nested routines, e.g. use NESTED/XNESTED
                    203:  * Symbols that should not be exported can be declared with the STATIC_xxx
                    204:  * macros.
                    205:  *
                    206:  * All functions must be terminated by the END macro
                    207:  *
                    208:  * It is conceivable, although currently at the limits of compiler
                    209:  * technology, that while performing inter-procedural optimizations
                    210:  * the compiler/linker be able to avoid unnecessary register spills
                    211:  * if told about the register usage of LEAF procedures (and by transitive
                    212:  * closure of NESTED procedures as well).  Assembly code can help
                    213:  * this process using the .reguse directive:
                    214:  *
                    215:  *             .reguse i_mask, f_mask
                    216:  *
                    217:  * where the register masks are built as above or-ing M_xx defines.
                    218:  *
                    219:  *
                    220:  * All symbols are internal unless EXPORTed.  Symbols that are IMPORTed
                    221:  * must be appropriately described to the debugger.
                    222:  *
                    223:  */
                    224:
                    225: /*
                    226:  * MCOUNT
                    227:  */
                    228:
                    229: #ifndef GPROF
                    230: #define MCOUNT /* nothing */
                    231: #else
                    232: #define MCOUNT                                                 \
                    233:        .set noat;                                              \
                    234:        jsr     at_reg,_mcount;                                 \
                    235:        .set at
                    236: #endif
                    237: /*
                    238:  * PALVECT, ESETUP, and ERSAVE
                    239:  *     Declare a palcode transfer point, and carefully construct
                    240:  *     gdb symbols with an unusual _negative_ register-save offset
                    241:  *     so that gdb can find the otherwise lost PC and then
                    242:  *     invert the vector for traceback. Also, fix up framesize,
                    243:  *     allowing for the palframe for the same reason.
                    244:  */
                    245:
                    246: #define PALVECT(_name_)                                                \
                    247:        ESETUP(_name_);                                         \
                    248:        ERSAVE()
                    249:
                    250: #define        ESETUP(_name_)                                          \
                    251:        /* .loc 1 __LINE__; */                                  \
                    252:        .globl  _name_;                                         \
                    253:        .ent    _name_ 0;                                       \
                    254: _name_:;                                                       \
                    255:        .set    noat;                                           \
                    256:        lda     sp,-(FRAME_SW_SIZE*8)(sp);                      \
                    257:        .frame  $30,(FRAME_SW_SIZE+6)*8,$26,0;   /* give gdb the real size */\
                    258:        .mask   0x4000000,-0x28;                                \
                    259:        .set    at
                    260:
                    261: #define        ERSAVE()                                                \
                    262:        .set    noat;                                           \
                    263:        stq     at_reg,(FRAME_AT*8)(sp);                        \
                    264:        .set    at;                                             \
                    265:        stq     ra,(FRAME_RA*8)(sp);                            \
                    266:        /* .loc 1 __LINE__; */                                  \
                    267:        bsr     ra,exception_save_regs         /* jmp/CALL trashes pv/t12 */
                    268:
                    269:
                    270: /*
                    271:  * LEAF
                    272:  *     Declare a global leaf function.
                    273:  *     A leaf function does not call other functions AND does not
                    274:  *     use any register that is callee-saved AND does not modify
                    275:  *     the stack pointer.
                    276:  */
                    277: #define        LEAF(_name_,_n_args_)                                   \
                    278:        .globl  _name_;                                         \
                    279:        .ent    _name_ 0;                                       \
                    280: _name_:;                                                       \
                    281:        .frame  sp,0,ra;                                        \
                    282:        MCOUNT
                    283: /* should have been
                    284:        .proc   _name_,_n_args_;                                \
                    285:        .frame  0,ra,0,0
                    286: */
                    287:
                    288: #define        LEAF_NOPROFILE(_name_,_n_args_)                                 \
                    289:        .globl  _name_;                                         \
                    290:        .ent    _name_ 0;                                       \
                    291: _name_:;                                                       \
                    292:        .frame  sp,0,ra
                    293: /* should have been
                    294:        .proc   _name_,_n_args_;                                \
                    295:        .frame  0,ra,0,0
                    296: */
                    297:
                    298: /*
                    299:  * STATIC_LEAF
                    300:  *     Declare a local leaf function.
                    301:  */
                    302: #define STATIC_LEAF(_name_,_n_args_)                           \
                    303:        .ent    _name_ 0;                                       \
                    304: _name_:;                                                       \
                    305:        .frame  sp,0,ra;                                        \
                    306:        MCOUNT
                    307: /* should have been
                    308:        .proc   _name_,_n_args_;                                \
                    309:        .frame  0,ra,0,0
                    310: */
                    311: /*
                    312:  * XLEAF
                    313:  *     Global alias for a leaf function, or alternate entry point
                    314:  */
                    315: #define        XLEAF(_name_,_n_args_)                                  \
                    316:        .globl  _name_;                                         \
                    317:        .aent   _name_ 0;                                       \
                    318: _name_:
                    319: /* should have been
                    320:        .aproc  _name_,_n_args_;
                    321: */
                    322:
                    323: /*
                    324:  * STATIC_XLEAF
                    325:  *     Local alias for a leaf function, or alternate entry point
                    326:  */
                    327: #define        STATIC_XLEAF(_name_,_n_args_)                           \
                    328:        .aent   _name_ 0;                                       \
                    329: _name_:
                    330: /* should have been
                    331:        .aproc  _name_,_n_args_;
                    332: */
                    333:
                    334: /*
                    335:  * NESTED
                    336:  *     Declare a (global) nested function
                    337:  *     A nested function calls other functions and needs
                    338:  *     therefore stack space to save/restore registers.
                    339:  */
                    340: #define        NESTED(_name_, _n_args_, _framesize_, _pc_reg_, _i_mask_, _f_mask_ ) \
                    341:        .globl  _name_;                                         \
                    342:        .ent    _name_ 0;                                       \
                    343: _name_:;                                                       \
                    344:        .frame  sp,_framesize_,_pc_reg_;                        \
                    345:        .livereg _i_mask_,_f_mask_;                             \
                    346:        MCOUNT
                    347: /* should have been
                    348:        .proc   _name_,_n_args_;                                \
                    349:        .frame  _framesize_, _pc_reg_, _i_mask_, _f_mask_
                    350: */
                    351:
                    352: #define        NESTED_NOPROFILE(_name_, _n_args_, _framesize_, _pc_reg_, _i_mask_, _f_mask_ ) \
                    353:        .globl  _name_;                                         \
                    354:        .ent    _name_ 0;                                       \
                    355: _name_:;                                                       \
                    356:        .frame  sp,_framesize_,_pc_reg_;                        \
                    357:        .livereg _i_mask_,_f_mask_
                    358: /* should have been
                    359:        .proc   _name_,_n_args_;                                \
                    360:        .frame  _framesize_, _pc_reg_, _i_mask_, _f_mask_
                    361: */
                    362:
                    363: /*
                    364:  * STATIC_NESTED
                    365:  *     Declare a local nested function.
                    366:  */
                    367: #define        STATIC_NESTED(_name_, _n_args_, _framesize_, _pc_reg_, _i_mask_, _f_mask_ ) \
                    368:        .ent    _name_ 0;                                       \
                    369: _name_:;                                                       \
                    370:        .frame  sp,_framesize_,_pc_reg_;                        \
                    371:        .livereg _i_mask_,_f_mask_;                             \
                    372:        MCOUNT
                    373: /* should have been
                    374:        .proc   _name_,_n_args_;                                \
                    375:        .frame  _framesize_, _pc_reg_, _i_mask_, _f_mask_
                    376: */
                    377:
                    378: /*
                    379:  * XNESTED
                    380:  *     Same as XLEAF, for a nested function.
                    381:  */
                    382: #define        XNESTED(_name_,_n_args_)                                \
                    383:        .globl  _name_;                                         \
                    384:        .aent   _name_ 0;                                       \
                    385: _name_:
                    386: /* should have been
                    387:        .aproc  _name_,_n_args_;
                    388: */
                    389:
                    390:
                    391: /*
                    392:  * STATIC_XNESTED
                    393:  *     Same as STATIC_XLEAF, for a nested function.
                    394:  */
                    395: #define        STATIC_XNESTED(_name_,_n_args_)                         \
                    396:        .aent   _name_ 0;                                       \
                    397: _name_:
                    398: /* should have been
                    399:        .aproc  _name_,_n_args_;
                    400: */
                    401:
                    402:
                    403: /*
                    404:  * END
                    405:  *     Function delimiter
                    406:  */
                    407: #define        END(_name_)                                             \
                    408:        .end    _name_
                    409:
                    410:
                    411: /*
                    412:  * CALL
                    413:  *     Function invocation
                    414:  */
                    415: #define        CALL(_name_)                                            \
                    416:        /* .loc 1 __LINE__; */                                  \
                    417:        jsr     ra,_name_;                                      \
                    418:        ldgp    gp,0(ra)
                    419: /* but this would cover longer jumps
                    420:        br      ra,.+4;                                         \
                    421:        bsr     ra,_name_
                    422: */
                    423:
                    424:
                    425: /*
                    426:  * RET
                    427:  *     Return from function
                    428:  */
                    429: #define        RET                                                     \
                    430:        ret     zero,(ra),1
                    431:
                    432:
                    433: /*
                    434:  * EXPORT
                    435:  *     Export a symbol
                    436:  */
                    437: #define        EXPORT(_name_)                                          \
                    438:        .globl  _name_;                                         \
                    439: _name_:
                    440:
                    441:
                    442: /*
                    443:  * IMPORT
                    444:  *     Make an external name visible, typecheck the size
                    445:  */
                    446: #define        IMPORT(_name_, _size_)                                  \
                    447:        .extern _name_,_size_
                    448:
                    449:
                    450: /*
                    451:  * ABS
                    452:  *     Define an absolute symbol
                    453:  */
                    454: #define        ABS(_name_, _value_)                                    \
                    455:        .globl  _name_;                                         \
                    456: _name_ =       _value_
                    457:
                    458:
                    459: /*
                    460:  * BSS
                    461:  *     Allocate un-initialized space for a global symbol
                    462:  */
                    463: #define        BSS(_name_,_numbytes_)                                  \
                    464:        .comm   _name_,_numbytes_
                    465:
                    466: /*
                    467:  * VECTOR
                    468:  *     Make an exception entry point look like a called function,
                    469:  *     to make it digestible to the debugger (KERNEL only)
                    470:  */
                    471: #define        VECTOR(_name_, _i_mask_)                                \
                    472:        .globl  _name_;                                         \
                    473:        .ent    _name_ 0;                                       \
                    474: _name_:;                                                       \
                    475:        .mask   _i_mask_|IM_EXC,0;                              \
                    476:        .frame  sp,MSS_SIZE,ra;
                    477: /*     .livereg _i_mask_|IM_EXC,0      */
                    478: /* should have been
                    479:        .proc   _name_,1;                                       \
                    480:        .frame  MSS_SIZE,$31,_i_mask_,0;                        \
                    481: */
                    482:
                    483: /*
                    484:  * MSG
                    485:  *     Allocate space for a message (a read-only ascii string)
                    486:  */
                    487: #define        ASCIZ   .asciz
                    488: #define        MSG(msg,reg,label)                                      \
                    489:        lda reg, label;                                         \
                    490:        .data;                                                  \
                    491: label: ASCIZ msg;                                              \
                    492:        .text;
                    493:
                    494: /*
                    495:  * PRINTF
                    496:  *     Print a message
                    497:  */
                    498: #define        PRINTF(msg,label)                                       \
                    499:        MSG(msg,a0,label);                                      \
                    500:        CALL(printf)
                    501:
                    502: /*
                    503:  * PANIC
                    504:  *     Fatal error (KERNEL)
                    505:  */
                    506: #define        PANIC(msg,label)                                        \
                    507:        MSG(msg,a0,label);                                      \
                    508:        CALL(panic)
                    509:
                    510: /*
                    511:  * Register mask defines, used to define both save
                    512:  * and use register sets.
                    513:  *
                    514:  * NOTE: The bit order should HAVE BEEN maintained when saving
                    515:  *      registers on the stack: sp goes at the highest
                    516:  *      address, gp lower on the stack, etc etc
                    517:  *      BUT NOONE CARES ABOUT DEBUGGERS AT MIPS
                    518:  */
                    519:
                    520: #define        IM_EXC  0x80000000
                    521: #define        IM_SP   0x40000000
                    522: #define        IM_GP   0x20000000
                    523: #define        IM_AT   0x10000000
                    524: #define        IM_T12  0x08000000
                    525: #      define  IM_PV   IM_T4
                    526: #define        IM_RA   0x04000000
                    527: #define        IM_T11  0x02000000
                    528: #      define  IM_AI   IM_T3
                    529: #define        IM_T10  0x01000000
                    530: #define        IM_T9   0x00800000
                    531: #define        IM_T8   0x00400000
                    532: #define        IM_A5   0x00200000
                    533: #define        IM_A4   0x00100000
                    534: #define        IM_A3   0x00080000
                    535: #define        IM_A2   0x00040000
                    536: #define        IM_A1   0x00020000
                    537: #define        IM_A0   0x00010000
                    538: #define        IM_S6   0x00008000
                    539: #define        IM_S5   0x00004000
                    540: #define        IM_S4   0x00002000
                    541: #define        IM_S3   0x00001000
                    542: #define        IM_S2   0x00000800
                    543: #define        IM_S1   0x00000400
                    544: #define        IM_S0   0x00000200
                    545: #define        IM_T7   0x00000100
                    546: #define        IM_T6   0x00000080
                    547: #define        IM_T5   0x00000040
                    548: #define        IM_T4   0x00000020
                    549: #define        IM_T3   0x00000010
                    550: #define        IM_T2   0x00000008
                    551: #define        IM_T1   0x00000004
                    552: #define        IM_T0   0x00000002
                    553: #define        IM_V0   0x00000001
                    554:
                    555: #define        FM_T15  0x40000000
                    556: #define        FM_T14  0x20000000
                    557: #define        FM_T13  0x10000000
                    558: #define        FM_T12  0x08000000
                    559: #define        FM_T11  0x04000000
                    560: #define        FM_T10  0x02000000
                    561: #define        FM_T9   0x01000000
                    562: #define        FM_T8   0x00800000
                    563: #define        FM_T7   0x00400000
                    564: #define        FM_A5   0x00200000
                    565: #define        FM_A4   0x00100000
                    566: #define        FM_A3   0x00080000
                    567: #define        FM_A2   0x00040000
                    568: #define        FM_A1   0x00020000
                    569: #define        FM_A0   0x00010000
                    570: #define        FM_T6   0x00008000
                    571: #define        FM_T5   0x00004000
                    572: #define        FM_T4   0x00002000
                    573: #define        FM_T3   0x00001000
                    574: #define        FM_T2   0x00000800
                    575: #define        FM_T1   0x00000400
                    576: #define        FM_S7   0x00000200
                    577: #define        FM_S6   0x00000100
                    578: #define        FM_S5   0x00000080
                    579: #define        FM_S4   0x00000040
                    580: #define        FM_S3   0x00000020
                    581: #define        FM_S2   0x00000010
                    582: #define        FM_S1   0x00000008
                    583: #define        FM_S0   0x00000004
                    584: #define        FM_T0   0x00000002
                    585: #define        FM_V1   FM_T0
                    586: #define        FM_V0   0x00000001
                    587:
                    588: /* Pull in PAL "function" codes. */
                    589: #include <machine/pal.h>
                    590:
                    591: /*
                    592:  * System call glue.
                    593:  */
                    594: #define        SYSCALLNUM(name)                                        \
                    595:        ___CONCAT(SYS_,name)
                    596:
                    597: #define        CALLSYS_NOERROR(name)                                   \
                    598:        ldiq    v0, SYSCALLNUM(name);                           \
                    599:        call_pal PAL_OSF1_callsys
                    600:
                    601: #define NETBSD_SYSCALLNUM(name)                                        \
                    602:        ___CONCAT(NETBSD_SYS_,name)
                    603:
                    604: #define NETBSD_CALLSYS_NOERROR(name)                           \
                    605:        ldiq    v0, NETBSD_SYSCALLNUM(name);                    \
                    606:        call_pal PAL_OSF1_callsys
                    607:
                    608: /*
                    609:  * Load the global pointer.
                    610:  */
                    611: #define        LDGP(reg)                                               \
                    612:        ldgp    gp, 0(reg)
                    613:
                    614: /*
                    615:  * WEAK_ALIAS: create a weak alias (ELF only).
                    616:  */
                    617: #ifdef __ELF__
                    618: #define WEAK_ALIAS(alias,sym)                                  \
                    619:        .weak alias;                                            \
                    620:        alias = sym
                    621: #endif
                    622:
                    623: /*
                    624:  * WARN_REFERENCES: create a warning if the specified symbol is referenced
                    625:  * (ELF only).
                    626:  */
                    627: #ifdef __ELF__
                    628: #ifdef __STDC__
                    629: #define        WARN_REFERENCES(_sym,_msg)                              \
                    630:        .section .gnu.warning. ## _sym ; .ascii _msg ; .text
                    631: #else
                    632: #define        WARN_REFERENCES(_sym,_msg)                              \
                    633:        .section .gnu.warning./**/_sym ; .ascii _msg ; .text
                    634: #endif /* __STDC__ */
                    635: #endif /* __ELF__ */
                    636:
                    637: /*
                    638:  * Kernel RCS ID tag and copyright macros
                    639:  */
                    640:
                    641: #ifdef _KERNEL
                    642:
                    643: #ifdef __ELF__
                    644: #define        __KERNEL_SECTIONSTRING(_sec, _str)                              \
                    645:        .section _sec ; .asciz _str ; .text
                    646: #else /* __ELF__ */
                    647: #define        __KERNEL_SECTIONSTRING(_sec, _str)                              \
                    648:        .data ; .asciz _str ; .align 3 ; .text
                    649: #endif /* __ELF__ */
                    650:
                    651: #define        __KERNEL_RCSID(_n, _s)          __KERNEL_SECTIONSTRING(.ident, _s)
                    652: #define        __KERNEL_COPYRIGHT(_n, _s)      __KERNEL_SECTIONSTRING(.copyright, _s)
                    653:
                    654: #ifdef NO_KERNEL_RCSIDS
                    655: #undef __KERNEL_RCSID
                    656: #define        __KERNEL_RCSID(_n, _s)          /* nothing */
                    657: #endif
                    658:
                    659: #endif /* _KERNEL */

CVSweb