OSDN Git Service

ARC: ldso: Use @pcl syntax.
[uclinux-h8/uClibc.git] / ldso / ldso / arc / dl-startup.h
1 /*
2  * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
3  *
4  * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
5  */
6
7 /*
8  * vineetg: Refactoring/cleanup of loader entry point
9  *  Removed 6 useless insns
10  * Joern Improved it even further:
11  *  -better insn scheduling
12  *  -no need for conditional code for _dl_skip_args
13  *  -use of assembler .&2 expressions vs. @gotpc refs (avoids need for GP)
14  *
15  * What this code does:
16  *  -ldso starts execution here when kernel returns from execve()
17  *  -calls into generic ldso entry point _dl_start( )
18  *  -optionally adjusts argc for executable if exec passed as cmd
19  *  -calls into app main with address of finaliser
20  */
21 __asm__(
22     ".section .text                                             \n"
23     ".align 4                                                   \n"
24     ".global _start                                             \n"
25     ".hidden _start                                             \n"
26     ".type  _start,@function                                    \n"
27
28     "_start:                                                    \n"
29     "   ; ldso entry point, returns app entry point             \n"
30     "   bl.d    _dl_start                                       \n"
31     "   mov_s   r0, sp          ; pass ptr to aux vector tbl    \n"
32
33     "   ; If ldso ran as cmd with executable file nm as arg     \n"
34     "   ; skip the extra args calc by dl_start()                \n"
35     "   ld_s    r1, [sp]       ; orig argc from aux-vec Tbl     \n"
36     "   ld      r12, [pcl, _dl_skip_args@pcl]                   \n"
37
38     "   add     r2, pcl, _dl_fini@pcl       ; finalizer         \n"
39
40     "   add2    sp, sp, r12    ; discard argv entries from stack\n"
41     "   sub_s   r1, r1, r12    ; adjusted argc, on stack        \n"
42     "   st_s    r1, [sp]                                        \n"
43
44     "   j_s.d   [r0]           ; app entry point                \n"
45     "   mov_s   r0, r2         ; ptr to finalizer _dl_fini      \n"
46
47     ".size  _start,.-_start                                     \n"
48     ".previous                                                  \n"
49 );
50
51 /*
52  * Get a pointer to the argv array.  On many platforms this can be just
53  * the address if the first argument, on other platforms we need to
54  * do something a little more subtle here.
55  */
56 #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS + 1)
57
58 /*
59  * Dynamic loader bootstrapping:
60  * Since we don't modify text at runtime, these can only be data relos
61  * (so safe to assume that they are word aligned).
62  * And also they HAVE to be RELATIVE relos only
63  * @RELP is the relo entry being processed
64  * @REL is the pointer to the address we are relocating.
65  * @SYMBOL is the symbol involved in the relocation
66  * @LOAD is the load address.
67  */
68
69 #define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB)            \
70 do {                                                                    \
71         int type = ELF32_R_TYPE((RELP)->r_info);                        \
72         if (likely(type == R_ARC_RELATIVE))                             \
73                 *REL += (unsigned long) LOAD;                           \
74         else                                                            \
75                 _dl_exit(1);                                            \
76 }while(0)
77
78 /*
79  * This will go away once we have DT_RELACOUNT
80  */
81 #define ARCH_NEEDS_BOOTSTRAP_RELOCS
82
83 /* we dont need to spit out argc, argv etc for debugging */
84 #define NO_EARLY_SEND_STDERR    1