Annotation of 43BSD/contrib/emacs/src/crt0.c, revision 1.1.1.1

1.1       root        1: /* C code startup routine.
                      2:    Copyright (C) 1985 Richard M. Stallman
                      3: 
                      4: This program is distributed in the hope that it will be useful,
                      5: but without any warranty.  No author or distributor
                      6: accepts responsibility to anyone for the consequences of using it
                      7: or for whether it serves any particular purpose or works at all,
                      8: unless he says so in writing.
                      9: 
                     10:    Permission is granted to anyone to distribute verbatim copies
                     11:    of this program's source code as received, in any medium, provided that
                     12:    the copyright notice, the nonwarraty notice above
                     13:    and this permission notice are preserved,
                     14:    and that the distributor grants the recipient all rights
                     15:    for further redistribution as permitted by this notice,
                     16:    and informs him of these rights.
                     17: 
                     18:    Permission is granted to distribute modified versions of this
                     19:    program's source code, or of portions of it, under the above
                     20:    conditions, plus the conditions that all changed files carry
                     21:    prominent notices stating who last changed them and that the
                     22:    derived material, including anything packaged together with it and
                     23:    conceptually functioning as a modification of it rather than an
                     24:    application of it, is in its entirety subject to a permission
                     25:    notice identical to this one.
                     26: 
                     27:    Permission is granted to distribute this program (verbatim or
                     28:    as modified) in compiled or executable form, provided verbatim
                     29:    redistribution is permitted as stated above for source code, and
                     30:     A.  it is accompanied by the corresponding machine-readable
                     31:       source code, under the above conditions, or
                     32:     B.  it is accompanied by a written offer, with no time limit,
                     33:       to distribute the corresponding machine-readable source code,
                     34:       under the above conditions, to any one, in return for reimbursement
                     35:       of the cost of distribution.   Verbatim redistribution of the
                     36:       written offer must be permitted.  Or,
                     37:     C.  it is distributed by someone who received only the
                     38:       compiled or executable form, and is accompanied by a copy of the
                     39:       written offer of source code which he received along with it.
                     40: 
                     41:    Permission is granted to distribute this program (verbatim or as modified)
                     42:    in executable form as part of a larger system provided that the source
                     43:    code for this program, including any modifications used,
                     44:    is also distributed or offered as stated in the preceding paragraph.
                     45: 
                     46: In other words, you are welcome to use, share and improve this program.
                     47: You are forbidden to forbid anyone else to use, share and improve
                     48: what you give them.   Help stamp out software-hoarding!  */
                     49: 
                     50: 
                     51: /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
                     52:    because it makes `envron' an initialized variable.
                     53:    It is easiest to have a special crt0.c on all machines
                     54:    though I don't know whether other machines actually need it.  */
                     55: 
                     56: /* On the vax and 68000, in BSD4.2 and USG5.2,
                     57:    this is the data format on startup:
                     58:   (vax) ap and fp are unpredictable as far as I know; don't use them.
                     59:   sp ->  word containing argc
                     60:          word pointing to first arg string
                     61:         [word pointing to next arg string]... 0 or more times
                     62:         0
                     63: Optionally:
                     64:         [word pointing to environment variable]... 1 or more times
                     65:         ...
                     66:         0
                     67: And always:
                     68:         first arg string
                     69:         [next arg string]... 0 or more times
                     70: */
                     71: 
                     72: /* On the 16000, at least in the one 4.2 system I know about,
                     73:   the initial data format is
                     74:   sp ->  word containing argc
                     75:          word containing argp
                     76:          word pointing to first arg string, and so on as above
                     77: */
                     78: 
                     79: #include "config.h"
                     80: 
                     81: /*             ********  WARNING ********
                     82:     Do not insert any data definitions before data_start!
                     83:     Since this is the first file linked, the address of the following
                     84:     variable should correspond to the start of initialized data space.
                     85:     On some systems this is a constant that is independent of the text
                     86:     size for shared executables.  On others, it is a function of the
                     87:     text size. In short, this seems to be the most portable way to
                     88:     discover the start of initialized data space dynamically at runtime,
                     89:     for either shared or unshared executables, on either swapping or
                     90:     virtual systems.  It only requires that the linker allocate objects
                     91:     in the order encountered, a reasonable model for most Unix systems.
                     92:     Similarly, note that the address of _start() should be the start
                     93:     of text space.   Fred Fish, UniSoft Systems Inc.  */
                     94:  
                     95: int data_start = 0;
                     96:    
                     97: #ifdef NEED_ERRNO
                     98: int errno = 0;
                     99: #endif
                    100:  
                    101: char **environ;
                    102: 
                    103: #if defined(orion) || defined(pyramid) || defined (celerity)
                    104: 
                    105: _start (argc, argv, envp)
                    106:      int argc;
                    107:      char **argv, **envp;
                    108: {
                    109:   environ = envp;
                    110: 
                    111:   exit (main (argc, argv, envp));
                    112: }
                    113: 
                    114: #endif /* orion or pyramid or celerity */
                    115: 
                    116: #if defined (ns16000) && !defined (sequent) && !defined (UMAX)
                    117: 
                    118: _start ()
                    119: {
                    120: /* On 16000, _start pushes fp onto stack */
                    121:   start1 ();
                    122: }
                    123: 
                    124: /* ignore takes care of skipping the fp value pushed in start.  */
                    125: static
                    126: start1 (ignore, argc, argv)
                    127:      int ignore;
                    128:      int argc;
                    129:      register char **argv;
                    130: {
                    131:   environ = argv + argc + 1;
                    132: 
                    133:   if (environ == *argv)
                    134:     environ--;
                    135:   exit (main (argc, argv, environ));
                    136: }
                    137: #endif /* ns16000, not sequent and not UMAX */
                    138: 
                    139: #ifdef UMAX
                    140: _start()
                    141: {
                    142:        asm("   exit []                 # undo enter");
                    143:        asm("   .set    exitsc,1");
                    144:        asm("   .set    sigcatchall,0x400");
                    145: 
                    146:        asm("   .globl  _exit");
                    147:        asm("   .globl  start");
                    148:        asm("   .globl  __start");
                    149:        asm("   .globl  _main");
                    150:        asm("   .globl  _environ");
                    151:        asm("   .globl  _sigvec");
                    152:        asm("   .globl  sigentry");
                    153: 
                    154:        asm("start:");
                    155:        asm("   br      .xstart");
                    156:        asm("   .org    0x20");
                    157:        asm("   .double p_glbl,0,0xf00000,0");
                    158:        asm("   .org    0x30");
                    159:        asm(".xstart:");
                    160:        asm("   adjspb  $8");
                    161:        asm("   movd    8(sp),0(sp)     # argc");
                    162:        asm("   addr    12(sp),r0");
                    163:        asm("   movd    r0,4(sp)        # argv");
                    164:        asm("L1:");
                    165:        asm("   movd    r0,r1");
                    166:        asm("   addqd   $4,r0");
                    167:        asm("   cmpqd   $0,0(r1)        # null args term ?");
                    168:        asm("   bne     L1");
                    169:        asm("   cmpd    r0,0(4(sp))     # end of 'env' or 'argv' ?");
                    170:        asm("   blt     L2");
                    171:        asm("   addqd   $-4,r0          # envp's are in list");
                    172:        asm("L2:");
                    173:        asm("   movd    r0,8(sp)        # env");
                    174:        asm("   movd    r0,@_environ    # indir is 0 if no env ; not 0 if env");
                    175:        asm("   movqd   $0,tos          # setup intermediate signal handler");
                    176:        asm("   addr    @sv,tos");
                    177:        asm("   movzwd  $sigcatchall,tos");
                    178:        asm("   jsr     @_sigvec");
                    179:        asm("   adjspb  $-12");
                    180:        asm("   jsr     @_main");
                    181:        asm("   adjspb  $-12");
                    182:        asm("   movd    r0,tos");
                    183:        asm("   jsr     @_exit");
                    184:        asm("   adjspb  $-4");
                    185:        asm("   addr    @exitsc,r0");
                    186:        asm("   svc");
                    187:        asm("   .align  4               # sigvec arg");
                    188:        asm("sv:");
                    189:        asm("   .double sigentry");
                    190:        asm("   .double 0");
                    191:        asm("   .double 0");
                    192: 
                    193:        asm("   .comm   p_glbl,1");
                    194: }
                    195: #endif /* UMAX */
                    196: 
                    197: #if defined(vax) || defined(tahoe) || defined (sequent) || defined (BOGUS)
                    198: 
                    199: #ifdef sequent
                    200: #define BOGUS bogus_fp,
                    201: #endif /* sequent */
                    202: 
                    203: #ifdef vax
                    204: #define BOGUS
                    205: #endif /* vax */
                    206: 
                    207: #ifdef tahoe
                    208: #define BOGUS
                    209: #endif /* tahoe */
                    210: 
                    211: /* Define symbol "start": here; some systems want that symbol.  */
                    212: #ifdef tower32
                    213: asm("  text            ");
                    214: asm("  global start    ");
                    215: #else
                    216: asm("  .text           ");
                    217: asm("  .globl start    ");
                    218: #endif
                    219: asm("  start:          ");
                    220: 
                    221: _start ()
                    222: {
                    223: /* On vax, nothing is pushed here  */
                    224: /* On sequent, bogus fp is pushed here  */
                    225:   start1 ();
                    226: }
                    227: 
                    228: static
                    229: start1 (BOGUS argc, xargv)
                    230:      int argc;
                    231:      char *xargv;
                    232: {
                    233:   register char **argv = &xargv;
                    234:   environ = argv + argc + 1;
                    235: 
                    236:   if ((char *)environ == xargv)
                    237:     environ--;
                    238:   exit (main (argc, argv, environ));
                    239: }
                    240: #else /* not vax or tahoe or sequent or BOGUS */
                    241: 
                    242: /* "m68k" and "m68000" both stand for m68000 processors,
                    243:    but with different program-entry conventions.
                    244:    This is a kludge.  Now that the BOGUS mechanism above exists,
                    245:    most of these machines could use the vax code above
                    246:    with some suitable definition of BOGUS.
                    247:    Then the symbol m68k could be flushed.
                    248:    But I don't want to risk breaking these machines
                    249:    in a version 17 patch release, so that change is being put off.  */
                    250: 
                    251: #ifdef m68k                    /* Can't do it all from C */
                    252: #ifdef STRIDE
                    253:        asm ("  comm    havefpu%,2");
                    254: #else /* m68k, not STRIDE */
                    255:        asm ("  data");
                    256:        asm ("  even");
                    257:        asm ("  global  splimit%");
                    258:        asm ("splimit%:");
                    259:        asm ("  space 4");
                    260: #endif /* STRIDE */
                    261:        asm ("  global  _start");
                    262:        asm ("  global  exit");
                    263:        asm ("  text");
                    264:        asm ("_start:");
                    265: #ifdef STRIDE
                    266:        asm ("  trap    &3");
                    267:        asm ("  mov.w   %d0,havefpu%");
                    268: #else /* m68k, not STRIDE */
                    269:        asm ("  mov.l   %d0,splimit%");
                    270: #endif /* STRIDE */
                    271:        asm ("  jsr     start1");
                    272:        asm ("  mov.l   %d0,(%sp)");
                    273:        asm ("  jsr     exit");
                    274:        asm ("  mov.l   &1,%d0");       /* d0 = 1 => exit */
                    275:        asm ("  trap    &0");
                    276: #else /* m68000, not m68k */
                    277: 
                    278: #ifdef m68000
                    279: 
                    280: _start ()
                    281: {
                    282: /* On 68000, _start pushes a6 onto stack  */
                    283:   start1 ();
                    284: }
                    285: #endif /* m68000 */
                    286: #endif /* m68k */
                    287: 
                    288: #if defined(m68k) || defined(m68000)
                    289: /* ignore takes care of skipping the a6 value pushed in start.  */
                    290: static
                    291: #ifdef m68k
                    292: start1 (argc, xargv)
                    293: #else
                    294: start1 (ignore, argc, xargv)
                    295: #endif
                    296:      int argc;
                    297:      char *xargv;
                    298: {
                    299:   register char **argv = &xargv;
                    300:   environ = argv + argc + 1;
                    301: 
                    302:   if ((char *)environ == xargv)
                    303:     environ--;
                    304: #ifdef sun2
                    305:   hack_sky();
                    306: #endif /* sun2 */
                    307:   exit (main (argc, argv, environ));
                    308: }
                    309: 
                    310: #endif /* m68k or m68000 */
                    311: 
                    312: #endif /* not vax or tahoe or sequent or BOGUS */
                    313: 
                    314: #ifdef hp9000s200
                    315: int argc_value;
                    316: char **argv_value;
                    317: 
                    318:        asm("   text");
                    319:        asm("   globl __start");
                    320:        asm("   globl _exit");
                    321:        asm("   globl _main");
                    322:        asm("__start");
                    323:        asm("   dc.l    0");
                    324:        asm("   subq.w  #0x1,d0");
                    325:        asm("   move.w  d0,float_soft");
                    326:        asm("   move.l  0x4(a7),d0");
                    327:        asm("   beq.s   skip_1");
                    328:        asm("   move.l  d0,a0");
                    329:        asm("   clr.l   -0x4(a0)");
                    330:        asm("skip_1");
                    331:        asm("   move.l  a7,a0");
                    332:        asm("   subq.l  #0x8,a7");
                    333:        asm("   move.l  (a0),(a7)");
                    334:        asm("   move.l  (a0),_argc_value");
                    335:        asm("   addq.l  #0x4,a0");
                    336:        asm("   move.l  a0,0x4(a7)");
                    337:        asm("   move.l  a0,_argv_value");
                    338:        asm("incr_loop");
                    339:        asm("   tst.l   (a0)+");
                    340:        asm("   bne.s   incr_loop");
                    341:        asm("   move.l  0x4(a7),a1");
                    342:        asm("   cmp.l   (a1),a0");
                    343:        asm("   blt.s   skip_2");
                    344:        asm("   subq.l  #0x4,a0");
                    345:        asm("skip_2");
                    346:        asm("   move.l  a0,0x8(a7)");
                    347:        asm("   move.l  a0,_environ");
                    348:        asm("   jsr     _main");
                    349:        asm("   addq.l  #0x8,a7");
                    350:        asm("   move.l  d0,-(a7)");
                    351:        asm("   jsr     _exit");
                    352:        asm("   move.w  #0x1,d0");
                    353:        asm("   trap    #0x0");
                    354:        asm("   comm    float_soft,4");
                    355: /* float_soft is allocated in this way because C would
                    356:    put an underscore character in its name otherwise. */ 
                    357: #endif /* hp9000s200 */

unix.superglobalmegacorp.com

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