From e3436cc40d8ebf4303d0ba5bb24f21edf41fd1e8 Mon Sep 17 00:00:00 2001 From: Markos Chandras Date: Tue, 21 Sep 2010 12:43:19 +0000 Subject: metag: Add support for loading shared objects into core memories. Signed-off-by: Markos Chandras Signed-off-by: Bernhard Reutner-Fischer --- ldso/ldso/metag/dl-inlines.h | 39 +++++++++++++++++++++++++++++++++++++++ ldso/ldso/metag/dl-sysdep.h | 25 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 ldso/ldso/metag/dl-inlines.h (limited to 'ldso') 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))) -- cgit v1.2.3