OSDN Git Service

fixup so we can at least get to the ldso Standalone execution step
authorMike Frysinger <vapier@gentoo.org>
Sat, 14 Jan 2006 07:14:40 +0000 (07:14 -0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 14 Jan 2006 07:14:40 +0000 (07:14 -0000)
ldso/ldso/m68k/dl-startup.h

index 07857cf..1a74cb1 100644 (file)
@@ -4,23 +4,43 @@
  * Copyright (C) 2005 by Erik Andersen <andersen@codepoet.org>
  */
 
-asm(
-    "  .text\n"
-    "  .globl  _start\n"
-    "  .type   _start,@function\n"
-    "_start:\n"
-    "  .set    _start,_dl_start\n"
-    "  .size   _start,.-_start\n"
-    "  .previous\n"
-);
+asm ("\
+       .text\n\
+       .globl _start\n\
+       .type _start,@function\n\
+_start:\n\
+       move.l %sp, -(%sp)\n\
+       jbsr _dl_start\n\
+       addq.l #4, %sp\n\
+       # Save the user entry point address in %a4.\n\
+       move.l %d0, %a4\n\
+       # See if we were run as a command with the executable file\n\
+       # name as an extra leading argument.\n\
+       move.l _dl_skip_args(%pc), %d0\n\
+       # Pop the original argument count\n\
+       move.l (%sp)+, %d1\n\
+       # Subtract _dl_skip_args from it.\n\
+       sub.l %d0, %d1\n\
+       # Adjust the stack pointer to skip _dl_skip_args words.\n\
+       lea (%sp, %d0*4), %sp\n\
+       # Push back the modified argument count.\n\
+       move.l %d1, -(%sp)\n\
+       # Pass our finalizer function to the user in %a1.\n\
+       lea _dl_fini(%pc), %a1\n\
+       # Initialize %fp with the stack pointer.\n\
+       move.l %sp, %fp\n\
+       # Jump to the user's entry point.\n\
+       jmp (%a4)\n\
+       .size _dl_start_user, . - _dl_start_user\n\
+       .previous");
 
 /* Get a pointer to the argv array.  On many platforms this can be just
  * the address if the first argument, on other platforms we need to
  * do something a little more subtle here.  */
-#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned int *) & ARGS)
+#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1)
 
 /* Handle relocation of the symbols in the dynamic loader. */
-static inline
+static __always_inline
 void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
        unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
 {
@@ -63,8 +83,4 @@ void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
 /* Transfer control to the user's application, once the dynamic loader is
  * done.  This routine has to exit the current function, then call the
  * _dl_elf_main function.  */
-#define START() \
-       __asm__ volatile ( \
-               "unlk %%a6\n\t" \
-               "jmp %0@" \
-               : : "a" (_dl_elf_main));
+#define START() return _dl_elf_main