summaryrefslogtreecommitdiff
path: root/ldso
diff options
context:
space:
mode:
Diffstat (limited to 'ldso')
-rw-r--r--ldso/include/dl-syscall.h4
-rw-r--r--ldso/ldso/m68k/dl-startup.h15
-rw-r--r--ldso/ldso/m68k/dl-sysdep.h20
3 files changed, 30 insertions, 9 deletions
diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h
index 1cbbbad0f..0b0b0ef1d 100644
--- a/ldso/include/dl-syscall.h
+++ b/ldso/include/dl-syscall.h
@@ -152,7 +152,7 @@ static __always_inline _syscall2(int, _dl_gettimeofday, struct timeval *, tv,
# define __NR__dl_mmap __NR_mmap
static __always_inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
int, prot, int, flags, int, fd, off_t, offset);
-
+#if !defined (__mcoldfire__) // Might be a kernel problem. failed on 2.6.25
/* then try mmap2() */
#elif defined(__NR_mmap2)
@@ -176,7 +176,7 @@ static __always_inline void * _dl_mmap(void * addr, unsigned long size, int prot
return __syscall_mmap2(addr, size, prot, flags,
fd, (off_t) (offset >> MMAP2_PAGE_SHIFT));
}
-
+#endif
/* finally, fall back to mmap(), syscall1() style */
#elif defined(__NR_mmap)
diff --git a/ldso/ldso/m68k/dl-startup.h b/ldso/ldso/m68k/dl-startup.h
index 2c38102a3..13530e05c 100644
--- a/ldso/ldso/m68k/dl-startup.h
+++ b/ldso/ldso/m68k/dl-startup.h
@@ -4,6 +4,17 @@
* Copyright (C) 2005 by Erik Andersen <andersen@codepoet.org>
*/
+/* Perform operation OP with PC-relative SRC as the first operand and
+ * DST as the second. TMP is available as a temporary if needed. */
+
+#ifdef __mcoldfire__
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ "move.l #" SRC " - ., " TMP "\n\t" OP " (-8, " PC ", " TMP "), " DST
+#else
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ OP " " SRC "(" PC "), " DST
+#endif
+
__asm__ ("\
.text\n\
.globl _start\n\
@@ -21,7 +32,7 @@ _dl_start_user:\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\
+ " PCREL_OP ("move.l", "_dl_skip_args", "%d0", "%d0", "%pc") "\n\
# Pop the original argument count\n\
move.l (%sp)+, %d1\n\
# Subtract _dl_skip_args from it.\n\
@@ -31,7 +42,7 @@ _dl_start_user:\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\
+ " PCREL_OP ("lea", "_dl_fini", "%a1", "%a1", "%pc") "\n\
# Initialize %fp with the stack pointer.\n\
move.l %sp, %fp\n\
# Jump to the user's entry point.\n\
diff --git a/ldso/ldso/m68k/dl-sysdep.h b/ldso/ldso/m68k/dl-sysdep.h
index 259cb84be..b5eda4e9c 100644
--- a/ldso/ldso/m68k/dl-sysdep.h
+++ b/ldso/ldso/m68k/dl-sysdep.h
@@ -42,19 +42,29 @@ extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
static __always_inline Elf32_Addr
elf_machine_dynamic (void)
{
- register Elf32_Addr *got __asm__ ("%a5");
- return *got;
+ Elf32_Addr got;
+
+ __asm__ ("move.l _DYNAMIC@GOT.w(%%a5), %0"
+ : "=a" (got));
+ return got;
}
+#ifdef __mcoldfire__
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ "move.l #" SRC " - ., " TMP "\n\t" OP " (-8, " PC ", " TMP "), " DST
+#else
+#define PCREL_OP(OP, SRC, DST, TMP, PC) \
+ OP " " SRC "(" PC "), " DST
+#endif
/* Return the run-time load address of the shared object. */
static __always_inline Elf32_Addr
elf_machine_load_address (void)
{
Elf32_Addr addr;
- __asm__ ("lea _dl_start(%%pc), %0\n\t"
- "sub.l _dl_start@GOT.w(%%a5), %0"
- : "=a" (addr));
+ __asm__ (PCREL_OP ("lea", "_dl_start", "%0", "%0", "%%pc") "\n\t"
+ "sub.l _dl_start@GOT.w(%%a5), %0"
+ : "=a" (addr));
return addr;
}