2 * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
4 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
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)
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
26 ".type _start,@function \n"
29 " ; ldso entry point, returns app entry point \n"
31 " mov_s r0, sp ; pass ptr to aux vector tbl \n"
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"
38 " add r2, pcl, _dl_fini@pcl ; finalizer \n"
40 " add2 sp, sp, r12 ; discard argv entries from stack\n"
41 " sub_s r1, r1, r12 ; adjusted argc, on stack \n"
44 " j_s.d [r0] ; app entry point \n"
45 " mov_s r0, r2 ; ptr to finalizer _dl_fini \n"
47 ".size _start,.-_start \n"
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.
56 #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS + 1)
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.
69 #define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB) \
71 int type = ELF32_R_TYPE((RELP)->r_info); \
72 if (likely(type == R_ARC_RELATIVE)) \
73 *REL += (unsigned long) LOAD; \
79 * This will go away once we have DT_RELACOUNT
81 #define ARCH_NEEDS_BOOTSTRAP_RELOCS
83 /* we dont need to spit out argc, argv etc for debugging */
84 #define NO_EARLY_SEND_STDERR 1