1117531Smarcel/* 2117531Smarcel * Copyright (c) 2003 Marcel Moolenaar 3117531Smarcel * All rights reserved. 4117531Smarcel * 5117531Smarcel * Redistribution and use in source and binary forms, with or without 6117531Smarcel * modification, are permitted provided that the following conditions 7117531Smarcel * are met: 8117531Smarcel * 9117531Smarcel * 1. Redistributions of source code must retain the above copyright 10117531Smarcel * notice, this list of conditions and the following disclaimer. 11117531Smarcel * 2. Redistributions in binary form must reproduce the above copyright 12117531Smarcel * notice, this list of conditions and the following disclaimer in the 13117531Smarcel * documentation and/or other materials provided with the distribution. 14117531Smarcel * 15117531Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16117531Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17117531Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18117531Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19117531Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20117531Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21117531Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22117531Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23117531Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24117531Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25117531Smarcel */ 26117531Smarcel 27216338Sdim#include <machine/asm.h> 28216338Sdim__FBSDID("$FreeBSD$"); 29117531Smarcel 30117531Smarcel .text 31117531Smarcel 32117531Smarcel/* 33117531Smarcel * void _start(char **ap, struct ps_strings *, void (*cleanup)(void)); 34117531Smarcel */ 35117531Smarcel#define AP in0 36117531Smarcel#define CLEANUP in2 37117531Smarcel 38117531Smarcel#define GP loc0 39117531Smarcel#define ARGC loc1 40117531Smarcel#define ARGV loc2 41117531Smarcel#define ENVP loc3 42117531Smarcel 43117531Smarcel .global _start 44117531Smarcel .type _start, @function 45117531Smarcel .proc _start 46117531Smarcel_start: 47117531Smarcel .prologue 48117531Smarcel .save rp, r0 49117531Smarcel .body 50117531Smarcel{ .mlx 51117531Smarcel alloc r14=ar.pfs,3,4,3,0 52117531Smarcel movl r15=@gprel(1f) 53117531Smarcel} 54117531Smarcel1: 55117531Smarcel{ .mmi 56117531Smarcel ld4 ARGC=[AP] 57117531Smarcel adds ARGV=8,AP 58117531Smarcel mov r16=ip 59117531Smarcel ;; 60117531Smarcel} 61117531Smarcel{ .mmi 62117531Smarcel sub gp=r16,r15 63117531Smarcel sub GP=r16,r15 64117531Smarcel shladd r14=ARGC,3,AP 65117531Smarcel ;; 66117531Smarcel} 67117531Smarcel{ .mii 68117531Smarcel addl r15=@ltoff(environ),gp 69117531Smarcel cmp4.ge p6,p7=0,ARGC 70117531Smarcel adds ENVP=16,r14 71117531Smarcel ;; 72117531Smarcel} 73117531Smarcel{ .mmi 74117531Smarcel ld8 r14=[r15] 75117531Smarcel(p7) ld8 r15=[ARGV] 76117531Smarcel addl r16=@gprel(__progname),gp 77117531Smarcel ;; 78117531Smarcel} 79117531Smarcel{ .mib 80117531Smarcel st8 [r14]=ENVP 81117531Smarcel(p7) cmp.eq p6,p0=0,r15 82117531Smarcel(p6) br.dpnt .L1 83117531Smarcel ;; 84117531Smarcel} 85117531Smarcel /* Normalize __progname. */ 86117531Smarcel{ .mmi 87117531Smarcel st8 [r16]=r15 88117531Smarcel ld1 r14=[r15],1 89117531Smarcel nop 0 90117531Smarcel ;; 91117531Smarcel} 92117531Smarcel.L0: 93117531Smarcel{ .mib 94117531Smarcel cmp4.eq p7,p0=0,r14 95117531Smarcel cmp4.eq p6,p0=0x2f,r14 96117531Smarcel(p7) br.dptk .L1 97117531Smarcel ;; 98117531Smarcel} 99117531Smarcel{ .mmb 100117531Smarcel(p6) st8 [r16]=r15 101117531Smarcel ld1 r14=[r15],1 102117531Smarcel br.dptk.many .L0 103117531Smarcel} 104117531Smarcel.L1: 105117531Smarcel{ .mib 106117531Smarcel cmp.ne p7,p0=0,CLEANUP 107117531Smarcel mov out0=CLEANUP 108117531Smarcel(p7) br.call.sptk b0=atexit 109117531Smarcel ;; 110117531Smarcel} 111133754Sdfr{ .mfb 112133989Smarcel mov gp=GP 113133754Sdfr nop 0 114133754Sdfr br.call.sptk b0=_init_tls 115133754Sdfr} 116117531Smarcel#ifdef GCRT 117117531Smarcel{ .mmi 118117531Smarcel mov gp=GP 119117531Smarcel ;; 120117531Smarcel addl r14=@ltoff(@fptr(_mcleanup)),gp 121117531Smarcel nop 0 122117531Smarcel ;; 123117531Smarcel} 124117531Smarcel{ .mfb 125117531Smarcel ld8 out0=[r14] 126117531Smarcel nop 0 127117531Smarcel br.call.sptk b0=atexit 128117531Smarcel ;; 129117531Smarcel} 130117531Smarcel#endif 131117531Smarcel{ .mmi 132117531Smarcel mov gp=GP 133117531Smarcel ;; 134117531Smarcel addl r14=@ltoff(@fptr(_fini)),gp 135117531Smarcel nop 0 136117531Smarcel ;; 137117531Smarcel} 138117531Smarcel{ .mfb 139117531Smarcel ld8 out0=[r14] 140117531Smarcel nop 0 141117531Smarcel br.call.sptk b0=atexit 142117531Smarcel ;; 143117531Smarcel} 144117531Smarcel#ifdef GCRT 145117531Smarcel{ .mmi 146117531Smarcel mov gp=GP 147117531Smarcel ;; 148117531Smarcel addl r14=@ltoff(eprol),gp 149117531Smarcel addl r15=@ltoff(etext),gp 150117531Smarcel ;; 151117531Smarcel} 152117531Smarcel{ .mmb 153117531Smarcel ld8 out0=[r14] 154117531Smarcel ld8 out1=[r15] 155117531Smarcel br.call.sptk b0=monstartup 156117531Smarcel ;; 157117531Smarcel} 158117531Smarcel#endif 159117531Smarcel{ .mfb 160117531Smarcel mov gp=GP 161117531Smarcel nop 0 162117531Smarcel br.call.sptk b0=_init 163117531Smarcel ;; 164117531Smarcel} 165117531Smarcel{ .mmi 166117531Smarcel mov gp=GP 167117531Smarcel mov out0=ARGC 168117531Smarcel mov out1=ARGV 169117531Smarcel} 170117531Smarcel{ .mfb 171117531Smarcel mov out2=ENVP 172117531Smarcel nop 0 173117531Smarcel br.call.sptk b0=main 174117531Smarcel ;; 175117531Smarcel} 176117531Smarcel{ .mib 177117531Smarcel mov gp=GP 178117606Smarcel mov out0=r8 179117531Smarcel br.call.sptk b0=exit 180117531Smarcel ;; 181117531Smarcel} 182117531Smarcel .endp _start 183117531Smarcel 184117531Smarcel#ifdef GCRT 185117531Smarceleprol: 186117531Smarcel#endif 187117531Smarcel 188117531Smarcel .rodata 189117531Smarcel.empty: stringz "" 190117531Smarcel 191117531Smarcel .sdata 192117531Smarcel .global __progname 193117531Smarcel .size __progname,8 194117531Smarcel .type __progname,@object 195117531Smarcel__progname: data8 .empty 196117531Smarcel 197117531Smarcel .common environ,8,8 198