From 181d410ad00cddd1d6c9f4835e129136b74c5187 Mon Sep 17 00:00:00 2001 From: Vineet Gupta Date: Sat, 14 Feb 2015 15:25:37 +0530 Subject: ARC: Conditionalise certain relocations as provided by TLS tools only uClibc mainline supports NPTL which in turns depends on TLS support in the tools (gcc/binutils), which is yet to be merged in dev branches. However there is some non NPTL code in uClibc, added as part of NPTL effort, which relies on certain relocations only provided by NPTL binutils. As a result building the current upstream even for LT.old breaks. So conditionalize that code on tools, bu tin lack of specific versions, we use NPTL enabling as a sign the tools are equipped to handle those relos. Signed-off-by: Vineet Gupta Signed-off-by: Bernhard Reutner-Fischer --- extra/Configs/defconfigs/arc/defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'extra') diff --git a/extra/Configs/defconfigs/arc/defconfig b/extra/Configs/defconfigs/arc/defconfig index 840c59f0e..db4308f22 100644 --- a/extra/Configs/defconfigs/arc/defconfig +++ b/extra/Configs/defconfigs/arc/defconfig @@ -6,7 +6,7 @@ KERNEL_HEADERS="%KERNEL_HEADERS%" # LDSO_CACHE_SUPPORT is not set LDSO_RUNPATH=y # LDSO_SAFE_RUNPATH is not set -UCLIBC_HAS_THREADS_NATIVE=y +LINUXTHREADS_OLD=y PTHREADS_DEBUG_SUPPORT=y UCLIBC_HAS_OBSTACK=y UCLIBC_SUSV2_LEGACY=y -- cgit v1.2.3 From c049c4d872af18d668bb98094ce4334e44508fbe Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Sat, 14 Feb 2015 15:25:38 +0530 Subject: ARC: add configuration option for MMU page size ARC CPU may have MMU page size of 4/8(default)/16k. uClibc needs to have page size configured accodring to HW it will be run on. Signed-off-by: Alexey Brodkin Signed-off-by: Vineet Gupta Signed-off-by: Bernhard Reutner-Fischer --- extra/Configs/Config.arc | 17 +++++++++++++++++ libc/sysdeps/linux/arc/bits/uClibc_page.h | 17 +++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) (limited to 'extra') diff --git a/extra/Configs/Config.arc b/extra/Configs/Config.arc index 40ff114cf..dc32ba4fb 100644 --- a/extra/Configs/Config.arc +++ b/extra/Configs/Config.arc @@ -21,3 +21,20 @@ config CONFIG_ARC_CPU_700 ARCompact ISA based ARC CPU endchoice + +choice + prompt "MMU Page Size" + default CONFIG_ARC_PAGE_SIZE_8K + +config CONFIG_ARC_PAGE_SIZE_8K + bool "8KB" + help + Choose between 4k, 8k (default) or 16k + +config CONFIG_ARC_PAGE_SIZE_16K + bool "16KB" + +config CONFIG_ARC_PAGE_SIZE_4K + bool "4KB" + +endchoice diff --git a/libc/sysdeps/linux/arc/bits/uClibc_page.h b/libc/sysdeps/linux/arc/bits/uClibc_page.h index 26cec54c9..b05c57501 100755 --- a/libc/sysdeps/linux/arc/bits/uClibc_page.h +++ b/libc/sysdeps/linux/arc/bits/uClibc_page.h @@ -9,16 +9,25 @@ /* * ARC700/linux supports 4k, 8k, 16k pages (build time). - * We rely on the kernel exported header (aka uapi headers since 3.8) - * for PAGE_SIZE and friends. This avoids hand-editing here when building - * toolchain. * * Although uClibc determines page size dynamically, from kernel's auxv which * ARC Linux does pass, still the generic code needs a fall back * _dl_pagesize = auxvt[AT_PAGESZ].a_un.a_val ? : PAGE_SIZE * */ -#include + +#include + +#if defined(__CONFIG_ARC_PAGE_SIZE_16K__) +#define PAGE_SHIFT 14 +#elif defined(__CONFIG_ARC_PAGE_SIZE_4K__) +#define PAGE_SHIFT 12 +#else +#define PAGE_SHIFT 13 +#endif + +#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_MASK (~(PAGE_SIZE-1)) /* TBD: fix this with runtime value for a PAGE_SIZE agnostic uClibc */ #define MMAP2_PAGE_SHIFT PAGE_SHIFT -- cgit v1.2.3 From c2460b9b7b8c76098dfb1313be4aa4a4a65ff619 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Sat, 14 Feb 2015 15:25:39 +0530 Subject: ARC defconfigs: enable some items perf: UCLIBC_HAS_GLIBC_CUSTOM_STREAMS elfutils: UCLIBC_HAS_PROGRAM_INVOCATION_NAME Signed-off-by: Vineet Gupta Signed-off-by: Bernhard Reutner-Fischer --- extra/Configs/defconfigs/arc/defconfig | 2 ++ 1 file changed, 2 insertions(+) (limited to 'extra') diff --git a/extra/Configs/defconfigs/arc/defconfig b/extra/Configs/defconfigs/arc/defconfig index db4308f22..2dca4f9b3 100644 --- a/extra/Configs/defconfigs/arc/defconfig +++ b/extra/Configs/defconfigs/arc/defconfig @@ -12,6 +12,7 @@ UCLIBC_HAS_OBSTACK=y UCLIBC_SUSV2_LEGACY=y UCLIBC_SUSV3_LEGACY=y UCLIBC_SUSV4_LEGACY=y +UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y UCLIBC_SV4_DEPRECATED=y UCLIBC_HAS_RPC=y @@ -19,6 +20,7 @@ UCLIBC_HAS_FULL_RPC=y UCLIBC_HAS_RESOLVER_SUPPORT=y UCLIBC_HAS_LIBRESOLV_STUB=y UCLIBC_HAS_LOCALE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y UCLIBC_HAS_NFTW=y UCLIBC_HAS_FTW=y RUNTIME_PREFIX="%RUNTIME_PREFIX%" -- cgit v1.2.3 From 89b63496e88c31c2714e42656212078388718b78 Mon Sep 17 00:00:00 2001 From: Anton Kolesov Date: Wed, 4 Feb 2015 15:34:51 +0300 Subject: ARC: Add GNU glob to ARC defconfigs GNU glob is required by make. Signed-off-by: Anton Kolesov Cc: Vineet Gupta Signed-off-by: Bernhard Reutner-Fischer --- extra/Configs/defconfigs/arc/defconfig | 1 + extra/Configs/defconfigs/arc/tb10x_defconfig | 1 + 2 files changed, 2 insertions(+) (limited to 'extra') diff --git a/extra/Configs/defconfigs/arc/defconfig b/extra/Configs/defconfigs/arc/defconfig index 2dca4f9b3..490bc2267 100644 --- a/extra/Configs/defconfigs/arc/defconfig +++ b/extra/Configs/defconfigs/arc/defconfig @@ -23,6 +23,7 @@ UCLIBC_HAS_LOCALE=y UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y UCLIBC_HAS_NFTW=y UCLIBC_HAS_FTW=y +UCLIBC_HAS_GNU_GLOB=y RUNTIME_PREFIX="%RUNTIME_PREFIX%" DEVEL_PREFIX="%DEVEL_PREFIX%" CROSS_COMPILER_PREFIX="arc-linux-uclibc-" diff --git a/extra/Configs/defconfigs/arc/tb10x_defconfig b/extra/Configs/defconfigs/arc/tb10x_defconfig index 60065f97d..405a4eac7 100644 --- a/extra/Configs/defconfigs/arc/tb10x_defconfig +++ b/extra/Configs/defconfigs/arc/tb10x_defconfig @@ -30,6 +30,7 @@ UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y UCLIBC_HAS_PRINTF_M_SPEC=y UCLIBC_HAS_NFTW=y UCLIBC_HAS_FTW=y +UCLIBC_HAS_GNU_GLOB=y RUNTIME_PREFIX="%RUNTIME_PREFIX%" DEVEL_PREFIX="%DEVEL_PREFIX%" CROSS_COMPILER_PREFIX="arc-linux-uclibc-" -- cgit v1.2.3 From afab56958f1cbb47b831ee3ebff231dfbae74af2 Mon Sep 17 00:00:00 2001 From: Vineet Gupta Date: Thu, 19 Feb 2015 19:13:59 +0530 Subject: ARCv2 ISA support This is next gen Instruction Set Architecture from Synopsys and basis for the ARC HS family of processors. http://www.synopsys.com/dw/ipdir.php?ds=arc-hs38-processor&elq_mid=5732&elq_cid=458802 http://www.synopsys.com/IP/ProcessorIP/ARCProcessors/arc-hs/Pages/default.aspx Signed-off-by: Vineet Gupta Signed-off-by: Bernhard Reutner-Fischer --- Rules.mak | 1 + extra/Configs/Config.arc | 6 ++++ extra/Configs/Config.in | 1 + extra/Configs/defconfigs/arc/arcv2_defconfig | 33 ++++++++++++++++++++++ include/elf.h | 1 + ldso/ldso/arc/dl-sysdep.h | 15 ++++++++-- ldso/ldso/arc/elfinterp.c | 4 +++ libc/string/arc/memcmp.S | 29 +++++++++++++++++++ libc/sysdeps/linux/arc/bits/syscalls.h | 10 ++++++- libc/sysdeps/linux/arc/bits/uClibc_arch_features.h | 7 +++++ 10 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 extra/Configs/defconfigs/arc/arcv2_defconfig (limited to 'extra') diff --git a/Rules.mak b/Rules.mak index 9f5fe8564..ea254f1a2 100644 --- a/Rules.mak +++ b/Rules.mak @@ -543,6 +543,7 @@ endif ifeq ($(TARGET_ARCH),arc) CPU_CFLAGS-y += -mlock -mswape CPU_CFLAGS-$(CONFIG_ARC_CPU_700) += -mA7 + CPU_CFLAGS-$(CONFIG_ARC_CPU_HS) += -mcpu=archs CPU_LDFLAGS-y += $(CPU_CFLAGS) -marclinux endif diff --git a/extra/Configs/Config.arc b/extra/Configs/Config.arc index dc32ba4fb..0c0bc71ce 100644 --- a/extra/Configs/Config.arc +++ b/extra/Configs/Config.arc @@ -20,6 +20,12 @@ config CONFIG_ARC_CPU_700 help ARCompact ISA based ARC CPU +config CONFIG_ARC_CPU_HS + bool "ARC-HS" + select ARCH_HAS_MMU + help + Next Generation ARCv2 ISA based Processors + endchoice choice diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 8e603b2ad..84659650b 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -255,6 +255,7 @@ config TARGET_SUBARCH default "i486" if CONFIG_486 default "i586" if CONFIG_586 default "i686" if CONFIG_686 + default "arcv2" if CONFIG_ARC_CPU_HS default "" source "extra/Configs/Config.in.arch" diff --git a/extra/Configs/defconfigs/arc/arcv2_defconfig b/extra/Configs/defconfigs/arc/arcv2_defconfig new file mode 100644 index 000000000..d3a7dc7b2 --- /dev/null +++ b/extra/Configs/defconfigs/arc/arcv2_defconfig @@ -0,0 +1,33 @@ +CONFIG_ARC_CPU_HS=y +ARCH_WANTS_LITTLE_ENDIAN=y +# UCLIBC_HAS_FPU is not set +DO_C99_MATH=y +KERNEL_HEADERS="%KERNEL_HEADERS%" +# DOPIC is not set +# LDSO_CACHE_SUPPORT is not set +LDSO_RUNPATH=y +# LDSO_SAFE_RUNPATH is not set +LINUXTHREADS_OLD=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_OBSTACK=y +UCLIBC_SUSV2_LEGACY=y +UCLIBC_SUSV3_LEGACY=y +UCLIBC_SUSV4_LEGACY=y +UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y +UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y +UCLIBC_SV4_DEPRECATED=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y +UCLIBC_HAS_RESOLVER_SUPPORT=y +UCLIBC_HAS_LIBRESOLV_STUB=y +UCLIBC_HAS_LOCALE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_NFTW=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GNU_GLOB=y +RUNTIME_PREFIX="%RUNTIME_PREFIX%" +DEVEL_PREFIX="%DEVEL_PREFIX%" +CROSS_COMPILER_PREFIX="arc-linux-uclibc-" +# DOSTRIP is not set +SUPPORT_LD_DEBUG=y +UCLIBC_HAS_BACKTRACE=y diff --git a/include/elf.h b/include/elf.h index 1979209cd..facf09cd5 100644 --- a/include/elf.h +++ b/include/elf.h @@ -378,6 +378,7 @@ typedef struct /* Xilinx Microblaze (official) */ #define EM_MICROBLAZE 189 +#define EM_ARCV2 195 /* ARCv2 Cores */ /* Legal values for e_version (version). */ diff --git a/ldso/ldso/arc/dl-sysdep.h b/ldso/ldso/arc/dl-sysdep.h index 08b3bade8..ca62a2c04 100644 --- a/ldso/ldso/arc/dl-sysdep.h +++ b/ldso/ldso/arc/dl-sysdep.h @@ -69,11 +69,16 @@ do { \ } while(0) /* Here we define the magic numbers that this dynamic loader should accept */ +#ifdef __A7__ #define MAGIC1 EM_ARCOMPACT +#define ELF_TARGET "ARCompact" /* For error messages */ +#elif defined(__HS__) +#define MAGIC1 EM_ARCV2 +#define ELF_TARGET "ARCv2" /* For error messages */ +#endif + #undef MAGIC2 -/* Used for error messages */ -#define ELF_TARGET "ARC" struct elf_resolve; extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, @@ -81,6 +86,8 @@ extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, extern unsigned __udivmodsi4(unsigned, unsigned) attribute_hidden; +#ifdef __A7__ +/* using "C" causes an indirection via __umodsi3 -> __udivmodsi4 */ #define do_rem(result, n, base) ((result) = \ \ __builtin_constant_p (base) ? (n) % (unsigned) (base) : \ @@ -95,6 +102,10 @@ extern unsigned __udivmodsi4(unsigned, unsigned) attribute_hidden; r1; \ }) \ ) +#elif defined(__HS__) +/* ARCv2 has hardware assisted divide/mod */ +#define do_rem(result, n, base) ((result) = (n) % (unsigned) (base)) +#endif /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or TLS variable so PLT entries should not be allowed to define the value. diff --git a/ldso/ldso/arc/elfinterp.c b/ldso/ldso/arc/elfinterp.c index d26c94705..7c31d3ac7 100644 --- a/ldso/ldso/arc/elfinterp.c +++ b/ldso/ldso/arc/elfinterp.c @@ -11,7 +11,11 @@ */ #include "ldso.h" +#ifdef __A7__ #define ARC_PLT_SIZE 12 +#else +#define ARC_PLT_SIZE 16 +#endif unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, unsigned int plt_pc) diff --git a/libc/string/arc/memcmp.S b/libc/string/arc/memcmp.S index 4c0e39143..a60757e7a 100644 --- a/libc/string/arc/memcmp.S +++ b/libc/string/arc/memcmp.S @@ -24,14 +24,32 @@ ENTRY(memcmp) ld r4,[r0,0] ld r5,[r1,0] lsr.f lp_count,r3,3 +#ifdef __HS__ + /* In ARCv2 a branch can't be the last instruction in a zero overhead + * loop. + * So we move the branch to the start of the loop, duplicate it + * after the end, and set up r12 so that the branch isn't taken + * initially. + */ + mov_s r12,WORD2 + lpne .Loop_end + brne WORD2,r12,.Lodd + ld WORD2,[r0,4] +#else lpne .Loop_end ld_s WORD2,[r0,4] +#endif ld_s r12,[r1,4] brne r4,r5,.Leven ld.a r4,[r0,8] ld.a r5,[r1,8] +#ifdef __HS__ +.Loop_end: + brne WORD2,r12,.Lodd +#else brne WORD2,r12,.Lodd .Loop_end: +#endif asl_s SHIFT,SHIFT,3 bhs_s .Last_cmp brne r4,r5,.Leven @@ -99,14 +117,25 @@ ENTRY(memcmp) ldb r4,[r0,0] ldb r5,[r1,0] lsr.f lp_count,r3 +#ifdef __HS__ + mov r12,r3 lpne .Lbyte_end + brne r3,r12,.Lbyte_odd +#else + lpne .Lbyte_end +#endif ldb_s r3,[r0,1] ldb r12,[r1,1] brne r4,r5,.Lbyte_even ldb.a r4,[r0,2] ldb.a r5,[r1,2] +#ifdef __HS__ +.Lbyte_end: + brne r3,r12,.Lbyte_odd +#else brne r3,r12,.Lbyte_odd .Lbyte_end: +#endif bcc .Lbyte_even brne r4,r5,.Lbyte_even ldb_s r3,[r0,1] diff --git a/libc/sysdeps/linux/arc/bits/syscalls.h b/libc/sysdeps/linux/arc/bits/syscalls.h index 5da6aadb3..248ef7844 100644 --- a/libc/sysdeps/linux/arc/bits/syscalls.h +++ b/libc/sysdeps/linux/arc/bits/syscalls.h @@ -98,7 +98,11 @@ extern int __syscall_error (int); * for syscall itself. *-------------------------------------------------------------------------*/ -#define ARC_TRAP_INSN "trap0 \n\t" +#ifdef __A7__ +#define ARC_TRAP_INSN "trap0 \n\t" +#elif defined(__HS__) +#define ARC_TRAP_INSN "trap_s 0 \n\t" +#endif #define INTERNAL_SYSCALL_NCS(nm, err, nr_args, args...) \ ({ \ @@ -176,7 +180,11 @@ extern int __syscall_error (int); #else +#ifdef __A7__ #define ARC_TRAP_INSN trap0 +#elif defined(__HS__) +#define ARC_TRAP_INSN trap_s 0 +#endif #endif /* __ASSEMBLER__ */ diff --git a/libc/sysdeps/linux/arc/bits/uClibc_arch_features.h b/libc/sysdeps/linux/arc/bits/uClibc_arch_features.h index 8af6eca4c..451575586 100755 --- a/libc/sysdeps/linux/arc/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/arc/bits/uClibc_arch_features.h @@ -47,4 +47,11 @@ /* The default ';' is a comment on ARC. */ #define __UCLIBC_ASM_LINE_SEP__ ` +/* does your target align 64bit values in register pairs ? (32bit arches only) */ +#if defined(__A7__) +#undef __UCLIBC_SYSCALL_ALIGN_64BIT__ +#else +#define __UCLIBC_SYSCALL_ALIGN_64BIT__ +#endif + #endif /* _BITS_UCLIBC_ARCH_FEATURES_H */ -- cgit v1.2.3 From 409f14d9b5e47513d5c939120a33965997c8ceb2 Mon Sep 17 00:00:00 2001 From: Steve Ellcey Date: Thu, 19 Feb 2015 16:03:26 -0800 Subject: Allow use of executable RUNPATH/RPATH when finding libraries. This option will modify ldso so that it will use the executables RUNPATH/RPATH to find to find libraries even though this behavour is not standard. Setting this option causes the uclibc dynamic linker behavour to match the glibc dynamic linker. Signed-off-by: Steve Ellcey Signed-off-by: Bernhard Reutner-Fischer --- extra/Configs/Config.in | 9 +++++++++ ldso/ldso/dl-elf.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'extra') diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 84659650b..f5210cdf9 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -419,6 +419,15 @@ config LDSO_RUNPATH Usage of RUNPATH tags is not too common, so disabling this feature should be safe for most people. +config LDSO_RUNPATH_OF_EXECUTABLE + bool "Use executables RUNPATH/RPATH when searching for libraries." + depends on LDSO_RUNPATH + default n + help + Use the executables RUNPATH/RPATH to find to find libraries even + though this behavour is not standard. Setting this option causes + the uclibc dynamic linker behavour to match the glibc dynamic linker. + config LDSO_SAFE_RUNPATH bool "Allow only RUNPATH beginning with /" depends on LDSO_RUNPATH diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index 54501d143..56319056d 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -308,6 +308,38 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp if (tpnt1 != NULL) return tpnt1; +#ifdef __LDSO_RUNPATH_OF_EXECUTABLE__ + /* Very last resort, try the executable's DT_RUNPATH and DT_RPATH */ + /* http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#shobj_dependencies + * The set of directories specified by a given DT_RUNPATH entry is + * used to find only the immediate dependencies of the executable or + * shared object containing the DT_RUNPATH entry. That is, it is + * used only for those dependencies contained in the DT_NEEDED + * entries of the dynamic structure containing the DT_RUNPATH entry, + * itself. One object's DT_RUNPATH entry does not affect the search + * for any other object's dependencies. + * + * glibc (around 2.19) violates this and the usual suspects are + * abusing this bug^Wrelaxed, user-friendly behaviour. + */ + + pnt = (char *) _dl_loaded_modules->dynamic_info[DT_RUNPATH]; + if (pnt) { + pnt += (unsigned long) _dl_loaded_modules->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching exe's RUNPATH='%s'\n", pnt); + if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) + return tpnt1; + } + pnt = (char *) _dl_loaded_modules->dynamic_info[DT_RPATH]; + if (pnt) { + pnt += (unsigned long) _dl_loaded_modules->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching exe's RPATH='%s'\n", pnt); + if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) + return tpnt1; + } +#endif + + goof: /* Well, we shot our wad on that one. All we can do now is punt */ if (_dl_internal_error_number) -- cgit v1.2.3