OSDN Git Service

clean up syntax/whitespace and a few variables to minimize diffs between i386/m68k
[uclinux-h8/uClibc.git] / ldso / ldso / m68k / dl-startup.h
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Architecture specific code used by dl-startup.c
4  * Copyright (C) 2005 by Erik Andersen <andersen@codepoet.org>
5  */
6
7 asm(
8     "   .text\n"
9     "   .globl  _start\n"
10     "   .type   _start,@function\n"
11     "_start:\n"
12     "   .set    _start,_dl_start\n"
13     "   .size   _start,.-_start\n"
14     "   .previous\n"
15 );
16
17 /* Get a pointer to the argv array.  On many platforms this can be just
18  * the address if the first argument, on other platforms we need to
19  * do something a little more subtle here.  */
20 #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned int *) & ARGS)
21
22 /* Handle relocation of the symbols in the dynamic loader. */
23 static inline
24 void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
25         unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
26 {
27         switch (ELF32_R_TYPE(rpnt->r_info))
28         {
29                 case R_68K_8:
30                         *(char *) reloc_addr = symbol_addr + rpnt->r_addend;
31                         break;
32                 case R_68K_16:
33                         *(short *) reloc_addr = symbol_addr + rpnt->r_addend;
34                         break;
35                 case R_68K_32:
36                         *reloc_addr = symbol_addr + rpnt->r_addend;
37                         break;
38                 case R_68K_PC8:
39                         *(char *) reloc_addr = (symbol_addr + rpnt->r_addend
40                                                - (unsigned int) reloc_addr);
41                         break;
42                 case R_68K_PC16:
43                         *(short *) reloc_addr = (symbol_addr + rpnt->r_addend
44                                                 - (unsigned int) reloc_addr);
45                         break;
46                 case R_68K_PC32:
47                         *reloc_addr = (symbol_addr + rpnt->r_addend
48                                       - (unsigned int) reloc_addr);
49                         break;
50                 case R_68K_GLOB_DAT:
51                 case R_68K_JMP_SLOT:
52                         *reloc_addr = symbol_addr;
53                         break;
54                 case R_68K_RELATIVE:
55                         *reloc_addr = ((unsigned int) load_addr +
56                                       (rpnt->r_addend ? : *reloc_addr));
57                         break;
58                 default:
59                         _dl_exit (1);
60         }
61 }
62
63 /* Transfer control to the user's application, once the dynamic loader is
64  * done.  This routine has to exit the current function, then call the
65  * _dl_elf_main function.  */
66 #define START() \
67         __asm__ volatile ( \
68                 "unlk %%a6\n\t" \
69                 "jmp %0@" \
70                 : : "a" (_dl_elf_main));