(__data_start): Add __data_start variable.
[kopensolaris-gnu/glibc.git] / sysdeps / ia64 / elf / start.S
1 /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <asm/unistd.h>
21 #include <asm/fpu.h>
22
23 /*
24  * Arguments for __libc_start_main:
25  *      out0:   main
26  *      out1:   argc
27  *      out2:   argv
28  *      out3:   init
29  *      out4:   fini
30  *      out5:   rtld_fini
31  *      out6:   stack_end
32  */
33
34         .psr    abi64
35         .psr    lsb
36         .lsb
37
38         .text
39
40         .global _start#
41         .proc   _start#
42
43 _start:
44         { .mlx
45           alloc r2 = ar.pfs,0,0,7,0
46           movl r3 = FPSR_DEFAULT
47         }
48         { .mlx
49           adds out2 = 16, sp    /* get address of argc value */
50           movl gp = @gprel(0f)
51           ;;
52         }
53 0:      { .mii
54           ld8 out1 = [out2], 8  /* load argc and move out2 to become argv */
55           mov r9 = ip
56           ;;
57           sub gp = r9, gp       /* back-compute gp value */
58           ;;
59         }
60         { .mfi
61           mov ar.fpsr = r3
62           addl out0 = @ltoff(@fptr(main#)), gp
63         }
64         { .mfi
65           addl out4 = @ltoff(@fptr(_fini#)), gp
66           addl out3 = @ltoff(@fptr(_init#)), gp
67           ;;
68         }
69         { .mmi
70           ld8 out0 = [out0]     /* pointer to `main' function descriptor */
71           ld8 out3 = [out3]     /* pointer to `init' function descriptor */
72           adds out6 = 16, sp    /* highest non-environment stack address */
73         }
74         { .mib
75           ld8 out4 = [out4]     /* pointer to `fini' function descriptor */
76           mov out5 = ret0       /* dynamic linker destructor */
77           br.call.sptk.few rp = __libc_start_main#
78         }
79         { .mib
80           mov rp = r0
81           br.ret.sptk.few rp    /* break miserably if we ever return */
82           ;;
83         }
84         .endp   _start#
85
86 /* Define a symbol for the first piece of initialized data.  */
87         .data
88         .globl __data_start
89 __data_start:
90         .long 0
91         .weak data_start
92         data_start = __data_start