summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkos Chandras <markos.chandras@imgtec.com>2010-09-21 12:43:19 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2013-03-14 22:47:08 +0100
commite3436cc40d8ebf4303d0ba5bb24f21edf41fd1e8 (patch)
tree602f66aec3ddb19cf9af50ce9382c33d1334bfcc
parentcf349fcbb555b77f22d96fe3a7b25579337ab989 (diff)
metag: Add support for loading shared objects into core memories.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
-rw-r--r--ldso/ldso/metag/dl-inlines.h39
-rw-r--r--ldso/ldso/metag/dl-sysdep.h25
2 files changed, 64 insertions, 0 deletions
diff --git a/ldso/ldso/metag/dl-inlines.h b/ldso/ldso/metag/dl-inlines.h
new file mode 100644
index 000000000..82fba93ab
--- /dev/null
+++ b/ldso/ldso/metag/dl-inlines.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013, Imagination Technologies Ltd.
+ *
+ * Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+ */
+
+static __always_inline int
+__dl_is_special_segment (Elf32_Ehdr *epnt,
+ Elf32_Phdr *ppnt)
+{
+ if (ppnt->p_type != PT_LOAD &&
+ ppnt->p_type != PT_DYNAMIC)
+ return 0;
+
+ if (ppnt->p_vaddr >= 0x80000000 &&
+ ppnt->p_vaddr < 0x82060000)
+ return 1;
+
+ if (ppnt->p_vaddr >= 0xe0200000 &&
+ ppnt->p_vaddr < 0xe0260000)
+ return 1;
+
+ return 0;
+}
+
+static __always_inline char *
+__dl_map_segment (Elf32_Ehdr *epnt,
+ Elf32_Phdr *ppnt,
+ int infile,
+ int flags)
+{
+ char *addr = (char *)ppnt->p_vaddr;
+
+ if (_DL_PREAD (infile, addr, ppnt->p_filesz, ppnt->p_offset) != ppnt->p_filesz) {
+ return 0;
+ }
+
+ return addr;
+}
diff --git a/ldso/ldso/metag/dl-sysdep.h b/ldso/ldso/metag/dl-sysdep.h
index 55e8d1f66..29547cb34 100644
--- a/ldso/ldso/metag/dl-sysdep.h
+++ b/ldso/ldso/metag/dl-sysdep.h
@@ -96,3 +96,28 @@ elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr,
}
#define DL_MALLOC_ALIGN 8
+
+#define HAVE_DL_INLINES_H
+
+#define DL_IS_SPECIAL_SEGMENT(EPNT, PPNT) \
+ __dl_is_special_segment(EPNT, PPNT)
+#define DL_MAP_SEGMENT(EPNT, PPNT, INFILE, FLAGS) \
+ __dl_map_segment (EPNT, PPNT, INFILE, FLAGS)
+
+#define DL_CHECK_LIB_TYPE(epnt, piclib, _dl_progname, libname) \
+do \
+{ \
+ ElfW(Phdr) *ppnt_; \
+ char *header_ = (char *)epnt; \
+ ppnt_ = (ElfW(Phdr) *)(intptr_t) & header_[epnt->e_phoff]; \
+ if (ppnt_->p_vaddr >= 0x80000000 && \
+ ppnt_->p_vaddr < 0x82060000) \
+ (piclib) = 2; \
+ if (ppnt_->p_vaddr >= 0xe0200000 && \
+ ppnt_->p_vaddr < 0xe0260000) \
+ (piclib) = 2; \
+} \
+while (0)
+
+#define _DL_PREAD(FD, BUF, SIZE, OFFSET) \
+ (_dl_pread((FD), (BUF), (SIZE), (OFFSET)))