diff options
269 files changed, 3031 insertions, 5158 deletions
diff --git a/Changelog-2010 b/Changelog-2010 deleted file mode 100644 index e70ec6888..000000000 --- a/Changelog-2010 +++ /dev/null @@ -1,804 +0,0 @@ -0.9.31 2 April 2010 - - Upgrade notices from previous versions. - o On x86_64 the format of /var/run/utmp changed compared to previous - versions. To retain compatibility with glibc we now define - __WORDSIZE_COMPAT32. If you are certain that you will never use - glibc nor run in i386 mode on your x86_64 installation, you can - remove this definition from wordsize.h. - Otherwise you have to delete /var/run/utmp on x86_64 hosts when - upgrading to 0.9.31 - o The SHARED_LIB_LOADER_PREFIX was renamed to a single path - component called MULTILIB_DIR and defaults to 'lib'. - -0.9.27 12 January 2005 - - This has been a long time in the making... Release highlights: - o New stdio implementation - o New optimized string functions - o Major improvements to the shared lib loader - o Shared libraries work properly on powerpc - o Debugging works on mips - o New architectures: frv, nios, nios2, bfin - o Linux 2.6.x kernel support - o Lots and lots of bug fixes - - This release is NOT binary compatible with uClibc 0.9.26 or any earlier - release, so be prepared to recompile your software if you are still using - an old version of uClibc. - - -Erik - - - -0.9.26 3 January 2004 - - This simply adds a fix for a pthread bug that was noticed a few hours - after the previous release. Otherwise identical to 0.9.25. - - This release remains binary compatible with uClibc 0.9.21-25 as long as - you take care to avoid any configuraton changes that will break things. - We _were_ planning to break binary compatibilty in this release, but - decided to hold those changes so we could push out a bugfix release. - - We _will_ break binary compatibilty in the upcoming 0.9.27 release to - implement a few things we have been postponing. That should hopefully be - the last ABI change before we freeze the ABI for the upcoming 1.0.x - stable uClibc series. - -Release highlights: - o A trivial fix for a pthread bug - o Nothing else - - -Erik - - - -0.9.25 3 January 2004 - -See Changelog.full for the complete list of who did what. - -Note: - This release remains binary compatible with uClibc 0.9.21-24 as long as - you take care to avoid any configuraton changes that will break things. - We _were_ planning to break binary compatibilty in this release, but - decided to hold those changes so we could push out a bugfix release. - - We _will_ break binary compatibilty in the upcoming 0.9.26 release to - implement a few things we have been postponing. That should hopefully be - the last ABI change before we freeze the ABI for the upcoming 1.0.x - stable uClibc series. - -Release highlights: - o Fixed a ton of problems found using the LTP and NIST test suites. - The few remaining test failures are obscure corner cases, such as - a few functions that fail (correctly) with incorrect errno values. - o Fixed a longstanding pthreads bug -- amoung other things, you no - longer need to explicitly add -lpthread for perl to work. - o Added some sh optimized string functions - o Added sh64 shared library support - o The default malloc implementation has been replaced, and will - now actually free memory when told to do so. - o Both popen() and exec*() now behave themselves per SuSv3 - o Better 2.6.x kernel header support - o Added support for Position Independent Executables (PIE) on x86 - o Lots of other minor cleanups - - -Erik - - - -0.9.24 15 December 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release remains binary compatible with uClibc 0.9.21-23 as - long as you take care to avoid any configuraton changes that will - break things. - - We currently plan to break binary compatibilty in the upcoming 0.9.25 to - implement a few things we have been postponing, which will hopefully be - the last change.... - -Release highlights: - o Fixed several silly configuration problems - o Added arm optimized string functions - o Lots of minor cleanups - - -Erik - - - - - -0.9.23 13 November 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release is binary compatible with uClibc 0.9.21 and 0.9.22 as - long as you take care to avoid any configuraton changes that will - break things. Enabling or disabling things like soft-float, - locale, wide wchar support, or changing cpu type are all good - examples of things that will break binary compatibility. - -Release highlights: - o Fixed several silly configuration problems that were - present in the 0.9.22 release. - o Fixed compilation problem with soft-float support on - several architectures. - o Lots of cleanup work on the powepc shared lib loader - thanks to Joakim Tjernlund. - o Updated the debian packaging for use in a standalone uClibc - system, rather than being a subordinate library under a - glibc based system. - - -Erik - - - - - -0.9.22 8 November 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release is binary compatible with the 0.9.21 release - if you take care to avoid any configuraton changes that - might break things for you (i.e. enabling or disabling things - like soft-float, locale, wide wchar support, or changing cpu - type are all good examples of binary incompatible config options). - -Release highlights: - o Added e1, microblaze, and sh64 architectures. - o Much improved soft-float support - o Rewrote the passwd and group handing functions - and implemented all SuSv3 required reentrant - versions. - o Reworked and updated the Config system. You now - get to select your target architecture with the - config system. - o Fixed pthreads for mmuless m68k systems - o Added some x86 optimized string functions. - o Lots and lots of bugs fixed. - - -Erik - - - - - -0.9.21 9 September 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release is not binary compatible with earlier releases. - Sorry about that. We have never promised to provide binary - compatibility until we hit version 1.0, and even then, if - you change your configuration. - -Release highlights: - o uClibc now has full ANSI/ISO C99 locale support (except - for wcsftime() and collating items in regex). - o Added support for using pre-generated locale data, making - it easy for mere mortals to use uClibc w/locale support. - o Lots of new tuning options added to trade size - for features, allowing for smaller static binaries. - o The "dlopen()'ing libraries that depend on libraries" - problem was fixed. - o A new scanf implementation. Well tested, but - brand new so watch for obscure bugs... - o Reworked and updated the Config system, adding several - nice new features which we now use. - o Lots and lots of sundry bug fixes and cleanups. - - -Erik - - - - - -0.9.20 30 June 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release remains binary compatible with 0.9.18 and 0.9.19. - - -Release highlights: - o Some ldd, profiling, and gcc wrapper updates - o Updated to support and compile with gcc 3.3 - o Several needed mips updates - o Building under cygwin should now work... - o Prevent non-PIC code getting into PIC libs - o Added mmap64 support - o mmu-less systems now get a 16k default thread stack size - which is much more sane than the old 2 MB default... - o Implemented syscall() for powerpc - o Optionally struct tm extension support - o Lots of other sundry little fixes and cleanups. - o Prevent buffer overflows in the passwd and group functions. - - -Erik - - - - - -0.9.19 3 March 2003 - -See Changelog.full for the complete list of who did what. - -Note: - This release remains binary compatible with 0.9.18 (except - for mips, but then mips was unusable in stock 0.9.18 anyways). - - -Release highlights: - Stefan Allius - o Some Makefile and warning fixes - David Airlie - o Fixed gcc wrapper handling of ctor/dtor stuff when used in - with and w/o the nostdinc and nostdlib options - Erik Andersen - o Fixed a number of system call kernel type/user type translation - problems that scrambled a handful of system calls. - o Fixup powerpc syscalls to eliminate warnings with gcc-3.2 - o Fixed several ioctl special cases for powerpc - o Checked in forgotten mips kernel_types.h changes - o Fixed mips shared library loader bug that caused segfaults - o Major update to the pthreads library. Should improve performance. - o Fixed uClibc's shared library loader so we can properly debug - applications using pthreads (must use gdb 5.3 or newer which - was compiled using uClibc). - o Made uClibc's ldd act just the glibc provided one (i.e. relying - on the shared lib loader to do the work) when it is possible to - doi so, and only rummage about the ELF headers when we have no - other choice (such as when using 'ldd' on cross compiled stuff). - Miles Bader - o header file updates for v850 architecture - o Fixed v850 crt0.S __uClibc_main argument stack space - Jeffrey Damick - o Fixed res_init() so it properly reloads /etc/resolv.conf - Vadim Lebedev - o Fixed ARM setjmp when floating point was disabled - David McCullough - o Removed debug (-g) when building crti.o and crtn.o, as - debug would mess up the build for SH4 and probably others. - o Fixed SH setjmp when floating point was enabled - - - -Erik - - - - - -0.9.18 12 February 2003 - -See Changelog.full for the complete list of who did what. - -Note: - - Once again, this release is _NOT_ binary compatible with earlier - releases. I _think this will be the last time (with the possible - exception of some future changes to our locale support...) - - -Release highlights: - Stefan Allius - o fixed a compile problem when large file support was disabled - o fixed dlib_pic.o to compile with proper flags - o fixed a shared lib loader compile warning - o Made adding libgcc functions to uClibc optional - Erik Andersen - o Fixed scandir64 to not free the wrong pieces of memory - which caused segfaults - o Fixed mismatches between kernel and libc dirent structures - o Fixed mismatches between the size of uClibc's struct dirent - and struct dirent64 so that when _FILE_OFFSET_BITS=64 we - do not lose part of the filename - o Fixed getdents64.c so the build will not break when compiling - vs a 2.0.x Linux kernel when UCLIBC_HAS_LFS is enabled - o Create stub crti.o and crtn.o files when UCLIBC_CTOR_DTOR is disabled - o Fixed licenses for a few files that erroneously were listed as GPL - but were really LGPL after discussing with authors - o sigaction for x86 had an extra and unwanted sigaction syscall - o Fixed debugging of arm binaries by adding a .note.ABI-tag section - Miles Bader - o header file updates for v850 architecture - o Fixed v850 clone syscall - Christian Krause - o Fixed pthread_cond_timedwait to properly uses rt singals - when available - Christophe Massiot - o Added mips _flush_cache syscall - David McCullough - o Added m68k brk syscall - Marshall M. Midden - o Fixed pipe implementation for mips - - - -Erik - - - - - -0.9.17 25 January 2003 - -See Changelog.full for the complete list of who did what. - -Note: - - I have always reserved the right to make binary incompatible changes as - needed prior to the "1.0" release. This release is a good example of - that. A few bugs turned up that needed to be fixed and the only good way - to fix them was to change some fundamental data structure sizes. So I did - just that. As a result, this release is _NOT_ binary compatible with - earlier releases -- you will need to recompile your applications. - - -Release highlights: - Stefan Allius - o fixed a number of shared library loader bugs - o setjmp, longjmp, clone, and vfork cleanups for the SH architecture - o Don't build the config system with ncurses unless asked to - Tobias Anderberg - o cris architecture updates - Erik Andersen - o Changed 'struct stat' and 'struct stat64' so they use types that - are consistant with use elsewhere in the library. Without this, - subtle bugs would occur due to comparing signed and unsigned - types (for example, GNU tar wouldn't work) - o Fixed dlopen so it works with staticly linked apps - o Fixed sigaction on arm architecture so sa_restorer works properly - o Fixed sigaction on x86 architecture for (fixed debugging threads) - o Fixed a wide char related segfault in the regular expression code - o Powerpc pread and pwrite are now implemented correctly - o Powerpc syscall mechanism re-implemented - o Sparc architecture and syscall mechanism fixed up so things compile - o usershell reimplemented - o Fixed global destructors for staticly linked applications - o Added dynamic atexit support (needed for full C++ ctor/dtor support) - o The ldd utility now acts more like the GNU utility - o Added a stub libnsl library to make stupid configure scripts bahave - o Always build crt1.o as well as crt0.o to minimize the need to mess - with the compiler - o Rewrote powerpc crt0.S to properly handle ctors/dtors - o Removed unimplemented and legacy stuff from our header files to - make configure behave better - o Made the lib loader also support libs in /usr/X11R6/lib by default - o Config system updates - o networking function updates - o Large file support updates - o Lots of other little bug fixes and cleanups - Nick Fedchik - o Support ether_aton - Nathan Field - o Fixed pthread_mutex_lock and pthread_mutex_unlock so they - actually work as advertised on mips - o Fixed several nasty pthread bugs fixing debugging - Brett Hunt - o Fixed potential segfaults during 'make menuconfig' - Jay Kulpinski - o Fixed a subtle problem in the DNS resolver that prevented - uncompressed DNS lookup responses from working - David McCullough - o Fixed pclose error handling - David Meggy - o fixed the problem where arm binaries would crash on start - that Erik stupidly caused right before the last release. - Manuel Novoa III - o Major locale support update! - o Allow people to use pregenerated locale data instead of generating - approx 40Mb of glibc locales to get the 300+ locales currently - supported. - o locale dependent collation support - o Fixed locale support tools to work when cross-compiling - o Added the *wprintf functions - o Added the wcsto{inttype} functions - o Added iconv() and a mini iconv utility - o Added hsearch and hsearch_r - o Fixed a silly bug allowing wprintf %s to work correctly. - o Fixed fdopen when used with "a" (append). - o Fixed stdio file position handing to be sure fell() always - gives correct results - Luc Van Oostenryck - o Fixed a buffer overflow in getlogin_r - Yoshinori Sato - o Hitachi h8300 architecture update - Ronald Wahl - o Powerpc shared library relocation fixes - - -Erik - - - -0.9.16 8 November 2002 - -See Changelog.full for the complete list of who did what. - -Release highlights: - o CRIS architecture and shared library support from Tobias Anderberg - o New uClibc configuration system - o shared library global constructors and destructors initialization - ordering fixed by Stefan Allius - o More SuperH architecture fixes from Stefan Allius - o uClibc now compiles with newer versions of gcc (i.e. RedHat 8.0) - o uClibc no longer requires perl to compile - o mips dlopen was fixed by Steven J. Hill - o pty and tty handling fixes - o Manuel Novoa added support for a new /etc/TZ file for globally - setting the system timezone. - o Manuel also fixed up a number of remaining wide char issues. - o Lots of other little bug fixes and cleanups - - -Erik - - - -0.9.15 27 August 2002 - -This is a minor bugfix release. - -See Changelog.full for the complete list of who did what. -Release highlights: - o Eliminated the HAS_LONG_LONG option. gcc always supports - long long, and the option never excluded all long long anyways. - o ctype.h no longer allows multiple argument evaluation in - compliance with ANSI/ISO C99 - o Obscure printf fixes -- one involving %o and one involving %f. - o Bugfixes for locking and reentrance in password/group functions - o Directly use kernel types for most items, eliminating needless - translation and fixing several bugs. - o Directly use kernel struct stat -- no more translating - o More superH (sh) architecture merging from Stefan Allius - o Errno values and strerror are now correct on alpha, sparc, and mips - o Fixed an obscure bug with fclose when custom streams are enabled. - o Lots of other little bug fixes and cleanups - - -Erik - - - -0.9.14 12 August 2002 - -This is a minor bugfix release. - -See Changelog.full for the complete list of who did what. -Release highlights: - o Fix a compile error when RPC and Pthread support - were both enabled. - o Eliminate duplicate define warnings in wstring.c. - o Fix potentially broken preprocessor comparisons. - o Erik was an idiot and broke thread locking in exit(), - atexit() and friends. Fix that. - o Fix the gcc wrapper to use crtbeginS.o and crtendS.o when - compiling PIC code (crtbegin.o and crtend.o) otherwise. - - -Erik - - - - -0.9.13 9 August 2002 - -Security Fixes - o There was an off-by-one buffer overflow in the group - handling code, fix thanks to Joseph Chiu. - o There was an integer overflow bug in calloc, per - http://online.securityfocus.com/bid/5398 - o There was an integer overflow bug in the xdr_array - RPC code, per http://online.securityfocus.com/bid/5356 - -See Changelog.full for the complete list of who did what. -Release highlights: - o Add full shared library support for Hitachi SuperH (sh) - thanks to Stefan Allius and Edie C. Dost - o Lots of reentrance cleanups (we should now be fully - reentrant when compiled with pthread support). - o Miles Bader implemented a new mmap based malloc which is much - smarter than the old "malloc-simple", and actually works, unlike - the old "malloc". This is now the default for mmu-less systems - and should greatly help reduce memory fragmentation and wastage. - o Reworked syscall handling for i386 and ARM, smaller and cleaner. - o Support for the syscall() function on i386 and ARM - o The uClibc g++ wrapper now automagically adds the proper include - search path and and libraries. - o Lots of shared library loader updates - o dlopen'd shred libraries not properly run destructors - when ctor/dtor support is enabled - o pread/pwrite/pread64/pwrite64 now all work as expected - o Lots and lots of other bug fixes and cleanups. - - -Erik - - - - -0.9.12 20 June 2002 - -See Changelog.full for the complete list of who did what. -Release highlights: - o Add full shared library support for mips (big and little - endian), thanks to a lot of hard work from Steven J. Hill - o i960 architecture support, thanks to Martin Proulx - o An initial alpha port (works, but needs some cleanup) - o Fixes shared library support for powerpc - o Fixes for mmu-less systems - o Much improved thread locking and reentrance. - o More gcc wrapper updates. XFree86 really does link - this time around. It still didn't last time. - o Libcrypt now passes conformance tests - o Nearly complete locale supporti thanks to a lot - of hard work by Manuel Novoa III. This stuff is - _way_ smaller than glibc's - o Completely new time handling functions also by Manuel - o Lots of other bug fixes and cleanups. - - -Erik - - - - -Erik Andersen: -0.9.11 10 April 2002 - -Release highlights: - o Lots of bug fixes - o Much better large file support - o Several gcc wrapper bug fixes, so things like iproute2 and - XFree86 should now link properly. - o Fixes a stdio thread locking bug that could cause random - deadlocks on s*printf calls when threading was enabled. - -Erik Andersen: - o Added a generic implementation of truncate64.c and ftruncate64.c - o Added missing creat64, glob64, mkstemp64, getrlimit64, setrlimit64 - o Removed internal erroneous use of __USE_FILE_OFFSET64 - o Made libpthread compile on sparc and powerpc - o Made libpthread soname and symlinks match the other libraries. - o Added finite() to the C89 math lib, since some math functions use it. - o Added missing function pointer to error.c (some apps wanted it) - o Fixed initfini build for arches where gcc tries to be sneaky - o Fixed m68k/bits/setjmp.h which I has broken in the last release. - o Fixed a buffer overflow in the dynamic library loader - o Fixed a stdio thread locking bug that could cause random - deadlocks on s*printf calls when threading was enabled. - o Implemented sqrtf(), needed for libstdc++ on arm -Miles Bader: - o Make clean fixes to not blindly wipe all symlinks - o Re-enabled clnt_perror() - o Re-implemented swab() -Dwayne Fontenot: - o Many updates to the uClibc Working Application List -Steven J. Hill: - o Many updates to the mips dynamic loader. Not yet working but - getting very close now. - o Fixed locking bug in getttyent() - o Support libpthread on mips -Richard June: - o Fixed several bugs in utmp code (pututline was only writing the - first sizeof-a-pointer bytes to the utmpfile). - o setutent() was only opening utmp readonly. -m4@brecis.COM: - o Fixed a silly typing problem with the getuid syscall. -Manuel Novoa III: - o Fixed stdio FILE read/write auto-transition bugs. - o Better stdio errno handling - o Changed setvbuf() to more closely match glibc's behavior - o Fixed getpass() to not echo passwords to the console - o Fixed locale ISblank flag. - o Fixed an arg promotion handling bug in _do_one_spec for %c reported - by Ilguiz Latypov. -Kensuke Otake: - o Implemented swab() -Yoshinori Sato: - o Fixed h8300 architecture support for pthreads and changes to - the include files -David Schleef: - o Made powerpc assembly code PIC-compatible - o Removed powerpc R_PPC_REL24 handling, since it was deceptively useless. -John Traill: - o Several types on powerpc, such as dev_t, are different than on other - architectures. John spotted this, which fixed a _ton_ of problems since - anything calling stat() was previously broken. -Jim Treadway: - o Eliminated use of alarm() from the DNS resolver by converting - it to use select instead (much cleaner). - - - - - - - - -0.9.10 21 March 2002 - -Major new features: - o pthreads support (derived from glibc 2.1.3's linuxthreads library) - by Stefan Soucek and Erik Andersen - o pthreads support for MMU-less systems, by Stefan Soucek - o Complete rewrite of all stdio functions for standards compliance, - small size, pthreads support, wide/narrow stream support, large - file support, unbuffered support, etc, etc by Manuel Novoa III - o gcc wrapper reworked by Erik Andersen. Now operated correctly in - all known cases, and now wraps g++ as well for C++ support. - o constructor/destructor support, for C++ by Erik Andersen. - o Eliminated duplicate include/bits header files, by Erik Andersen. - Now all common include/bits headers are grouped together. - - -Erik Andersen: - o Lots of changes and improvements to the shared library loader - o Cleaned up a piles of bugs - o Fixed a segfault when scandir was called on empty directories. - o Several syscalls added: pread/pwrite - o Makefile/build system cleanups - o Sighandling fixes - o pthreads support (with Stefan Soucek) - o Added ldexp to the C89 math library, per POSIX - o fclose() EINTR handling is now correct per IEEE Std 1003.1-2001 - o Support isblank() - o Reworked libcrypt to avoid leaking private symbols into the namespace - o Added strtof(), strtold(), updwtmp(), strptime() - o Fix ldso build for older arm cross compilers -Miles Bader: - o atexit cleanups - o fixed gcc wrapper handling of -M* options - o Fixed truncate64/ftruncate64 to restrict them to 64-bit systems, - since we can't be sure that the _syscall macros can cope with 64 - bit args on 32 bit arches. - o Large File support on the v850 - o Fixed v850 headers after Erik messed them up - o Eliminate include/features.h namespace pollution -M. R. Brown: - o Fixed pthread support for SH, and fixed SH vfork as well - o Fixed SH headers after Erik messed them up -Geoffrey Espin: - o Mips architecture cleanups. Now works perfectly - with busybox, vi, ash, etc... - o Merged in the random number support (rand, srand, etc) from glibc. -Thomas Fritzsche: - o Fixes DNS resolver bug from 0.9.9 -Steven J. Hill: - o Fixed build to support both mips and mipsel - o Beginnings of a mips ldso port -Andrew Ip: - o Support for gnu error() functions -David McCullough: - o Coldfire platform updates: clone, setjmp - o Fixed simple malloc to work on systems with an MMU -Manuel Novoa III: - o Rewrote all stdio functions for standards compliance, small size, - pthreads support, wide/narrow stream support, large file support, - unbuffered support, etc, etc, etc. - o Rewrote the various string to int functions to be smaller, more - standards compilant, and reduce dependance on libgcc.a. -Yoshinori Sato: - o ptrace for the Hitachi h8300 fix -David Schleef: - o Debian packaging updates - o Check for proper 16-byte aliged stack pointer on powerpc -Stefan Soucek: - o pthreads support for MMU-less systems - o pthreads support (with Erik Andersen) -Brian Stafford: - o Rewrote strcasecmp() per SUSv2. -Bart Visscher: - o Added missing IPV6 support and reentrant networking function - additions so iptables now runs with IPV6 support. - - - - - - -0.9.9 February 4, 2002 - -Erik Andersen: - o A bunch of doc updates. Major update to the working - apps list. - o Added a configurator script (extra/Configs/uClibc_config_fix.pl) - which can simplify configuring uClibc. - o Fixed setjmp/longjmp on x86,arm,powerpc,mips,and sparc. - Hitting ^C in ash kills client apps now, not ash. - o Reworked signal handling code so it now passes POSIX - conformance tests. - o Fixed sleep and usleep to work correctly when - interrupted by signals. - o Made getopt behave the same when staticly linking - as when dynamicly linking. It was using different - implementations depending on how apps were linked. - o Added missing inttypes.h header file - o Eliminate all C++ style comments from header files - o Support statvfs and statfs - o Support getmntent_r - o Scandir and scandir64 were calling malloc without - checking for ENOMEM - o Fixed stpcpy function declaration - o Many large file support improvements. - o Fixed fcntl to work when DOLFS is enabled - o Fixed termios code to do the Right Thing(tm) - o Allow regex to be excluded at compile time - o Implemented mempcpy - o Build ldd and readelf for the target system and for the - host system - o Fix several cases where get-needed-libgcc-objects.sh - could fail, breaking the shared uClibc library. - o Include all shared library loader objects into a - single C file, thereby reducing its size further. - o Reworked the shared library linking process to be more - flexible so that gcc and ld can more easily be built to - target uClibc library. - o Better error checking in the Makefiles. Be more pedantic - about tar, chmod, etc to avoid system dependent failures. - o We can now autodetect the target architecture - o Hide references to wchar_t so GNU autoconf - configure scripts won't get confused and try to - enable wide char support. - o Fixed stdio.h so apps can use varargs.h if they want to. - o Added brk/sbrk support for ARM, powerpc, mips, and sparc - and set them to default to the much faster brk using malloc - o Added missing syscalls: get_kernel_syms, fcntl64, - fdatasync, sched_setparam, sched_getparam, - sched_setscheduler, sched_getscheduler, - sched_get_priority_max, sched_get_priority_min, - sched_rr_get_interval, sigaltstack, sendfile, - pivot_root, sigsuspend, setfsuid, and setfsgid - o Force DOPIC be true when HAVE_SHARED is true. - o Fixed hstrerror() - o Implemented gethostent(), sethostent(), and endhostent() - o Added arch specific support so that sparc and mips actually - compile and work -Miles Bader: - o Fixes for the v850 architecture: crt0, setjmp, - arch autodetection, etc. - o Fixed `make install' to not build ldso stuff on - non-shared-library systems. -Michael E Brown: - o Allow the gcc wrapper to support setting DEVEL_PREFIX - and BUILD_DIR at runtime (no more need to recompile). -M. R. Brown and Erik Andersen: - o Fixed the SH port so it now works. Tested and shown - working on an SH4 Dreamcast system. -Kim Heino: - o Made 'make clean' remove generated bits/syscall.h -David McCullough: - o SH architecture updates. Added brk, sbrk, - o Fixed simple malloc to work on systems with an MMU - o Taught getutent to return NULL if utmp doesn't exist. - o Added insque/remque support - o Fixed DNS resolver version number so apps won't get - confused and use the wrong API. - o Added Config selectable shadow password support -Yoshinori Sato - o Contributed support for the Hitach H8/300H architecture -Cédric Schieli: - o Add support for inet_netof, inet_lnaof, inet_makeaddr - and hstrerror. -David Schleef: - o Added libstrip, a nifty script to automagically - strip unneeded content from the uClibc shared - libraries. -Martin Sieper - o Added getw() and putw() - o Added missing header files -- lastlog.h, sgtty.h, - netipx/ipx.h, sys/perm.h -Stefan Soucek: - o Add rcmd support, i.e. rsh, rlogin, etc. - o Fix rcmd to avoid alloca, which is dangerous - on mmu-less systems -spudmonkey@racsa.co.cr: - o Eliminate a buffer overflow in the shared library loader -Brian Stafford: - o Enable support for Unix98 PTYs, and add option - to disable old style PTYs. - - diff --git a/DEDICATION.mjn3 b/DEDICATION.mjn3 deleted file mode 100644 index bc26bc845..000000000 --- a/DEDICATION.mjn3 +++ /dev/null @@ -1,22 +0,0 @@ - -All of my uClibc and busybox work is dedicated to Toni, my love who -passed away on Feb. 12, 2003. - -I would ask that anyone benefiting from this work, especially those -using it in commercial products, consider making a donation in her -memory to our local non-profit hospice organization that did so much -for us in her last few months. - - In memory of Toni W. Hagan - - Hospice of Acadiana, Inc. - 2600 Johnston St., Suite 200 - Lafayette, LA 70503-3240 - - Phone (337) 232-1234 or 1-800-738-2226 - Fax (337) 232-1297 - - http://www.hospiceacadiana.com/ - - -Manuel Novoa III @@ -1,21 +1,20 @@ SOFTWARE REQUIREMENTS - Compiling uClibc requires Linux kernel header files. uClibc will + Compiling uClibc-ng requires Linux kernel header files. uClibc-ng will be compiled to match the interfaces available in the provided - version of the Linux kernel headers. Linux kernel version 2.0, - version 2.2, version 2.4 and version 2.6 are known to work. Other - kernel versions may work but haven't been tested. Its also helpful - to have a working version of GNU binutils, and GNU gcc -- using - excessively old versions of these packages can cause very strange - errors that are difficult to find and fix. + version of the Linux kernel headers. Linux kernel version 3.x is + supported. + Its also helpful to have a working version of GNU binutils, and + GNU gcc -- using excessively old versions of these packages can + cause very strange errors that are difficult to find and fix. -CONFIGURING uClibc: +CONFIGURING uClibc-ng: - - Users must have a valid configuration file to compile uClibc. Do not + - Users must have a valid configuration file to compile uClibc-ng. Do not skip this step. New configuration options are added in each release, and odd configuration options are sometimes removed. - To configure uClibc, you can run: + To configure uClibc-ng, you can run: make menuconfig or @@ -39,10 +38,10 @@ CONFIGURING uClibc: "make allnoconfig" Set all values to "no" for all options. -COMPILING uClibc: +COMPILING uClibc-ng: - - uClibc does not have proper dependancy checking (yet) so if you - change your uClibc configuration, you must current rebuild the + - uClibc-ng does not have proper dependancy checking so if you + change your uClibc-ng configuration, you must current rebuild the entire library, by first running make clean @@ -51,30 +50,29 @@ COMPILING uClibc: make - to compile uClibc. or if you are cross compiling, you would + to compile uClibc-ng. or if you are cross compiling, you would instead run something like: make CROSS_COMPILE=arm-linux- -INSTALLING the uClibc development environment: +INSTALLING the uClibc-ng development environment: - As root, if necessary, run something like: make PREFIX=<some path> install - This will install the uClibc runtime and development system (i.e. + This will install the uClibc-ng runtime and development system (i.e. all the header files, libraries, etc) into the directories defined within your .config file. -USING uClibc: +USING uClibc-ng: - - To compile programs with uClibc you will need a complete toolchain - (i.e. binutils, gcc, and uClibc) that was built expressly for use - with uClibc. + - To compile programs with uClibc-ng you will need a complete toolchain + (i.e. binutils, gcc and uClibc-ng) that was built expressly for use + with uClibc-ng. - - Native and cross compiling toolchains, as well as makefiles for creating - uClibc toolchains, are available from the uClibc website. You may want - to check out "buildroot", which is available from the uClibc download area, - which provides examples of how to build your own uClibc based system. + - You have two choices at the moment: + - Use OpenADK from http://www.openadk.org + - Use your own build scripts or environment diff --git a/MAINTAINERS b/MAINTAINERS deleted file mode 100644 index d7c0ff967..000000000 --- a/MAINTAINERS +++ /dev/null @@ -1,152 +0,0 @@ -Arch Maintainers List - -Note: For the hard of thinking, this list is meant to remain in alphabetical -order. If you could add yourselves to it in alphabetical order that would be -so much easier [Ed]. - -P: Person -E: Person's email address -W: Web-page with status/info -S: Status, one of the following: - - Supported: Someone is actually paid to look after this. - Maintained: Someone actually looks after it. - Patches: It has a maintainer but they don't have time to do - much other than throw the odd patch in. See below ... - Unmaintained: No current maintainer [but maybe you could take the - role as you write your new code]. - Obsolete: Old code. Something tagged obsolete generally means - it has been replaced by a better system and you - should be using that. - ----------------------------------------------------------------------- - -ALPHA -S: Unmaintained - - -ARM -N: Erik Andersen -E: andersen@codepoet.org -W: http://www.arm.linux.org.uk/ -S: Maintained - - -AVR32 -N: Hans-Christian Egtvedt -E: hans-christian.egtvedt@atmel.com -N: Haavard Skinnemoen -E: haavard.skinnemoen@atmel.com -W: http://avr32linux.org/ -S: Maintained - - -BFIN -N: Mike Frysinger -E: vapier.adi@gmail.com -W: http://blackfin.uclinux.org/ -S: Maintained - - -CRIS -P: Ricard Wanderlof -M: ricard.wanderlof@axis.com -W: http://developer.axis.com -S: Maintained - - -E1 -S: Unmaintained - - -FRV -S: Unmaintained - - -H8300 -S: Unmaintained - - -HPPA -S: Unmaintained - - -IA64 -S: Unmaintained - - -I386 -N: Erik Andersen -E: andersen@codepoet.org -S: Maintained - - -I960 -S: Unmaintained - - -M68K -S: Unmaintained - - -MICROBLAZE -S: Unmaintained - - -MIPS -N: Erik Andersen -E: andersen@codepoet.org -W: http://www.linux-mips.org -S: Maintained - - -NIOS and NIOS2 -S: Unmaintained - - -POWERPC -N: Joakim Tjernlund -E: joakim.tjernlund@lumentis.se -W: http://penguinppc.org/ -S: Maintained - - -SH and SH64 -P: Paul Mundt -E: lethal@linux-sh.org -W: http://www.linux-sh.org -S: Maintained - - -SH4 (NPTL/TLS) -P: Carmelo Amoroso -E: carmelo.amoroso@st.com -W: http://www.stlinux.com -S: Supported - - -SPARC -P: Austin Foxley -E: austinf@cetoncorp.com -S: Maintained - -VAX -P: Jan-Benedict Glaw -E: jbglaw@lug-owl.de (personal), linux-vax@pergamentum.com (mailing list) -W: http://linux-vax.sourceforge.net/ -S: Maintained - -V850 -S: Unmaintained - - -X86_64 -S: Unmaintained - - -XTENSA -P: Chris Zankel -E: chris@zankel.net -W: http://linux-xtensa.org/ -S: Maintained - diff --git a/Makefile.in b/Makefile.in index 2233be8b2..e76449372 100644 --- a/Makefile.in +++ b/Makefile.in @@ -167,7 +167,7 @@ $(ALL_HEADERS_SYS_ARCH): $(do_ln) $(call rel_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/sys/$(@F) $@ endif -$(target-headers-sysdep) $(pregen-headers-y): | $(top_builddir)include/bits $(top_builddir)include/sys +$(target-headers-sysdep) $(pregen-headers-y): | $(top_builddir)include/bits $(top_builddir)include/sys $(top_builddir)include/bits/sysnum.h HEADERCLEAN_common: $(do_rm) $(ALL_HEADERS_COMMON) @@ -1,73 +1,48 @@ + uClibc-ng - a small C Library for Linux - uClibc - a Small C Library for Linux - Erik Andersen <andersen@codepoet.org> +uClibc-ng (aka µClibc-ng/pronounced yew-see-lib-see-next-generation) is a C +library for developing embedded Linux systems. It is much smaller than the GNU +C Library, but nearly all applications supported by glibc also work perfectly +with uClibc-ng. -uClibc (aka µClibc/pronounced yew-see-lib-see) is a C library for -developing embedded Linux systems. It is much smaller than the -GNU C Library, but nearly all applications supported by glibc -also work perfectly with uClibc. Porting applications from glibc -to uClibc typically involves just recompiling the source code. -uClibc even supports shared libraries and threading. It currently -runs on standard Linux and MMU-less (also known as µClinux) -systems with support for alpha, ARM, cris, e1, h8300, i386, i960, -m68k, microblaze, mips/mipsel, PowerPC, SH, SPARC, and v850 -processors. +uClibc-ng is a spin-off of uClibc from http://www.uclibc.org +from Erik Andersen and others. + +Porting applications from glibc to uClibc-ng typically involves just +recompiling the source code. uClibc-ng even supports shared libraries and +threading. It currently runs on standard Linux and MMU-less (also +known as µClinux) systems with support for ARC, ARM, Blackfin, i386, M68K/Coldfire +MIPS, MIPS64, PowerPC, SH, Sparc, X86_64 and XTENSA processors. If you are building an embedded Linux system and you find that glibc is eating up too much space, you should consider using -uClibc. If you are building a huge fileserver with 12 Terabytes +uClibc-ng. If you are building a huge fileserver with 12 Terabytes of storage, then using glibc may make more sense. Unless, for example, that 12 Terabytes will be Network Attached Storage and you plan to burn Linux into the system's firmware... -uClibc is maintained by Erik Andersen and is licensed under the +uClibc-ng is maintained by Waldemar Brodkorb and is licensed under the GNU LESSER GENERAL PUBLIC LICENSE. This license allows you to make closed source commercial applications using an unmodified -version of uClibc (Please consider sharing some of the money you -make ;-). You do not need to give away all your source code just -because you use uClibc and/or run on Linux. You should, however, +version of uClibc-ng. You do not need to give away all your source code just +because you use uClibc-ng and/or run on Linux. You should, however, carefuly review the license and make certain you understand and abide by it strictly. - For installation instructions, see the file INSTALL. -uClibc strives to be standards compliant, which means that most +uClibc-ng strives to be standards compliant, which means that most documentation written for SuSv3, or for glibc also applies to -uClibc functions. However, many GNU extensions are not supported +uClibc-ng functions. However, many GNU extensions are not supported because they have not been ported, or more importantly, would -increase the size of uClibc disproportional to the added -functionality. There is some discussion of these differences -in the "docs" directory. +increase the size of uClibc-ng disproportional to the added +functionality. -Additional information (recent releases, FAQ, mailing list, bugs, -etc.) can be found at http://www.uclibc.org/. +Additional information can be found at http://www.uclibc-ng.org/. -uClibc may be freely modified and distributed under the terms of +uClibc-ng may be freely modified and distributed under the terms of the GNU Lesser General Public License, which can be found in the -file COPYING.LIB. - -Please Note: - - There is an unwholesomely huge amount of code out there - that depends on the presence of GNU libc header files. - We have GNU libc compatible header files. So we have - committed a horrible sin in uClibc. We _lie_ and claim - to be GNU libc in order to force these applications to - work as their developers intended. This is IMHO, - pardonable, since these defines are not really intended - to check for the presence of a particular library, but - rather are used to define an _interface_. Some programs - are especially chummy with glibc, and may need this - behavior disabled by adding CFLAGS+=-D__FORCE_NOGLIBC - - If you want to make special exceptions in your code which are - specifically for uClibc, you can make certain to include features.h, - and then have your code check for uClibc as follows: - - #ifdef __UCLIBC__ - do_something_special(); - #endif +file COPYING. And most of all, be sure to have some fun! :-) - -Erik + -Waldemar @@ -67,9 +67,6 @@ AWK = awk STRIP_FLAGS ?= -x -R .note -R .comment -## unused? if yes, remove after 0.9.31 -## UNIFDEF := $(top_builddir)extra/scripts/unifdef - # Select the compiler needed to build binaries for your development system HOSTCC = gcc BUILD_CFLAGS = -Os @@ -127,9 +124,9 @@ export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS MULTILIB_DIR # Now config hard core -MAJOR_VERSION := 0 -MINOR_VERSION := 9 -SUBLEVEL := 34 +MAJOR_VERSION := 1 +MINOR_VERSION := 0 +SUBLEVEL := 1 EXTRAVERSION :=-git VERSION := $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL) ABI_VERSION := $(MAJOR_VERSION) @@ -295,12 +292,8 @@ CPU_CFLAGS-y := -funsigned-char -fno-builtin $(eval $(call check-gcc-var,-fno-asm)) CPU_CFLAGS-y += $(CFLAG_-fno-asm) -LDADD_LIBFLOAT= ifeq ($(UCLIBC_HAS_SOFT_FLOAT),y) -# If -msoft-float isn't supported, we want an error anyway. -# Hmm... might need to revisit this for arm since it has 2 different -# soft float encodings. -ifneq ($(TARGET_ARCH),nios) +ifneq ($(TARGET_ARCH),bfin) ifneq ($(TARGET_ARCH),nios2) ifneq ($(TARGET_ARCH),sh) ifneq ($(TARGET_ARCH),c6x) @@ -309,11 +302,6 @@ endif endif endif endif -ifeq ($(TARGET_ARCH),arm) -# No longer needed with current toolchains, but leave it here for now. -# If anyone is actually still using gcc 2.95 (say), they can uncomment it. -# LDADD_LIBFLOAT=-lfloat -endif endif $(eval $(call check-gcc-var,-std=gnu99)) @@ -404,21 +392,9 @@ endif ifeq ($(TARGET_ARCH),mips) OPTIMIZATION+=-mno-split-addresses - CPU_CFLAGS-$(CONFIG_MIPS_ISA_1)+=-mips1 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_2)+=-mips2 -mtune=mips2 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_3)+=-mips3 -mtune=mips3 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32R2)+=-march=mips32r2 -mtune=mips32r2 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 - CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64R2)+=-mips64r2 -mtune=mips64r2 CPU_CFLAGS-$(CONFIG_MIPS_N64_ABI)+=-mabi=64 CPU_CFLAGS-$(CONFIG_MIPS_O32_ABI)+=-mabi=32 CPU_CFLAGS-$(CONFIG_MIPS_N32_ABI)+=-mabi=n32 - - CPU_CFLAGS-$(CONFIG_MIPS_NAN_LEGACY)+=-mnan=legacy - CPU_CFLAGS-$(CONFIG_MIPS_NAN_2008)+=-mnan=2008 - CPU_LDFLAGS-y += $(CPU_CFLAGS) endif @@ -808,11 +784,7 @@ ASFLAGS += $(ASFLAG_--noexecstack) LIBGCC_CFLAGS ?= $(CFLAGS) $(CPU_CFLAGS-y) $(eval $(call cache-output-var,LIBGCC,$(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name)) -$(eval $(call cache-output-var,LIBGCC_EH,$(CC) $(LIBGCC_CFLAGS) -print-file-name=libgcc_eh.a)) -# with -O0 we (e.g. lockf) might end up with references to -# _Unwind_Resume, so pull in gcc_eh in this case.. LIBGCC_DIR:=$(dir $(LIBGCC)) -LIBGCC += $(if $(DODEBUG),$(LIBGCC_EH)) # moved from libpthread/linuxthreads ifeq ($(UCLIBC_CTOR_DTOR),y) @@ -1,189 +0,0 @@ -TODO list for every uClibc release: -------------------------------------------------- - *) Test cris, i386, mips, mipsel, sh, x86_64, arm, armeb, and powerpc - with the latest LTP testsuite. Fix any regressions and post LTP - testsuite results for each architecture on uclibc.org. - *) Audit header files. Remove prototypes for all functions that - are not supported -- especially needed for the libm headers. - *) Audit header files. When options are disabled, also disable - them in the include files as well by checking for the proper - define from include/bits/uClibc_config.h (pulled in from features.h) - -TODO list for the uClibc 1.0.0 release: -------------------------------------------------- - *) NPTL - support arches: (o todo; + done) - o alpha - + arm - o avr32 - o bfin - o cris - o e1 - o frv - o h8300 - o hppa - + i386 - o i960 - o ia64 - o m68k - o microblaze - + mips - o nios - o nios2 - + powerpc - + sh - + sh64 - o sparc - o v850 - o vax - o x86_64 - o xtensa - o ... - *) Go through SUSv4 - TOC: http://www.opengroup.org/onlinepubs/9699919799/xrat/contents.html - shell (busybox): http://www.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap01.html#tag_22_01_01 - interface: - http://www.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap13.html#tag_21_13_02 - http://www.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap01.html#tag_23_01_01 - *) glob / fnmatch tests fail - *) regex should pass AT&T conformance tests - *) Finish hiding uClibc internal symbols from our exported namespace - *) Add system for generating minimal system call asm wrappers that abuse - the C ABI to minimize amount of register/stack manipulation - *) Explicity add some sortof CONFIG_LINUX_2_2_ABI, CONFIG_LINUX_2_4_ABI - and CONFIG_LINUX_2_6_ABI type options, rather than having the abi - depend on the selected set of kernel headers. This will likely also - require that we provide a set of kernel headers (probably a derivitive - of Mazur's linux-libc-headers) that can supplies the 2.2, 2.4, and 2.6 - kernel abi. - *) Documentation updates: - *) Write a uClibc HOWTO document - *) Update README document - *) Update INSTALL document - *) Update docs/Glibc_vs_uClibc_Differences.txt document - and fully document all differences between the feature - set of uClibc and glibc. - *) Update docs/uClibc_vs_SuSv3.txt document - *) Update docs/threads.txt document - *) Write man pages for ldd and ldconfig utility binaries - *) Implement some mechanism (perhaps encoded in the .so name, - perhaps using an abi tag magically embedded into each object) - for flagging config options that break the ABI. Options - such as UCLIBC_HAS_SOFT_FLOAT, UCLIBC_HAS_THREADS, UCLIBC_HAS_LOCALE, - and perhaps others (finalize list) produce a lib with a differing - ABI. Make it so apps cannot use an ABI mis-matched uClibc. - This is most easily done using symbol versioning... - *) Implement the long double versions of math funcs on interrested - arches using wrappers on top of the double versions (size / precision - trade off where size clearly wins). - *) Make all small objects (>~50 bytes) into either inlines or - into a static library - *) Cleanup / rewrite sysconf.c. It should get some information - from ldso (such as HZ). Other stuff it currently just makes - up, which is obviously wrong. Also bits/uClibc_clk_tck.h - needs to be updated at the same time to get proper HZ values. - *) poll emulation using select() for old 2.0.x uClinux kernels - in libc/sysdeps/linux/common/poll.c fails some python self-tests. - Of course, modern systems using the actuall poll() syscall work fine. - *) Cleanup/scrub all the Makefile copyright junk - *) Fix dlopen, for both static and dynamic cases, and make it - fully comply with SuSv3 - *) check if sched_getcpu is only pulled in where it should be - *) remove HANDLE_OLDER_RLIMIT, NEW_GETRLIMIT (conditionalize on - ugetrlimit, it seems, else use the modern variant) - *) simplify exec*() in the light of execvpe (perhaps single internal - impl); USE_GNU for execvpe (and other GNU extensions, see psm). - *) Remove unused math complex hidden protos throughout - - -TODO list for AFTER the uClibc 1.0.0 release: -------------------------------------------------- - *) Add support for 64bit time (to deal withhttp://2038bug.com/): - date -s 011903142038 sets epoch to roll over in a few seconds (2^31) - *) Add support for Linux 2.6.x fast vsyscalls - *) Enable pristine source tree builds - *) Fix regex so it isn't so stinking big - *) Fix glob so it isn't so stinking big - *) run 'nm -D --size-sort -t d libuClibc-0.9.26.so' and work on the - biggest things (i.e. stuff at the end of the list) to make - them smaller. - *) Fix dlopen/dlsym/dlclose locking to more fine grained or use RCU - <more wishlist items here> - - -Arch specific TODO: -------------------------------------------------- - alpha: - ldso is not implemented - arm: - update crt1 code again for nommu (http://bugs.uclibc.org/view.php?id=538) - recruit jbowler and integrate thumb support - frv: - needs to be updated for the new ldso changes and unification of the - uClibc_main funcs (__uClibc_start_main doesnt exist anymore) - hppa: - errno.c test segfaults causes segfault in clone.S (seems to be in glibc too) - i386: - add support for fast system calls - ia64: - ldso is not implemented - m68k: - ldso lazy relocation doesnt work - sh64: - ldso is reasonably broken, presently requiring additional - coaxing/threatening. - sparc: - need a sigaction.c since common one doesnt work (signal tests) - ldso needs to be updated since it's totally broken atm - vax: - pthread support, linktime warning support (implies GAS patches), - general touchups, testing, ldso. - - ------------------------------------------------------------------------------ -Manuel's todo: - - 1) Little things that need fixing: - ---------------------------------- - a) Fix bug in *printf: outdigit precison bug - b) Check that gnu/bsd extension members tm_gmtoff and tm_zone in struct tm - are respected where they should be. - c) Implement the obstack printf funcs for glibc compat. - d) Implement glibc 'a' flag for scanf string conversions. - e) Allow use of the older non-table-based ctype functions when using - stub locale support. (smaller) - f) __drand48_iterate should be void - g) alphasort vs. versionsort. The former seems to be SVID, the latter GNU - i.e. reverse to what we currently do. The latter is unimplemented. - h) ponder removal/configs to turn off: __xpg_*, bsd_signal, dysize, - getw/putw, utimes, - - 2) Additional str{f|p}time issues. - ---------------------------------- - a) Spacing issue wrt strptime. - b) Support locale specific alternate digits. (data is in place) - c) Support locale era in year designations. (data is in place) - d) Deal with mb format string issues in strftime. - e) Implement wcsftime. - - 3) Other locale issues (my implementation): - ------------------------------------------- - a) Do a little more clean up of ctype and wctype. - b) Rework of the locale data organization to make using locales reasonable - when staticly linking. (mmap) - c) Rewrite the locale data generation tools to process the text specifications - rather than relying on glibc. - d) Adapt regex lib to use my collation data and add the necessary collating - item tables to support SUSv3 required features. - e) transliteration of unsupported wchars in 8-bit locales (like glibc). - f) Support ISO/IEC 14652 draft locale extensions (LC_PAPER, etc). - g) Implement strfrom. - h) Shift-state codeset locale support? - - 4) Misc: - -------- - a) Port uClibc to other OSs (including elks), or even bare metal (libgloss). - b) Write a space-efficient gettext substitute, to avoid storing large amounts - of redundant data. - - diff --git a/extra/Configs/Config.arm b/extra/Configs/Config.arm index a16c9197a..00cf98281 100644 --- a/extra/Configs/Config.arm +++ b/extra/Configs/Config.arm @@ -28,6 +28,7 @@ config CONFIG_ARM_EABI config COMPILE_IN_THUMB_MODE bool "Build using Thumb mode" select USE_BX + select USE_LDREXSTREX help Say 'y' here to force building uClibc in thumb mode. Say 'n' to use your compiler's default mode. @@ -38,3 +39,10 @@ config USE_BX Say 'y' to use BX to return from functions on your thumb-aware processor. Say 'y' if you need to use interworking. Say 'n' if not. It is safe to say 'y' even if you're not doing interworking. + +config USE_LDREXSTREX + bool "Use load-store exclusive ASM ops (not supported in SmartFusion)" + depends on COMPILE_IN_THUMB_MODE + default n + help + Say 'y' to use LDREX/STREX ASM ops. diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 1fd686052..3c2add655 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -45,8 +45,8 @@ choice help The architecture of your target. -config TARGET_alpha - bool "alpha" +#config TARGET_alpha +# bool "alpha" config TARGET_arc bool "arc" @@ -60,38 +60,40 @@ config TARGET_avr32 config TARGET_bfin bool "bfin" +# someone could sync this tree: +# http://linux-c6x.org/git/?p=uClibc.git;a=summary config TARGET_c6x bool "c6x" config TARGET_cris bool "cris" -config TARGET_e1 - bool "e1 (BROKEN)" +#config TARGET_e1 +# bool "e1 (BROKEN)" -config TARGET_frv - bool "frv (BROKEN)" +#config TARGET_frv +# bool "frv (BROKEN)" -config TARGET_h8300 - bool "h8300 (BROKEN)" +#config TARGET_h8300 +# bool "h8300 (BROKEN)" -config TARGET_hppa - bool "hppa" +#config TARGET_hppa +# bool "hppa" config TARGET_i386 bool "i386" -config TARGET_i960 - bool "i960 (BROKEN)" +#config TARGET_i960 +# bool "i960 (BROKEN)" -config TARGET_ia64 - bool "ia64" +#config TARGET_ia64 +# bool "ia64" config TARGET_m68k bool "m68k" -config TARGET_metag - bool "metag" +#config TARGET_metag +# bool "metag" config TARGET_microblaze bool "microblaze" @@ -99,8 +101,8 @@ config TARGET_microblaze config TARGET_mips bool "mips" -config TARGET_nios - bool "nios" +#config TARGET_nios +# bool "nios" config TARGET_nios2 bool "nios2" @@ -111,17 +113,17 @@ config TARGET_powerpc config TARGET_sh bool "superh" -config TARGET_sh64 - bool "sh64" +#config TARGET_sh64 +# bool "sh64" config TARGET_sparc bool "sparc" -config TARGET_v850 - bool "v850 (BROKEN)" +#config TARGET_v850 +# bool "v850 (BROKEN)" -config TARGET_vax - bool "vax" +#config TARGET_vax +# bool "vax" config TARGET_x86_64 bool "x86_64" @@ -472,7 +474,7 @@ config LDSO_NO_CLEANUP Unless you know you need this, you should answer N. config UCLIBC_CTOR_DTOR - bool "Support global constructors and destructors" + boolean default y help If you wish to build uClibc with support for global constructor @@ -522,6 +524,15 @@ config LINUXTHREADS_OLD bool "older (stable) version of linuxthreads" # linuxthreads and linuxthreads.old need nanosleep() select UCLIBC_HAS_REALTIME + depends on !TARGET_arc && \ + !TARGET_i386 && \ + !TARGET_metag && \ + !TARGET_mips && \ + !TARGET_powerpc && \ + !TARGET_sh && \ + !TARGET_sparc && \ + !TARGET_x86_64 && \ + !TARGET_xtensa help There are two versions of linuxthreads. The older (stable) version has been in uClibc for quite a long time but hasn't seen too many @@ -531,6 +542,16 @@ config LINUXTHREADS_OLD config LINUXTHREADS_NEW bool "slightly newer version of linuxthreads" depends on ARCH_HAS_DEPRECATED_SYSCALLS + depends on !TARGET_arc && \ + !TARGET_arm && \ + !TARGET_i386 && \ + !TARGET_metag && \ + !TARGET_mips && \ + !TARGET_powerpc && \ + !TARGET_sh && \ + !TARGET_sparc && \ + !TARGET_x86_64 && \ + !TARGET_xtensa help The new version has not been tested much, and lacks ports for arches which glibc does not support (like bfin/frv/etc...), but is based on @@ -543,24 +564,21 @@ config UCLIBC_HAS_THREADS_NATIVE select UCLIBC_HAS_STDIO_FUTEXES select UCLIBC_HAS_REALTIME # i386 has no lowlevellock support (yet) as opposed to i486 onward - depends on !CONFIG_386 + depends on !CONFIG_386 && \ + !TARGET_alpha && \ + !TARGET_avr32 && \ + !TARGET_bfin && \ + !TARGET_c6x && \ + !TARGET_cris && \ + !TARGET_hppa && \ + !TARGET_ia64 && \ + !TARGET_m68k && \ + !TARGET_microblaze && \ + !TARGET_nios2 && \ + !TARGET_vax help If you want to compile uClibc with NPTL support, then answer Y. - IMPORTANT NOTE! NPTL requires a Linux 2.6 kernel, binutils - at least version 2.16 and GCC with at least version 4.1.0. NPTL - will not work with older versions of any above sources. If you - ignore any of these guidelines, you do so at your own risk. Do - not ask for help on any of the development mailing lists. - - !!!! WARNING !!!! BIG FAT WARNING !!!! REALLY BIG FAT WARNING !!!! - - This is experimental code and at times it may not even build and - even if it does it might decide to do random damage. This code is - potentially hazardous to your health and sanity. It will remain - that way until further notice at which point this notice will - disappear. Thank you for your support and for not smoking. - endchoice config UCLIBC_HAS_THREADS @@ -2485,11 +2503,4 @@ config DOMULTI If unsure, keep the default of N. -config UCLIBC_MJN3_ONLY - bool "Manuel's hidden warnings" - help - Answer Y here to see all Manuel's personal notes, warnings, and todos. - - Most people will answer N. - endmenu diff --git a/extra/Configs/Config.mips b/extra/Configs/Config.mips index 76b10c662..4d30d31d2 100644 --- a/extra/Configs/Config.mips +++ b/extra/Configs/Config.mips @@ -33,21 +33,6 @@ config CONFIG_MIPS_N64_ABI endchoice choice - prompt "Target NAN Encoding" - default CONFIG_MIPS_NAN_LEGACY - help - This is the NAN Encoding you want to use. Chose either Legacy - or 2008. - -config CONFIG_MIPS_NAN_LEGACY - bool "LEGACY" - -config CONFIG_MIPS_NAN_2008 - bool "2008" - -endchoice - -choice prompt "Target Processor Architecture" default CONFIG_MIPS_ISA_1 if CONFIG_MIPS_O32_ABI default CONFIG_MIPS_ISA_3 if CONFIG_MIPS_N32_ABI diff --git a/include/elf.h b/include/elf.h index 39208ea3c..18d286b03 100644 --- a/include/elf.h +++ b/include/elf.h @@ -2350,6 +2350,11 @@ typedef Elf32_Addr Elf32_Conflict; #define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step */ +#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */ +#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */ +#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ + + /* ARM-specific program header flags */ #define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base */ @@ -3062,8 +3067,11 @@ typedef Elf32_Addr Elf32_Conflict; #define R_XTENSA_SLOT12_ALT 47 #define R_XTENSA_SLOT13_ALT 48 #define R_XTENSA_SLOT14_ALT 49 +#define R_XTENSA_TLSDESC_FN 50 +#define R_XTENSA_TLSDESC_ARG 51 +#define R_XTENSA_TLS_TPOFF 53 /* Keep this the last entry. */ -#define R_XTENSA_NUM 50 +#define R_XTENSA_NUM 54 /* C6X specific relocs */ #define R_C6000_NONE 0 diff --git a/include/gnu-versions.h b/include/gnu-versions.h index f67764c7b..9f537785e 100644 --- a/include/gnu-versions.h +++ b/include/gnu-versions.h @@ -45,7 +45,9 @@ #define _GNU_OBSTACK_INTERFACE_VERSION 1 /* vs malloc/obstack.c */ #define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */ +#ifdef __UCLIBC_HAS_GNU_GLOB__ #define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */ +#endif #define _GNU_GETOPT_INTERFACE_VERSION 2 /* vs posix/getopt.c and posix/getopt1.c */ diff --git a/include/link.h b/include/link.h index 147b79384..67bc80062 100644 --- a/include/link.h +++ b/include/link.h @@ -132,6 +132,8 @@ struct link_map size_t l_tls_modid; /* Nonzero if _dl_init_static_tls should be called for this module */ unsigned int l_need_tls_init:1; + /* Address of TLS descriptor hash table. */ + void *l_tlsdesc_table; #endif #endif }; diff --git a/include/math.h b/include/math.h index 1b54c9ee9..c79af3f35 100644 --- a/include/math.h +++ b/include/math.h @@ -118,6 +118,7 @@ __BEGIN_DECLS # define _Mfloat_ float # endif # define _Mdouble_ _Mfloat_ +# define _Mdouble_is_float_ # ifdef __STDC__ # define __MATH_PRECNAME(name,r) name##f##r # else @@ -126,6 +127,7 @@ __BEGIN_DECLS # define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99 # define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99 # include <bits/mathcalls.h> +# undef _Mdouble_is_float_ # undef _Mdouble_ # undef _Mdouble_BEGIN_NAMESPACE # undef _Mdouble_END_NAMESPACE diff --git a/include/netinet/tcp.h b/include/netinet/tcp.h index 06e8414b5..04032bb68 100644 --- a/include/netinet/tcp.h +++ b/include/netinet/tcp.h @@ -51,6 +51,16 @@ #define TCP_QUICKACK 12 /* Bock/reenable quick ACKs. */ #define TCP_CONGESTION 13 /* Congestion control algorithm. */ #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ +#define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ +#define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ +#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ +#define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ +#define TCP_REPAIR 19 /* TCP sock is under repair right now */ +#define TCP_REPAIR_QUEUE 20 /* Set TCP queue to repair */ +#define TCP_QUEUE_SEQ 21 /* Set sequence number of repaired queue. */ +#define TCP_REPAIR_OPTIONS 22 /* Repair TCP connection options */ +#define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */ +#define TCP_TIMESTAMP 24 /* TCP time stamp */ #ifdef __USE_MISC # include <sys/types.h> diff --git a/ldso/include/dl-hash.h b/ldso/include/dl-hash.h index e1e3e3f95..18f21aefa 100644 --- a/ldso/include/dl-hash.h +++ b/ldso/include/dl-hash.h @@ -70,6 +70,8 @@ struct elf_resolve { size_t l_tls_modid; /* Nonzero if _dl_init_static_tls should be called for this module */ unsigned int l_need_tls_init:1; + /* Address of TLS descriptor hash table. */ + void *l_tlsdesc_table; #endif ElfW(Addr) mapaddr; diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h index e556f7b56..4749d7abd 100644 --- a/ldso/include/dl-syscall.h +++ b/ldso/include/dl-syscall.h @@ -25,11 +25,7 @@ extern int _dl_errno; /* Pull in whatever this particular arch's kernel thinks the kernel version of * struct stat should look like. It turns out that each arch has a different * opinion on the subject, and different kernel revs use different names... */ -#if defined(__sparc_v9__) && (__WORDSIZE == 64) -#define kernel_stat64 stat -#else #define kernel_stat stat -#endif #include <bits/kernel_stat.h> #include <bits/kernel_types.h> @@ -146,14 +142,10 @@ static __always_inline _syscall0(gid_t, _dl_getegid) #define __NR__dl_getpid __NR_getpid static __always_inline _syscall0(gid_t, _dl_getpid) -#if defined __NR_readlinkat && !defined __NR_readlink +#if defined __NR_readlinkat # define __NR__dl_readlink __NR_readlinkat static __always_inline _syscall4(int, _dl_readlink, int, id, const char *, path, char *, buf, size_t, bufsiz) -#elif defined __NR_readlink -# define __NR__dl_readlink __NR_readlink -static __always_inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, - size_t, bufsiz) #endif #ifdef __NR_pread64 diff --git a/ldso/include/inline-hashtab.h b/ldso/include/inline-hashtab.h new file mode 100644 index 000000000..4a4812027 --- /dev/null +++ b/ldso/include/inline-hashtab.h @@ -0,0 +1,265 @@ +/* + * The hashcode handling code below is heavily inspired in libiberty's + * hashtab code, but with most adaptation points and support for + * deleting elements removed. + * + * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + * Contributed by Vladimir Makarov (vmakarov@cygnus.com). + */ + +#ifndef INLINE_HASHTAB_H +# define INLINE_HASHTAB_H 1 + +static __always_inline unsigned long +higher_prime_number(unsigned long n) +{ + /* These are primes that are near, but slightly smaller than, a power of two. */ + static const unsigned long primes[] = { + 7, + 13, + 31, + 61, + 127, + 251, + 509, + 1021, + 2039, + 4093, + 8191, + 16381, + 32749, + 65521, + 131071, + 262139, + 524287, + 1048573, + 2097143, + 4194301, + 8388593, + 16777213, + 33554393, + 67108859, + 134217689, + 268435399, + 536870909, + 1073741789, + /* 4294967291 */ + ((unsigned long) 2147483647) + ((unsigned long) 2147483644), + }; + const unsigned long *low = &primes[0]; + const unsigned long *high = &primes[ARRAY_SIZE(primes)]; + + while (low != high) { + const unsigned long *mid = low + (high - low) / 2; + if (n > *mid) + low = mid + 1; + else + high = mid; + } + +#if 0 + /* If we've run out of primes, abort. */ + if (n > *low) { + fprintf(stderr, "Cannot find prime bigger than %lu\n", n); + abort(); + } +#endif + + return *low; +} + +struct funcdesc_ht +{ + /* Table itself */ + void **entries; + + /* Current size (in entries) of the hash table */ + size_t size; + + /* Current number of elements */ + size_t n_elements; +}; + +static __always_inline struct funcdesc_ht * +htab_create(void) +{ + struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht)); + size_t ent_size; + + if (!ht) + return NULL; + ht->size = 3; + ent_size = sizeof(void *) * ht->size; + ht->entries = _dl_malloc(ent_size); + if (!ht->entries) + return NULL; + + ht->n_elements = 0; + _dl_memset(ht->entries, 0, ent_size); + + return ht; +} + +/* + * This is only called from _dl_loadaddr_unmap, so it's safe to call + * _dl_free(). See the discussion below. + */ +static __always_inline void +htab_delete(struct funcdesc_ht *htab) +{ + size_t i; + + for (i = htab->size - 1; i >= 0; i--) + if (htab->entries[i]) + _dl_free(htab->entries[i]); + + _dl_free(htab->entries); + _dl_free(htab); +} + +/* + * Similar to htab_find_slot, but without several unwanted side effects: + * - Does not call htab->eq_f when it finds an existing entry. + * - Does not change the count of elements/searches/collisions in the + * hash table. + * This function also assumes there are no deleted entries in the table. + * HASH is the hash value for the element to be inserted. + */ +static __always_inline void ** +find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash) +{ + size_t size = htab->size; + unsigned int index = hash % size; + void **slot = htab->entries + index; + int hash2; + + if (!*slot) + return slot; + + hash2 = 1 + hash % (size - 2); + for (;;) { + index += hash2; + if (index >= size) + index -= size; + + slot = htab->entries + index; + if (!*slot) + return slot; + } +} + +/* + * The following function changes size of memory allocated for the + * entries and repeatedly inserts the table elements. The occupancy + * of the table after the call will be about 50%. Naturally the hash + * table must already exist. Remember also that the place of the + * table entries is changed. If memory allocation failures are allowed, + * this function will return zero, indicating that the table could not be + * expanded. If all goes well, it will return a non-zero value. + */ +static __always_inline int +htab_expand(struct funcdesc_ht *htab, int (*hash_fn) (void *)) +{ + void **oentries; + void **olimit; + void **p; + void **nentries; + size_t nsize; + + oentries = htab->entries; + olimit = oentries + htab->size; + + /* + * Resize only when table after removal of unused elements is either + * too full or too empty. + */ + if (htab->n_elements * 2 > htab->size) + nsize = higher_prime_number(htab->n_elements * 2); + else + nsize = htab->size; + + nentries = _dl_malloc(sizeof(*nentries) * nsize); + _dl_memset(nentries, 0, sizeof(*nentries) * nsize); + if (nentries == NULL) + return 0; + htab->entries = nentries; + htab->size = nsize; + + p = oentries; + do { + if (*p) + *find_empty_slot_for_expand(htab, hash_fn(*p)) = *p; + p++; + } while (p < olimit); + +#if 0 + /* + * We can't tell whether this was allocated by the _dl_malloc() + * built into ld.so or malloc() in the main executable or libc, + * and calling free() for something that wasn't malloc()ed could + * do Very Bad Things (TM). Take the conservative approach + * here, potentially wasting as much memory as actually used by + * the hash table, even if multiple growths occur. That's not + * so bad as to require some overengineered solution that would + * enable us to keep track of how it was allocated. + */ + _dl_free(oentries); +#endif + return 1; +} + +/* + * This function searches for a hash table slot containing an entry + * equal to the given element. To delete an entry, call this with + * INSERT = 0, then call htab_clear_slot on the slot returned (possibly + * after doing some checks). To insert an entry, call this with + * INSERT = 1, then write the value you want into the returned slot. + * When inserting an entry, NULL may be returned if memory allocation + * fails. + */ +static __always_inline void ** +htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert, + int (*hash_fn)(void *), int (*eq_fn)(void *, void *)) +{ + unsigned int index; + int hash, hash2; + size_t size; + void **entry; + + if (htab->size * 3 <= htab->n_elements * 4 && + htab_expand(htab, hash_fn) == 0) + return NULL; + + hash = hash_fn(ptr); + + size = htab->size; + index = hash % size; + + entry = &htab->entries[index]; + if (!*entry) + goto empty_entry; + else if (eq_fn(*entry, ptr)) + return entry; + + hash2 = 1 + hash % (size - 2); + for (;;) { + index += hash2; + if (index >= size) + index -= size; + + entry = &htab->entries[index]; + if (!*entry) + goto empty_entry; + else if (eq_fn(*entry, ptr)) + return entry; + } + + empty_entry: + if (!insert) + return NULL; + + htab->n_elements++; + return entry; +} + +#endif diff --git a/ldso/include/ldsodefs.h b/ldso/include/ldsodefs.h index 4063d00f4..f17ac0ca0 100644 --- a/ldso/include/ldsodefs.h +++ b/ldso/include/ldsodefs.h @@ -62,13 +62,18 @@ extern void _dl_get_tls_static_info (size_t *sizep, size_t *alignp) extern void _dl_allocate_static_tls (struct link_map *map) internal_function attribute_hidden; +extern int _dl_try_allocate_static_tls (struct link_map* map) + internal_function attribute_hidden; /* Taken from glibc/elf/dl-reloc.c */ #define CHECK_STATIC_TLS(sym_map) \ do { \ - if (unlikely((sym_map)->l_tls_offset == NO_TLS_OFFSET)) \ + if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET, 0)) \ _dl_allocate_static_tls (sym_map); \ } while (0) +#define TRY_STATIC_TLS(sym_map) \ + (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1) \ + || _dl_try_allocate_static_tls (sym_map) == 0) /* These are internal entry points to the two halves of _dl_allocate_tls, only used within rtld.c itself at startup time. */ diff --git a/ldso/include/tlsdeschtab.h b/ldso/include/tlsdeschtab.h new file mode 100644 index 000000000..86baea148 --- /dev/null +++ b/ldso/include/tlsdeschtab.h @@ -0,0 +1,119 @@ +/* Hash table for TLS descriptors. + Copyright (C) 2005-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + + uClibc port by Baruch Siach <baruch@tkos.co.il> + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef TLSDESCHTAB_H +# define TLSDESCHTAB_H 1 + +# ifdef SHARED + +# include <inline-hashtab.h> + +inline static int +hash_tlsdesc (void *p) +{ + struct tlsdesc_dynamic_arg *td = p; + + /* We know all entries are for the same module, so ti_offset is the + only distinguishing entry. */ + return td->tlsinfo.ti_offset; +} + +inline static int +eq_tlsdesc (void *p, void *q) +{ + struct tlsdesc_dynamic_arg *tdp = p, *tdq = q; + + return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset; +} + +inline static int +map_generation (struct link_map *map) +{ + size_t idx = map->l_tls_modid; + struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list); + + /* Find the place in the dtv slotinfo list. */ + do + { + /* Does it fit in the array of this list element? */ + if (idx < listp->len) + { + /* We should never get here for a module in static TLS, so + we can assume that, if the generation count is zero, we + still haven't determined the generation count for this + module. */ + if (listp->slotinfo[idx].gen) + return listp->slotinfo[idx].gen; + else + break; + } + idx -= listp->len; + listp = listp->next; + } + while (listp != NULL); + + /* If we get to this point, the module still hasn't been assigned an + entry in the dtv slotinfo data structures, and it will when we're + done with relocations. At that point, the module will get a + generation number that is one past the current generation, so + return exactly that. */ + return GL(dl_tls_generation) + 1; +} + +void * +internal_function +_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset) +{ + struct funcdesc_ht *ht; + void **entry; + struct tlsdesc_dynamic_arg *td, test; + + ht = map->l_tlsdesc_table; + if (! ht) + { + ht = htab_create (); + if (! ht) + return 0; + map->l_tlsdesc_table = ht; + } + + test.tlsinfo.ti_module = map->l_tls_modid; + test.tlsinfo.ti_offset = ti_offset; + entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc); + if (*entry) + { + td = *entry; + return td; + } + + *entry = td = _dl_malloc (sizeof (struct tlsdesc_dynamic_arg)); + /* This may be higher than the map's generation, but it doesn't + matter much. Worst case, we'll have one extra DTV update per + thread. */ + td->gen_count = map_generation (map); + td->tlsinfo = test.tlsinfo; + + return td; +} + +# endif /* SHARED */ + +#endif diff --git a/ldso/ldso/Makefile.in b/ldso/ldso/Makefile.in index e0d0a097d..56f4a4556 100644 --- a/ldso/ldso/Makefile.in +++ b/ldso/ldso/Makefile.in @@ -27,6 +27,14 @@ CFLAGS-$(DODEBUG)-ldso/ldso := -O2 -g CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\" +# avoid ld.so linking error since gcc 4.9.x: undefined reference to abort +ifeq ($(TARGET_ARCH),xtensa) +CFLAGS-ldso.c += -fno-delete-null-pointer-checks +endif +ifeq ($(TARGET_ARCH),sh) +CFLAGS-ldso.c += -fno-delete-null-pointer-checks +endif + LDFLAGS-$(UCLIBC_FORMAT_DSBT_ELF)-$(UCLIBC_LDSO_NAME).so := -Wl,--dsbt-index=1 ifneq ($(SUPPORT_LD_DEBUG),y) LDFLAGS-$(UCLIBC_LDSO_NAME).so := $(LDFLAGS) diff --git a/ldso/ldso/arm/dl-sysdep.h b/ldso/ldso/arm/dl-sysdep.h index 94dc1d707..dc89710c6 100644 --- a/ldso/ldso/arm/dl-sysdep.h +++ b/ldso/ldso/arm/dl-sysdep.h @@ -105,7 +105,7 @@ elf_machine_dynamic (void) return dynamic; } -extern void __dl_start __asm__ ("_dl_start"); +extern char __dl_start[] __asm__("_dl_start"); /* Return the run-time load address of the shared object. */ static __always_inline Elf32_Addr __attribute__ ((unused)) diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c index c2f52b822..2043263ec 100644 --- a/ldso/ldso/arm/elfinterp.c +++ b/ldso/ldso/arm/elfinterp.c @@ -69,7 +69,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry) got_addr = (char **) instr_addr; /* Get the address of the GOT entry */ - new_addr = _dl_find_hash(symname, &_dl_loaded_modules->symbol_scope, + new_addr = (unsigned long)_dl_find_hash(symname, &_dl_loaded_modules->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT, NULL); if (unlikely(!new_addr)) { _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", @@ -203,7 +203,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct r_scope_elem *scope, symname = strtab + symtab[symtab_index].st_name; if (symtab_index) { - symbol_addr = _dl_find_hash(symname, scope, tpnt, + symbol_addr = (unsigned long)_dl_find_hash(symname, scope, tpnt, elf_machine_type_class(reloc_type), &sym_ref); /* diff --git a/ldso/ldso/avr32/dl-sysdep.h b/ldso/ldso/avr32/dl-sysdep.h index 515d829d0..a42212731 100644 --- a/ldso/ldso/avr32/dl-sysdep.h +++ b/ldso/ldso/avr32/dl-sysdep.h @@ -63,11 +63,12 @@ elf_machine_dynamic (void) return *got; } +extern char __dl_start[] __asm__("_dl_start"); + /* Return the run-time load address of the shared object. */ static __always_inline Elf32_Addr elf_machine_load_address (void) { - extern void __dl_start __asm__("_dl_start"); Elf32_Addr got_addr = (Elf32_Addr) &__dl_start; Elf32_Addr pcrel_addr; diff --git a/ldso/ldso/bfin/dl-sysdep.h b/ldso/ldso/bfin/dl-sysdep.h index c96526356..a026b641d 100644 --- a/ldso/ldso/bfin/dl-sysdep.h +++ b/ldso/ldso/bfin/dl-sysdep.h @@ -79,6 +79,7 @@ while (0) #define DL_MAP_SEGMENT(EPNT, PPNT, INFILE, FLAGS) \ __dl_map_segment (EPNT, PPNT, INFILE, FLAGS) +#if defined(__FDPIC__) #include "../fdpic/dl-sysdep.h" static __always_inline Elf32_Addr @@ -92,13 +93,6 @@ static __always_inline void elf_machine_relative (DL_LOADADDR_TYPE load_off, const Elf32_Addr rel_addr, Elf32_Word relative_count) { -#if 0 - Elf32_Rel * rpnt = (void *) rel_addr; - --rpnt; - do { - Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset); - - *reloc_addr = DL_RELOC_ADDR (load_off, *reloc_addr); - } while (--relative_count); -#endif + return 0; } +#endif diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index 56319056d..49b516390 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -133,56 +133,60 @@ _dl_protect_relro (struct elf_resolve *l) * in uClibc/ldso/util/ldd.c */ static struct elf_resolve * search_for_named_library(const char *name, unsigned rflags, const char *path_list, - struct dyn_elf **rpnt) + struct dyn_elf **rpnt, const char* origin) { - char *path, *path_n, *mylibname; + char *mylibname; struct elf_resolve *tpnt; - int done; + const char *p, *pn; + int plen; if (path_list==NULL) return NULL; - /* We need a writable copy of this string, but we don't - * need this allocated permanently since we don't want - * to leak memory, so use alloca to put path on the stack */ - done = _dl_strlen(path_list); - path = alloca(done + 1); - /* another bit of local storage */ mylibname = alloca(2050); - _dl_memcpy(path, path_list, done+1); - /* Unlike ldd.c, don't bother to eliminate double //s */ /* Replace colons with zeros in path_list */ /* : at the beginning or end of path maps to CWD */ /* :: anywhere maps CWD */ /* "" maps to CWD */ - done = 0; - path_n = path; - do { - if (*path == 0) { - *path = ':'; - done = 1; + for (p = path_list; p != NULL; p = pn) { + pn = _dl_strchr(p + 1, ':'); + if (pn != NULL) { + plen = pn - p; + pn++; + } else + plen = _dl_strlen(p); + + if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { + int olen; + if (rflags && plen != 7) + continue; + if (origin == NULL) + continue; + for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--) + ; + if (olen <= 0) + continue; + _dl_memcpy(&mylibname[0], origin, olen); + _dl_memcpy(&mylibname[olen], p + 7, plen - 7); + mylibname[olen + plen - 7] = 0; + } else if (plen != 0) { + _dl_memcpy(mylibname, p, plen); + mylibname[plen] = 0; + } else { + _dl_strcpy(mylibname, "."); } - if (*path == ':') { - *path = 0; - if (*path_n) - _dl_strcpy(mylibname, path_n); - else - _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */ - _dl_strcat(mylibname, "/"); - _dl_strcat(mylibname, name); + _dl_strcat(mylibname, "/"); + _dl_strcat(mylibname, name); #ifdef __LDSO_SAFE_RUNPATH__ - if (*mylibname == '/') + if (*mylibname == '/') #endif - if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL) - return tpnt; - path_n = path+1; - } - path++; - } while (!done); + if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL) + return tpnt; + } return NULL; } @@ -234,8 +238,10 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp if (pnt) { pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); - if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) + if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, + tpnt->libname)) != NULL) return tpnt1; + } #endif @@ -243,7 +249,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ if (_dl_library_path) { _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); - if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt)) != NULL) + if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt, NULL)) != NULL) { return tpnt1; } @@ -257,9 +263,21 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp if (pnt) { pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); - if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) + if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, NULL)) != NULL) return tpnt1; } +#ifdef __LDSO_RUNPATH_OF_EXECUTABLE__ + /* + * Try the DT_RPATH of the executable itself. + */ + 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 #endif /* @@ -291,7 +309,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp /* Look for libraries wherever the shared library loader * was installed */ _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); - tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt); + tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt, NULL); if (tpnt1 != NULL) return tpnt1; #endif @@ -304,7 +322,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp #ifndef __LDSO_CACHE_SUPPORT__ ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib" #endif - , rpnt); + , rpnt, NULL); if (tpnt1 != NULL) return tpnt1; diff --git a/ldso/ldso/dl-tls.c b/ldso/ldso/dl-tls.c index 6679693f4..5d6d3b9d3 100644 --- a/ldso/ldso/dl-tls.c +++ b/ldso/ldso/dl-tls.c @@ -100,20 +100,16 @@ _dl_realloc (void * __ptr, size_t __size) * the static TLS area already allocated for each running thread. If this * object's TLS segment is too big to fit, we fail. If it fits, * we set MAP->l_tls_offset and return. - * This function intentionally does not return any value but signals error - * directly, as static TLS should be rare and code handling it should - * not be inlined as much as possible. */ -void -internal_function __attribute_noinline__ -_dl_allocate_static_tls (struct link_map *map) +int +internal_function +_dl_try_allocate_static_tls (struct link_map* map) { /* If the alignment requirements are too high fail. */ if (map->l_tls_align > _dl_tls_static_align) { fail: - _dl_dprintf(2, "cannot allocate memory in static TLS block"); - _dl_exit(30); + return -1; } # ifdef TLS_TCB_AT_TP @@ -169,6 +165,23 @@ fail: } else map->l_need_tls_init = 1; + + return 0; +} + +/* + * This function intentionally does not return any value but signals error + * directly, as static TLS should be rare and code handling it should + * not be inlined as much as possible. + */ +void +internal_function __attribute_noinline__ +_dl_allocate_static_tls (struct link_map *map) +{ + if (_dl_try_allocate_static_tls (map)) { + _dl_dprintf(2, "cannot allocate memory in static TLS block"); + _dl_exit(30); + } } #ifdef SHARED diff --git a/ldso/ldso/fdpic/dl-inlines.h b/ldso/ldso/fdpic/dl-inlines.h index 14a491689..ebbd0334c 100644 --- a/ldso/ldso/fdpic/dl-inlines.h +++ b/ldso/ldso/fdpic/dl-inlines.h @@ -5,6 +5,8 @@ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ +#include <inline-hashtab.h> + /* Initialize a DL_LOADADDR_TYPE given a got pointer and a complete load map. */ static __always_inline void __dl_init_loadaddr_map(struct elf32_fdpic_loadaddr *loadaddr, Elf32_Addr dl_boot_got_pointer, @@ -143,269 +145,18 @@ __dl_addr_in_loadaddr(void *p, struct elf32_fdpic_loadaddr loadaddr) return 0; } -/* - * The hashcode handling code below is heavily inspired in libiberty's - * hashtab code, but with most adaptation points and support for - * deleting elements removed. - * - * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - * Contributed by Vladimir Makarov (vmakarov@cygnus.com). - */ -static __always_inline unsigned long -higher_prime_number(unsigned long n) -{ - /* These are primes that are near, but slightly smaller than, a power of two. */ - static const unsigned long primes[] = { - 7, - 13, - 31, - 61, - 127, - 251, - 509, - 1021, - 2039, - 4093, - 8191, - 16381, - 32749, - 65521, - 131071, - 262139, - 524287, - 1048573, - 2097143, - 4194301, - 8388593, - 16777213, - 33554393, - 67108859, - 134217689, - 268435399, - 536870909, - 1073741789, - /* 4294967291 */ - ((unsigned long) 2147483647) + ((unsigned long) 2147483644), - }; - const unsigned long *low = &primes[0]; - const unsigned long *high = &primes[ARRAY_SIZE(primes)]; - - while (low != high) { - const unsigned long *mid = low + (high - low) / 2; - if (n > *mid) - low = mid + 1; - else - high = mid; - } - -#if 0 - /* If we've run out of primes, abort. */ - if (n > *low) { - fprintf(stderr, "Cannot find prime bigger than %lu\n", n); - abort(); - } -#endif - - return *low; -} - -struct funcdesc_ht -{ - /* Table itself */ - struct funcdesc_value **entries; - - /* Current size (in entries) of the hash table */ - size_t size; - - /* Current number of elements */ - size_t n_elements; -}; - -static __always_inline int -hash_pointer(const void *p) +static int +hash_pointer(void *p) { return (int) ((long)p >> 3); } -static __always_inline struct funcdesc_ht * -htab_create(void) -{ - struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht)); - size_t ent_size; - - if (!ht) - return NULL; - ht->size = 3; - ent_size = sizeof(struct funcdesc_ht_value *) * ht->size; - ht->entries = _dl_malloc(ent_size); - if (!ht->entries) - return NULL; - - ht->n_elements = 0; - _dl_memset(ht->entries, 0, ent_size); - - return ht; -} - -/* - * This is only called from _dl_loadaddr_unmap, so it's safe to call - * _dl_free(). See the discussion below. - */ -static __always_inline void -htab_delete(struct funcdesc_ht *htab) +static int +eq_pointer(void *p, void *q) { - size_t i; - - for (i = htab->size - 1; i >= 0; i--) - if (htab->entries[i]) - _dl_free(htab->entries[i]); - - _dl_free(htab->entries); - _dl_free(htab); -} - -/* - * Similar to htab_find_slot, but without several unwanted side effects: - * - Does not call htab->eq_f when it finds an existing entry. - * - Does not change the count of elements/searches/collisions in the - * hash table. - * This function also assumes there are no deleted entries in the table. - * HASH is the hash value for the element to be inserted. - */ -static __always_inline struct funcdesc_value ** -find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash) -{ - size_t size = htab->size; - unsigned int index = hash % size; - struct funcdesc_value **slot = htab->entries + index; - int hash2; - - if (!*slot) - return slot; - - hash2 = 1 + hash % (size - 2); - for (;;) { - index += hash2; - if (index >= size) - index -= size; - - slot = htab->entries + index; - if (!*slot) - return slot; - } -} - -/* - * The following function changes size of memory allocated for the - * entries and repeatedly inserts the table elements. The occupancy - * of the table after the call will be about 50%. Naturally the hash - * table must already exist. Remember also that the place of the - * table entries is changed. If memory allocation failures are allowed, - * this function will return zero, indicating that the table could not be - * expanded. If all goes well, it will return a non-zero value. - */ -static __always_inline int -htab_expand(struct funcdesc_ht *htab) -{ - struct funcdesc_value **oentries; - struct funcdesc_value **olimit; - struct funcdesc_value **p; - struct funcdesc_value **nentries; - size_t nsize; - - oentries = htab->entries; - olimit = oentries + htab->size; - - /* - * Resize only when table after removal of unused elements is either - * too full or too empty. - */ - if (htab->n_elements * 2 > htab->size) - nsize = higher_prime_number(htab->n_elements * 2); - else - nsize = htab->size; - - nentries = _dl_malloc(sizeof(*nentries) * nsize); - _dl_memset(nentries, 0, sizeof(*nentries) * nsize); - if (nentries == NULL) - return 0; - htab->entries = nentries; - htab->size = nsize; - - p = oentries; - do { - if (*p) - *find_empty_slot_for_expand(htab, hash_pointer((*p)->entry_point)) = *p; - p++; - } while (p < olimit); - -#if 0 - /* - * We can't tell whether this was allocated by the _dl_malloc() - * built into ld.so or malloc() in the main executable or libc, - * and calling free() for something that wasn't malloc()ed could - * do Very Bad Things (TM). Take the conservative approach - * here, potentially wasting as much memory as actually used by - * the hash table, even if multiple growths occur. That's not - * so bad as to require some overengineered solution that would - * enable us to keep track of how it was allocated. - */ - _dl_free(oentries); -#endif - return 1; -} - -/* - * This function searches for a hash table slot containing an entry - * equal to the given element. To delete an entry, call this with - * INSERT = 0, then call htab_clear_slot on the slot returned (possibly - * after doing some checks). To insert an entry, call this with - * INSERT = 1, then write the value you want into the returned slot. - * When inserting an entry, NULL may be returned if memory allocation - * fails. - */ -static __always_inline struct funcdesc_value ** -htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert) -{ - unsigned int index; - int hash, hash2; - size_t size; - struct funcdesc_value **entry; - - if (htab->size * 3 <= htab->n_elements * 4 && - htab_expand(htab) == 0) - return NULL; - - hash = hash_pointer(ptr); - - size = htab->size; - index = hash % size; - - entry = &htab->entries[index]; - if (!*entry) - goto empty_entry; - else if ((*entry)->entry_point == ptr) - return entry; - - hash2 = 1 + hash % (size - 2); - for (;;) { - index += hash2; - if (index >= size) - index -= size; - - entry = &htab->entries[index]; - if (!*entry) - goto empty_entry; - else if ((*entry)->entry_point == ptr) - return entry; - } - - empty_entry: - if (!insert) - return NULL; + struct funcdesc_value *entry = p; - htab->n_elements++; - return entry; + return entry->entry_point == q; } void * @@ -424,7 +175,7 @@ _dl_funcdesc_for (void *entry_point, void *got_value) tpnt->funcdesc_ht = ht; } - entry = htab_find_slot(ht, entry_point, 1); + entry = htab_find_slot(ht, entry_point, 1, hash_pointer, eq_pointer); if (*entry) { _dl_assert((*entry)->entry_point == entry_point); return _dl_stabilize_funcdesc(*entry); @@ -459,7 +210,8 @@ _dl_lookup_address(void const *address) if (fd->got_value != rpnt->loadaddr.got_value) continue; - address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0); + address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0, + hash_pointer, eq_pointer); if (address && *(struct funcdesc_value *const*)address == fd) { address = (*(struct funcdesc_value *const*)address)->entry_point; diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 56196292b..7367f1737 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -403,6 +403,20 @@ static ptrdiff_t _dl_build_local_scope (struct elf_resolve **list, return p - list; } +static void _dl_setup_progname(const char *argv0) +{ + char image[PATH_MAX]; + ssize_t s; + + s = _dl_readlink(AT_FDCWD, "/proc/self/exe", image, sizeof(image)); + if (s > 0 && image[0] == '/') { + image[s] = 0; + _dl_progname = _dl_strdup(image); + } else if (argv0) { + _dl_progname = argv0; + } +} + void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv DL_GET_READY_TO_RUN_EXTRA_PARMS) @@ -454,9 +468,7 @@ void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, * been fixed up by now. Still no function calls outside of this * library, since the dynamic resolver is not yet ready. */ - if (argv[0]) { - _dl_progname = argv[0]; - } + _dl_setup_progname(argv[0]); #ifdef __DSBT__ _dl_ldso_dsbt = (void *)tpnt->dynamic_info[DT_DSBT_BASE_IDX]; diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index dfe37c526..6310c7735 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/ldso/ldso/mips/elfinterp.c @@ -239,12 +239,12 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, case R_MIPS_TLS_DTPMOD64: case R_MIPS_TLS_DTPMOD32: if (tls_tpnt) - *(ElfW(Word) *)reloc_addr = tls_tpnt->l_tls_modid; + *(ElfW(Addr) *)reloc_addr = tls_tpnt->l_tls_modid; break; case R_MIPS_TLS_DTPREL64: case R_MIPS_TLS_DTPREL32: - *(ElfW(Word) *)reloc_addr += + *(ElfW(Addr) *)reloc_addr += TLS_DTPREL_VALUE (symbol_addr); break; diff --git a/ldso/ldso/xtensa/dl-debug.h b/ldso/ldso/xtensa/dl-debug.h index 4128d9452..18beae5ca 100644 --- a/ldso/ldso/xtensa/dl-debug.h +++ b/ldso/ldso/xtensa/dl-debug.h @@ -8,54 +8,31 @@ static const char * const _dl_reltypes_tab[] = { - "R_XTENSA_NONE", - "R_XTENSA_32", - "R_XTENSA_RTLD", - "R_XTENSA_GLOB_DAT", - "R_XTENSA_JMP_SLOT", - "R_XTENSA_RELATIVE", - "R_XTENSA_PLT", - "R_XTENSA_UNUSED7", - "R_XTENSA_OP0", - "R_XTENSA_OP1", - "R_XTENSA_OP2", - "R_XTENSA_ASM_EXPAND", - "R_XTENSA_ASM_SIMPLIFY", - "R_XTENSA_UNUSED13", - "R_XTENSA_UNUSED14", - "R_XTENSA_GNU_VTINHERIT", - "R_XTENSA_GNU_VTENTRY", - "R_XTENSA_DIFF8", - "R_XTENSA_DIFF16", - "R_XTENSA_DIFF32", - "R_XTENSA_SLOT0_OP", - "R_XTENSA_SLOT1_OP", - "R_XTENSA_SLOT2_OP", - "R_XTENSA_SLOT3_OP", - "R_XTENSA_SLOT4_OP", - "R_XTENSA_SLOT5_OP", - "R_XTENSA_SLOT6_OP", - "R_XTENSA_SLOT7_OP", - "R_XTENSA_SLOT8_OP", - "R_XTENSA_SLOT9_OP", - "R_XTENSA_SLOT10_OP", - "R_XTENSA_SLOT11_OP", - "R_XTENSA_SLOT12_OP", - "R_XTENSA_SLOT13_OP", - "R_XTENSA_SLOT14_OP", - "R_XTENSA_SLOT0_ALT", - "R_XTENSA_SLOT1_ALT", - "R_XTENSA_SLOT2_ALT", - "R_XTENSA_SLOT3_ALT", - "R_XTENSA_SLOT4_ALT", - "R_XTENSA_SLOT5_ALT", - "R_XTENSA_SLOT6_ALT", - "R_XTENSA_SLOT7_ALT", - "R_XTENSA_SLOT8_ALT", - "R_XTENSA_SLOT9_ALT", - "R_XTENSA_SLOT10_ALT", - "R_XTENSA_SLOT11_ALT", - "R_XTENSA_SLOT12_ALT", - "R_XTENSA_SLOT13_ALT", - "R_XTENSA_SLOT14_ALT" + [0] "R_XTENSA_NONE", "R_XTENSA_32", + [2] "R_XTENSA_RTLD", "R_XTENSA_GLOB_DAT", + [4] "R_XTENSA_JMP_SLOT", "R_XTENSA_RELATIVE", + [6] "R_XTENSA_PLT", "R_XTENSA_UNUSED7", + [8] "R_XTENSA_OP0", "R_XTENSA_OP1", + [10] "R_XTENSA_OP2", "R_XTENSA_ASM_EXPAND", + [12] "R_XTENSA_ASM_SIMPLIFY", "R_XTENSA_UNUSED13", + [14] "R_XTENSA_UNUSED14", "R_XTENSA_GNU_VTINHERIT", + [16] "R_XTENSA_GNU_VTENTRY", "R_XTENSA_DIFF8", + [18] "R_XTENSA_DIFF16", "R_XTENSA_DIFF32", + [20] "R_XTENSA_SLOT0_OP", "R_XTENSA_SLOT1_OP", + [22] "R_XTENSA_SLOT2_OP", "R_XTENSA_SLOT3_OP", + [24] "R_XTENSA_SLOT4_OP", "R_XTENSA_SLOT5_OP", + [26] "R_XTENSA_SLOT6_OP", "R_XTENSA_SLOT7_OP", + [28] "R_XTENSA_SLOT8_OP", "R_XTENSA_SLOT9_OP", + [30] "R_XTENSA_SLOT10_OP", "R_XTENSA_SLOT11_OP", + [32] "R_XTENSA_SLOT12_OP", "R_XTENSA_SLOT13_OP", + [34] "R_XTENSA_SLOT14_OP", "R_XTENSA_SLOT0_ALT", + [36] "R_XTENSA_SLOT1_ALT", "R_XTENSA_SLOT2_ALT", + [38] "R_XTENSA_SLOT3_ALT", "R_XTENSA_SLOT4_ALT", + [40] "R_XTENSA_SLOT5_ALT", "R_XTENSA_SLOT6_ALT", + [42] "R_XTENSA_SLOT7_ALT", "R_XTENSA_SLOT8_ALT", + [44] "R_XTENSA_SLOT9_ALT", "R_XTENSA_SLOT10_ALT", + [46] "R_XTENSA_SLOT11_ALT", "R_XTENSA_SLOT12_ALT", + [48] "R_XTENSA_SLOT13_ALT", "R_XTENSA_SLOT14_ALT", + [50] "R_XTENSA_TLSDESC_FN", "R_XTENSA_TLSDESC_ARG", + [52] "R_XTENSA_TLS_TPOFF" }; diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h index 0c28d5e44..8fe54a3c7 100644 --- a/ldso/ldso/xtensa/dl-startup.h +++ b/ldso/ldso/xtensa/dl-startup.h @@ -11,7 +11,7 @@ __asm__ ( " .text\n" " .align 4\n" - " .literal_position\n" + " .literal_position\n" " .global _start\n" " .type _start, @function\n" " .hidden _start\n" diff --git a/ldso/ldso/xtensa/dl-sysdep.h b/ldso/ldso/xtensa/dl-sysdep.h index 5f8bcb0a8..d308237d3 100644 --- a/ldso/ldso/xtensa/dl-sysdep.h +++ b/ldso/ldso/xtensa/dl-sysdep.h @@ -100,10 +100,13 @@ typedef struct xtensa_got_location_struct { struct elf_resolve; extern unsigned long _dl_linux_resolver (struct elf_resolve *, int); -/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so - undefined references should not be allowed to define the value. */ +/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or + TLS variable, so undefined references should not be allowed to define + the value. */ #define elf_machine_type_class(type) \ - (((type) == R_XTENSA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) + (((type) == R_XTENSA_JMP_SLOT || (type) == R_XTENSA_TLS_TPOFF \ + || (type) == R_XTENSA_TLSDESC_FN || (type) == R_XTENSA_TLSDESC_ARG) \ + * ELF_RTYPE_CLASS_PLT) /* Return the link-time address of _DYNAMIC. */ static __always_inline Elf32_Addr diff --git a/ldso/ldso/xtensa/dl-tlsdesc.S b/ldso/ldso/xtensa/dl-tlsdesc.S new file mode 100644 index 000000000..0638af439 --- /dev/null +++ b/ldso/ldso/xtensa/dl-tlsdesc.S @@ -0,0 +1,98 @@ +/* Thread-local storage handling in the ELF dynamic linker. Xtensa version. + Copyright (C) 2012-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +#if defined __UCLIBC_HAS_TLS__ +#include <tls.h> +#include "tlsdesc.h" + + .text + .align 4 + .hidden _dl_tlsdesc_return + .global _dl_tlsdesc_return + .type _dl_tlsdesc_return, @function +_dl_tlsdesc_return: + entry a1, 16 + rur.threadptr a3 + add a2, a2, a3 + retw + .size _dl_tlsdesc_return, .-_dl_tlsdesc_return + +#ifdef SHARED + + + /* This function is used for symbols that need dynamic TLS. + + The argument passed to this function points to the TLS descriptor. + + The assembly code that follows is a rendition of the following + C code, hand-optimized a little bit. + + ptrdiff_t + _dl_tlsdesc_dynamic(struct tlsdesc_dynamic_arg *td) + { + dtv_t *dtv = (dtv_t *)THREAD_DTV(); + if (td->gen_count <= dtv[0].counter + && dtv[td->tlsinfo.ti_module].pointer.val + != TLS_DTV_UNALLOCATED) + return dtv[td->tlsinfo.ti_module].pointer.val + + td->tlsinfo.ti_offset - __builtin_thread_pointer(); + return __tls_get_addr (&td->tlsinfo) - __builtin_thread_pointer(); + } + */ + + .align 4 + .hidden _dl_tlsdesc_dynamic + .global _dl_tlsdesc_dynamic + .type _dl_tlsdesc_dynamic, @function +_dl_tlsdesc_dynamic: + entry a1, 32 + + /* dtv_t *dtv = (dtv_t *)THREAD_DTV(); */ + rur.threadptr a3 + l32i a4, a3, 0 + + /* if (td->gen_count <= dtv[0].counter */ + l32i a6, a2, TLSDESC_GEN_COUNT + l32i a7, a4, 0 + blt a7, a6, .Lslow + + /* && dtv[td->tlsinfo.ti_module].pointer.val != TLS_DTV_UNALLOCATED) */ + l32i a6, a2, TLSDESC_MODID + addx8 a6, a3, a6 + l32i a6, a6, 0 + beqi a6, -1, .Lslow + + /* return dtv[td->tlsinfo.ti_module].pointer.val + + td->tlsinfo.ti_offset - __builtin_thread_pointer(); */ + l32i a6, a2, TLSDESC_MODOFF + sub a2, a6, a3 + retw + + /* return __tls_get_addr (&td->tlsinfo) - __builtin_thread_pointer(); */ +.Lslow: + mov a10, a2 + movi a8, __tls_get_addr + callx8 a8 + sub a2, a10, a3 + retw + .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic + +#endif /* SHARED */ +#endif diff --git a/ldso/ldso/xtensa/elfinterp.c b/ldso/ldso/xtensa/elfinterp.c index b4cf9752d..66deb63ab 100644 --- a/ldso/ldso/xtensa/elfinterp.c +++ b/ldso/ldso/xtensa/elfinterp.c @@ -32,6 +32,11 @@ #include "ldso.h" +#if defined(USE_TLS) && USE_TLS +#include "dl-tls.h" +#include "tlsdeschtab.h" +#endif + unsigned long _dl_linux_resolver (struct elf_resolve *tpnt, int reloc_entry) { @@ -146,6 +151,9 @@ _dl_do_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope, int reloc_type; int symtab_index; char *symname; +#if defined USE_TLS && USE_TLS + struct elf_resolve *tls_tpnt = NULL; +#endif struct symbol_ref sym_ref; ElfW(Addr) *reloc_addr; ElfW(Addr) symbol_addr; @@ -172,15 +180,22 @@ _dl_do_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope, * here, so all bases should be covered. */ if (unlikely (!symbol_addr && + ELF_ST_TYPE (sym_ref.sym->st_info) != STT_TLS && ELF_ST_BIND (sym_ref.sym->st_info) != STB_WEAK)) { - _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", - _dl_progname, symname); - _dl_exit (1); + return 1; } if (_dl_trace_prelink) { _dl_debug_lookup (symname, tpnt, &symtab[symtab_index], &sym_ref, elf_machine_type_class(reloc_type)); } +#if defined USE_TLS && USE_TLS + tls_tpnt = sym_ref.tpnt; +#endif + } else { + symbol_addr =symtab[symtab_index].st_value; +#if defined USE_TLS && USE_TLS + tls_tpnt = tpnt; +#endif } #if defined (__SUPPORT_LD_DEBUG__) @@ -198,8 +213,8 @@ _dl_do_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope, case R_XTENSA_RTLD: if (rpnt->r_addend == 1) { - /* Grab the function pointer stashed at the beginning of the - GOT by the GOT_INIT function. */ + /* Grab the function pointer stashed at the beginning + of the GOT by the GOT_INIT function. */ *reloc_addr = *(ElfW(Addr) *) tpnt->dynamic_info[DT_PLTGOT]; } else if (rpnt->r_addend == 2) { /* Store the link map for the object. */ @@ -213,6 +228,35 @@ _dl_do_reloc (struct elf_resolve *tpnt, struct r_scope_elem *scope, *reloc_addr += tpnt->loadaddr + rpnt->r_addend; break; +#if defined USE_TLS && USE_TLS + case R_XTENSA_TLS_TPOFF: + CHECK_STATIC_TLS((struct link_map *) tls_tpnt); + *reloc_addr = symbol_addr + tls_tpnt->l_tls_offset + rpnt->r_addend; + break; + case R_XTENSA_TLSDESC_FN: +#ifndef SHARED + CHECK_STATIC_TLS((struct link_map *) tls_tpnt); +#else + if (!TRY_STATIC_TLS ((struct link_map *) tls_tpnt)) + *reloc_addr = (ElfW(Addr)) _dl_tlsdesc_dynamic; + else +#endif + *reloc_addr = (ElfW(Addr)) _dl_tlsdesc_return; + break; + case R_XTENSA_TLSDESC_ARG: +#ifndef SHARED + CHECK_STATIC_TLS((struct link_map *) tls_tpnt); +#else + if (!TRY_STATIC_TLS ((struct link_map *) tls_tpnt)) + *reloc_addr = (ElfW(Addr)) + _dl_make_tlsdesc_dynamic((struct link_map *) tls_tpnt, + symbol_addr + *reloc_addr); + else +#endif + *reloc_addr += symbol_addr + tls_tpnt->l_tls_offset; + break; +#endif + default: return -1; /* Calls _dl_exit(1). */ } diff --git a/libc/inet/ntop.c b/libc/inet/ntop.c index 0181a415c..30dde6f9c 100644 --- a/libc/inet/ntop.c +++ b/libc/inet/ntop.c @@ -105,7 +105,7 @@ inet_ntop6(const u_char *src, char *dst, size_t size) * to use pointer overlays. All the world's not a VAX. */ char tmp[sizeof ("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")], *tp; - struct { int base, len; } best, cur; + struct { int base, len; } best = { 0, 0 }, cur = { 0, 0 }; u_int words[8]; int i; diff --git a/libc/misc/regex/regex_internal.c b/libc/misc/regex/regex_internal.c index f9412d663..c74c6a0c3 100644 --- a/libc/misc/regex/regex_internal.c +++ b/libc/misc/regex/regex_internal.c @@ -650,15 +650,8 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) mbstate_t cur_state; wchar_t wc2; int mlen = raw + pstr->len - p; - unsigned char buf[6]; size_t mbclen; - if (BE (pstr->trans != NULL, 0)) - { - int i = mlen < 6 ? mlen : 6; - while (--i >= 0) - buf[i] = pstr->trans[p[i]]; - } /* XXX Don't use mbrtowc, we know which conversion to use (UTF-8 -> UCS4). */ memset (&cur_state, 0, sizeof (cur_state)); diff --git a/libc/stdio/__fpending.c b/libc/stdio/__fpending.c index a7fe05463..e7e33e80a 100644 --- a/libc/stdio/__fpending.c +++ b/libc/stdio/__fpending.c @@ -18,13 +18,6 @@ * convert wide chars to their multibyte encodings and buffer _those_. */ -#ifdef __UCLIBC_HAS_WCHAR__ -#warning Note: Unlike the glibc version, this __fpending returns bytes in buffer for wide streams too! - -link_warning(__fpending, "This version of __fpending returns bytes remaining in buffer for both narrow and wide streams. glibc's version returns wide chars in buffer for the wide stream case.") - -#endif - size_t __fpending(register FILE * __restrict stream) { __STDIO_STREAM_VALIDATE(stream); diff --git a/libc/stdio/_scanf.c b/libc/stdio/_scanf.c index 6ecb3cb1e..d48fd1267 100644 --- a/libc/stdio/_scanf.c +++ b/libc/stdio/_scanf.c @@ -553,9 +553,8 @@ enum { /**********************************************************************/ #ifdef L_vfwscanf -/* FIXME: "warning: the right operand of ">" changes sign when promoted" */ -#if WINT_MIN > EOF -#error Unfortunately, we currently need wint_t to be able to store EOF. Sorry. +#if WINT_MIN > WEOF +#error Unfortunately, we currently need wint_t to be able to store WEOF. Sorry. #endif #define W_EOF WEOF #define Wint wint_t @@ -1144,7 +1143,7 @@ int VFSCANF (FILE *__restrict fp, const Wchar *__restrict format, va_list arg) unsigned char buf[MAX_DIGITS+2]; #ifdef L_vfscanf unsigned char scanset[UCHAR_MAX + 1]; - unsigned char invert; /* Careful! Meaning changes. */ + unsigned char invert = 0; /* Careful! Meaning changes. */ #endif /* L_vfscanf */ unsigned char fail; unsigned char zero_conversions = 1; diff --git a/libc/stdio/_stdio.c b/libc/stdio/_stdio.c index 388a2117c..ee247a5fd 100644 --- a/libc/stdio/_stdio.c +++ b/libc/stdio/_stdio.c @@ -195,7 +195,6 @@ void _stdio_term(void) * chain might be corrupt due to a partial store. */ STDIO_INIT_MUTEX(_stdio_openlist_add_lock); -#warning check #ifdef __STDIO_BUFFERS STDIO_INIT_MUTEX(_stdio_openlist_del_lock); #endif diff --git a/libc/stdio/fflush.c b/libc/stdio/fflush.c index d9104a42f..cf0356a38 100644 --- a/libc/stdio/fflush.c +++ b/libc/stdio/fflush.c @@ -97,8 +97,6 @@ int fflush_unlocked(register FILE *stream) while(stream) { /* We only care about currently writing streams and do not want to * block trying to obtain mutexes on non-writing streams. */ -#warning fix for nonatomic -#warning unnecessary check if no threads if (__STDIO_STREAM_IS_WRITING(stream)) { /* ONLY IF ATOMIC!!! */ __MY_STDIO_THREADLOCK(stream); /* Need to check again once we have the lock. */ diff --git a/libc/stdio/popen.c b/libc/stdio/popen.c index 40a6ddac1..e1b1d4038 100644 --- a/libc/stdio/popen.c +++ b/libc/stdio/popen.c @@ -124,8 +124,6 @@ FILE *popen(const char *command, const char *modes) return NULL; } -#warning is pclose correct wrt the new mutex semantics? - int pclose(FILE *stream) { struct popen_list_item *p; diff --git a/libc/stdlib/system.c b/libc/stdlib/system.c index 3ef9a8b1c..8a6734db7 100644 --- a/libc/stdlib/system.c +++ b/libc/stdlib/system.c @@ -20,11 +20,7 @@ extern __typeof(system) __libc_system; #if !defined __UCLIBC_HAS_THREADS_NATIVE__ -/* uClinux-2.0 has vfork, but Linux 2.0 doesn't */ #include <sys/syscall.h> -#ifndef __NR_vfork -# define vfork fork -#endif int __libc_system(const char *command) { @@ -91,9 +87,6 @@ libc_hidden_proto(waitpid) #elif defined __sparc__ # define FORK() \ INLINE_CLONE_SYSCALL (CLONE_PARENT_SETTID | SIGCHLD, 0, &pid, NULL, NULL) -#elif defined __s390__ -# define FORK() \ - INLINE_SYSCALL (clone, 3, 0, CLONE_PARENT_SETTID | SIGCHLD, &pid) #else # define FORK() \ INLINE_SYSCALL (clone, 3, CLONE_PARENT_SETTID | SIGCHLD, 0, &pid) diff --git a/libc/sysdeps/linux/arm/bits/syscalls.h b/libc/sysdeps/linux/arm/bits/syscalls.h index 6b747d91b..778cc3453 100644 --- a/libc/sysdeps/linux/arm/bits/syscalls.h +++ b/libc/sysdeps/linux/arm/bits/syscalls.h @@ -43,41 +43,7 @@ }) \ ) -#if !defined(__thumb__) -#if defined(__ARM_EABI__) -#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ -(__extension__ \ - ({unsigned int __internal_sys_result; \ - { \ - register int __a1 __asm__ ("r0"), _nr __asm__ ("r7"); \ - LOAD_ARGS_##nr (args) \ - _nr = (name); \ - __asm__ __volatile__ ("swi 0x0 @ syscall " #name \ - : "=r" (__a1) \ - : "r" (_nr) ASM_ARGS_##nr \ - : "memory"); \ - __internal_sys_result = __a1; \ - } \ - (int) __internal_sys_result; }) \ -) -#else /* defined(__ARM_EABI__) */ - -#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ -(__extension__ \ - ({ unsigned int __internal_sys_result; \ - { \ - register int __a1 __asm__ ("a1"); \ - LOAD_ARGS_##nr (args) \ - __asm__ __volatile__ ("swi %1 @ syscall " #name \ - : "=r" (__a1) \ - : "i" (name) ASM_ARGS_##nr \ - : "memory"); \ - __internal_sys_result = __a1; \ - } \ - (int) __internal_sys_result; }) \ -) -#endif -#else /* !defined(__thumb__) */ +#if defined(__thumb__) /* We can't use push/pop inside the asm because that breaks unwinding (ie. thread cancellation). */ @@ -101,7 +67,23 @@ } \ (int) __internal_sys_result; }) \ ) -#endif /*!defined(__thumb__)*/ +#else /* ARM */ +#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ +(__extension__ \ + ({unsigned int __internal_sys_result; \ + { \ + register int __a1 __asm__ ("r0"), _nr __asm__ ("r7"); \ + LOAD_ARGS_##nr (args) \ + _nr = (name); \ + __asm__ __volatile__ ("swi 0x0 @ syscall " #name \ + : "=r" (__a1) \ + : "r" (_nr) ASM_ARGS_##nr \ + : "memory"); \ + __internal_sys_result = __a1; \ + } \ + (int) __internal_sys_result; }) \ +) +#endif #define INTERNAL_SYSCALL_ERROR_P(val, err) \ ((unsigned int) (val) >= 0xfffff001u) @@ -138,11 +120,13 @@ LOAD_ARGS_5 (a1, a2, a3, a4, a5) \ register int _v2 __asm__ ("v2") = _v2tmp; #define ASM_ARGS_6 ASM_ARGS_5, "r" (_v2) +#ifndef __thumb__ #define LOAD_ARGS_7(a1, a2, a3, a4, a5, a6, a7) \ int _v3tmp = (int) (a7); \ LOAD_ARGS_6 (a1, a2, a3, a4, a5, a6) \ register int _v3 __asm__ ("v3") = _v3tmp; #define ASM_ARGS_7 ASM_ARGS_6, "r" (_v3) +#endif #endif /* __ASSEMBLER__ */ diff --git a/libc/sysdeps/linux/arm/clone.S b/libc/sysdeps/linux/arm/clone.S index 03cd10e62..d1c9239da 100644 --- a/libc/sysdeps/linux/arm/clone.S +++ b/libc/sysdeps/linux/arm/clone.S @@ -19,6 +19,7 @@ /* clone() is even more special than fork() as it mucks with stacks and invokes a function in the right context after its all over. */ +#include <sysdep.h> #define _ERRNO_H #include <features.h> #include <bits/errno.h> @@ -26,6 +27,13 @@ #include <bits/arm_asm.h> #include <bits/arm_bx.h> +#if defined __UCLIBC_HAS_THREADS__ && !defined __LINUXTHREADS_OLD__ +#include <sysdep-cancel.h> +#endif + +#define CLONE_VM 0x00000100 +#define CLONE_THREAD 0x00010000 + #if defined(__NR_clone) /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ @@ -52,23 +60,22 @@ __clone: @ get flags mov r0, r2 @ new sp is already in r1 - @ load remaining arguments off the stack - stmfd sp!, {r4} - ldr r2, [sp, #4] - ldr r3, [sp, #8] - ldr r4, [sp, #12] DO_CALL (clone) movs a1, a1 blt __error - ldmnefd sp!, {r4} beq 1f bx lr 1: @ pick the function arg and call address off the stack and execute ldr r0, [sp, #4] +#if defined(__USE_BX__) ldr r1, [sp] bl 2f @ blx r1 +#else + mov lr, pc + ldr pc, [sp] +#endif @ and we are done, passing the return value through r0 bl HIDDEN_JUMPTARGET(_exit) @@ -87,6 +94,8 @@ __error: .pool #else __clone: +.fnstart +.cantunwind @ sanity check args cmp r0, #0 IT(te, ne) @@ -95,32 +104,58 @@ __clone: beq __error @ insert the args onto the new stack - sub r1, r1, #8 - str r3, [r1, #4] - @ save the function pointer as the 0th element - str r0, [r1] + str r3, [r1, #-4]! + str r0, [r1, #-4]! @ do the system call @ get flags mov r0, r2 +#ifdef RESET_PID + mov ip, r2 +#endif @ new sp is already in r1 - @ load remaining arguments off the stack - stmfd sp!, {r4} - ldr r2, [sp, #4] - ldr r3, [sp, #8] - ldr r4, [sp, #12] - DO_CALL (clone) - movs a1, a1 - IT(t, ne) - ldmnefd sp!, {r4} + push {r4, r7} + cfi_adjust_cfa_offset (8) + cfi_rel_offset (r4, 0) + cfi_rel_offset (r7, 4) + ldr r2, [sp, #8] + ldr r3, [sp, #12] + ldr r4, [sp, #16] + ldr r7, =SYS_ify(clone) + swi 0x0 + cfi_endproc + cmp r0, #0 + beq 1f + pop {r4, r7} blt __error - IT(t, ne) #if defined(__USE_BX__) bxne lr #else movne pc, lr #endif + cfi_startproc +.fnend +PSEUDO_END (__clone) + +1: + .fnstart + .cantunwind +#ifdef RESET_PID + tst ip, #CLONE_THREAD + bne 3f + GET_TLS (lr) + mov r1, r0 + tst ip, #CLONE_VM + ldr r7, =SYS_ify(getpid) + ite ne + movne r0, #-1 + swieq 0x0 + NEGOFF_ADJ_BASE (r1, TID_OFFSET) + str r0, NEGOFF_OFF1 (r1, TID_OFFSET) + str r0, NEGOFF_OFF2 (r1, PID_OFFSET, TID_OFFSET) +3: +#endif @ pick the function arg and call address off the stack and execute ldr r0, [sp, #4] mov lr, pc diff --git a/libc/sysdeps/linux/arm/sysdep.h b/libc/sysdeps/linux/arm/sysdep.h index 64f40407e..2d0a9cc41 100644 --- a/libc/sysdeps/linux/arm/sysdep.h +++ b/libc/sysdeps/linux/arm/sysdep.h @@ -213,6 +213,42 @@ __local_syscall_error: \ sees the right arguments. */ +#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__) +# define ARCH_HAS_HARD_TP +#endif + +# ifdef __thumb2__ +# define NEGOFF_ADJ_BASE(R, OFF) add R, R, $OFF +# define NEGOFF_ADJ_BASE2(D, S, OFF) add D, S, $OFF +# define NEGOFF_OFF1(R, OFF) [R] +# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $((OFFA) - (OFFB))] +# else +# define NEGOFF_ADJ_BASE(R, OFF) +# define NEGOFF_ADJ_BASE2(D, S, OFF) mov D, S +# define NEGOFF_OFF1(R, OFF) [R, $OFF] +# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $OFFA] +# endif + +# ifdef ARCH_HAS_HARD_TP +/* If the cpu has cp15 available, use it. */ +# define GET_TLS(TMP) mrc p15, 0, r0, c13, c0, 3 +# else +/* At this generic level we have no tricks to pull. Call the ABI routine. */ +# define GET_TLS(TMP) \ + push { r1, r2, r3, lr }; \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (16); \ + cfi_rel_offset (r1, 0); \ + cfi_rel_offset (r2, 4); \ + cfi_rel_offset (r3, 8); \ + cfi_rel_offset (lr, 12); \ + bl __aeabi_read_tp; \ + pop { r1, r2, r3, lr }; \ + cfi_restore_state +# endif /* ARCH_HAS_HARD_TP */ + + + #undef DO_CALL #if defined(__ARM_EABI__) diff --git a/libc/sysdeps/linux/common/bits/mathcalls.h b/libc/sysdeps/linux/common/bits/mathcalls.h index 9bebb5190..3d7e34fa2 100644 --- a/libc/sysdeps/linux/common/bits/mathcalls.h +++ b/libc/sysdeps/linux/common/bits/mathcalls.h @@ -291,7 +291,9 @@ __END_NAMESPACE_C99 #ifdef __USE_ISOC99 __BEGIN_NAMESPACE_C99 /* True gamma function. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (tgamma,, (_Mdouble_)) +# endif __END_NAMESPACE_C99 #endif @@ -322,7 +324,9 @@ __MATHCALLX (nextafter,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)) libm_hidden_proto(nextafterl) # endif # if defined __USE_ISOC99 && !defined __LDBL_COMPAT +# ifndef _Mdouble_is_float_ __MATHCALLX (nexttoward,, (_Mdouble_ __x, long double __y), (__const__)) +# endif # endif /* Return the remainder of integer divison X / Y with infinite precision. */ @@ -339,11 +343,15 @@ __MATHDECLI (int,ilogb,, (_Mdouble_ __x)) #ifdef __USE_ISOC99 /* Return X times (2 to the Nth power). */ +# ifndef _Mdouble_is_float_ __MATHCALLI (scalbln,, (_Mdouble_ __x, long int __n)) +# endif /* Round X to integral value in floating-point format using current rounding direction, but do not raise inexact exception. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (nearbyint,, (_Mdouble_ __x)) +# endif /* Round X to nearest integral value, rounding halfway cases away from zero. */ @@ -356,7 +364,9 @@ __MATHCALLX (trunc,, (_Mdouble_ __x), (__const__)) /* Compute remainder of X and Y and put in *QUO a value with sign of x/y and magnitude congruent `mod 2^n' to the magnitude of the integral quotient x/y, with n >= 3. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (remquo,, (_Mdouble_ __x, _Mdouble_ __y, int *__quo)) +# endif /* Conversion functions. */ @@ -373,13 +383,19 @@ __MATHDECLI (long long int,llround,, (_Mdouble_ __x)) /* Return positive difference between X and Y. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (fdim,, (_Mdouble_ __x, _Mdouble_ __y)) +# endif /* Return maximum numeric value from X and Y. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (fmax,, (_Mdouble_ __x, _Mdouble_ __y)) +# endif /* Return minimum numeric value from X and Y. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (fmin,, (_Mdouble_ __x, _Mdouble_ __y)) +# endif /* Classify given number. */ @@ -390,7 +406,9 @@ __MATHDECL_PRIV (int, signbit,, (_Mdouble_ __value), (__const__)) /* Multiply-add function computed as a ternary operation. */ +# ifndef _Mdouble_is_float_ __MATHCALLI (fma,, (_Mdouble_ __x, _Mdouble_ __y, _Mdouble_ __z)) +# endif #endif /* Use ISO C99. */ #if defined __USE_MISC || defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99 diff --git a/libc/sysdeps/linux/common/bits/uClibc_fpmax.h b/libc/sysdeps/linux/common/bits/uClibc_fpmax.h index bbea1ae9d..b7dcee1d3 100644 --- a/libc/sysdeps/linux/common/bits/uClibc_fpmax.h +++ b/libc/sysdeps/linux/common/bits/uClibc_fpmax.h @@ -68,10 +68,6 @@ typedef float __fpmax_t; #ifndef DECIMAL_DIG -#ifdef L___strtofpmax -/* Emit warning only once. */ -#warning DECIMAL_DIG is not defined! If you are using gcc, it may not be defining __STDC_VERSION__ as it should. -#endif #if !defined(FLT_RADIX) || (FLT_RADIX != 2) #error unable to compensate for missing DECIMAL_DIG! #endif diff --git a/libc/sysdeps/linux/common/fstatat64.c b/libc/sysdeps/linux/common/fstatat64.c index 015f57d13..711521a6a 100644 --- a/libc/sysdeps/linux/common/fstatat64.c +++ b/libc/sysdeps/linux/common/fstatat64.c @@ -10,10 +10,18 @@ #include <bits/wordsize.h> #include <sys/syscall.h> +#if defined __mips__ +# include <sgidefs.h> +#endif + /* 64bit ports tend to favor newfstatat() */ #if __WORDSIZE == 64 && defined __NR_newfstatat # define __NR_fstatat64 __NR_newfstatat #endif +/* mips N32 ABI use newfstatat(), too */ +#if defined __mips__ && _MIPS_SIM == _ABIN32 +# define __NR_fstatat64 __NR_newfstatat +#endif #ifdef __NR_fstatat64 # include <sys/stat.h> diff --git a/libc/sysdeps/linux/common/setreuid.c b/libc/sysdeps/linux/common/setreuid.c index a9eea6dc4..583a987c0 100644 --- a/libc/sysdeps/linux/common/setreuid.c +++ b/libc/sysdeps/linux/common/setreuid.c @@ -37,4 +37,4 @@ int setreuid(uid_t ruid, uid_t euid) } #endif -libc_hidden_def(setreuid) +libc_hidden_weak(setreuid) diff --git a/libc/sysdeps/linux/common/sync_file_range.c b/libc/sysdeps/linux/common/sync_file_range.c index db797de62..52bc9d7af 100644 --- a/libc/sysdeps/linux/common/sync_file_range.c +++ b/libc/sysdeps/linux/common/sync_file_range.c @@ -24,6 +24,9 @@ static int __NC(sync_file_range)(int fd, off64_t offset, off64_t nbytes, unsigne { # if defined __powerpc__ && __WORDSIZE == 64 return INLINE_SYSCALL(sync_file_range, 4, fd, flags, offset, nbytes); +# elif defined __arm__ && defined __thumb__ + return INLINE_SYSCALL(sync_file_range, 6, fd, + OFF64_HI_LO(offset), OFF64_HI_LO(nbytes), flags); # elif (defined __mips__ && _MIPS_SIM == _ABIO32) || \ (defined(__UCLIBC_SYSCALL_ALIGN_64BIT__) && !(defined(__powerpc__) || defined(__xtensa__))) /* arch with 64-bit data in even reg alignment #2: [arcv2/others-in-future] diff --git a/libc/sysdeps/linux/common/xstatconv.c b/libc/sysdeps/linux/common/xstatconv.c index 7edc42a81..a21579c41 100644 --- a/libc/sysdeps/linux/common/xstatconv.c +++ b/libc/sysdeps/linux/common/xstatconv.c @@ -37,9 +37,12 @@ void __xstat_conv(struct kernel_stat *kbuf, struct stat *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } void __xstat32_conv(struct kernel_stat64 *kbuf, struct stat *buf) @@ -56,9 +59,12 @@ void __xstat32_conv(struct kernel_stat64 *kbuf, struct stat *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } #ifdef __UCLIBC_HAS_LFS__ @@ -80,9 +86,12 @@ void __xstat64_conv(struct kernel_stat64 *kbuf, struct stat64 *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } #endif /* __UCLIBC_HAS_LFS__ */ diff --git a/libc/sysdeps/linux/cris/sys/procfs.h b/libc/sysdeps/linux/cris/sys/procfs.h index d4ee05134..65b57ba4e 100644 --- a/libc/sysdeps/linux/cris/sys/procfs.h +++ b/libc/sysdeps/linux/cris/sys/procfs.h @@ -28,10 +28,14 @@ #include <sys/types.h> #include <sys/ucontext.h> #include <sys/user.h> -#include <asm/elf.h> __BEGIN_DECLS +typedef unsigned long elf_greg_t; + +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + struct elf_siginfo { int si_signo; /* Signal number. */ diff --git a/libc/sysdeps/linux/cris/sysdep.S b/libc/sysdeps/linux/cris/sysdep.S index 8f25fb722..a23bb260f 100644 --- a/libc/sysdeps/linux/cris/sysdep.S +++ b/libc/sysdeps/linux/cris/sysdep.S @@ -35,7 +35,7 @@ ENTRY (__syscall_error) /* Note that __syscall_error is only visible within this library, and no-one passes it on as a pointer, so can assume that R0 (GOT pointer) is correctly set up. */ - PLTCALL (HIDDEN_JUMPTARGET(__errno_location)) + PLTCALL (__errno_location) move [sp+],srp move.d [sp+],r11 diff --git a/libc/sysdeps/linux/m68k/sys/reg.h b/libc/sysdeps/linux/m68k/sys/reg.h deleted file mode 100644 index 984898100..000000000 --- a/libc/sysdeps/linux/m68k/sys/reg.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _SYS_REG_H -#define _SYS_REG_H 1 - -/* Index into an array of 4 byte integers returned from ptrace for - location of the users' stored general purpose registers. */ - -enum -{ - PT_D1 = 0, -#define PT_D1 PT_D1 - PT_D2 = 1, -#define PT_D2 PT_D2 - PT_D3 = 2, -#define PT_D3 PT_D3 - PT_D4 = 3, -#define PT_D4 PT_D4 - PT_D5 = 4, -#define PT_D5 PT_D5 - PT_D6 = 5, -#define PT_D6 PT_D6 - PT_D7 = 6, -#define PT_D7 PT_D7 - PT_A0 = 7, -#define PT_A0 PT_A0 - PT_A1 = 8, -#define PT_A1 PT_A1 - PT_A2 = 9, -#define PT_A2 PT_A2 - PT_A3 = 10, -#define PT_A3 PT_A3 - PT_A4 = 11, -#define PT_A4 PT_A4 - PT_A5 = 12, -#define PT_A5 PT_A5 - PT_A6 = 13, -#define PT_A6 PT_A6 - PT_D0 = 14, -#define PT_D0 PT_D0 - PT_USP = 15, -#define PT_USP PT_USP - PT_ORIG_D0 = 16, -#define PT_ORIG_D0 PT_ORIG_D0 - PT_SR = 17, -#define PT_SR PT_SR - PT_PC = 18, -#define PT_PC PT_PC - PT_FP0 = 21, -#define PT_FP0 PT_FP0 - PT_FP1 = 24, -#define PT_FP1 PT_FP1 - PT_FP2 = 27, -#define PT_FP2 PT_FP2 - PT_FP3 = 30, -#define PT_FP3 PT_FP3 - PT_FP4 = 33, -#define PT_FP4 PT_FP4 - PT_FP5 = 36, -#define PT_FP5 PT_FP5 - PT_FP6 = 39, -#define PT_FP6 PT_FP6 - PT_FP7 = 42, -#define PT_FP7 PT_FP7 - PT_FPCR = 45, -#define PT_FPCR PT_FPCR - PT_FPSR = 46, -#define PT_FPSR PT_FPSR - PT_FPIAR = 47 -#define PT_FPIAR PT_FPIAR -}; - -#endif /* _SYS_REG_H */ diff --git a/libc/sysdeps/linux/microblaze/bits/uClibc_page.h b/libc/sysdeps/linux/microblaze/bits/uClibc_page.h index 8069e6afb..9335d8eb7 100644 --- a/libc/sysdeps/linux/microblaze/bits/uClibc_page.h +++ b/libc/sysdeps/linux/microblaze/bits/uClibc_page.h @@ -20,7 +20,7 @@ #ifndef _UCLIBC_PAGE_H #define _UCLIBC_PAGE_H -#include <linux/autoconf.h> +#include <generated/autoconf.h> #if defined(CONFIG_MICROBLAZE_32K_PAGES) #define PAGE_SHIFT 15 diff --git a/libc/sysdeps/linux/mips/bits/kernel_stat.h b/libc/sysdeps/linux/mips/bits/kernel_stat.h index 655c089e0..a2a6169a3 100644 --- a/libc/sysdeps/linux/mips/bits/kernel_stat.h +++ b/libc/sysdeps/linux/mips/bits/kernel_stat.h @@ -8,6 +8,18 @@ #include <sgidefs.h> #if _MIPS_SIM == _MIPS_SIM_ABI64 +typedef struct { + unsigned int tv_sec; + unsigned int tv_nsec; +} __ktimespec_t; +#else +typedef struct { + time_t tv_sec; + unsigned long tv_nsec; +} __ktimespec_t; +#endif + +#if _MIPS_SIM == _MIPS_SIM_ABI64 /* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ struct kernel_stat { __kernel_dev_t st_dev; @@ -20,9 +32,9 @@ struct kernel_stat { __kernel_dev_t st_rdev; unsigned int st_pad2[3]; __kernel_off_t st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned int st_blksize; unsigned int reserved3; unsigned long st_blocks; @@ -41,9 +53,9 @@ struct kernel_stat { unsigned int st_rdev; unsigned int st_pad2[3]; unsigned long long st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned int st_blksize; unsigned int reserved3; unsigned long long st_blocks; @@ -62,9 +74,9 @@ struct kernel_stat { long st_pad2[2]; __kernel_off_t st_size; long st_pad3; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; long st_blksize; long st_blocks; long st_pad4[14]; @@ -81,9 +93,9 @@ struct kernel_stat64 { unsigned long st_rdev; unsigned long st_pad1[3]; /* Reserved for st_rdev expansion */ long long st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned long st_blksize; unsigned long st_pad2; long long st_blocks; diff --git a/libc/sysdeps/linux/xtensa/Makefile.arch b/libc/sysdeps/linux/xtensa/Makefile.arch index 277a1e325..b9b6b87d5 100644 --- a/libc/sysdeps/linux/xtensa/Makefile.arch +++ b/libc/sysdeps/linux/xtensa/Makefile.arch @@ -5,7 +5,10 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -CSRC-y := brk.c fork.c sigaction.c __syscall_error.c +CSRC-y := brk.c sigaction.c __syscall_error.c SSRC-y := bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S \ sigrestorer.S syscall.S mmap.S windowspill.S __longjmp.S vfork.S + +CSRC-$(if $(UCLIBC_HAS_THREADS_NATIVE),,y) += fork.c +SSRC-$(if $(UCLIBC_HAS_THREADS_NATIVE),,y) += clone.S diff --git a/libc/sysdeps/linux/xtensa/clone.S b/libc/sysdeps/linux/xtensa/clone.S index aa79aa736..34d68a875 100644 --- a/libc/sysdeps/linux/xtensa/clone.S +++ b/libc/sysdeps/linux/xtensa/clone.S @@ -1,34 +1,38 @@ -/* Copyright (C) 2001, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2005 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. + Library General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* clone is even more special than fork as it mucks with stacks - and invokes a function in the right context after it's all over. */ + and invokes a function in the right context after its all over. */ -#include "sysdep.h" -#include <sys/syscall.h> +#include <features.h> +#include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> +#ifdef RESET_PID +#include <tls.h> +#endif +#define __ASSEMBLY__ +#include <linux/sched.h> -/* int clone (a2 = int (*fn)(void *arg), - a3 = void *child_stack, - a4 = int flags, - a5 = void *arg, - a6 = pid_t *ptid, - a7 = struct user_desc *tls, - 16(sp) = pid_t *ctid) */ +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, + a2 a3 a4 a5 + pid_t *ptid, struct user_desc *tls, pid_t *ctid) + a6 a7 16(sp) +*/ .text ENTRY (__clone) @@ -39,7 +43,7 @@ ENTRY (__clone) /* a2 and a3 are candidates for destruction by system-call return parameters. We don't need the stack pointer after the system - call. We trust that the kernel will preserve a7, a9, and a6. */ + call. We trust that the kernel will preserve a6, a7 and a9. */ mov a9, a5 /* save function argument */ mov a5, a7 @@ -48,19 +52,18 @@ ENTRY (__clone) mov a6, a4 mov a4, a8 l32i a8, a1, 16 /* child_tid */ - movi a2, SYS_ify (clone) - - /* syscall (a2 = NR_clone, - a6 = clone_flags, - a3 = usp, - a4 = parent_tid, - a5 = child_tls, - a8 = child_tid) */ + movi a2, SYS_ify(clone) + + /* syscall(NR_clone,clone_flags, usp, parent_tid, child_tls, child_tid) + a2 a6 a3 a4 a5 a8 + */ + syscall bltz a2, SYSCALL_ERROR_LABEL beqz a2, .Lthread_start - /* Fall through for parent. */ + /* fall through for parent */ + .Lpseudo_end: retw @@ -69,32 +72,38 @@ ENTRY (__clone) j SYSCALL_ERROR_LABEL .Lthread_start: - /* Start child thread. */ - movi a0, 0 /* terminate the stack frame */ + +#if CLONE_THREAD != 0x00010000 || CLONE_VM != 0x00000100 +# error invalid values for CLONE_THREAD or CLONE_VM +#endif #ifdef RESET_PID - /* Check and see if we need to reset the PID. */ - bbsi.l a6, 16, 1f /* CLONE_THREAD = 0x00010000 */ + bbsi.l a6, 16, .Lskip_restore_pid /* CLONE_THREAD = 0x00010000 */ movi a2, -1 - bbsi.l a6, 8, 2f /* CLONE_VM = 0x00000100 */ - movi a2, SYS_ify (getpid) + bbsi a6, 8, .Lgotpid /* CLONE_VM = 0x00000100 */ + movi a2, SYS_ify(getpid) syscall -2: rur a3, THREADPTR - movi a4, PID_OFFSET - add a4, a4, a3 - s32i a2, a4, 0 - movi a4, TID_OFFSET - add a4, a4, a3 - s32i a2, a3, 0 -1: -#endif /* RESET_PID */ - +.Lgotpid: + rur a3, threadptr + movi a0, TLS_PRE_TCB_SIZE + sub a3, a3, a0 + s32i a2, a3, PID + s32i a2, a3, TID +.Lskip_restore_pid: +#endif + + /* start child thread */ + movi a0, 0 /* terminate the stack frame */ mov a6, a9 /* load up the 'arg' parameter */ callx4 a7 /* call the user's function */ /* Call _exit. Note that any return parameter from the user's - function in a6 is seen as inputs to _exit. */ - movi a2, JUMPTARGET(_exit) + function in a6 is seen as inputs to _exit. */ +#ifdef PIC + movi a2, _exit@PLT +#else + movi a2, _exit +#endif callx4 a2 PSEUDO_END (__clone) diff --git a/libc/sysdeps/linux/xtensa/fork.c b/libc/sysdeps/linux/xtensa/fork.c index e9b681c67..4e4f937a0 100644 --- a/libc/sysdeps/linux/xtensa/fork.c +++ b/libc/sysdeps/linux/xtensa/fork.c @@ -20,6 +20,10 @@ pid_t fork(void) { return (pid_t) INLINE_SYSCALL(clone, 2, SIGCHLD, 0); } -lt_strong_alias(fork) -lt_libc_hidden(fork) +# ifdef __UCLIBC_HAS_THREADS__ +strong_alias(fork,__libc_fork) +libc_hidden_weak(fork) +# else +libc_hidden_def(fork) +# endif #endif diff --git a/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h b/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h index 41f81dbad..4516d9398 100644 --- a/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h +++ b/libc/sysdeps/linux/xtensa/jmpbuf-unwind.h @@ -1,25 +1,23 @@ -/* Copyright (C) 1997, 1998, 2007 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* Test if longjmp to JMPBUF would unwind the frame containing a local - variable at ADDRESS. */ - +/* + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ #include <setjmp.h> #include <jmpbuf-offsets.h> +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ #define _JMPBUF_UNWINDS(jmpbuf, address) \ ((void *) (address) < (void *) (jmpbuf)[JB_SP]) + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <stdint.h> +#include <unwind.h> + +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ + _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) + +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ + ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj)) +#endif diff --git a/libc/sysdeps/linux/xtensa/sys/ptrace.h b/libc/sysdeps/linux/xtensa/sys/ptrace.h new file mode 100644 index 000000000..882b8c8ed --- /dev/null +++ b/libc/sysdeps/linux/xtensa/sys/ptrace.h @@ -0,0 +1,155 @@ +/* `ptrace' debugger support interface. Linux version. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _SYS_PTRACE_H +#define _SYS_PTRACE_H 1 + +#include <features.h> + +/* Kludge away careless namespace pollution from the kernel. */ + +#undef PTRACE_GETREGS +#undef PTRACE_SETREGS +#undef PTRACE_GETFPREGS +#undef PTRACE_SETFPREGS +#undef PTRACE_GETFPREGSIZE + + +__BEGIN_DECLS + +/* Type of the REQUEST argument to `ptrace.' */ +enum __ptrace_request +{ + /* Indicate that the process making this request should be traced. + All signals received by this process can be intercepted by its + parent, and its parent can use the other `ptrace' requests. */ + PTRACE_TRACEME = 0, +#define PT_TRACE_ME PTRACE_TRACEME + + /* Return the word in the process's text space at address ADDR. */ + PTRACE_PEEKTEXT = 1, +#define PT_READ_I PTRACE_PEEKTEXT + + /* Return the word in the process's data space at address ADDR. */ + PTRACE_PEEKDATA = 2, +#define PT_READ_D PTRACE_PEEKDATA + + /* Return the word in the process's user area at offset ADDR. */ + PTRACE_PEEKUSER = 3, +#define PT_READ_U PTRACE_PEEKUSER + + /* Write the word DATA into the process's text space at address ADDR. */ + PTRACE_POKETEXT = 4, +#define PT_WRITE_I PTRACE_POKETEXT + + /* Write the word DATA into the process's data space at address ADDR. */ + PTRACE_POKEDATA = 5, +#define PT_WRITE_D PTRACE_POKEDATA + + /* Write the word DATA into the process's user area at offset ADDR. */ + PTRACE_POKEUSER = 6, +#define PT_WRITE_U PTRACE_POKEUSER + + /* Continue the process. */ + PTRACE_CONT = 7, +#define PT_CONTINUE PTRACE_CONT + + /* Kill the process. */ + PTRACE_KILL = 8, +#define PT_KILL PTRACE_KILL + + /* Single step the process. + This is not supported on all machines. */ + PTRACE_SINGLESTEP = 9, +#define PT_STEP PTRACE_SINGLESTEP + + /* Get all general purpose registers used by a processes. + This is not supported on all machines. */ + PTRACE_GETREGS = 12, +#define PT_GETREGS PTRACE_GETREGS + + /* Set all general purpose registers used by a processes. + This is not supported on all machines. */ + PTRACE_SETREGS = 13, +#define PT_SETREGS PTRACE_SETREGS + + /* Get all floating point registers used by a processes. + This is not supported on all machines. */ + PTRACE_GETFPREGS = 14, +#define PT_GETFPREGS PTRACE_GETFPREGS + + /* Set all floating point registers used by a processes. + This is not supported on all machines. */ + PTRACE_SETFPREGS = 15, +#define PT_SETFPREGS PTRACE_SETFPREGS + + /* Attach to a process that is already running. */ + PTRACE_ATTACH = 16, +#define PT_ATTACH PTRACE_ATTACH + + /* Detach from a process attached to with PTRACE_ATTACH. */ + PTRACE_DETACH = 17, +#define PT_DETACH PTRACE_DETACH + + /* Get size required for the buffer holding the floating point registers. + This is not supported on all machines. */ + PTRACE_GETFPREGSIZE = 18, +#define PT_GETFPREGSIZE PTRACE_GETFPREGSIZE + + /* Continue and stop at the next (return from) syscall. */ + PTRACE_SYSCALL = 24 +#define PT_SYSCALL PTRACE_SYSCALL +}; + +/* Options set using PTRACE_SETOPTIONS. */ +enum __ptrace_setoptions { + PTRACE_O_TRACESYSGOOD = 0x00000001, + PTRACE_O_TRACEFORK = 0x00000002, + PTRACE_O_TRACEVFORK = 0x00000004, + PTRACE_O_TRACECLONE = 0x00000008, + PTRACE_O_TRACEEXEC = 0x00000010, + PTRACE_O_TRACEVFORKDONE = 0x00000020, + PTRACE_O_TRACEEXIT = 0x00000040, + PTRACE_O_MASK = 0x0000007f +}; + +/* Wait extended result codes for the above trace options. */ +enum __ptrace_eventcodes { + PTRACE_EVENT_FORK = 1, + PTRACE_EVENT_VFORK = 2, + PTRACE_EVENT_CLONE = 3, + PTRACE_EVENT_EXEC = 4, + PTRACE_EVENT_VFORK_DONE = 5, + PTRACE_EVENT_EXIT = 6 +}; + +/* Perform process tracing functions. REQUEST is one of the values + above, and determines the action to be taken. + For all requests except PTRACE_TRACEME, PID specifies the process to be + traced. + + PID and the other arguments described above for the various requests should + appear (those that are used for the particular request) as: + pid_t PID, void *ADDR, int DATA, void *ADDR2 + after REQUEST. */ +extern long int ptrace (enum __ptrace_request __request, ...) __THROW; + +__END_DECLS + +#endif /* _SYS_PTRACE_H */ diff --git a/libc/sysdeps/linux/xtensa/sysdep.h b/libc/sysdeps/linux/xtensa/sysdep.h index afe95cc6a..cab4a2f8d 100644 --- a/libc/sysdeps/linux/xtensa/sysdep.h +++ b/libc/sysdeps/linux/xtensa/sysdep.h @@ -16,6 +16,10 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _LINUX_XTENSA_SYSDEP_H +#define _LINUX_XTENSA_SYSDEP_H 1 + +#include <common/sysdep.h> #include <sys/syscall.h> #ifdef __ASSEMBLER__ @@ -24,12 +28,6 @@ #define ASM_TYPE_DIRECTIVE(name, typearg) .type name, typearg #define ASM_SIZE_DIRECTIVE(name) .size name, . - name -#ifdef __STDC__ -#define C_LABEL(name) name : -#else -#define C_LABEL(name) name/**/: -#endif - #define ENTRY(name) \ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name), @function); \ @@ -52,6 +50,15 @@ #undef END #define END(name) ASM_SIZE_DIRECTIVE(name) +/* Local label name for asm code. */ +#ifndef L +# ifdef HAVE_ELF +# define L(name) .L##name +# else +# define L(name) name +# endif +#endif + /* Define a macro for this directive so it can be removed in a few places. */ #define LITERAL_POSITION .literal_position @@ -123,19 +130,7 @@ #define PSEUDO_END_ERRVAL(name) \ END (name) -#undef ret_ERRVAL -#define ret_ERRVAL retw - -#if defined RTLD_PRIVATE_ERRNO -# define SYSCALL_ERROR_HANDLER \ -0: movi a4, rtld_errno; \ - neg a2, a2; \ - s32i a2, a4, 0; \ - movi a2, -1; \ - j .Lpseudo_end; - -#elif defined _LIBC_REENTRANT - +#if defined _LIBC_REENTRANT # if defined USE___THREAD # ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno @@ -170,3 +165,9 @@ #endif /* _LIBC_REENTRANT */ #endif /* __ASSEMBLER__ */ + +/* Pointer mangling is not yet supported for Xtensa. */ +#define PTR_MANGLE(var) (void) (var) +#define PTR_DEMANGLE(var) (void) (var) + +#endif /* _LINUX_XTENSA_SYSDEP_H */ diff --git a/libc/sysdeps/linux/xtensa/vfork.S b/libc/sysdeps/linux/xtensa/vfork.S index f094ae38f..6aced0a50 100644 --- a/libc/sysdeps/linux/xtensa/vfork.S +++ b/libc/sysdeps/linux/xtensa/vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2005-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,72 +19,67 @@ #include <sys/syscall.h> #define _SIGNAL_H #include <bits/signum.h> +#define __ASSEMBLY__ +#include <linux/sched.h> -/* Clone the calling process, but without copying the whole address space. +/* + Clone the calling process, but without copying the whole address space. The calling process is suspended until the new process exits or is replaced by a call to `execve'. Return -1 for errors, 0 to the new process, and the process ID of the new process to the old process. Note that it is important that we don't create a new stack frame for the - caller. */ + caller. - -/* The following are defined in linux/sched.h, which unfortunately - is not safe for inclusion in an assembly file. */ -#define CLONE_VM 0x00000100 /* set if VM shared between processes */ -#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to - wake it up on mm_release */ +*/ #ifndef SAVE_PID -#define SAVE_PID +#define SAVE_PID(a,b,c,d) #endif - #ifndef RESTORE_PID -#define RESTORE_PID +#define RESTORE_PID(a,b,c) +#endif +#ifndef RESTORE_PID12 +#define RESTORE_PID12(a,b,c) #endif +/* + pid_t vfork(void); + Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) + */ -/* pid_t vfork(void); - Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */ HIDDEN_ENTRY (__vfork) + .literal .Ljumptable, 0, .L4, .L8, .L12 - movi a6, .Ljumptable - extui a2, a0, 30, 2 /* call-size: call4/8/12 = 1/2/3 */ - addx4 a4, a2, a6 /* find return address in jumptable */ - l32i a4, a4, 0 - add a4, a4, a6 - + mov a3, a0 # move return address out of the way + movi a0, .Ljumptable + extui a2, a3, 30, 2 # call-size: call4/8/12 = 1/2/3 + addx4 a0, a2, a0 # find return address in jumptable slli a2, a2, 30 - xor a3, a0, a2 /* remove call-size from return addr */ - extui a5, a4, 30, 2 /* get high bits of jump target */ - slli a5, a5, 30 - or a3, a3, a5 /* stuff them into the return address */ - xor a4, a4, a5 /* clear high bits of jump target */ - or a0, a4, a2 /* create temporary return address */ - retw /* "return" to .L4, .L8, or .L12 */ - - .align 4 -.Ljumptable: - .word 0 - .word .L4 - .Ljumptable - .word .L8 - .Ljumptable - .word .L12 - .Ljumptable + l32i a0, a0, 0 + + xor a3, a3, a2 # remove call-size from return address + or a0, a0, a2 # create temporary return address + retw /* a7: return address */ + .L4: mov a12, a2 mov a13, a3 - SAVE_PID + SAVE_PID(a5,a15,a2,a3) + + /* use syscall 'clone' and set new stack pointer to the same address */ - /* Use syscall 'clone'. Set new stack pointer to the same address. */ - movi a2, SYS_ify (clone) + movi a2, SYS_ify(clone) movi a3, 0 movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD + syscall - RESTORE_PID + RESTORE_PID(a5,a15,a2) movi a5, -4096 @@ -94,22 +89,24 @@ HIDDEN_ENTRY (__vfork) bgeu a6, a5, 1f jx a7 -1: call4 .Lerr /* returns to original caller */ +1: call4 .Lerr /* a11: return address */ + .L8: mov a12, a2 mov a13, a3 mov a14, a6 - SAVE_PID + SAVE_PID(a9,a15,a2,a3) - movi a2, SYS_ify (clone) + movi a2, SYS_ify(clone) movi a3, 0 movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD + syscall - RESTORE_PID + RESTORE_PID(a9,a15,a2) movi a9, -4096 @@ -120,22 +117,25 @@ HIDDEN_ENTRY (__vfork) bgeu a10, a9, 1f jx a11 -1: call8 .Lerr /* returns to original caller */ + +1: call8 .Lerr /* a15: return address */ + .L12: mov a12, a2 mov a13, a3 mov a14, a6 - SAVE_PID + SAVE_PID (a2,a3,a2,a6) - movi a2, SYS_ify (clone) + movi a2, SYS_ify(clone) movi a3, 0 movi a6, CLONE_VM | CLONE_VFORK | SIGCHLD + syscall - RESTORE_PID + RESTORE_PID12(a3,a6,a15) mov a3, a13 movi a13, -4096 @@ -147,18 +147,18 @@ HIDDEN_ENTRY (__vfork) bgeu a14, a13, 1f jx a15 -1: call12 .Lerr /* returns to original caller */ +1: call12 .Lerr .align 4 + .Lerr: entry a1, 16 - /* Restore the return address. */ - extui a4, a0, 30, 2 /* get the call-size bits */ + /* Restore return address */ + + extui a4, a0, 30, 2 slli a4, a4, 30 - slli a3, a3, 2 /* clear high bits of target address */ - srli a3, a3, 2 - or a0, a3, a4 /* combine them */ + or a0, a3, a4 PSEUDO_END (__vfork) .Lpseudo_end: diff --git a/libc/unistd/daemon.c b/libc/unistd/daemon.c index 435d4f1ff..8fa292850 100644 --- a/libc/unistd/daemon.c +++ b/libc/unistd/daemon.c @@ -69,7 +69,6 @@ /* use clone() to get fork() like behavior here -- we just want to disassociate * from the controlling terminal */ -static inline attribute_optimize("O3") pid_t _fork_parent(void) { INTERNAL_SYSCALL_DECL(err); diff --git a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h index 438c12ab9..2b877f980 100644 --- a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h +++ b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h @@ -21,12 +21,50 @@ #ifndef _PT_MACHINE_H #define _PT_MACHINE_H 1 -#include <features.h> +#include <sys/syscall.h> +#include <unistd.h> #ifndef PT_EI # define PT_EI __extern_always_inline #endif +#if defined(__thumb__) +#if defined(__USE_LDREXSTREX__) +PT_EI long int ldrex(int *spinlock) +{ + long int ret; + __asm__ __volatile__( + "ldrex %0, [%1]\n" + : "=r"(ret) + : "r"(spinlock) : "memory"); + return ret; +} + +PT_EI long int strex(int val, int *spinlock) +{ + long int ret; + __asm__ __volatile__( + "strex %0, %1, [%2]\n" + : "=r"(ret) + : "r" (val), "r"(spinlock) : "memory"); + return ret; +} + +/* Spinlock implementation; required. */ +PT_EI long int +testandset (int *spinlock) +{ + register unsigned int ret; + + do { + ret = ldrex(spinlock); + } while (strex(1, spinlock)); + + return ret; +} + +#else /* __USE_LDREXSTREX__ */ + /* This will not work on ARM1 or ARM2 because SWP is lacking on those machines. Unfortunately we have no way to detect this at compile time; let's hope nobody tries to use one. */ @@ -36,8 +74,6 @@ PT_EI long int testandset (int *spinlock); PT_EI long int testandset (int *spinlock) { register unsigned int ret; - -#if defined(__thumb__) void *pc; __asm__ __volatile__( ".align 0\n" @@ -50,15 +86,21 @@ PT_EI long int testandset (int *spinlock) "\t.force_thumb" : "=r"(ret), "=r"(pc) : "0"(1), "r"(spinlock)); -#else + return ret; +} +#endif +#else /* __thumb__ */ + +PT_EI long int testandset (int *spinlock); +PT_EI long int testandset (int *spinlock) +{ + register unsigned int ret; __asm__ __volatile__("swp %0, %1, [%2]" : "=r"(ret) : "0"(1), "r"(spinlock)); -#endif - return ret; } - +#endif /* Get some notion of the current stack. Need not be exactly the top of the stack, just something somewhere in the current frame. */ diff --git a/libpthread/linuxthreads/Makefile.in b/libpthread/linuxthreads/Makefile.in index 4a499f78e..c1ec1c9c7 100644 --- a/libpthread/linuxthreads/Makefile.in +++ b/libpthread/linuxthreads/Makefile.in @@ -65,7 +65,7 @@ CFLAGS-OMIT-libc_pthread_init.c := $(CFLAGS-dir_linuxthreads) libpthread_libc_CSRC := \ forward.c libc-cancellation.c libc_pthread_init.c # alloca_cutoff.c libpthread_libc_OBJ := $(patsubst %.c, $(libpthread_OUT)/%.o,$(libpthread_libc_CSRC)) -libc-static-y += $(libpthread_OUT)/libc_pthread_init.o +libc-static-y += $(libpthread_OUT)/libc_pthread_init.o $(libpthread_OUT)/libc-cancellation.o libc-shared-y += $(libpthread_libc_OBJ:.o=.oS) libpthread-static-y += $(patsubst %,$(libpthread_OUT)/%.o,$(libpthread_static_SRC)) diff --git a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c index c26a2786f..af77c2a9d 100644 --- a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c +++ b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c @@ -27,10 +27,15 @@ __pthread_spin_lock (pthread_spinlock_t *lock) unsigned int val; do - __asm__ __volatile__ ("tas %1; sne %0" - : "=dm" (val), "=m" (*lock) - : "m" (*lock) - : "cc"); + __asm__ __volatile__ ( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif + : "=dm" (val), "=m" (*lock) + : "m" (*lock) + : "cc"); while (val); return 0; @@ -43,7 +48,12 @@ __pthread_spin_trylock (pthread_spinlock_t *lock) { unsigned int val; - __asm__ __volatile__ ("tas %1; sne %0" + __asm__ __volatile__ ( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif : "=dm" (val), "=m" (*lock) : "m" (*lock) : "cc"); diff --git a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h index e2d7bdc81..1eb9fd57b 100644 --- a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h @@ -28,12 +28,18 @@ #endif /* Spinlock implementation; required. */ +PT_EI long int testandset (int *spinlock); PT_EI long int testandset (int *spinlock) { char ret; - __asm__ __volatile__("tas %1; sne %0" + __asm__ __volatile__( +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000) + "tas %1; sne %0" +#else + "bset #7,%1; sne %0" +#endif : "=dm"(ret), "=m"(*spinlock) : "m"(*spinlock) : "cc"); @@ -50,6 +56,7 @@ register char * stack_pointer __asm__ ("%sp"); /* Compare-and-swap for semaphores. */ +#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__mc68000) #define HAS_COMPARE_AND_SWAP PT_EI int __compare_and_swap (long int *p, long int oldval, long int newval) @@ -63,5 +70,5 @@ __compare_and_swap (long int *p, long int oldval, long int newval) return ret; } - +#endif #endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c index 706faeff3..634c75245 100644 --- a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c +++ b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c @@ -16,7 +16,9 @@ <http://www.gnu.org/licenses/>. */ #include <netdb.h> +#ifdef __UCLIBC_HAS_TLS__ #include <tls.h> +#endif #include <linuxthreads/internals.h> #include <sysdep-cancel.h> diff --git a/libpthread/linuxthreads/sysdeps/s390/pspinlock.c b/libpthread/linuxthreads/sysdeps/s390/pspinlock.c deleted file mode 100644 index be7578642..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/pspinlock.c +++ /dev/null @@ -1,90 +0,0 @@ -/* POSIX spinlock implementation. S/390 version. - Copyright (C) 2000, 2004 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <pthread.h> -#include "internals.h" - -/* This implementation is similar to the one used in the Linux kernel. - But the kernel is byte instructions for the memory access. This is - faster but unusable here. The problem is that only 128 - threads/processes could use the spinlock at the same time. If (by - a design error in the program) a thread/process would hold the - spinlock for a time long enough to accumulate 128 waiting - processes, the next one will find a positive value in the spinlock - and assume it is unlocked. We cannot accept that. */ - -int -__pthread_spin_lock (pthread_spinlock_t *lock) -{ - __asm__ __volatile__(" basr 1,0\n" - "0: slr 0,0\n" - " cs 0,1,%1\n" - " jl 0b\n" - : "=m" (*lock) - : "m" (*lock) : "0", "1", "cc" ); - return 0; -} -weak_alias (__pthread_spin_lock, pthread_spin_lock) - -int -__pthread_spin_trylock (pthread_spinlock_t *lock) -{ - int oldval; - - __asm__ __volatile__(" slr %1,%1\n" - " basr 1,0\n" - "0: cs %1,1,%0" - : "=m" (*lock), "=&d" (oldval) - : "m" (*lock) : "1", "cc" ); - return oldval == 0 ? 0 : EBUSY; -} -weak_alias (__pthread_spin_trylock, pthread_spin_trylock) - - -int -__pthread_spin_unlock (pthread_spinlock_t *lock) -{ - __asm__ __volatile__(" xc 0(4,%0),0(%0)\n" - " bcr 15,0" - : : "a" (lock) : "memory" ); - return 0; -} -weak_alias (__pthread_spin_unlock, pthread_spin_unlock) - - -int -__pthread_spin_init (pthread_spinlock_t *lock, int pshared) -{ - /* We can ignore the `pshared' parameter. Since we are busy-waiting - all processes which can access the memory location `lock' points - to can use the spinlock. */ - *lock = 0; - return 0; -} -weak_alias (__pthread_spin_init, pthread_spin_init) - - -int -__pthread_spin_destroy (pthread_spinlock_t *lock) -{ - /* Nothing to do. */ - return 0; -} -weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h b/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h deleted file mode 100644 index 51505a97d..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/s390-32/pt-machine.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Machine-dependent pthreads configuration and inline functions. - S390 version. - Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#ifndef _PT_MACHINE_H -#define _PT_MACHINE_H 1 - -#ifndef PT_EI -# define PT_EI __extern_always_inline -#endif - -extern long int testandset (int *spinlock); -extern int __compare_and_swap (long int *p, long int oldval, long int newval); - -/* For multiprocessor systems, we want to ensure all memory accesses - are completed before we reset a lock. On other systems, we still - need to make sure that the compiler has flushed everything to memory. */ -#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory") - -/* Spinlock implementation; required. */ -PT_EI long int -testandset (int *spinlock) -{ - int ret; - - __asm__ __volatile__( - " la 1,%1\n" - " lhi 0,1\n" - " l %0,%1\n" - "0: cs %0,0,0(1)\n" - " jl 0b" - : "=&d" (ret), "+m" (*spinlock) - : : "0", "1", "cc"); - - return ret; -} - - -/* Get some notion of the current stack. Need not be exactly the top - of the stack, just something somewhere in the current frame. */ -#define CURRENT_STACK_FRAME stack_pointer -register char * stack_pointer __asm__ ("15"); - -#ifdef __UCLIBC_HAS_TLS__ -/* Return the thread descriptor for the current thread. */ -# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ()) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) __builtin_set_thread_pointer (descr) -#else -/* Return the thread descriptor for the current thread. - S/390 registers uses access register 0 as "thread register". */ -#define THREAD_SELF ({ \ - register pthread_descr __self; \ - __asm__ ("ear %0,%%a0" : "=d" (__self) ); \ - __self; \ -}) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) ({ \ - __asm__ ("sar %%a0,%0" : : "d" (descr) ); \ -}) -#endif - -/* Access to data in the thread descriptor is easy. */ -#define THREAD_GETMEM(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_GETMEM_NC(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_SETMEM(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) -#define THREAD_SETMEM_NC(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) - -/* We want the OS to assign stack addresses. */ -#define FLOATING_STACKS 1 - -/* Maximum size of the stack if the rlimit is unlimited. */ -#define ARCH_STACK_MAX_SIZE 8*1024*1024 - -/* Compare-and-swap for semaphores. */ - -#define HAS_COMPARE_AND_SWAP - -PT_EI int -__compare_and_swap(long int *p, long int oldval, long int newval) -{ - int retval; - - __asm__ __volatile__( - " la 1,%1\n" - " lr 0,%2\n" - " cs 0,%3,0(1)\n" - " ipm %0\n" - " srl %0,28\n" - "0:" - : "=&d" (retval), "+m" (*p) - : "d" (oldval) , "d" (newval) - : "cc", "0", "1" ); - return retval == 0; -} - -#endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h b/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h deleted file mode 100644 index 4bff85aec..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/s390-64/pt-machine.h +++ /dev/null @@ -1,124 +0,0 @@ -/* Machine-dependent pthreads configuration and inline functions. - 64 bit S/390 version. - Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If - not, see <http://www.gnu.org/licenses/>. */ - -#ifndef _PT_MACHINE_H -#define _PT_MACHINE_H 1 - -#ifndef PT_EI -# define PT_EI __extern_always_inline -#endif - -extern long int testandset (int *spinlock); -extern int __compare_and_swap (long int *p, long int oldval, long int newval); - -/* For multiprocessor systems, we want to ensure all memory accesses - are completed before we reset a lock. On other systems, we still - need to make sure that the compiler has flushed everything to memory. */ -#define MEMORY_BARRIER() __asm__ __volatile__ ("bcr 15,0" : : : "memory") - -/* Spinlock implementation; required. */ -PT_EI long int -testandset (int *spinlock) -{ - int ret; - - __asm__ __volatile__( - " la 1,%1\n" - " lhi 0,1\n" - " l %0,%1\n" - "0: cs %0,0,0(1)\n" - " jl 0b" - : "=&d" (ret), "+m" (*spinlock) - : : "0", "1", "cc"); - - return ret; -} - - -/* Get some notion of the current stack. Need not be exactly the top - of the stack, just something somewhere in the current frame. */ -#define CURRENT_STACK_FRAME stack_pointer -register char * stack_pointer __asm__ ("15"); - -#ifdef __UCLIBC_HAS_TLS__ -/* Return the thread descriptor for the current thread. */ -# define THREAD_SELF ((pthread_descr) __builtin_thread_pointer ()) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) __builtin_set_thread_pointer (descr) -#else -/* Return the thread descriptor for the current thread. - 64 bit S/390 uses access register 0 and 1 as "thread register". */ -#define THREAD_SELF ({ \ - register pthread_descr __self; \ - __asm__ (" ear %0,%%a0\n" \ - " sllg %0,%0,32\n" \ - " ear %0,%%a1\n" \ - : "=d" (__self) ); \ - __self; \ -}) - -/* Initialize the thread-unique value. */ -#define INIT_THREAD_SELF(descr, nr) ({ \ - __asm__ (" sar %%a1,%0\n" \ - " srlg 0,%0,32\n" \ - " sar %%a0,0\n" \ - : : "d" (descr) : "0" ); \ -}) -#endif - -/* Access to data in the thread descriptor is easy. */ -#define THREAD_GETMEM(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_GETMEM_NC(descr, member) \ - ((void) sizeof (descr), THREAD_SELF->member) -#define THREAD_SETMEM(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) -#define THREAD_SETMEM_NC(descr, member, value) \ - ((void) sizeof (descr), THREAD_SELF->member = (value)) - -/* We want the OS to assign stack addresses. */ -#define FLOATING_STACKS 1 - -/* Maximum size of the stack if the rlimit is unlimited. */ -#define ARCH_STACK_MAX_SIZE 8*1024*1024 - -/* Compare-and-swap for semaphores. */ - -#define HAS_COMPARE_AND_SWAP - -PT_EI int -__compare_and_swap(long int *p, long int oldval, long int newval) -{ - int retval; - - __asm__ __volatile__( - " lgr 0,%2\n" - " csg 0,%3,%1\n" - " ipm %0\n" - " srl %0,28\n" - "0:" - : "=&d" (retval), "+m" (*p) - : "d" (oldval) , "d" (newval) - : "cc", "0"); - return retval == 0; -} - -#endif /* pt-machine.h */ diff --git a/libpthread/linuxthreads/sysdeps/s390/tcb-offsets.sym b/libpthread/linuxthreads/sysdeps/s390/tcb-offsets.sym deleted file mode 100644 index aee6be257..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/tcb-offsets.sym +++ /dev/null @@ -1,4 +0,0 @@ -#include <sysdep.h> -#include <tls.h> - -MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) diff --git a/libpthread/linuxthreads/sysdeps/s390/tls.h b/libpthread/linuxthreads/sysdeps/s390/tls.h deleted file mode 100644 index d987bdbc2..000000000 --- a/libpthread/linuxthreads/sysdeps/s390/tls.h +++ /dev/null @@ -1,144 +0,0 @@ -/* Definitions for thread-local data handling. linuxthreads/s390 version. - Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _TLS_H -#define _TLS_H - -#ifndef __ASSEMBLER__ - -# include <pt-machine.h> -# include <stdbool.h> -# include <stddef.h> - -/* Type for the dtv. */ -typedef union dtv -{ - size_t counter; - struct - { - void *val; - bool is_static; - } pointer; -} dtv_t; - -typedef struct -{ - void *tcb; /* Pointer to the TCB. Not necessary the - thread descriptor used by libpthread. */ - dtv_t *dtv; - void *self; /* Pointer to the thread descriptor. */ - int multiple_threads; -} tcbhead_t; - -#else /* __ASSEMBLER__ */ -# include <tcb-offsets.h> -#endif /* __ASSEMBLER__ */ - -/* TLS is always supported if the tools support it. There are no - kernel dependencies. To avoid bothering with the TLS support code - at all, use configure --without-tls. - - We need USE_TLS to be consistently defined, for ldsodefs.h - conditionals. */ - -#ifdef HAVE_TLS_SUPPORT - -/* Signal that TLS support is available. */ -# define USE_TLS 1 - -# ifndef __ASSEMBLER__ -/* Get system call information. */ -# include <sysdep.h> - - -/* Get the thread descriptor definition. */ -# include <linuxthreads/descr.h> - -/* This is the size of the initial TCB. */ -# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) - -/* Alignment requirements for the initial TCB. */ -# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t) - -/* This is the size of the TCB. */ -# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct) - -/* Alignment requirements for the TCB. */ -# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct) - -/* The TCB can have any size and the memory following the address the - thread pointer points to is unspecified. Allocate the TCB there. */ -# define TLS_TCB_AT_TP 1 - - -/* Install the dtv pointer. The pointer passed is to the element with - index -1 which contain the length. */ -# define INSTALL_DTV(descr, dtvp) \ - ((tcbhead_t *) (descr))->dtv = (dtvp) + 1 - -/* Install new dtv for current thread. */ -# define INSTALL_NEW_DTV(dtv) \ - (((tcbhead_t *) __builtin_thread_pointer ())->dtv = (dtv)) - -/* Return dtv of given thread descriptor. */ -# define GET_DTV(descr) \ - (((tcbhead_t *) (descr))->dtv) - -/* Code to initially initialize the thread pointer. This might need - special attention since 'errno' is not yet available and if the - operation can cause a failure 'errno' must not be touched. - - The value of this macro is null if successful, or an error string. */ -# define TLS_INIT_TP(descr, secondcall) \ - ({ \ - void *_descr = (descr); \ - tcbhead_t *head = _descr; \ - \ - head->tcb = _descr; \ - /* For now the thread descriptor is at the same address. */ \ - head->self = _descr; \ - \ - __builtin_set_thread_pointer (_descr); \ - NULL; \ - }) - -/* Return the address of the dtv for the current thread. */ -# define THREAD_DTV() \ - (((tcbhead_t *) __builtin_thread_pointer ())->dtv) - -# endif /* __ASSEMBLER__ */ - -#else /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */ - -# ifndef __ASSEMBLER__ - -/* Get the thread descriptor definition. */ -# include <linuxthreads/descr.h> - -# define NONTLS_INIT_TP \ - do { \ - static const tcbhead_t nontls_init_tp \ - = { .multiple_threads = 0 }; \ - INIT_THREAD_SELF (&nontls_init_tp, 0); \ - } while (0) - -# endif /* __ASSEMBLER__ */ - -#endif /* HAVE_TLS_SUPPORT && (FLOATING_STACKS || !IS_IN_libpthread) */ - -#endif /* tls.h */ diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h deleted file mode 100644 index 6b588257d..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/bits/typesizes.h +++ /dev/null @@ -1,71 +0,0 @@ -/* bits/typesizes.h -- underlying types for *_t. Linux/s390 version. - Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _BITS_TYPES_H -# error "Never include <bits/typesizes.h> directly; use <sys/types.h> instead." -#endif - -#ifndef _BITS_TYPESIZES_H -#define _BITS_TYPESIZES_H 1 - -/* See <bits/types.h> for the meaning of these macros. This file exists so - that <bits/types.h> need not vary across different GNU platforms. */ - -#define __DEV_T_TYPE __UQUAD_TYPE -#define __UID_T_TYPE __U32_TYPE -#define __GID_T_TYPE __U32_TYPE -#define __INO_T_TYPE __ULONGWORD_TYPE -#define __INO64_T_TYPE __UQUAD_TYPE -#define __MODE_T_TYPE __U32_TYPE -#define __NLINK_T_TYPE __UWORD_TYPE -#define __OFF_T_TYPE __SLONGWORD_TYPE -#define __OFF64_T_TYPE __SQUAD_TYPE -#define __PID_T_TYPE __S32_TYPE -#define __RLIM_T_TYPE __ULONGWORD_TYPE -#define __RLIM64_T_TYPE __UQUAD_TYPE -#define __BLKCNT_T_TYPE __SLONGWORD_TYPE -#define __BLKCNT64_T_TYPE __SQUAD_TYPE -#define __FSBLKCNT_T_TYPE __ULONGWORD_TYPE -#define __FSBLKCNT64_T_TYPE __UQUAD_TYPE -#define __FSFILCNT_T_TYPE __ULONGWORD_TYPE -#define __FSFILCNT64_T_TYPE __UQUAD_TYPE -#define __ID_T_TYPE __U32_TYPE -#define __CLOCK_T_TYPE __SLONGWORD_TYPE -#define __TIME_T_TYPE __SLONGWORD_TYPE -#define __USECONDS_T_TYPE __U32_TYPE -#define __SUSECONDS_T_TYPE __SLONGWORD_TYPE -#define __DADDR_T_TYPE __S32_TYPE -#define __SWBLK_T_TYPE __SLONGWORD_TYPE -#define __KEY_T_TYPE __S32_TYPE -#define __CLOCKID_T_TYPE __S32_TYPE -#define __TIMER_T_TYPE __S32_TYPE -#define __BLKSIZE_T_TYPE __SLONGWORD_TYPE -#define __FSID_T_TYPE struct { int __val[2]; } -#if defined __GNUC__ && __GNUC__ <= 2 -/* Compatibility with g++ 2.95.x. */ -#define __SSIZE_T_TYPE __SWORD_TYPE -#else -/* size_t is unsigned long int on s390 -m31. */ -#define __SSIZE_T_TYPE __SLONGWORD_TYPE -#endif - -/* Number of descriptors that can fit in an `fd_set'. */ -#define __FD_SETSIZE 1024 - - -#endif /* bits/typesizes.h */ diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c deleted file mode 100644 index cde418307..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/pt-initfini.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Special .init and .fini section support for S/390. - Copyright (C) 2000, 2001 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it - and/or modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - The GNU C Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. */ - -/* This file is compiled into assembly code which is then munged by a sed - script into two files: crti.s and crtn.s. - - * crti.s puts a function prologue at the beginning of the - .init and .fini sections and defines global symbols for - those addresses, so they can be called as functions. - - * crtn.s puts the corresponding function epilogues - in the .init and .fini sections. */ - -__asm__ ("\ -\n\ -#include \"defs.h\"\n\ -\n\ -/*@HEADER_ENDS*/\n\ -\n\ -/*@TESTS_BEGIN*/\n\ -\n\ -/*@TESTS_END*/\n\ -\n\ -/*@_init_PROLOG_BEGINS*/\n\ -\n\ - .section .init\n\ -#NO_APP\n\ - .align 4\n\ -.globl _init\n\ - .type _init,@function\n\ -_init:\n\ -# leaf function 0\n\ -# automatics 0\n\ -# outgoing args 0\n\ -# need frame pointer 0\n\ -# call alloca 0\n\ -# has varargs 0\n\ -# incoming args (stack) 0\n\ -# function length 36\n\ - STM 6,15,24(15)\n\ - BRAS 13,.LTN1_0\n\ -.LT1_0:\n\ -.LC13:\n\ - .long __pthread_initialize_minimal@PLT-.LT1_0\n\ -.LC14:\n\ - .long __gmon_start__@GOT\n\ -.LC15:\n\ - .long _GLOBAL_OFFSET_TABLE_-.LT1_0\n\ -.LTN1_0:\n\ - LR 1,15\n\ - AHI 15,-96\n\ - ST 1,0(15)\n\ - L 12,.LC15-.LT1_0(13)\n\ - AR 12,13\n\ - L 1,.LC13-.LT1_0(13)\n\ - LA 1,0(1,13)\n\ - BASR 14,1\n\ - L 1,.LC14-.LT1_0(13)\n\ - L 1,0(1,12)\n\ - LTR 1,1\n\ - JE .L22\n\ - BASR 14,1\n\ -.L22:\n\ -#APP\n\ - .align 4,0x07\n\ - END_INIT\n\ -\n\ -/*@_init_PROLOG_ENDS*/\n\ -\n\ -/*@_init_EPILOG_BEGINS*/\n\ - .align 4\n\ - .section .init\n\ -#NO_APP\n\ - .align 4\n\ - L 4,152(15)\n\ - LM 6,15,120(15)\n\ - BR 4\n\ -#APP\n\ - END_INIT\n\ -\n\ -/*@_init_EPILOG_ENDS*/\n\ -\n\ -/*@_fini_PROLOG_BEGINS*/\n\ - .section .fini\n\ -#NO_APP\n\ - .align 4\n\ -.globl _fini\n\ - .type _fini,@function\n\ -_fini:\n\ -# leaf function 0\n\ -# automatics 0\n\ -# outgoing args 0\n\ -# need frame pointer 0\n\ -# call alloca 0\n\ -# has varargs 0\n\ -# incoming args (stack) 0\n\ -# function length 30\n\ - STM 6,15,24(15)\n\ - BRAS 13,.LTN2_0\n\ -.LT2_0:\n\ -.LC17:\n\ - .long _GLOBAL_OFFSET_TABLE_-.LT2_0\n\ -.LTN2_0:\n\ - LR 1,15\n\ - AHI 15,-96\n\ - ST 1,0(15)\n\ - L 12,.LC17-.LT2_0(13)\n\ - AR 12,13\n\ -#APP\n\ - .align 4,0x07\n\ - END_FINI\n\ -\n\ -/*@_fini_PROLOG_ENDS*/\n\ -\n\ -/*@_fini_EPILOG_BEGINS*/\n\ - .align 4\n\ - .section .fini\n\ -#NO_APP\n\ - .align 4\n\ - L 4,152(15)\n\ - LM 6,15,120(15)\n\ - BR 4\n\ -#APP\n\ - END_FINI\n\ -\n\ -/*@_fini_EPILOG_ENDS*/\n\ -\n\ -/*@TRAILER_BEGINS*/\ -"); diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h deleted file mode 100644 index 2431129e5..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <tls.h> -#ifndef __ASSEMBLER__ -# include <linuxthreads/internals.h> -#endif - -#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt - -# if !defined NOT_IN_libc || defined IS_IN_libpthread - -# define PSEUDO_CANCEL(name, syscall_name, args) \ -L(pseudo_cancel): \ - STM_##args \ - stm %r12,%r15,48(%r15); \ - lr %r14,%r15; \ - ahi %r15,-96; \ - st %r14,0(%r15); \ - basr %r13,0; \ -0: l %r1,1f-0b(%r13); \ - bas %r14,0(%r1,%r13); \ - lr %r0,%r2; \ - LM_##args \ - DO_CALL(syscall_name, args); \ - l %r1,2f-0b(%r13); \ - lr %r12,%r2; \ - lr %r2,%r0; \ - bas %r14,0(%r1,%r13); \ - lr %r2,%r12; \ - lm %r12,%r15,48+96(%r15); \ - j L(pseudo_check); \ -1: .long CENABLE-0b; \ -2: .long CDISABLE-0b; - -# else /* !libc.so && !libpthread.so */ - -# define PSEUDO_CANCEL(name, syscall_name, args) \ -L(pseudo_cancel): \ - STM_##args \ - stm %r11,%r15,44(%r15); \ - lr %r14,%r15; \ - ahi %r15,-96; \ - st %r14,0(%r15); \ - basr %r13,0; \ -0: l %r12,3f-0b(%r13); \ - l %r1,1f-0b(%r13); \ - la %r12,0(%r12,%r13); \ - bas %r14,0(%r1,%r13); \ - lr %r0,%r2; \ - LM_##args \ - DO_CALL(syscall_name, args); \ - l %r1,2f-0b(%r13); \ - lr %r11,%r2; \ - lr %r2,%r0; \ - bas %r14,0(%r1,%r13); \ - lr %r2,%r11; \ - lm %r11,%r15,44+96(%r15); \ - j L(pseudo_check); \ -1: .long CENABLE@PLT-0b; \ -2: .long CDISABLE@PLT-0b; \ -3: .long _GLOBAL_OFFSET_TABLE_-0b; - -# endif - -# undef PSEUDO -# define PSEUDO(name, syscall_name, args) \ - .text; \ -PSEUDO_CANCEL(name, syscall_name, args) \ -ENTRY(name) \ - SINGLE_THREAD_P(%r1) \ - jne L(pseudo_cancel); \ - DO_CALL(syscall_name, args); \ -L(pseudo_check): \ - lhi %r4,-4095; \ - clr %r2,%r4; \ - jnl SYSCALL_ERROR_LABEL; \ -L(pseudo_end): - -# ifdef IS_IN_libpthread -# define CENABLE __pthread_enable_asynccancel -# define CDISABLE __pthread_disable_asynccancel -# elif !defined NOT_IN_libc -# define CENABLE __libc_enable_asynccancel -# define CDISABLE __libc_disable_asynccancel -# else -# define CENABLE __librt_enable_asynccancel -# define CDISABLE __librt_disable_asynccancel -# endif - -#define STM_0 /* Nothing */ -#define STM_1 st %r2,8(%r15); -#define STM_2 stm %r2,%r3,8(%r15); -#define STM_3 stm %r2,%r4,8(%r15); -#define STM_4 stm %r2,%r5,8(%r15); -#define STM_5 stm %r2,%r5,8(%r15); - -#define LM_0 /* Nothing */ -#define LM_1 l %r2,8+96(%r15); -#define LM_2 lm %r2,%r3,8+96(%r15); -#define LM_3 lm %r2,%r4,8+96(%r15); -#define LM_4 lm %r2,%r5,8+96(%r15); -#define LM_5 lm %r2,%r5,8+96(%r15); - -# ifndef __ASSEMBLER__ -# define SINGLE_THREAD_P \ - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ - p_header.data.multiple_threads) == 0, 1) -# else -# define SINGLE_THREAD_P(reg) \ - ear reg,%a0; \ - icm reg,15,MULTIPLE_THREADS_OFFSET(reg); -# endif - -#elif !defined __ASSEMBLER__ - -/* This code should never be used but we define it anyhow. */ -# define SINGLE_THREAD_P (1) - -#endif diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S deleted file mode 100644 index 078c730fd..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#define _ERRNO_H 1 -#include <bits/errno.h> - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - basr %r1,0 -0: -#ifdef SHARED - al %r1,4f-0b(%r1) - l %r1,0(%r1) - ltr %r1,%r1 -#else - icm %r1,15,4f-0b(%r1) -#endif - jne 1f - - /* Do vfork system call. */ - svc SYS_ify (vfork) - - /* Check for error. */ - lhi %r4,-4095 - clr %r2,%r4 - jnl SYSCALL_ERROR_LABEL - - /* Normal return. */ - br %r14 -1: - basr %r1,0 -2: - al %r1,3f-2b(%r1) - br %r1 -3: - .long HIDDEN_JUMPTARGET(fork)-2b -4: -#ifdef SHARED - .long __libc_pthread_functions-0b -#else - .weak pthread_create - .long pthread_create -#endif -PSEUDO_END(__vfork) - -libc_hidden_def (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c deleted file mode 100644 index 136ce5442..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-initfini.c +++ /dev/null @@ -1,136 +0,0 @@ -/* Special .init and .fini section support for 64 bit S/390. - Copyright (C) 2001 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it - and/or modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - In addition to the permissions in the GNU Lesser General Public - License, the Free Software Foundation gives you unlimited - permission to link the compiled version of this file with other - programs, and to distribute those programs without any restriction - coming from the use of this file. (The Lesser General Public - License restrictions do apply in other respects; for example, they - cover modification of the file, and distribution when not linked - into another program.) - - The GNU C Library is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. */ - -/* This file is compiled into assembly code which is then munged by a sed - script into two files: crti.s and crtn.s. - - * crti.s puts a function prologue at the beginning of the - .init and .fini sections and defines global symbols for - those addresses, so they can be called as functions. - - * crtn.s puts the corresponding function epilogues - in the .init and .fini sections. */ - -__asm__ ("\ -\n\ -#include \"defs.h\"\n\ -\n\ -/*@HEADER_ENDS*/\n\ -\n\ -/*@TESTS_BEGIN*/\n\ -\n\ -/*@TESTS_END*/\n\ -\n\ -/*@_init_PROLOG_BEGINS*/\n\ -\n\ - .section .init\n\ -#NO_APP\n\ - .align 4\n\ -.globl _init\n\ - .type _init,@function\n\ -_init:\n\ -# leaf function 0\n\ -# automatics 0\n\ -# outgoing args 0\n\ -# need frame pointer 0\n\ -# call alloca 0\n\ -# has varargs 0\n\ -# incoming args (stack) 0\n\ -# function length 36\n\ - STMG 6,15,48(15)\n\ - LGR 1,15\n\ - AGHI 15,-160\n\ - STG 1,0(15)\n\ - LARL 12,_GLOBAL_OFFSET_TABLE_\n\ - BRASL 14,__pthread_initialize_minimal@PLT\n\ - LARL 1,__gmon_start__@GOTENT\n\ - LG 1,0(1)\n\ - LTGR 1,1\n\ - JE .L22\n\ - BASR 14,1\n\ -.L22:\n\ -#APP\n\ - .align 4,0x07\n\ - END_INIT\n\ -\n\ -/*@_init_PROLOG_ENDS*/\n\ -\n\ -/*@_init_EPILOG_BEGINS*/\n\ - .align 4\n\ - .section .init\n\ -#NO_APP\n\ - .align 4\n\ - LG 4,272(15)\n\ - LMG 6,15,208(15)\n\ - BR 4\n\ -#APP\n\ - END_INIT\n\ -\n\ -/*@_init_EPILOG_ENDS*/\n\ -\n\ -/*@_fini_PROLOG_BEGINS*/\n\ - .section .fini\n\ -#NO_APP\n\ - .align 4\n\ -.globl _fini\n\ - .type _fini,@function\n\ -_fini:\n\ -# leaf function 0\n\ -# automatics 0\n\ -# outgoing args 0\n\ -# need frame pointer 0\n\ -# call alloca 0\n\ -# has varargs 0\n\ -# incoming args (stack) 0\n\ -# function length 30\n\ - STMG 6,15,48(15)\n\ - LGR 1,15\n\ - AGHI 15,-160\n\ - STG 1,0(15)\n\ - LARL 12,_GLOBAL_OFFSET_TABLE_\n\ -#APP\n\ - .align 4,0x07\n\ - END_FINI\n\ -\n\ -/*@_fini_PROLOG_ENDS*/\n\ -\n\ -/*@_fini_EPILOG_BEGINS*/\n\ - .align 4\n\ - .section .fini\n\ -#NO_APP\n\ - .align 4\n\ - LG 4,272(15)\n\ - LMG 6,15,208(15)\n\ - BR 4\n\ -#APP\n\ - END_FINI\n\ -\n\ -/*@_fini_EPILOG_ENDS*/\n\ -\n\ -/*@TRAILER_BEGINS*/\n\ - "); diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c deleted file mode 100644 index d57283ad2..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/pt-sigsuspend.c +++ /dev/null @@ -1 +0,0 @@ -#include "../../ia64/pt-sigsuspend.c" diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h deleted file mode 100644 index cf3124ebb..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#include <tls.h> -#ifndef __ASSEMBLER__ -# include <linuxthreads/internals.h> -#endif - -#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt - -# undef PSEUDO -# define PSEUDO(name, syscall_name, args) \ - .text; \ -L(pseudo_cancel): \ - STM_##args \ - stmg %r13,%r15,104(%r15); \ - lgr %r14,%r15; \ - aghi %r15,-160; \ - stg %r14,0(%r15); \ - brasl %r14,CENABLE; \ - lgr %r0,%r2; \ - LM_##args \ - DO_CALL(syscall_name, args); \ - lgr %r13,%r2; \ - lgr %r2,%r0; \ - brasl %r14,CDISABLE; \ - lgr %r2,%r13; \ - lmg %r13,%r15,104+160(%r15); \ - j L(pseudo_check); \ -ENTRY(name) \ - SINGLE_THREAD_P \ - jne L(pseudo_cancel); \ - DO_CALL(syscall_name, args); \ -L(pseudo_check): \ - lghi %r4,-4095; \ - clgr %r2,%r4; \ - jgnl SYSCALL_ERROR_LABEL; \ -L(pseudo_end): - -# ifdef IS_IN_libpthread -# define CENABLE __pthread_enable_asynccancel -# define CDISABLE __pthread_disable_asynccancel -# define __local_multiple_threads __pthread_multiple_threads -# elif !defined NOT_IN_libc -# define CENABLE __libc_enable_asynccancel -# define CDISABLE __libc_disable_asynccancel -# define __local_multiple_threads __libc_multiple_threads -# else -# define CENABLE __librt_enable_asynccancel@PLT -# define CDISABLE __librt_disable_asynccancel@PLT -# endif - -#define STM_0 /* Nothing */ -#define STM_1 stg %r2,16(%r15); -#define STM_2 stmg %r2,%r3,16(%r15); -#define STM_3 stmg %r2,%r4,16(%r15); -#define STM_4 stmg %r2,%r5,16(%r15); -#define STM_5 stmg %r2,%r5,16(%r15); - -#define LM_0 /* Nothing */ -#define LM_1 lg %r2,16+160(%r15); -#define LM_2 lmg %r2,%r3,16+160(%r15); -#define LM_3 lmg %r2,%r4,16+160(%r15); -#define LM_4 lmg %r2,%r5,16+160(%r15); -#define LM_5 lmg %r2,%r5,16+160(%r15); - -# if !defined NOT_IN_libc || defined IS_IN_libpthread -# ifndef __ASSEMBLER__ -extern int __local_multiple_threads attribute_hidden; -# define SINGLE_THREAD_P \ - __builtin_expect (__local_multiple_threads == 0, 1) -# else -# define SINGLE_THREAD_P \ - larl %r1,__local_multiple_threads; \ - icm %r0,15,0(%r1); -# endif - -# else - -# ifndef __ASSEMBLER__ -# define SINGLE_THREAD_P \ - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ - p_header.data.multiple_threads) == 0, 1) -# else -# define SINGLE_THREAD_P \ - ear %r1,%a0; \ - sllg %r1,%r1,32; \ - ear %r1,%a1; \ - icm %r1,15,MULTIPLE_THREADS_OFFSET(%r1); -# endif - -# endif - -#elif !defined __ASSEMBLER__ - -/* This code should never be used but we define it anyhow. */ -# define SINGLE_THREAD_P (1) - -#endif diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S deleted file mode 100644 index 109d4f6dc..000000000 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com> - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep-cancel.h> -#define _ERRNO_H 1 -#include <bits/errno.h> - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) -#ifdef SHARED - larl %r1,__libc_pthread_functions - lg %r1,0(%r1) -#else - .weak pthread_create - larl %r1,pthread_create -#endif - ltgr %r1,%r1 - jgne HIDDEN_JUMPTARGET(fork) - - /* Do vfork system call. */ - svc SYS_ify (vfork) - - /* Check for error. */ - lghi %r4,-4095 - clgr %r2,%r4 - jgnl SYSCALL_ERROR_LABEL - - /* Normal return. */ - br %r14 -PSEUDO_END(__vfork) - -libc_hidden_def (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/nptl/allocatestack.c b/libpthread/nptl/allocatestack.c index 3f0586d28..118820a9a 100644 --- a/libpthread/nptl/allocatestack.c +++ b/libpthread/nptl/allocatestack.c @@ -786,7 +786,7 @@ __reclaim_stacks (void) if (in_flight_stack != 0) { bool add_p = in_flight_stack & 1; - list_t *elem = (list_t *) (in_flight_stack & ~UINTMAX_C (1)); + list_t *elem = (list_t *)(uintptr_t)(in_flight_stack & ~UINTMAX_C (1)); if (add_p) { diff --git a/libpthread/nptl/forward.c b/libpthread/nptl/forward.c index 812908001..a5c97babd 100644 --- a/libpthread/nptl/forward.c +++ b/libpthread/nptl/forward.c @@ -160,5 +160,6 @@ FORWARD2(__pthread_unwind, /* We cannot call abort() here. */ INTERNAL_SYSCALL_DECL (err); INTERNAL_SYSCALL (kill, err, 1, SIGKILL); + __builtin_unreachable(); }) #undef return diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/arc/Makefile.arch index 8e3c7b0bc..3b9db6a61 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arc/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S +libpthread_linux_arch_SSRC = libpthread_linux_arch_CSRC = pthread_once.c lowlevellock.c \ pt-__syscall_rt_sigaction.c pt-__syscall_error.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/arc/pt-vfork.S deleted file mode 100644 index f222dca43..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arc/pt-vfork.S +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com) - * - * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. - */ - -#include "vfork.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch index 0ea0b2931..5522ce349 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S +libpthread_linux_arch_SSRC = libpthread_linux_arch_CSRC = pthread_once.c \ pt-__syscall_rt_sigaction.c pt-__syscall_error.c \ lowlevellock.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S deleted file mode 100644 index df18f0304..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.S +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <tcb-offsets.h> - -/* Save the PID value. */ -#define SAVE_PID \ - str lr, [sp, #-4]!; /* Save LR. */ \ - mov r0, #0xffff0fff; /* Point to the high page. */ \ - mov lr, pc; /* Save our return address. */ \ - sub pc, r0, #31; /* Jump to the TLS entry. */ \ - ldr lr, [sp], #4; /* Restore LR. */ \ - mov r2, r0; /* Save the TLS addr in r2. */ \ - ldr r3, [r2, #PID_OFFSET]; /* Load the saved PID. */ \ - rsb r0, r3, #0; /* Negate it. */ \ - str r0, [r2, #PID_OFFSET] /* Store the temporary PID. */ - -/* Restore the old PID value in the parent. */ -#define RESTORE_PID \ - cmp r0, #0; /* If we are the parent... */ \ - strne r3, [r2, #PID_OFFSET] /* ... restore the saved PID. */ - -#include "../../../../../../../libc/sysdeps/linux/arm/vfork.S" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch index fff0dae89..9dc878c4c 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S clone.S pthread_spin_unlock.S pthread_once.S +libpthread_linux_arch_SSRC = clone.S pthread_spin_unlock.S pthread_once.S libpthread_linux_arch_CSRC = pthread_spin_init.c pt-__syscall_error.c libc_linux_arch_CSRC = fork.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S deleted file mode 100644 index 5bba782df..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/i386/pt-vfork.S +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Schwab <schwab@gnu.org>. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#define _ERRNO_H 1 -#include <bits/errno.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> - -/* Save the PID value. */ -#define SAVE_PID \ - movl %gs:PID, %edx; \ - movl %edx, %eax; \ - negl %eax; \ - movl %eax, %gs:PID - -/* Restore the old PID value in the parent. */ -#define RESTORE_PID \ - testl %eax, %eax; \ - je 1f; \ - movl %edx, %gs:PID; \ -1: - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - /* Pop the return PC value into ECX. */ - popl %ecx - - SAVE_PID - - /* Stuff the syscall number in EAX and enter into the kernel. */ - movl $SYS_ify (vfork), %eax - int $0x80 - - RESTORE_PID - - /* Jump to the return PC. Don't jump directly since this - disturbs the branch target cache. Instead push the return - address back on the stack. */ - pushl %ecx - - cmpl $-4095, %eax - jae SYSCALL_ERROR_LABEL /* Branch forward if it failed. */ -L(pseudo_end): - ret -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c index 2a5bf6dd9..75369bd70 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevellock.c @@ -22,8 +22,6 @@ #include <lowlevellock.h> #include <sys/time.h> #include <tls.h> -#include <tcb-offsets.h> - void #ifndef IS_IN_libpthread diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/metag/Makefile.arch index 4d02d0c9a..ddc768085 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/metag/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S +libpthread_linux_arch_SSRC = libpthread_linux_arch_CSRC = pthread_once.c \ pt-__syscall_rt_sigaction.c pt-__syscall_error.c \ lowlevellock.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile.arch index 4a3d0f248..f87dedca4 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S clone.S +libpthread_linux_arch_SSRC = clone.S libpthread_linux_arch_CSRC = pthread_once.c pt-__syscall_rt_sigaction.c libc_linux_arch_CSRC = fork.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/pt-vfork.S deleted file mode 100644 index 52fbde337..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/pt-vfork.S +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2005 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <features.h> -#include <tls.h> - -/* Save the PID value. */ -#define SAVE_PID \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Negate it. */ \ - sw a2, PID_OFFSET(v1); /* Store the temporary PID. */ - -/* Restore the old PID value in the parent. */ -#define RESTORE_PID \ - beqz v0, 1f; /* If we are the parent... */ \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Re-negate it. */ \ - sw a2, PID_OFFSET(v1); /* Restore the PID. */ \ -1: - -#include <../../../../../../../libc/sysdeps/linux/mips/vfork.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch index 21b9b7239..df4bb6963 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S +libpthread_linux_arch_SSRC = libpthread_linux_arch_CSRC = pthread_once.c pt-__syscall_error.c libc_linux_arch_CSRC = fork.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S deleted file mode 100644 index 2f82504a2..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#define _ERRNO_H 1 -#include <bits/errno.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(2) - neg 0,0 - stw 0,PID(2) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(2) - neg 0,0 - stw 0,PID(2) - - PSEUDO_RET - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S deleted file mode 100644 index 12e47b39c..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#define _ERRNO_H 1 -#include <bits/errno.h> -#include <bits/kernel-features.h> -#include <tcb-offsets.h> - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(13) - neg 0,0 - stw 0,PID(13) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(13) - neg 0,0 - stw 0,PID(13) - - PSEUDO_RET - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/pt-vfork.S deleted file mode 100644 index 0225219d9..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/powerpc/pt-vfork.S +++ /dev/null @@ -1,5 +0,0 @@ -#if defined __powerpc64__ -# include "powerpc64/pt-vfork.S" -#else -# include "powerpc32/pt-vfork.S" -#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch index 154dd6e66..908d9e15d 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S pthread_once.S pthread_rwlock_wrlock.S \ +libpthread_linux_arch_SSRC = pthread_once.S pthread_rwlock_wrlock.S \ pthread_rwlock_rdlock.S pthread_rwlock_unlock.S \ lowlevellock.S lowlevelrobustlock.S pthread_barrier_wait.S \ pthread_cond_broadcast.S pthread_cond_signal.S \ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pt-vfork.S deleted file mode 100644 index 56aa6d0af..000000000 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/pt-vfork.S +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#define _ERRNO_H 1 -#include <bits/errno.h> -#include <tcb-offsets.h> - -/* Clone the calling process, but without copying the whole address space. - The calling process is suspended until the new process exits or is - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - /* Save the PID value. */ - stc gbr, r2 - mov.w .L2, r0 - mov.l @(r0,r2), r4 - neg r4, r1 - mov.l r1, @(r0,r2) - - mov.w .L1, r3 - trapa #0x10 - mov r0, r1 - - /* Restore the old PID value in the parent. */ - tst r0, r0 - bt/s 2f - stc gbr, r2 - mov.w .L2, r0 - mov.l r4, @(r0,r2) - mov r1, r0 -2: - mov #-12, r2 - shad r2, r1 - not r1, r1 // r1=0 means r0 = -1 to -4095 - tst r1, r1 // i.e. error in linux - bf .Lpseudo_end - SYSCALL_ERROR_HANDLER -.Lpseudo_end: - rts - nop -.L1: - .word __NR_vfork -.L2: - .word PID - TLS_PRE_TCB_SIZE - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/Makefile.arch index 2b2b5f579..01a9e879a 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S clone.S +libpthread_linux_arch_SSRC = clone.S libpthread_linux_arch_CSRC = pthread_once.c lowlevellock.c \ pthread_barrier_init.c pthread_barrier_wait.c pthread_barrier_destroy.c \ pt-__syscall_error.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile.arch index ebd506047..af1416485 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/Makefile.arch @@ -5,7 +5,7 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. # -libpthread_linux_arch_SSRC = pt-vfork.S clone.S pthread_once.S \ +libpthread_linux_arch_SSRC = clone.S pthread_once.S \ lowlevellock.S pthread_barrier_wait.S pthread_cond_signal.S pthread_cond_broadcast.S \ sem_post.S sem_timedwait.S lowlevelrobustlock.S \ sem_trywait.S sem_wait.S pthread_rwlock_rdlock.S pthread_rwlock_wrlock.S \ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch new file mode 100644 index 000000000..8ebe28773 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/Makefile.arch @@ -0,0 +1,15 @@ +# uClibc-ng project +# Licensed under the LGPL v2.1, see the file COPYING and LICENSE. + +libc_linux_arch_CSRC = fork.c +libc_linux_arch_SSRC = clone.S vfork.S +libpthread_linux_arch_CSRC = pthread_once.c +libpthread_linux_arch_SSRC = + +CFLAGS-OMIT-fork.c = -DNOT_IN_libc -DIS_IN_libpthread +ASFLAGS-pt-vfork.S = -DNOT_IN_libc -DIS_IN_libpthread -D_LIBC_REENTRANT + +ASFLAGS-clone.S = -D_LIBC_REENTRANT +ASFLAGS-vfork.S = -D_LIBC_REENTRANT +ASFLAGS-syscall.S = -D_LIBC_REENTRANT +ASFLAGS-mmap.S = -D_LIBC_REENTRANT diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h new file mode 100644 index 000000000..5e4402088 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/pthreadtypes.h @@ -0,0 +1,184 @@ +/* Copyright (C) 2002-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H 1 + +#include <endian.h> + +#define __SIZEOF_PTHREAD_ATTR_T 36 +#define __SIZEOF_PTHREAD_MUTEX_T 24 +#define __SIZEOF_PTHREAD_MUTEXATTR_T 4 +#define __SIZEOF_PTHREAD_COND_T 48 +#define __SIZEOF_PTHREAD_COND_COMPAT_T 12 +#define __SIZEOF_PTHREAD_CONDATTR_T 4 +#define __SIZEOF_PTHREAD_RWLOCK_T 32 +#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8 +#define __SIZEOF_PTHREAD_BARRIER_T 20 +#define __SIZEOF_PTHREAD_BARRIERATTR_T 4 + + +/* Thread identifiers. The structure of the attribute type is not + exposed on purpose. */ +typedef unsigned long int pthread_t; + + +union pthread_attr_t +{ + char __size[__SIZEOF_PTHREAD_ATTR_T]; + long int __align; +}; +#ifndef __have_pthread_attr_t +typedef union pthread_attr_t pthread_attr_t; +# define __have_pthread_attr_t 1 +#endif + + +typedef struct __pthread_internal_slist +{ + struct __pthread_internal_slist *__next; +} __pthread_slist_t; + + +/* Data structures for mutex handling. The structure of the attribute + type is not exposed on purpose. */ +typedef union +{ + struct __pthread_mutex_s + { + int __lock; + unsigned int __count; + int __owner; + /* KIND must stay at this position in the structure to maintain + binary compatibility. */ + int __kind; + unsigned int __nusers; + __extension__ union + { + int __spins; + __pthread_slist_t __list; + }; + } __data; + char __size[__SIZEOF_PTHREAD_MUTEX_T]; + long int __align; +} pthread_mutex_t; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; + long int __align; +} pthread_mutexattr_t; + + +/* Data structure for conditional variable handling. The structure of + the attribute type is not exposed on purpose. */ +typedef union +{ + struct + { + int __lock; + unsigned int __futex; + __extension__ unsigned long long int __total_seq; + __extension__ unsigned long long int __wakeup_seq; + __extension__ unsigned long long int __woken_seq; + void *__mutex; + unsigned int __nwaiters; + unsigned int __broadcast_seq; + } __data; + char __size[__SIZEOF_PTHREAD_COND_T]; + __extension__ long long int __align; +} pthread_cond_t; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_CONDATTR_T]; + long int __align; +} pthread_condattr_t; + + +/* Keys for thread-specific data */ +typedef unsigned int pthread_key_t; + + +/* Once-only execution */ +typedef int pthread_once_t; + + +#if defined __USE_UNIX98 || defined __USE_XOPEN2K +/* Data structure for read-write lock variable handling. The + structure of the attribute type is not exposed on purpose. */ +typedef union +{ + struct + { + int __lock; + unsigned int __nr_readers; + unsigned int __readers_wakeup; + unsigned int __writer_wakeup; + unsigned int __nr_readers_queued; + unsigned int __nr_writers_queued; +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +#else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +#endif + int __writer; + } __data; + char __size[__SIZEOF_PTHREAD_RWLOCK_T]; + long int __align; +} pthread_rwlock_t; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_RWLOCKATTR_T]; + long int __align; +} pthread_rwlockattr_t; +#endif + + +#ifdef __USE_XOPEN2K +/* POSIX spinlock data type. */ +typedef volatile int pthread_spinlock_t; + + +/* POSIX barriers data type. The structure of the type is + deliberately not exposed. */ +typedef union +{ + char __size[__SIZEOF_PTHREAD_BARRIER_T]; + long int __align; +} pthread_barrier_t; + +typedef union +{ + char __size[__SIZEOF_PTHREAD_BARRIERATTR_T]; + int __align; +} pthread_barrierattr_t; +#endif + + +#endif /* bits/pthreadtypes.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h new file mode 100644 index 000000000..8845cf009 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/bits/semaphore.h @@ -0,0 +1,35 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SEMAPHORE_H +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." +#endif + + +#define __SIZEOF_SEM_T 16 + + +/* Value returned if `sem_open' failed. */ +#define SEM_FAILED ((sem_t *) 0) + + +typedef union +{ + char __size[__SIZEOF_SEM_T]; + long int __align; +} sem_t; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S new file mode 100644 index 000000000..539b9ef38 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/clone.S @@ -0,0 +1,3 @@ +#define RESET_PID +#include <tcb-offsets.h> +#include <libc/sysdeps/linux/xtensa/clone.S> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c new file mode 100644 index 000000000..2bb96e91a --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/createthread.c @@ -0,0 +1,24 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Value passed to 'clone' for initialization of the thread register. */ +#define TLS_VALUE (pd + 1) + + +/* Get the real implementation. */ +#include <sysdeps/pthread/createthread.c> diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c index 08a085ce4..ba5c700da 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/x86_64/pt-vfork.S +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/fork.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. +/* Copyright (C) 2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -15,18 +15,15 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <tcb-offsets.h> +#include <sched.h> +#include <signal.h> +#include <sysdep.h> +#include <tls.h> -#define SAVE_PID \ - movl %fs:PID, %esi; \ - movl %esi, %edx; \ - negl %edx; \ - movl %edx, %fs:PID -#define RESTORE_PID \ - testq %rax, %rax; \ - je 1f; \ - movl %esi, %fs:PID; \ -1: +#define ARCH_FORK() \ + INLINE_SYSCALL (clone, 5, \ + CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0, \ + NULL, NULL, &THREAD_SELF->tid) -#include <../../../../../../../libc/sysdeps/linux/x86_64/vfork.S> +#include "../fork.c" diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c new file mode 100644 index 000000000..756f39fd4 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.c @@ -0,0 +1,132 @@ +/* low level locking for pthread library. Generic futex-using version. + Copyright (C) 2003-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <sysdep.h> +#include <lowlevellock.h> +#include <sys/time.h> + +void +__lll_lock_wait_private (int *futex) +{ + do + { + int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1); + if (oldval != 0) + lll_futex_wait (futex, 2, LLL_PRIVATE); + } + while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); +} + + +/* These functions don't get included in libc.so */ +#ifdef IS_IN_libpthread +void +__lll_lock_wait (int *futex, int private) +{ + do + { + int oldval = atomic_compare_and_exchange_val_acq (futex, 2, 1); + if (oldval != 0) + lll_futex_wait (futex, 2, private); + } + while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); +} + + +int +__lll_timedlock_wait (int *futex, const struct timespec *abstime, int private) +{ + struct timespec rt; + + /* Reject invalid timeouts. */ + if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) + return EINVAL; + + /* Upgrade the lock. */ + if (atomic_exchange_acq (futex, 2) == 0) + return 0; + + do + { + struct timeval tv; + + /* Get the current time. */ + (void) __gettimeofday (&tv, NULL); + + /* Compute relative timeout. */ + rt.tv_sec = abstime->tv_sec - tv.tv_sec; + rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; + if (rt.tv_nsec < 0) + { + rt.tv_nsec += 1000000000; + --rt.tv_sec; + } + + /* Already timed out? */ + if (rt.tv_sec < 0) + return ETIMEDOUT; + + // XYZ: Lost the lock to check whether it was private. + lll_futex_timed_wait (futex, 2, &rt, private); + } + while (atomic_compare_and_exchange_bool_acq (futex, 2, 0) != 0); + + return 0; +} + + +int +__lll_timedwait_tid (int *tidp, const struct timespec *abstime) +{ + int tid; + + if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000) + return EINVAL; + + /* Repeat until thread terminated. */ + while ((tid = *tidp) != 0) + { + struct timeval tv; + struct timespec rt; + + /* Get the current time. */ + (void) __gettimeofday (&tv, NULL); + + /* Compute relative timeout. */ + rt.tv_sec = abstime->tv_sec - tv.tv_sec; + rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000; + if (rt.tv_nsec < 0) + { + rt.tv_nsec += 1000000000; + --rt.tv_sec; + } + + /* Already timed out? */ + if (rt.tv_sec < 0) + return ETIMEDOUT; + + /* Wait until thread terminates. */ + // XYZ: Lost the lock to check whether it was private. + if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT) + return ETIMEDOUT; + } + + return 0; +} +#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h new file mode 100644 index 000000000..abe6e9c37 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/lowlevellock.h @@ -0,0 +1,293 @@ +/* Copyright (C) 2005-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _LOWLEVELLOCK_H +#define _LOWLEVELLOCK_H 1 + +#include <time.h> +#include <sys/param.h> +#include <bits/pthreadtypes.h> +#include <atomic.h> +#include <sysdep.h> +#include <bits/kernel-features.h> + +#define FUTEX_WAIT 0 +#define FUTEX_WAKE 1 +#define FUTEX_REQUEUE 3 +#define FUTEX_CMP_REQUEUE 4 +#define FUTEX_WAKE_OP 5 +#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1) +#define FUTEX_LOCK_PI 6 +#define FUTEX_UNLOCK_PI 7 +#define FUTEX_TRYLOCK_PI 8 +#define FUTEX_WAIT_BITSET 9 +#define FUTEX_WAKE_BITSET 10 +#define FUTEX_PRIVATE_FLAG 128 +#define FUTEX_CLOCK_REALTIME 256 + +#define FUTEX_BITSET_MATCH_ANY 0xffffffff + +/* Values for 'private' parameter of locking macros. Yes, the + definition seems to be backwards. But it is not. The bit will be + reversed before passing to the system call. */ +#define LLL_PRIVATE 0 +#define LLL_SHARED FUTEX_PRIVATE_FLAG + + +#if !defined NOT_IN_libc || defined IS_IN_rtld +/* In libc.so or ld.so all futexes are private. */ +# ifdef __ASSUME_PRIVATE_FUTEX +# define __lll_private_flag(fl, private) \ + ((fl) | FUTEX_PRIVATE_FLAG) +# else +# define __lll_private_flag(fl, private) \ + ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) +# endif +#else +# ifdef __ASSUME_PRIVATE_FUTEX +# define __lll_private_flag(fl, private) \ + (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) +# else +# define __lll_private_flag(fl, private) \ + (__builtin_constant_p (private) \ + ? ((private) == 0 \ + ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) \ + : (fl)) \ + : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG) \ + & THREAD_GETMEM (THREAD_SELF, header.private_futex)))) +# endif +#endif + + +#define lll_futex_wait(futexp, val, private) \ + lll_futex_timed_wait(futexp, val, NULL, private) + +#define lll_futex_timed_wait(futexp, val, timespec, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp), \ + __lll_private_flag (FUTEX_WAIT, private), \ + (val), (timespec)); \ + __ret; \ + }) + +#define lll_futex_timed_wait_bitset(futexp, val, timespec, clockbit, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + int __op = FUTEX_WAIT_BITSET | clockbit; \ + __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \ + __lll_private_flag (__op, private), \ + (val), (timespec), NULL /* Unused. */, \ + FUTEX_BITSET_MATCH_ANY); \ + __ret; \ + }) + +#define lll_futex_wake(futexp, nr, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 4, (futexp), \ + __lll_private_flag (FUTEX_WAKE, private), \ + (nr), 0); \ + __ret; \ + }) + +#define lll_robust_dead(futexv, private) \ + do \ + { \ + int *__futexp = &(futexv); \ + atomic_or (__futexp, FUTEX_OWNER_DIED); \ + lll_futex_wake (__futexp, 1, private); \ + } \ + while (0) + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \ + __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ + (nr_wake), (nr_move), (mutex), (val)); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err); \ + }) + + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret; \ + __ret = INTERNAL_SYSCALL (futex, __err, 6, (futexp), \ + __lll_private_flag (FUTEX_WAKE_OP, private), \ + (nr_wake), (nr_wake2), (futexp2), \ + FUTEX_OP_CLEAR_WAKE_IF_GT_ONE); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err); \ + }) + + +#define lll_trylock(lock) \ + atomic_compare_and_exchange_val_acq(&(lock), 1, 0) + +#define lll_cond_trylock(lock) \ + atomic_compare_and_exchange_val_acq(&(lock), 2, 0) + +#define __lll_robust_trylock(futex, id) \ + (atomic_compare_and_exchange_val_acq (futex, id, 0) != 0) +#define lll_robust_trylock(lock, id) \ + __lll_robust_trylock (&(lock), id) + +extern void __lll_lock_wait_private (int *futex) attribute_hidden; +extern void __lll_lock_wait (int *futex, int private) attribute_hidden; +extern int __lll_robust_lock_wait (int *futex, int private) attribute_hidden; + +#define __lll_lock(futex, private) \ + ((void) ({ \ + int *__futex = (futex); \ + if (__builtin_expect (atomic_compare_and_exchange_val_acq (__futex, \ + 1, 0), 0)) \ + { \ + if (__builtin_constant_p (private) && (private) == LLL_PRIVATE) \ + __lll_lock_wait_private (__futex); \ + else \ + __lll_lock_wait (__futex, private); \ + } \ + })) +#define lll_lock(futex, private) __lll_lock (&(futex), private) + + +#define __lll_robust_lock(futex, id, private) \ + ({ \ + int *__futex = (futex); \ + int __val = 0; \ + \ + if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id, \ + 0), 0)) \ + __val = __lll_robust_lock_wait (__futex, private); \ + __val; \ + }) +#define lll_robust_lock(futex, id, private) \ + __lll_robust_lock (&(futex), id, private) + + +#define __lll_cond_lock(futex, private) \ + ((void) ({ \ + int *__futex = (futex); \ + if (__builtin_expect (atomic_exchange_acq (__futex, 2), 0)) \ + __lll_lock_wait (__futex, private); \ + })) +#define lll_cond_lock(futex, private) __lll_cond_lock (&(futex), private) + + +#define lll_robust_cond_lock(futex, id, private) \ + __lll_robust_lock (&(futex), (id) | FUTEX_WAITERS, private) + + +extern int __lll_timedlock_wait (int *futex, const struct timespec *, + int private) attribute_hidden; +extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *, + int private) attribute_hidden; + +#define __lll_timedlock(futex, abstime, private) \ + ({ \ + int *__futex = (futex); \ + int __val = 0; \ + \ + if (__builtin_expect (atomic_exchange_acq (__futex, 1), 0)) \ + __val = __lll_timedlock_wait (__futex, abstime, private); \ + __val; \ + }) +#define lll_timedlock(futex, abstime, private) \ + __lll_timedlock (&(futex), abstime, private) + + +#define __lll_robust_timedlock(futex, abstime, id, private) \ + ({ \ + int *__futex = (futex); \ + int __val = 0; \ + \ + if (__builtin_expect (atomic_compare_and_exchange_bool_acq (__futex, id, \ + 0), 0)) \ + __val = __lll_robust_timedlock_wait (__futex, abstime, private); \ + __val; \ + }) +#define lll_robust_timedlock(futex, abstime, id, private) \ + __lll_robust_timedlock (&(futex), abstime, id, private) + + +#define __lll_unlock(futex, private) \ + (void) \ + ({ int *__futex = (futex); \ + int __oldval = atomic_exchange_rel (__futex, 0); \ + if (__builtin_expect (__oldval > 1, 0)) \ + lll_futex_wake (__futex, 1, private); \ + }) +#define lll_unlock(futex, private) __lll_unlock(&(futex), private) + + +#define __lll_robust_unlock(futex, private) \ + (void) \ + ({ int *__futex = (futex); \ + int __oldval = atomic_exchange_rel (__futex, 0); \ + if (__builtin_expect (__oldval & FUTEX_WAITERS, 0)) \ + lll_futex_wake (__futex, 1, private); \ + }) +#define lll_robust_unlock(futex, private) \ + __lll_robust_unlock(&(futex), private) + + +#define lll_islocked(futex) \ + (futex != 0) + + +/* Our internal lock implementation is identical to the binary-compatible + mutex implementation. */ + +/* Initializers for lock. */ +#define LLL_LOCK_INITIALIZER (0) +#define LLL_LOCK_INITIALIZER_LOCKED (1) + +/* The states of a lock are: + 0 - untaken + 1 - taken by one user + >1 - taken by more users */ + +/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex + wakeup when the clone terminates. The memory location contains the + thread ID while the clone is running and is reset to zero + afterwards. */ +#define lll_wait_tid(tid) \ + do { \ + __typeof (tid) __tid; \ + while ((__tid = (tid)) != 0) \ + lll_futex_wait (&(tid), __tid, LLL_SHARED);\ + } while (0) + +extern int __lll_timedwait_tid (int *, const struct timespec *) + attribute_hidden; + +#define lll_timedwait_tid(tid, abstime) \ + ({ \ + int __res = 0; \ + if ((tid) != 0) \ + __res = __lll_timedwait_tid (&(tid), (abstime)); \ + __res; \ + }) + +#endif /* lowlevellock.h */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c new file mode 100644 index 000000000..4e6d26e81 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pt-initfini.c @@ -0,0 +1,134 @@ +/* Special .init and .fini section support. Linuxthread version. + Copyright (C) 1995,1996,1997,2000,2001,2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it + and/or modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Library General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + The GNU C Library is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + see <http://www.gnu.org/licenses/>. */ + +/* This file is compiled into assembly code which is then munged by a sed + script into two files: crti.s and crtn.s. + + * crti.s puts a function prologue at the beginning of the + .init and .fini sections and defines global symbols for + those addresses, so they can be called as functions. + + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ + +#include <stdlib.h> + +/* We use embedded asm for .section unconditionally, as this makes it + easier to insert the necessary directives into crtn.S. */ +#define SECTION(x) __asm__ (".section " x ) + +/* Embed an #include to pull in the alignment and .end directives. */ +__asm__ ("\n#include \"defs.h\""); +__asm__ ("\n#if defined __i686 && defined __ASSEMBLER__"); +__asm__ ("\n#undef __i686"); +__asm__ ("\n#define __i686 __i686"); +__asm__ ("\n#endif"); + +/* The initial common code ends here. */ +__asm__ ("\n/*@HEADER_ENDS*/"); + +/* To determine whether we need .end and .align: */ +__asm__ ("\n/*@TESTS_BEGIN*/"); +extern void dummy (void (*foo) (void)); +void +dummy (void (*foo) (void)) +{ + if (foo) + (*foo) (); +} +__asm__ ("\n/*@TESTS_END*/"); + +/* The beginning of _init: */ +__asm__ ("\n/*@_init_PROLOG_BEGINS*/"); + +static void +call_initialize_minimal (void) +{ + extern void __pthread_initialize_minimal_internal (void) + __attribute ((visibility ("hidden"))); + + __pthread_initialize_minimal_internal (); +} + +SECTION (".init"); +extern void __attribute__ ((section (".init"))) _init (void); +void +_init (void) +{ + /* The very first thing we must do is to set up the registers. */ + call_initialize_minimal (); + + __asm__ ("ALIGN"); + __asm__("END_INIT"); + /* Now the epilog. */ + __asm__ ("\n/*@_init_PROLOG_ENDS*/"); + __asm__ ("\n/*@_init_EPILOG_BEGINS*/"); + SECTION(".init"); +} +__asm__ ("END_INIT"); + +/* End of the _init epilog, beginning of the _fini prolog. */ +__asm__ ("\n/*@_init_EPILOG_ENDS*/"); +__asm__ ("\n/*@_fini_PROLOG_BEGINS*/"); + +SECTION (".fini"); +extern void __attribute__ ((section (".fini"))) _fini (void); +void +_fini (void) +{ + + /* End of the _fini prolog. */ + __asm__ ("ALIGN"); + __asm__ ("END_FINI"); + __asm__ ("\n/*@_fini_PROLOG_ENDS*/"); + + /* Xtensa: It doesn't really matter whether GCC thinks this is a leaf + function or not, and the scripts that are supposed to remove the + call don't catch the literal, resulting in an undefined symbol + reference. */ +#if 0 + { + /* Let GCC know that _fini is not a leaf function by having a dummy + function call here. We arrange for this call to be omitted from + either crt file. */ + extern void i_am_not_a_leaf (void); + i_am_not_a_leaf (); + } +#endif + + /* Beginning of the _fini epilog. */ + __asm__ ("\n/*@_fini_EPILOG_BEGINS*/"); + SECTION (".fini"); +} +__asm__ ("END_FINI"); + +/* End of the _fini epilog. Any further generated assembly (e.g. .ident) + is shared between both crt files. */ +__asm__ ("\n/*@_fini_EPILOG_ENDS*/"); +__asm__ ("\n/*@TRAILER_BEGINS*/"); + +/* End of file. */ diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c new file mode 100644 index 000000000..46085d3b5 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/pthread_once.c @@ -0,0 +1,89 @@ +/* Copyright (C) 2004-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "pthreadP.h" +#include <lowlevellock.h> + +unsigned long int __fork_generation attribute_hidden; + +static void +clear_once_control (void *arg) +{ + pthread_once_t *once_control = (pthread_once_t *) arg; + + *once_control = 0; + lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); +} + +int +__pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) +{ + for (;;) + { + int oldval; + int newval; + + /* Pseudo code: + newval = __fork_generation | 1; + oldval = *once_control; + if ((oldval & 2) == 0) + *once_control = newval; + Do this atomically. + */ + do + { + newval = __fork_generation | 1; + oldval = *once_control; + if (oldval & 2) + break; + } while (atomic_compare_and_exchange_val_acq (once_control, newval, oldval) != oldval); + + /* Check if the initializer has already been done. */ + if ((oldval & 2) != 0) + return 0; + + /* Check if another thread already runs the initializer. */ + if ((oldval & 1) == 0) + break; + + /* Check whether the initializer execution was interrupted by a fork. */ + if (oldval != newval) + break; + + /* Same generation, some other thread was faster. Wait. */ + lll_futex_wait (once_control, oldval, LLL_PRIVATE); + } + + /* This thread is the first here. Do the initialization. + Register a cleanup handler so that in case the thread gets + interrupted the initialization can be restarted. */ + pthread_cleanup_push (clear_once_control, once_control); + + init_routine (); + + pthread_cleanup_pop (0); + + /* Say that the initialisation is done. */ + *once_control = __fork_generation | 2; + + /* Wake up all other threads. */ + lll_futex_wake (once_control, INT_MAX, LLL_PRIVATE); + + return 0; +} +weak_alias (__pthread_once, pthread_once) +strong_alias (__pthread_once, __pthread_once_internal) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h new file mode 100644 index 000000000..6bb2aeb56 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/sysdep-cancel.h @@ -0,0 +1,108 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <tls.h> +/* #include <pt-machine.h> */ +#ifndef __ASSEMBLER__ +# include <pthreadP.h> +#endif + +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt +// FIXME: ENTRY includes an entry instruction, here we'd want entry sp, 48! +# undef PSEUDO +# define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + SINGLE_THREAD_P(a15); \ + bnez a15, .Lpseudo_cancel; \ + DO_CALL (syscall_name, args); \ + bgez a2, .Lpseudo_done; \ + movi a4, -4095; \ + blt a2, a4, .Lpseudo_done; \ + j SYSCALL_ERROR_LABEL; \ + .Lpseudo_done: \ + retw; \ + .Lpseudo_cancel: \ + /* The syscall args are in a2...a7; no need to save */ \ + CENABLE; \ + /* The return value is in a10 and preserved across the syscall */ \ + DO_CALL (syscall_name, args); \ + CDISABLE; \ + bgez a2, .Lpseudo_end; \ + movi a4, -4095; \ + blt a2, a4, .Lpseudo_end; \ + j SYSCALL_ERROR_LABEL; \ + .Lpseudo_end: + + +# ifdef IS_IN_libpthread +# define CENABLE_FUNC __pthread_enable_asynccancel +# define CDISABLE_FUNC __pthread_disable_asynccancel +# define __local_multiple_threads __pthread_multiple_threads +# elif !defined NOT_IN_libc +# define CENABLE_FUNC __libc_enable_asynccancel +# define CDISABLE_FUNC __libc_disable_asynccancel +# define __local_multiple_threads __libc_multiple_threads +# elif defined IS_IN_librt +# define CENABLE_FUNC __librt_enable_asynccancel +# define CDISABLE_FUNC __librt_disable_asynccancel +# else +# error Unsupported library +# endif + +# define CENABLE movi a8, CENABLE_FUNC; \ + callx8 a8 +# define CDISABLE movi a8, CDISABLE_FUNC; \ + callx8 a8 + +# if defined IS_IN_libpthread || !defined NOT_IN_libc +# ifndef __ASSEMBLER__ +extern int __local_multiple_threads attribute_hidden; +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +# else +# define SINGLE_THREAD_P(reg) movi reg, __local_multiple_threads; \ + l32i reg, reg, 0; +# endif + +# else +# ifndef __ASSEMBLER__ +# define SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0, 1) +# else +# define SINGLE_THREAD_P(reg) \ + rur reg, threadptr; \ + l32i reg, reg, MULTIPLE_THREADS_OFFSET; +# endif +# endif + +#else + +/* This code should never be used but we define it anyhow. */ +# define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 + +#endif + + +#ifndef __ASSEMBLER__ +# define RTLD_SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + header.multiple_threads) == 0, 1) +#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S new file mode 100644 index 000000000..46eb76dd6 --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/xtensa/vfork.S @@ -0,0 +1,59 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <tls.h> + +/* + Save the PID value, save 0x80000000 if PID was 0. + Registers a2 and a3 are available; ar should return the PID and as threadptr + */ + +#define SAVE_PID(pid,tp,ar,as) \ + rur tp, threadptr; \ + movi ar, TLS_PRE_TCB_SIZE; \ + sub tp, tp, ar; \ + l32i pid, tp, PID; \ + neg ar, pid; \ + movi as, 0x80000000; \ + moveqz ar, as, ar; \ + s32i ar, tp, PID; \ + +/* + Restore the PID value, restore to 0 if saved value was 0x80000000 + Return value from the syscall is in a2. + */ +#define RESTORE_PID(pid,tp,res) \ + beqz res, 1f; \ + s32i pid, tp, PID; \ +1: + +/* + Special version for call12, where we don't have enough registers + available to preserve the original PID. + */ +#define RESTORE_PID12(ar, as, at) \ + rur as, threadptr; \ + movi ar, TLS_PRE_TCB_SIZE; \ + sub as, as, ar; \ + l32i ar, as, PID; \ + movi at, 0x80000000; \ + sub at, at, ar; \ + neg ar, ar; \ + moveqz ar, at, at; \ + s32i ar, as, PID; + +#include <libc/sysdeps/linux/xtensa/vfork.S> diff --git a/libpthread/nptl/sysdeps/xtensa/Makefile.arch b/libpthread/nptl/sysdeps/xtensa/Makefile.arch new file mode 100644 index 000000000..5bbd409c6 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/Makefile.arch @@ -0,0 +1,40 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. +# This file is part of the GNU C Library. +# +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, write to the Free +# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA. + +CFLAGS-pt-raise.c = -DNOT_IN_libc -DIS_IN_libpthread + +ASFLAGS-dl-tlsdesc.S = -DNOT_IN_libc=1 +ASFLAGS-pthread_spin_lock.S = -DNOT_IN_libc -DIS_IN_libpthread +ASFLAGS-pthread_spin_trylock.S = -DNOT_IN_libc -DIS_IN_libpthread +ASFLAGS-nptl-sysdep.S = -DNOT_IN_libc -DIS_IN_libpthread \ + -D_LIBC_REENTRANT \ + -I$(top_srcdir)libc/sysdeps/linux/xtensa + +libc_arch_a_CSRC = libc-tls.c +librt_arch_a_SSRC = dl-tlsdesc.S + +CFLAGS-gen_tlsdesc.c = -S +$(libpthread_arch_OUT)/gen_tlsdesc.c: $(libpthread_arch_DIR)/tlsdesc.sym | $(libpthread_arch_OUT) + $(do_awk) $(top_srcdir)extra/scripts/gen-as-const.awk $< > $@ +$(libpthread_arch_OUT)/gen_tlsdesc.s: $(libpthread_arch_OUT)/gen_tlsdesc.c | headers + $(compile.c) +libpthread-generated-y += $(libpthread_arch_OUT)/gen_tlsdesc.s +$(libpthread_arch_OUT)/tlsdesc.h: $(libpthread_arch_OUT)/gen_tlsdesc.s + $(do_sed) $(PTHREAD_GENERATE_MANGLE) $< > $@ + @if test ! -s $@ ; then rm -f $@ ; false ; fi +pregen-headers-$(UCLIBC_HAS_THREADS_NATIVE) += $(libpthread_arch_OUT)/tlsdesc.h diff --git a/libpthread/nptl/sysdeps/xtensa/dl-tls.h b/libpthread/nptl/sysdeps/xtensa/dl-tls.h new file mode 100644 index 000000000..29008dbb9 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/dl-tls.h @@ -0,0 +1,58 @@ +/* Thread-local storage handling in the ELF dynamic linker. Xtensa version. + Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _XTENSA_DL_TLS_H +#define _XTENSA_DL_TLS_H 1 + +/* Type used for the representation of TLS information in the GOT. */ +typedef struct +{ + unsigned long int ti_module; + unsigned long int ti_offset; +} tls_index; + +extern void *__tls_get_addr (tls_index *ti); + +/* Type used to represent a TLS descriptor. */ +struct tlsdesc +{ + union + { + void *pointer; + long value; + } argument; + ptrdiff_t (*entry)(struct tlsdesc *); +}; + +/* Type used as the argument in a TLS descriptor for a symbol that + needs dynamic TLS offsets. */ +struct tlsdesc_dynamic_arg +{ + tls_index tlsinfo; + size_t gen_count; +}; + +extern ptrdiff_t attribute_hidden + _dl_tlsdesc_return(struct tlsdesc_dynamic_arg *); + +extern void *_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset); +extern ptrdiff_t attribute_hidden + _dl_tlsdesc_dynamic(struct tlsdesc_dynamic_arg *); + +#endif diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/alpha/pt-vfork.S b/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h index a6005c1ab..bda498b8a 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/alpha/pt-vfork.S +++ b/libpthread/nptl/sysdeps/xtensa/jmpbuf-unwind.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -15,28 +15,18 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <sysdep.h> -#include <tcb-offsets.h> +#include <setjmp.h> +#include <stdint.h> +#include <unwind.h> -#undef PSEUDO_PREPARE_ARGS -#define PSEUDO_PREPARE_ARGS \ - /* Load the current cached pid value across the vfork. */ \ - rduniq; \ - ldl a2, PID_OFFSET(v0); \ - mov v0, a1; \ - /* Write back its negation, to indicate that the pid value is \ - uninitialized in the the child, and in the window between \ - here and the point at which we restore the value. */ \ - negl a2, t0; \ - stl t0, PID_OFFSET(v0); +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#undef _JMPBUF_UNWINDS +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ + ((void *) (address) < (void *) demangle (jmpbuf[JB_SP])) -PSEUDO (__vfork, vfork, 0) +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ + _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) - /* If we're back in the parent, restore the saved pid. */ - beq v0, 1f - stl a2, PID_OFFSET(a1) -1: ret - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ + ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj)) diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S b/libpthread/nptl/sysdeps/xtensa/libc-tls.c index 37231a8c3..80494c56f 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S +++ b/libpthread/nptl/sysdeps/xtensa/libc-tls.c @@ -1,6 +1,6 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. +/* Thread-local storage handling in the ELF dynamic linker. Xtensa version. + Copyright (C) 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -16,29 +16,21 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <sysdep.h> -#include <tcb-offsets.h> - - .text - .globl __syscall_error -ENTRY(__vfork) - ld [%g7 + PID], %o5 - sub %g0, %o5, %o4 - st %o4, [%g7 + PID] - - LOADSYSCALL(vfork) - ta 0x10 - bcc 2f - mov %o7, %g1 - st %o5, [%g7 + PID] - call __syscall_error - mov %g1, %o7 -2: sub %o1, 1, %o1 - andcc %o0, %o1, %o0 - bne,a 1f - st %o5, [%g7 + PID] -1: retl - nop -END(__vfork) - -weak_alias (__vfork, vfork) +#include <sysdeps/generic/libc-tls.c> +#include <dl-tls.h> + +#if defined(USE_TLS) && USE_TLS + +/* On Xtensa, linker optimizations are not required, so __tls_get_addr + can be called even in statically linked binaries. In this case module + must be always 1 and PT_TLS segment exist in the binary, otherwise it + would not link. */ + +void * +__tls_get_addr (tls_index *ti) +{ + dtv_t *dtv = THREAD_DTV (); + return (char *) dtv[1].pointer.val + ti->ti_offset; +} + +#endif diff --git a/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S b/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S new file mode 100644 index 000000000..1e220a863 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/pthread_spin_lock.S @@ -0,0 +1,37 @@ +/* Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + .text + .align 4 + + .globl pthread_spin_lock +pthread_spin_lock: + + entry a1, 16 + + movi a3, 0 + wsr a3, scompare1 + movi a3, 1 +1: s32c1i a3, a2, 0 + bnez a3, 1b + movi a2, 0 + + retw + + .type pthread_spin_lock, @function + .size pthread_spin_lock, .-pthread_spin_lock diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/pt-vfork.S b/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S index 489c74936..a736b010f 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/metag/pt-vfork.S +++ b/libpthread/nptl/sysdeps/xtensa/pthread_spin_trylock.S @@ -16,36 +16,25 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include <tcb-offsets.h> -#include <asm/unistd.h> - -#ifdef __PIC__ -#define __VFORK_METAG_LOAD_TP ___metag_load_tp@PLT -#else -#define __VFORK_METAG_LOAD_TP ___metag_load_tp -#endif - -/* Save the PID value. */ -#define SAVE_PID \ - SETL [A0StP++], D0FrT, D1RtP; \ - CALLR D1RtP, __VFORK_METAG_LOAD_TP; \ - SUB D0Re0, D0Re0, #TLS_PRE_TCB_SIZE; \ - GETD D0FrT, [D0Re0 + #PID]; \ - NEG D0FrT, D0FrT; \ - SETD [D0Re0 + #PID], D0FrT; \ - GETL D0FrT, D1RtP, [--A0StP]; - -#define RESTORE_PID \ - CMP D0Re0, #0; \ - BEQ 1f; \ - MSETL [A0StP++], D0Re0, D0FrT; \ - CALLR D1RtP, __VFORK_METAG_LOAD_TP; \ - SUB D0Re0, D0Re0, #TLS_PRE_TCB_SIZE; \ - GETD D0FrT, [D0Re0 + #PID]; \ - NEG D0FrT, D0FrT; \ - SETD [D0Re0 + #PID], D0FrT; \ - GETL D0FrT, D1RtP, [--A0StP]; \ - GETL D0Re0, D1Re0, [--A0StP]; \ -1: - -#include <../../../../../../../libc/sysdeps/linux/metag/vfork.S> +#define _ERRNO_H 1 +#include <bits/errno.h> + + .text + .align 4 + + .globl pthread_spin_trylock +pthread_spin_trylock: + + entry a1, 16 + + movi a3, 0 + wsr a3, scompare1 + movi a3, 1 + s32c1i a3, a2, 0 + movi a2, EBUSY + moveqz a2, a3, a3 + + retw + + .type pthread_spin_trylock, @function + .size pthread_spin_trylock, .-pthread_spin_trylock diff --git a/libpthread/nptl/sysdeps/xtensa/pthreaddef.h b/libpthread/nptl/sysdeps/xtensa/pthreaddef.h new file mode 100644 index 000000000..e72b4bc58 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/pthreaddef.h @@ -0,0 +1,39 @@ +/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Default stack size. */ +#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) + +/* Required stack pointer alignment at beginning. */ +#define STACK_ALIGN 16 + +/* Minimal stack size after allocating thread descriptor and guard size. */ +#define MINIMAL_REST_STACK 2048 + +/* Alignment requirement for TCB. */ +#define TCB_ALIGNMENT 16 + + +/* Location of current stack frame. */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) + + +/* XXX Until we have a better place keep the definitions here. */ + +#define __exit_thread_inline(val) \ + INLINE_SYSCALL (exit, 1, (val)) diff --git a/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym b/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym new file mode 100644 index 000000000..4c8687647 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/tcb-offsets.sym @@ -0,0 +1,7 @@ +#include <sysdep.h> +#include <tls.h> + +TLS_PRE_TCB_SIZE sizeof (struct pthread) +MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) +PID offsetof (struct pthread, pid) +TID offsetof (struct pthread, tid) diff --git a/libpthread/nptl/sysdeps/xtensa/tls.h b/libpthread/nptl/sysdeps/xtensa/tls.h new file mode 100644 index 000000000..f0cb27c01 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/tls.h @@ -0,0 +1,159 @@ +/* Definition for thread-local data handling. NPTL/Xtensa version. + Copyright (C) 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _TLS_H +#define _TLS_H + +#ifndef __ASSEMBLER__ + +# include <stdbool.h> +# include <stddef.h> +# include <stdint.h> + +/* Type for the dtv. */ +typedef union dtv +{ + size_t counter; + struct + { + void *val; + bool is_static; + } pointer; +} dtv_t; + + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + +/* We require TLS support in the tools. */ +#define HAVE_TLS_SUPPORT 1 +#define HAVE_TLS_MODEL_ATTRIBUTE 1 +#define HAVE___THREAD 1 + +/* Signal that TLS support is available. */ +#define USE_TLS 1 + +#ifndef __ASSEMBLER__ + +/* Get system call information. */ +# include <sysdep.h> + +/* The TLS blocks start right after the TCB. */ +# define TLS_DTV_AT_TP 1 + +/* Get the thread descriptor definition. */ +# include <../../descr.h> + +typedef struct +{ + dtv_t *dtv; + void *private; +} tcbhead_t; + +/* This is the size of the initial TCB. */ +# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) + +/* Alignment requirements for the initial TCB. */ +# define TLS_INIT_TCB_ALIGN 16 + +/* This is the size of the TCB. */ +# define TLS_TCB_SIZE sizeof (tcbhead_t) + +/* This is the size we need before TCB. */ +# define TLS_PRE_TCB_SIZE sizeof (struct pthread) + +/* Alignment requirements for the TCB. */ +# define TLS_TCB_ALIGN 16 + + +/* Install the dtv pointer. The pointer passed is to the element with + index -1 which contain the length. */ +# define INSTALL_DTV(tcbp, dtvp) \ + (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1) + +/* Install new dtv for current thread. */ +# define INSTALL_NEW_DTV(dtv) \ + ({ tcbhead_t *__tcbp; \ + __asm__ __volatile__ ("rur %0, threadptr" : "=r" (__tcbp)); \ + __tcbp->dtv = (dtv); }) \ + +/* Return dtv of given thread descriptor. */ +# define GET_DTV(tcbp) \ + (((tcbhead_t *) (tcbp))->dtv) + +/* Code to initially initialize the thread pointer. This might need + special attention since 'errno' is not yet available and if the + operation can cause a failure 'errno' must not be touched. */ +# define TLS_INIT_TP(tcbp, secondcall) \ + ({ __asm__ __volatile__ ("wur %0, threadptr" : : "r" (tcbp)); 0; }) + +/* Return the address of the dtv for the current thread. */ +# define THREAD_DTV() \ + ({ tcbhead_t *__tcbp; \ + __asm__ __volatile__ ("rur %0, threadptr" : "=r" (__tcbp)); \ + __tcbp->dtv; }) + +/* Return the thread descriptor for the current thread. */ +# define THREAD_SELF \ + ({ struct pthread *__self; \ + __asm__ ("rur %0, threadptr" : "=r" (__self)); \ + __self - 1; }) + +/* Magic for libthread_db to know how to do THREAD_SELF. */ +# define DB_THREAD_SELF \ + CONST_THREAD_AREA (32, sizeof (struct pthread)) + +/* Access to data in the thread descriptor is easy. */ +#define THREAD_GETMEM(descr, member) \ + descr->member +#define THREAD_GETMEM_NC(descr, member, idx) \ + descr->member[idx] +#define THREAD_SETMEM(descr, member, value) \ + descr->member = (value) +#define THREAD_SETMEM_NC(descr, member, idx, value) \ + descr->member[idx] = (value) + +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) + +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + +#endif /* __ASSEMBLER__ */ + +#endif /* tls.h */ diff --git a/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym b/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym new file mode 100644 index 000000000..b18bf5fb9 --- /dev/null +++ b/libpthread/nptl/sysdeps/xtensa/tlsdesc.sym @@ -0,0 +1,10 @@ +#include <stddef.h> +#include <sysdep.h> +#include <tls.h> +#include <link.h> +#include <dl-tls.h> + +TLSDESC_ARG offsetof(struct tlsdesc, argument) +TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count) +TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module) +TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset) diff --git a/test/API/Makefile b/test/API/Makefile deleted file mode 100644 index 2384e2a98..000000000 --- a/test/API/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# uClibc API tests -# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - -top_builddir=../../ -top_srcdir=../../ -include ../Rules.mak --include Makefile.in -include ../Test.mak diff --git a/test/API/Makefile.in b/test/API/Makefile.in deleted file mode 100644 index 9e7cfdf57..000000000 --- a/test/API/Makefile.in +++ /dev/null @@ -1,26 +0,0 @@ -# uClibc API tests -# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - -SHELL_TESTS := shell_tst-API -run: $(SHELL_TESTS) - -define get_codes - $(subst .,,$(sort $(suffix $(subst -,.,$(foreach x,$(1),$(if $(findstring -,$(x)),$(x),)))))) -endef -sym_files = $(patsubst %.syms,%,$(wildcard *.syms)) -stds = $(patsubst .%,%,$(sort $(suffix $(sym_files)))) -tests=$(foreach s,$(stds),$(patsubst %.$(s),%,$(sym_files))) -codes=$(call get_codes,$(tests)) - -shell_tst-API: uclibc_out=$(patsubst shell_%,%,$@).out -shell_tst-API: glibc_out=$(patsubst shell_%,%_glibc,$@).out -shell_tst-API: - @exec echo "DISABLED for now, needs improvement" -shell_tst-API_DISABLED: - $(showtest) - $(Q)top_builddir=$(top_builddir) AWK=$(AWK) \ - uclibc_out=$(uclibc_out) glibc_out=$(glibc_out) \ - $(SHELL) \ - $(patsubst shell_%,%.sh,$@) $(stds) "$(tests)" - $(do_showdiff) $(glibc_out) $(uclibc_out) ; \ - exec diff -u "$(glibc_out)" "$(uclibc_out)" diff --git a/test/API/aio.SUSv4.syms b/test/API/aio.SUSv4.syms deleted file mode 100644 index c7d13e09c..000000000 --- a/test/API/aio.SUSv4.syms +++ /dev/null @@ -1,8 +0,0 @@ -aio_cancel -aio_error -aio_fsync -aio_read -aio_return -aio_suspend -aio_write -lio_listio diff --git a/test/API/arpa_inet.SUSv4.syms b/test/API/arpa_inet.SUSv4.syms deleted file mode 100644 index e61cc9f76..000000000 --- a/test/API/arpa_inet.SUSv4.syms +++ /dev/null @@ -1,8 +0,0 @@ -htonl -htons -ntohl -ntohs -inet_addr -inet_ntoa -inet_ntop -inet_pton diff --git a/test/API/complex.SUSv4.syms b/test/API/complex.SUSv4.syms deleted file mode 100644 index ce7be69c8..000000000 --- a/test/API/complex.SUSv4.syms +++ /dev/null @@ -1,66 +0,0 @@ -cabs -cabsf -cabsl -cacos -cacosf -cacosh -cacoshf -cacoshl -cacosl -carg -cargf -cargl -casin -casinf -casinh -casinhf -casinhl -casinl -catan -catanf -catanh -catanhf -catanhl -catanl -ccos -ccosf -ccosh -ccoshf -ccoshl -ccosl -cexp -cexpf -cexpl -cimag -cimagf -cimagl -clog -clogf -clogl -conj -conjf -conjl -cpow -cpowf -cpowl -cproj -cprojf -cprojl -creal -crealf -creall -csin -csinf -csinh -csinhf -csinhl -csinl -csqrt -csqrtf -csqrtl -ctan -ctanf -ctanh -ctanhf -ctanhl -ctanl diff --git a/test/API/ctype-CX.SUSv4.syms b/test/API/ctype-CX.SUSv4.syms deleted file mode 100644 index 3963c49a5..000000000 --- a/test/API/ctype-CX.SUSv4.syms +++ /dev/null @@ -1,14 +0,0 @@ -isalnum_l -isalpha_l -isblank_l -iscntrl_l -isdigit_l -isgraph_l -islower_l -isprint_l -ispunct_l -isspace_l -isupper_l -isxdigit_l -tolower_l -toupper_l diff --git a/test/API/ctype-OBXSI.SUSv4.syms b/test/API/ctype-OBXSI.SUSv4.syms deleted file mode 100644 index 7a5ad9b14..000000000 --- a/test/API/ctype-OBXSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -isascii -toascii diff --git a/test/API/ctype.SUSv4.syms b/test/API/ctype.SUSv4.syms deleted file mode 100644 index fac123f32..000000000 --- a/test/API/ctype.SUSv4.syms +++ /dev/null @@ -1,14 +0,0 @@ -isalnum -isalpha -isblank -iscntrl -isdigit -isgraph -islower -isprint -ispunct -isspace -isupper -isxdigit -tolower -toupper diff --git a/test/API/dirent-XSI.SUSv4.syms b/test/API/dirent-XSI.SUSv4.syms deleted file mode 100644 index 979107095..000000000 --- a/test/API/dirent-XSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -seekdir -telldir diff --git a/test/API/dirent.SUSv4.syms b/test/API/dirent.SUSv4.syms deleted file mode 100644 index e749efb67..000000000 --- a/test/API/dirent.SUSv4.syms +++ /dev/null @@ -1,9 +0,0 @@ -alphasort -closedir -dirfd -fdopendir -opendir -readdir -readdir_r -rewinddir -scandir diff --git a/test/API/dlfcn.SUSv4.syms b/test/API/dlfcn.SUSv4.syms deleted file mode 100644 index 1e7500efc..000000000 --- a/test/API/dlfcn.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -dlclose -dlerror -dlopen -dlsym diff --git a/test/API/fcntl-ADV.SUSv4.syms b/test/API/fcntl-ADV.SUSv4.syms deleted file mode 100644 index 899236e5e..000000000 --- a/test/API/fcntl-ADV.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -posix_fadvise -posix_fallocate diff --git a/test/API/fcntl.SUSv4.syms b/test/API/fcntl.SUSv4.syms deleted file mode 100644 index 588085b1f..000000000 --- a/test/API/fcntl.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -creat -fcntl -open -openat diff --git a/test/API/fenv.SUSv4.syms b/test/API/fenv.SUSv4.syms deleted file mode 100644 index a9aebcbdd..000000000 --- a/test/API/fenv.SUSv4.syms +++ /dev/null @@ -1,11 +0,0 @@ -feclearexcept -fegetenv -fegetexceptflag -fegetround -feholdexcept -feraiseexcept -fesetenv -fesetexceptflag -fesetround -fetestexcept -feupdateenv diff --git a/test/API/ftw-OB.SUSv4.syms b/test/API/ftw-OB.SUSv4.syms deleted file mode 100644 index 87a440fc3..000000000 --- a/test/API/ftw-OB.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -ftw diff --git a/test/API/ftw.SUSv4.syms b/test/API/ftw.SUSv4.syms deleted file mode 100644 index 35000c9ce..000000000 --- a/test/API/ftw.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -nftw diff --git a/test/API/glob.SUSv4.syms b/test/API/glob.SUSv4.syms deleted file mode 100644 index c2e4234ab..000000000 --- a/test/API/glob.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -glob -globfree diff --git a/test/API/grp-XSI.SUSv4.syms b/test/API/grp-XSI.SUSv4.syms deleted file mode 100644 index e2b1c1dd2..000000000 --- a/test/API/grp-XSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -setgrent diff --git a/test/API/grp.SUSv4.syms b/test/API/grp.SUSv4.syms deleted file mode 100644 index 77a8c6ea9..000000000 --- a/test/API/grp.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -endgrent -getgrent -getgrgid -getgrgid_r -getgrnam -getgrnam_r diff --git a/test/API/html2input.sh b/test/API/html2input.sh deleted file mode 100755 index 9ea68fec1..000000000 --- a/test/API/html2input.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh -# vi: ft=awk : -# -# Script to extract functions and external variables off SUS html docs -# -# Copyright (C) 2010 Bernhard Reutner-Fischer -# Public Domain - -# Usage: -# wget http://www.opengroup.org/onlinepubs/9699919799/download/susv4.tgz -# tar xzf susv4.tgz -# SUS=susv4 html2input.sh -vFULL_DECLARATIONS=1 -# or -# SUS=susv4 html2input.sh -vFULL_DECLARATIONS=0 -vSTDNAME=SUSv4 -# -# Bug in time.h.html of SUSv4: -# It inconsistently reads "as variables" instead of "external variables" that -# is used everywhere except in time.h.html - -test "x$SUS" = "x" && SUS="susv4" -test "x$AWK" = "x" && AWK="AWK" -test "x$GREP" = "x" && GREP="GREP" -for h in \ - $($GREP -l "shall be declared as functions" $SUS/basedefs/*.h.html) \ - $($GREP -l "shall declare the following as variables" $SUS/basedefs/*.h.html) \ - $($GREP -l "shall declare the following external variables" $SUS/basedefs/*.h.html) -do -$AWK $* ' -function get_filename () { - if (NR == 1) { - x=FILENAME - sub(".*/", "", x) - split(x, f , ".") - fname=f[1] - if (STDNAME) - fname=fname "." STDNAME - fname=fname ".in" - printf "" > fname - } -} -function unhtml (l) { - sub("<tt>", "", l) - sub("</tt>", "", l) - sub("<sup>", "", l) - sub("</sup>", "", l) - sub("<a [^>]*>", "", l) - sub("</a>", "", l) - if (l ~ /<img[^>]*Option[[:space:]][[:space:]]*Start[^>]*>/) { - sub("<img[^>]*>", "[Option Start]", l) - } else if (l ~ /<img[^>]*Option[[:space:]][[:space:]]*End[^>]*>/) { - sub("<img[^>]*>", "[Option End]", l) - } - sub("<.*>", "", l) - return l -} -function get_funcname (l) { - if (FULL_DECLARATIONS) - return l - if (l !~ /;$/) - return l - cnt = split(l, foo, " ") - if (cnt >= 2 && foo[2] ~ /^\(\*/) { - cnt = split(l, foo, "(") - # good enough for signal() and sigset() - if (cnt >= 2) - l=foo[2] - } else { - sub("\\(.*", "", l) - } - gsub("[[\\]\\*]", "", l) - i = split(l, a, " ") - if (i) - l = a[i] - return l -} -function get_varname (l) { - if (FULL_DECLARATIONS) - return l - if (l !~ /;$/) - return l - gsub(",[[:space:]][[:space:]]*", ",", l) - sub(";$", "", l) - i = split(l, a, " ") - if (i) - l = a[i] - gsub("[[\\]\\*]", "", l) - gsub(",", "\n", l) - return l -} -BEGIN{data=0;l=""} -get_filename() -/shall be declared as functions/{data=1;isvar=0;next;} -/shall declare the following as variables/{data=1;isvar=1;next;} -/shall declare the following external variables/{data=1;isvar=1;next;} -/<pre>/{data++;next;} -/<\/pre>/{data=0;next;} -/.*/{ - if (data == 2 && fname) { - tmp = $0 - sub("^[[:space:]][[:space:]]*", " ", tmp) - l = l tmp - tmp = unhtml(l) - if (!tmp) - next - l = tmp - if (tmp !~ /;$/ && tmp !~ />$/ && - tmp !~ /Option Start\]$/ && tmp !~ /Option End\]$/) - next - if (!isvar) - l = get_funcname(l) - else - l = get_varname(l) - if (l) - print l >> fname - l="" - } -} -' $h -done diff --git a/test/API/iconv.SUSv4.syms b/test/API/iconv.SUSv4.syms deleted file mode 100644 index 059952064..000000000 --- a/test/API/iconv.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -iconv -iconv_close -iconv_open diff --git a/test/API/inttypes.SUSv4.syms b/test/API/inttypes.SUSv4.syms deleted file mode 100644 index 6cbc3a259..000000000 --- a/test/API/inttypes.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -imaxabs -imaxdiv -strtoimax -strtoumax -wcstoimax -wcstoumax diff --git a/test/API/libgen.SUSv4.syms b/test/API/libgen.SUSv4.syms deleted file mode 100644 index 3d4945afe..000000000 --- a/test/API/libgen.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -basename -dirname diff --git a/test/API/locale-CX.SUSv4.syms b/test/API/locale-CX.SUSv4.syms deleted file mode 100644 index 22ffcfc2a..000000000 --- a/test/API/locale-CX.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -duplocale -freelocale -newlocale -uselocale diff --git a/test/API/locale.SUSv4.syms b/test/API/locale.SUSv4.syms deleted file mode 100644 index 33f8cad06..000000000 --- a/test/API/locale.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -localeconv -setlocale diff --git a/test/API/math-XSI.SUSv4.syms b/test/API/math-XSI.SUSv4.syms deleted file mode 100644 index 4ce15d8f0..000000000 --- a/test/API/math-XSI.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -j0 -j1 -jn -y0 -y1 -yn diff --git a/test/API/math.SUSv4.syms b/test/API/math.SUSv4.syms deleted file mode 100644 index 5343ac068..000000000 --- a/test/API/math.SUSv4.syms +++ /dev/null @@ -1,171 +0,0 @@ -acos -acosf -acosh -acoshf -acoshl -acosl -asin -asinf -asinh -asinhf -asinhl -asinl -atan -atan2 -atan2f -atan2l -atanf -atanh -atanhf -atanhl -atanl -cbrt -cbrtf -cbrtl -ceil -ceilf -ceill -copysign -copysignf -copysignl -cos -cosf -cosh -coshf -coshl -cosl -erf -erfc -erfcf -erfcl -erff -erfl -exp -exp2 -exp2f -exp2l -expf -expl -expm1 -expm1f -expm1l -fabs -fabsf -fabsl -fdim -fdimf -fdiml -floor -floorf -floorl -fma -fmaf -fmal -fmax -fmaxf -fmaxl -fmin -fminf -fminl -fmod -fmodf -fmodl -frexp -frexpf -frexpl -hypot -hypotf -hypotl -ilogb -ilogbf -ilogbl -ldexp -ldexpf -ldexpl -lgamma -lgammaf -lgammal -llrint -llrintf -llrintl -llround -llroundf -llroundl -log -log10 -log10f -log10l -log1p -log1pf -log1pl -log2 -log2f -log2l -logb -logbf -logbl -logf -logl -lrint -lrintf -lrintl -lround -lroundf -lroundl -modf -modff -modfl -nan -nanf -nanl -nearbyint -nearbyintf -nearbyintl -nextafter -nextafterf -nextafterl -nexttoward -nexttowardf -nexttowardl -pow -powf -powl -remainder -remainderf -remainderl -remquo -remquof -remquol -rint -rintf -rintl -round -roundf -roundl -scalbln -scalblnf -scalblnl -scalbn -scalbnf -scalbnl -sin -sinf -sinh -sinhf -sinhl -sinl -sqrt -sqrtf -sqrtl -tan -tanf -tanh -tanhf -tanhl -tanl -tgamma -tgammaf -tgammal -trunc -truncf -truncl diff --git a/test/API/monetary.SUSv4.syms b/test/API/monetary.SUSv4.syms deleted file mode 100644 index 256b53a78..000000000 --- a/test/API/monetary.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -strfmon -strfmon_l diff --git a/test/API/mqueue.SUSv4.syms b/test/API/mqueue.SUSv4.syms deleted file mode 100644 index 54c80a08d..000000000 --- a/test/API/mqueue.SUSv4.syms +++ /dev/null @@ -1,10 +0,0 @@ -mq_close -mq_getattr -mq_notify -mq_open -mq_receive -mq_send -mq_setattr -mq_timedreceive -mq_timedsend -mq_unlink diff --git a/test/API/ndbm.SUSv4.syms b/test/API/ndbm.SUSv4.syms deleted file mode 100644 index 70116bf49..000000000 --- a/test/API/ndbm.SUSv4.syms +++ /dev/null @@ -1,9 +0,0 @@ -dbm_clearerr -dbm_close -dbm_delete -dbm_error -dbm_fetch -dbm_firstkey -dbm_nextkey -dbm_open -dbm_store diff --git a/test/API/net_if.SUSv4.syms b/test/API/net_if.SUSv4.syms deleted file mode 100644 index 828a0cdb8..000000000 --- a/test/API/net_if.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -if_freenameindex -if_indextoname -if_nameindex -if_nametoindex diff --git a/test/API/netdb.SUSv4.syms b/test/API/netdb.SUSv4.syms deleted file mode 100644 index daf932b05..000000000 --- a/test/API/netdb.SUSv4.syms +++ /dev/null @@ -1,22 +0,0 @@ -endhostent -endnetent -endprotoent -endservent -freeaddrinfo -gai_strerror -getaddrinfo -gethostent -getnameinfo -getnetbyaddr -getnetbyname -getnetent -getprotobyname -getprotobynumber -getprotoent -getservbyname -getservbyport -getservent -sethostent -setnetent -setprotoent -setservent diff --git a/test/API/nl_types.SUSv4.syms b/test/API/nl_types.SUSv4.syms deleted file mode 100644 index ea0059931..000000000 --- a/test/API/nl_types.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -catclose -catgets -catopen diff --git a/test/API/pthread-MC1.SUSv4.syms b/test/API/pthread-MC1.SUSv4.syms deleted file mode 100644 index 8a47a3910..000000000 --- a/test/API/pthread-MC1.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -pthread_mutexattr_getprotocol -pthread_mutexattr_setprotocol diff --git a/test/API/pthread-OBXSI.SUSv4.syms b/test/API/pthread-OBXSI.SUSv4.syms deleted file mode 100644 index 140b53d06..000000000 --- a/test/API/pthread-OBXSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -pthread_getconcurrency -pthread_setconcurrency diff --git a/test/API/pthread-RPP|TPP.SUSv4.syms b/test/API/pthread-RPP|TPP.SUSv4.syms deleted file mode 100644 index b116695f2..000000000 --- a/test/API/pthread-RPP|TPP.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -pthread_mutex_getprioceiling -pthread_mutex_setprioceiling -pthread_mutexattr_getprioceiling -pthread_mutexattr_setprioceiling diff --git a/test/API/pthread-TCT.SUSv4.syms b/test/API/pthread-TCT.SUSv4.syms deleted file mode 100644 index 7153787e2..000000000 --- a/test/API/pthread-TCT.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -pthread_getcpuclockid diff --git a/test/API/pthread-TPS.SUSv4.syms b/test/API/pthread-TPS.SUSv4.syms deleted file mode 100644 index 76fcd9560..000000000 --- a/test/API/pthread-TPS.SUSv4.syms +++ /dev/null @@ -1,9 +0,0 @@ -pthread_attr_getinheritsched -pthread_attr_getschedpolicy -pthread_attr_getscope -pthread_attr_setinheritsched -pthread_attr_setschedpolicy -pthread_attr_setscope -pthread_getschedparam -pthread_setschedparam -pthread_setschedprio diff --git a/test/API/pthread-TSATSS.SUSv4.syms b/test/API/pthread-TSATSS.SUSv4.syms deleted file mode 100644 index 5e03091cb..000000000 --- a/test/API/pthread-TSATSS.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -pthread_attr_getstack -pthread_attr_setstack diff --git a/test/API/pthread-TSH.SUSv4.syms b/test/API/pthread-TSH.SUSv4.syms deleted file mode 100644 index 717b232ac..000000000 --- a/test/API/pthread-TSH.SUSv4.syms +++ /dev/null @@ -1,8 +0,0 @@ -pthread_barrierattr_getpshared -pthread_barrierattr_setpshared -pthread_condattr_getpshared -pthread_condattr_setpshared -pthread_mutexattr_getpshared -pthread_mutexattr_setpshared -pthread_rwlockattr_getpshared -pthread_rwlockattr_setpshared diff --git a/test/API/pthread-TSS.SUSv4.syms b/test/API/pthread-TSS.SUSv4.syms deleted file mode 100644 index 1092f88d3..000000000 --- a/test/API/pthread-TSS.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -pthread_attr_getstacksize -pthread_attr_setstacksize diff --git a/test/API/pthread.SUSv4.syms b/test/API/pthread.SUSv4.syms deleted file mode 100644 index 524a6fec7..000000000 --- a/test/API/pthread.SUSv4.syms +++ /dev/null @@ -1,70 +0,0 @@ -pthread_atfork -pthread_attr_destroy -pthread_attr_getdetachstate -pthread_attr_getguardsize -pthread_attr_getschedparam -pthread_attr_init -pthread_attr_setdetachstate -pthread_attr_setguardsize -pthread_attr_setschedparam -pthread_barrier_destroy -pthread_barrier_init -pthread_barrier_wait -pthread_barrierattr_destroy -pthread_barrierattr_init -pthread_cancel -pthread_cleanup_pop -pthread_cleanup_push -pthread_cond_broadcast -pthread_cond_destroy -pthread_cond_init -pthread_cond_signal -pthread_cond_timedwait -pthread_cond_wait -pthread_condattr_destroy -pthread_condattr_getclock -pthread_condattr_init -pthread_condattr_setclock -pthread_create -pthread_detach -pthread_equal -pthread_exit -pthread_getspecific -pthread_join -pthread_key_create -pthread_key_delete -pthread_mutex_consistent -pthread_mutex_destroy -pthread_mutex_init -pthread_mutex_lock -pthread_mutex_timedlock -pthread_mutex_trylock -pthread_mutex_unlock -pthread_mutexattr_destroy -pthread_mutexattr_getrobust -pthread_mutexattr_gettype -pthread_mutexattr_init -pthread_mutexattr_setrobust -pthread_mutexattr_settype -pthread_once -pthread_rwlock_destroy -pthread_rwlock_init -pthread_rwlock_rdlock -pthread_rwlock_timedrdlock -pthread_rwlock_timedwrlock -pthread_rwlock_tryrdlock -pthread_rwlock_trywrlock -pthread_rwlock_unlock -pthread_rwlock_wrlock -pthread_rwlockattr_destroy -pthread_rwlockattr_init -pthread_self -pthread_setcancelstate -pthread_setcanceltype -pthread_setspecific -pthread_spin_destroy -pthread_spin_init -pthread_spin_lock -pthread_spin_trylock -pthread_spin_unlock -pthread_testcancel diff --git a/test/API/pwd-XSI.SUSv4.syms b/test/API/pwd-XSI.SUSv4.syms deleted file mode 100644 index 8b0350aa6..000000000 --- a/test/API/pwd-XSI.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -endpwent -getpwent -setpwent diff --git a/test/API/pwd.SUSv4.syms b/test/API/pwd.SUSv4.syms deleted file mode 100644 index 45328f664..000000000 --- a/test/API/pwd.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -getpwnam -getpwnam_r -getpwuid -getpwuid_r diff --git a/test/API/regex.SUSv4.syms b/test/API/regex.SUSv4.syms deleted file mode 100644 index 94bf9fa67..000000000 --- a/test/API/regex.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -regcomp -regerror -regexec -regfree diff --git a/test/API/sched-PS.SUSv4.syms b/test/API/sched-PS.SUSv4.syms deleted file mode 100644 index 51ce62afa..000000000 --- a/test/API/sched-PS.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -sched_getparam -sched_getscheduler -sched_setparam -sched_setscheduler diff --git a/test/API/sched-PS|TPS.SUSv4.syms b/test/API/sched-PS|TPS.SUSv4.syms deleted file mode 100644 index 67fdb603b..000000000 --- a/test/API/sched-PS|TPS.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -sched_get_priority_max -sched_get_priority_min -sched_rr_get_interval diff --git a/test/API/sched.SUSv4.syms b/test/API/sched.SUSv4.syms deleted file mode 100644 index 0b6b81db0..000000000 --- a/test/API/sched.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -sched_yield diff --git a/test/API/search.SUSv4.syms b/test/API/search.SUSv4.syms deleted file mode 100644 index 5bbf8451f..000000000 --- a/test/API/search.SUSv4.syms +++ /dev/null @@ -1,11 +0,0 @@ -hcreate -hdestroy -hsearch -insque -lfind -lsearch -remque -tdelete -tfind -tsearch -twalk diff --git a/test/API/semaphore.SUSv4.syms b/test/API/semaphore.SUSv4.syms deleted file mode 100644 index 1f291c540..000000000 --- a/test/API/semaphore.SUSv4.syms +++ /dev/null @@ -1,10 +0,0 @@ -sem_close -sem_destroy -sem_getvalue -sem_init -sem_open -sem_post -sem_timedwait -sem_trywait -sem_unlink -sem_wait diff --git a/test/API/separate.awk b/test/API/separate.awk deleted file mode 100644 index f7850c4f4..000000000 --- a/test/API/separate.awk +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/awk -f -# -# Usage: awk -f separate.awk foo.SUSv4.in -# Input: http://www.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html#tag_13_77_03_06 -# Output: foo-$CODE.SUSv4.syms, foo.SUSv4.syms -# -# Copyright (C) 2010 Bernhard Reutner-Fischer -# Public domain - -function get_code(line) -{ - sub("\\]\\[.*", "", line) - sub("\\[", "", line) - sub(" ", "", line) - return line -} -BEGIN{ - code="";# feature set; XSI, OB XSI, CX, etc - -} -/\[Option Start\]/{ - code = get_code($0) - next -} -/\[Option End\]/{ code = ""; next; } -/.*/ { - if (!hdrname) { - split(FILENAME, fparts, ".") - hdrname = fparts[1] - stdname = fparts[2] - if (fparts[3] != "in") { - print "inputfilename may not be ok, exiting." - exit(1) - } - } - if (code) { - fname = hdrname "-" code "." stdname ".syms" - } else { - fname = hdrname "." stdname ".syms" - } - sub("^*", "", $0) - if (file[code]) { - print $0 >> fname - } else { - print $0 > fname - file[code] = 1 - } -} diff --git a/test/API/setjmp-CX.SUSv4.syms b/test/API/setjmp-CX.SUSv4.syms deleted file mode 100644 index fb0fbbe93..000000000 --- a/test/API/setjmp-CX.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -siglongjmp diff --git a/test/API/setjmp-OBXSI.SUSv4.syms b/test/API/setjmp-OBXSI.SUSv4.syms deleted file mode 100644 index 8f2d5b11e..000000000 --- a/test/API/setjmp-OBXSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -_longjmp diff --git a/test/API/setjmp.SUSv4.syms b/test/API/setjmp.SUSv4.syms deleted file mode 100644 index a51df77b6..000000000 --- a/test/API/setjmp.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -longjmp diff --git a/test/API/signal-CX.SUSv4.syms b/test/API/signal-CX.SUSv4.syms deleted file mode 100644 index 3d77c5acc..000000000 --- a/test/API/signal-CX.SUSv4.syms +++ /dev/null @@ -1,18 +0,0 @@ -kill -psiginfo -psignal -pthread_kill -pthread_sigmask -sigaction -sigaddset -sigdelset -sigemptyset -sigfillset -sigismember -sigpending -sigprocmask -sigqueue -sigsuspend -sigtimedwait -sigwait -sigwaitinfo diff --git a/test/API/signal-OBXSI.SUSv4.syms b/test/API/signal-OBXSI.SUSv4.syms deleted file mode 100644 index 2a6341d63..000000000 --- a/test/API/signal-OBXSI.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -sighold -sigignore -siginterrupt -sigpause -sigrelse -void diff --git a/test/API/signal-XSI.SUSv4.syms b/test/API/signal-XSI.SUSv4.syms deleted file mode 100644 index f3df0c15e..000000000 --- a/test/API/signal-XSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -killpg -sigaltstack diff --git a/test/API/signal.SUSv4.syms b/test/API/signal.SUSv4.syms deleted file mode 100644 index 2119c27d1..000000000 --- a/test/API/signal.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -raise -void diff --git a/test/API/spawn-PS.SUSv4.syms b/test/API/spawn-PS.SUSv4.syms deleted file mode 100644 index f92ebbb2e..000000000 --- a/test/API/spawn-PS.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -posix_spawnattr_getschedparam -posix_spawnattr_getschedpolicy -posix_spawnattr_setschedparam -posix_spawnattr_setschedpolicy diff --git a/test/API/spawn.SUSv4.syms b/test/API/spawn.SUSv4.syms deleted file mode 100644 index 7481640c1..000000000 --- a/test/API/spawn.SUSv4.syms +++ /dev/null @@ -1,17 +0,0 @@ -posix_spawn -posix_spawn_file_actions_addclose -posix_spawn_file_actions_adddup2 -posix_spawn_file_actions_addopen -posix_spawn_file_actions_destroy -posix_spawn_file_actions_init -posix_spawnattr_destroy -posix_spawnattr_getflags -posix_spawnattr_getpgroup -posix_spawnattr_getsigdefault -posix_spawnattr_getsigmask -posix_spawnattr_init -posix_spawnattr_setflags -posix_spawnattr_setpgroup -posix_spawnattr_setsigdefault -posix_spawnattr_setsigmask -posix_spawnp diff --git a/test/API/stdio-CX.SUSv4.syms b/test/API/stdio-CX.SUSv4.syms deleted file mode 100644 index 98742c369..000000000 --- a/test/API/stdio-CX.SUSv4.syms +++ /dev/null @@ -1,20 +0,0 @@ -ctermid -fdopen -fileno -flockfile -fmemopen -fseeko -ftello -ftrylockfile -funlockfile -getc_unlocked -getchar_unlocked -getdelim -getline -open_memstream -pclose -popen -putc_unlocked -putchar_unlocked -renameat -vdprintf diff --git a/test/API/stdio-OB.SUSv4.syms b/test/API/stdio-OB.SUSv4.syms deleted file mode 100644 index f874a6c1c..000000000 --- a/test/API/stdio-OB.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -gets -tmpnam diff --git a/test/API/stdio-OBXSI.SUSv4.syms b/test/API/stdio-OBXSI.SUSv4.syms deleted file mode 100644 index 644049efe..000000000 --- a/test/API/stdio-OBXSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -tempnam diff --git a/test/API/stdio.SUSv4.syms b/test/API/stdio.SUSv4.syms deleted file mode 100644 index 08404437e..000000000 --- a/test/API/stdio.SUSv4.syms +++ /dev/null @@ -1,44 +0,0 @@ -clearerr -fclose -feof -ferror -fflush -fgetc -fgetpos -fgets -fopen -fprintf -fputc -fputs -fread -freopen -fscanf -fseek -fsetpos -ftell -fwrite -getc -getchar -perror -printf -putc -putchar -puts -remove -rename -rewind -scanf -setbuf -setvbuf -snprintf -sprintf -sscanf -tmpfile -ungetc -vfprintf -vfscanf -vprintf -vscanf -vsnprintf -vsprintf -vsscanf diff --git a/test/API/stdlib-ADV.SUSv4.syms b/test/API/stdlib-ADV.SUSv4.syms deleted file mode 100644 index bfb66851d..000000000 --- a/test/API/stdlib-ADV.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -posix_memalign diff --git a/test/API/stdlib-CX.SUSv4.syms b/test/API/stdlib-CX.SUSv4.syms deleted file mode 100644 index 10a7b1f67..000000000 --- a/test/API/stdlib-CX.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -mkdtemp -mkstemp -setenv -unsetenv diff --git a/test/API/stdlib-OBCX.SUSv4.syms b/test/API/stdlib-OBCX.SUSv4.syms deleted file mode 100644 index 1947cc782..000000000 --- a/test/API/stdlib-OBCX.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -rand_r diff --git a/test/API/stdlib-XSI.SUSv4.syms b/test/API/stdlib-XSI.SUSv4.syms deleted file mode 100644 index 6cb0f1bb7..000000000 --- a/test/API/stdlib-XSI.SUSv4.syms +++ /dev/null @@ -1,22 +0,0 @@ -a64l -drand48 -erand48 -grantpt -initstate -jrand48 -l64a -lcong48 -lrand48 -mrand48 -nrand48 -posix_openpt -ptsname -putenv -random -realpath -seed48 -setkey -setstate -srand48 -srandom -unlockpt diff --git a/test/API/stdlib.SUSv4.syms b/test/API/stdlib.SUSv4.syms deleted file mode 100644 index aefd96939..000000000 --- a/test/API/stdlib.SUSv4.syms +++ /dev/null @@ -1,37 +0,0 @@ -_Exit -abort -abs -atexit -atof -atoi -atol -atoll -bsearch -calloc -div -exit -free -getenv -getsubopt -labs -ldiv -llabs -lldiv -malloc -mblen -mbstowcs -mbtowc -qsort -rand -realloc -srand -strtod -strtof -strtol -strtold -strtoll -strtoul -strtoull -system -wcstombs -wctomb diff --git a/test/API/string-CX.SUSv4.syms b/test/API/string-CX.SUSv4.syms deleted file mode 100644 index 4f493d4e1..000000000 --- a/test/API/string-CX.SUSv4.syms +++ /dev/null @@ -1,11 +0,0 @@ -stpcpy -stpncpy -strcoll_l -strdup -strerror_l -strerror_r -strndup -strnlen -strsignal -strtok_r -strxfrm_l diff --git a/test/API/string-XSI.SUSv4.syms b/test/API/string-XSI.SUSv4.syms deleted file mode 100644 index e0ee4e32f..000000000 --- a/test/API/string-XSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -memccpy diff --git a/test/API/string.SUSv4.syms b/test/API/string.SUSv4.syms deleted file mode 100644 index 3c5e2b877..000000000 --- a/test/API/string.SUSv4.syms +++ /dev/null @@ -1,22 +0,0 @@ -memchr -memcmp -memcpy -memmove -memset -strcat -strchr -strcmp -strcoll -strcpy -strcspn -strerror -strlen -strncat -strncmp -strncpy -strpbrk -strrchr -strspn -strstr -strtok -strxfrm diff --git a/test/API/strings-XSI.SUSv4.syms b/test/API/strings-XSI.SUSv4.syms deleted file mode 100644 index c1173c1a9..000000000 --- a/test/API/strings-XSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -ffs diff --git a/test/API/strings.SUSv4.syms b/test/API/strings.SUSv4.syms deleted file mode 100644 index b4bc23372..000000000 --- a/test/API/strings.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -strcasecmp -strcasecmp_l -strncasecmp -strncasecmp_l diff --git a/test/API/stropts.SUSv4.syms b/test/API/stropts.SUSv4.syms deleted file mode 100644 index 796d3885b..000000000 --- a/test/API/stropts.SUSv4.syms +++ /dev/null @@ -1,8 +0,0 @@ -fattach -fdetach -getmsg -getpmsg -ioctl -isastream -putmsg -putpmsg diff --git a/test/API/sys_mman-ADV.SUSv4.syms b/test/API/sys_mman-ADV.SUSv4.syms deleted file mode 100644 index 4598c3b70..000000000 --- a/test/API/sys_mman-ADV.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -posix_madvise diff --git a/test/API/sys_mman-ML.SUSv4.syms b/test/API/sys_mman-ML.SUSv4.syms deleted file mode 100644 index de0f37d48..000000000 --- a/test/API/sys_mman-ML.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -mlockall -munlockall diff --git a/test/API/sys_mman-MLR.SUSv4.syms b/test/API/sys_mman-MLR.SUSv4.syms deleted file mode 100644 index aa8ea9ca1..000000000 --- a/test/API/sys_mman-MLR.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -mlock -munlock diff --git a/test/API/sys_mman-SHM.SUSv4.syms b/test/API/sys_mman-SHM.SUSv4.syms deleted file mode 100644 index 885119a8b..000000000 --- a/test/API/sys_mman-SHM.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -shm_open -shm_unlink diff --git a/test/API/sys_mman-TYM.SUSv4.syms b/test/API/sys_mman-TYM.SUSv4.syms deleted file mode 100644 index 68bc50e37..000000000 --- a/test/API/sys_mman-TYM.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -posix_mem_offset -posix_typed_mem_get_info -posix_typed_mem_open diff --git a/test/API/sys_mman-XSI|SIO.SUSv4.syms b/test/API/sys_mman-XSI|SIO.SUSv4.syms deleted file mode 100644 index 3a2f8c300..000000000 --- a/test/API/sys_mman-XSI|SIO.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -msync diff --git a/test/API/sys_mman.SUSv4.syms b/test/API/sys_mman.SUSv4.syms deleted file mode 100644 index 46a46e7d7..000000000 --- a/test/API/sys_mman.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -mmap -mprotect -munmap diff --git a/test/API/sys_msg.SUSv4.syms b/test/API/sys_msg.SUSv4.syms deleted file mode 100644 index 95c2ec18c..000000000 --- a/test/API/sys_msg.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -msgctl -msgget -msgrcv -msgsnd diff --git a/test/API/sys_resource.SUSv4.syms b/test/API/sys_resource.SUSv4.syms deleted file mode 100644 index 72d3e1e24..000000000 --- a/test/API/sys_resource.SUSv4.syms +++ /dev/null @@ -1,5 +0,0 @@ -getpriority -getrlimit -getrusage -setpriority -setrlimit diff --git a/test/API/sys_select.SUSv4.syms b/test/API/sys_select.SUSv4.syms deleted file mode 100644 index 40cf6d869..000000000 --- a/test/API/sys_select.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -FD_CLR -FD_ISSET -FD_SET -FD_ZERO -pselect -select diff --git a/test/API/sys_sem.SUSv4.syms b/test/API/sys_sem.SUSv4.syms deleted file mode 100644 index 173f1d99b..000000000 --- a/test/API/sys_sem.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -semctl -semget -semop diff --git a/test/API/sys_shm.SUSv4.syms b/test/API/sys_shm.SUSv4.syms deleted file mode 100644 index f284402e8..000000000 --- a/test/API/sys_shm.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -shmat -shmctl -shmdt -shmget diff --git a/test/API/sys_socket.SUSv4.syms b/test/API/sys_socket.SUSv4.syms deleted file mode 100644 index cc51c9e56..000000000 --- a/test/API/sys_socket.SUSv4.syms +++ /dev/null @@ -1,18 +0,0 @@ -accept -bind -connect -getpeername -getsockname -getsockopt -listen -recv -recvfrom -recvmsg -send -sendmsg -sendto -setsockopt -shutdown -sockatmark -socket -socketpair diff --git a/test/API/sys_stat-XSI.SUSv4.syms b/test/API/sys_stat-XSI.SUSv4.syms deleted file mode 100644 index 4800d0098..000000000 --- a/test/API/sys_stat-XSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -mknod -mknodat diff --git a/test/API/sys_stat.SUSv4.syms b/test/API/sys_stat.SUSv4.syms deleted file mode 100644 index 3fe729fc5..000000000 --- a/test/API/sys_stat.SUSv4.syms +++ /dev/null @@ -1,14 +0,0 @@ -chmod -fchmod -fchmodat -fstat -fstatat -futimens -lstat -mkdir -mkdirat -mkfifo -mkfifoat -stat -umask -utimensat diff --git a/test/API/sys_statvfs.SUSv4.syms b/test/API/sys_statvfs.SUSv4.syms deleted file mode 100644 index c3fd5f4dc..000000000 --- a/test/API/sys_statvfs.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -fstatvfs -statvfs diff --git a/test/API/sys_time-OB.SUSv4.syms b/test/API/sys_time-OB.SUSv4.syms deleted file mode 100644 index caf1f3f3d..000000000 --- a/test/API/sys_time-OB.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -getitimer -gettimeofday -setitimer diff --git a/test/API/sys_time.SUSv4.syms b/test/API/sys_time.SUSv4.syms deleted file mode 100644 index 526a4049e..000000000 --- a/test/API/sys_time.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -select -utimes diff --git a/test/API/sys_uio.SUSv4.syms b/test/API/sys_uio.SUSv4.syms deleted file mode 100644 index 31caee5c3..000000000 --- a/test/API/sys_uio.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -readv -writev diff --git a/test/API/sys_wait.SUSv4.syms b/test/API/sys_wait.SUSv4.syms deleted file mode 100644 index 753c3806d..000000000 --- a/test/API/sys_wait.SUSv4.syms +++ /dev/null @@ -1,3 +0,0 @@ -wait -waitid -waitpid diff --git a/test/API/syslog.SUSv4.syms b/test/API/syslog.SUSv4.syms deleted file mode 100644 index a44f514cf..000000000 --- a/test/API/syslog.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -closelog -openlog -setlogmask -syslog diff --git a/test/API/termios.SUSv4.syms b/test/API/termios.SUSv4.syms deleted file mode 100644 index 43ac8366d..000000000 --- a/test/API/termios.SUSv4.syms +++ /dev/null @@ -1,11 +0,0 @@ -cfgetispeed -cfgetospeed -cfsetispeed -cfsetospeed -tcdrain -tcflow -tcflush -tcgetattr -tcgetsid -tcsendbreak -tcsetattr diff --git a/test/API/time-CPT.SUSv4.syms b/test/API/time-CPT.SUSv4.syms deleted file mode 100644 index 278952e5b..000000000 --- a/test/API/time-CPT.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -clock_getcpuclockid diff --git a/test/API/time-CX.SUSv4.syms b/test/API/time-CX.SUSv4.syms deleted file mode 100644 index d2cbb7757..000000000 --- a/test/API/time-CX.SUSv4.syms +++ /dev/null @@ -1,15 +0,0 @@ -clock_getres -clock_gettime -clock_nanosleep -clock_settime -gmtime_r -localtime_r -nanosleep -strftime_l -timer_create -timer_delete -timer_getoverrun -timer_gettime -timer_settime -tzset -tzname diff --git a/test/API/time-OB.SUSv4.syms b/test/API/time-OB.SUSv4.syms deleted file mode 100644 index ce1dad050..000000000 --- a/test/API/time-OB.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -asctime -ctime diff --git a/test/API/time-OBCX.SUSv4.syms b/test/API/time-OBCX.SUSv4.syms deleted file mode 100644 index b46018c57..000000000 --- a/test/API/time-OBCX.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -asctime_r -ctime_r diff --git a/test/API/time-XSI.SUSv4.syms b/test/API/time-XSI.SUSv4.syms deleted file mode 100644 index 9bf1f6226..000000000 --- a/test/API/time-XSI.SUSv4.syms +++ /dev/null @@ -1,4 +0,0 @@ -getdate -strptime -daylight -timezone diff --git a/test/API/time.SUSv4.syms b/test/API/time.SUSv4.syms deleted file mode 100644 index 788e19eed..000000000 --- a/test/API/time.SUSv4.syms +++ /dev/null @@ -1,7 +0,0 @@ -clock -difftime -gmtime -localtime -mktime -strftime -time diff --git a/test/API/trace-TEF.SUSv4.syms b/test/API/trace-TEF.SUSv4.syms deleted file mode 100644 index bc9f47bf4..000000000 --- a/test/API/trace-TEF.SUSv4.syms +++ /dev/null @@ -1,8 +0,0 @@ -posix_trace_eventset_add -posix_trace_eventset_del -posix_trace_eventset_empty -posix_trace_eventset_fill -posix_trace_eventset_ismember -posix_trace_get_filter -posix_trace_set_filter -posix_trace_trid_eventid_open diff --git a/test/API/trace-TRI.SUSv4.syms b/test/API/trace-TRI.SUSv4.syms deleted file mode 100644 index ea5723dc5..000000000 --- a/test/API/trace-TRI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -posix_trace_attr_getinherited -posix_trace_attr_setinherited diff --git a/test/API/trace-TRL.SUSv4.syms b/test/API/trace-TRL.SUSv4.syms deleted file mode 100644 index 763c7f429..000000000 --- a/test/API/trace-TRL.SUSv4.syms +++ /dev/null @@ -1,9 +0,0 @@ -posix_trace_attr_getlogfullpolicy -posix_trace_attr_getlogsize -posix_trace_attr_setlogfullpolicy -posix_trace_attr_setlogsize -posix_trace_close -posix_trace_create_withlog -posix_trace_flush -posix_trace_open -posix_trace_rewind diff --git a/test/API/trace.SUSv4.syms b/test/API/trace.SUSv4.syms deleted file mode 100644 index c12b882e6..000000000 --- a/test/API/trace.SUSv4.syms +++ /dev/null @@ -1,31 +0,0 @@ -posix_trace_attr_destroy -posix_trace_attr_getclockres -posix_trace_attr_getcreatetime -posix_trace_attr_getgenversion -posix_trace_attr_getmaxdatasize -posix_trace_attr_getmaxsystemeventsize -posix_trace_attr_getmaxusereventsize -posix_trace_attr_getname -posix_trace_attr_getstreamfullpolicy -posix_trace_attr_getstreamsize -posix_trace_attr_init -posix_trace_attr_setmaxdatasize -posix_trace_attr_setname -posix_trace_attr_setstreamfullpolicy -posix_trace_attr_setstreamsize -posix_trace_clear -posix_trace_create -posix_trace_event -posix_trace_eventid_equal -posix_trace_eventid_get_name -posix_trace_eventid_open -posix_trace_eventtypelist_getnext_id -posix_trace_eventtypelist_rewind -posix_trace_get_attr -posix_trace_get_status -posix_trace_getnext_event -posix_trace_shutdown -posix_trace_start -posix_trace_stop -posix_trace_timedgetnext_event -posix_trace_trygetnext_event diff --git a/test/API/tst-API.sh b/test/API/tst-API.sh deleted file mode 100755 index 3d0302c8e..000000000 --- a/test/API/tst-API.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -std="$1" -shift -cod="$*" - -result=0 - -for l in $top_builddir/lib/lib*-*.so; do \ - readelf -D -W -s $l | \ - $AWK ' -/^[[:space:]]*[[:digit:]]/ { if ($8 != "UND") print $NF; } -'; \ - done | sort | uniq > $uclibc_out -for code in $cod; do cat $code.$std.syms; done | sort | uniq > $glibc_out -result=0 -exit $result diff --git a/test/API/unistd-CX.SUSv4.syms b/test/API/unistd-CX.SUSv4.syms deleted file mode 100644 index 4e183e444..000000000 --- a/test/API/unistd-CX.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -ctermid diff --git a/test/API/unistd-FSC.SUSv4.syms b/test/API/unistd-FSC.SUSv4.syms deleted file mode 100644 index e5c2ab2b2..000000000 --- a/test/API/unistd-FSC.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -fsync diff --git a/test/API/unistd-OBXSI.SUSv4.syms b/test/API/unistd-OBXSI.SUSv4.syms deleted file mode 100644 index 4e6787f6a..000000000 --- a/test/API/unistd-OBXSI.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -setpgrp diff --git a/test/API/unistd-SIO.SUSv4.syms b/test/API/unistd-SIO.SUSv4.syms deleted file mode 100644 index 2ed33b396..000000000 --- a/test/API/unistd-SIO.SUSv4.syms +++ /dev/null @@ -1 +0,0 @@ -fdatasync diff --git a/test/API/unistd-XSI.SUSv4.syms b/test/API/unistd-XSI.SUSv4.syms deleted file mode 100644 index db5417673..000000000 --- a/test/API/unistd-XSI.SUSv4.syms +++ /dev/null @@ -1,9 +0,0 @@ -crypt -encrypt -gethostid -lockf -nice -setregid -setreuid -swab -sync diff --git a/test/API/unistd.SUSv4.syms b/test/API/unistd.SUSv4.syms deleted file mode 100644 index fec630db8..000000000 --- a/test/API/unistd.SUSv4.syms +++ /dev/null @@ -1,74 +0,0 @@ -access -alarm -chdir -chown -close -confstr -dup -dup2 -_exit -execl -execle -execlp -execv -execve -execvp -faccessat -fchdir -fchown -fchownat -fexecve -fork -fpathconf -ftruncate -getcwd -getegid -geteuid -getgid -getgroups -gethostname -getlogin -getlogin_r -getopt -getpgid -getpgrp -getpid -getppid -getsid -getuid -isatty -lchown -link -linkat -lseek -pathconf -pause -pipe -pread -pwrite -read -readlink -readlinkat -rmdir -setegid -seteuid -setgid -setpgid -setsid -setuid -sleep -symlink -symlinkat -sysconf -tcgetpgrp -tcsetpgrp -truncate -ttyname -ttyname_r -unlink -unlinkat -write -optarg -opterr -optind -optopt diff --git a/test/API/utmpx.SUSv4.syms b/test/API/utmpx.SUSv4.syms deleted file mode 100644 index 1fd294aac..000000000 --- a/test/API/utmpx.SUSv4.syms +++ /dev/null @@ -1,6 +0,0 @@ -endutxent -getutxent -getutxid -getutxline -pututxline -setutxent diff --git a/test/API/wchar-CX.SUSv4.syms b/test/API/wchar-CX.SUSv4.syms deleted file mode 100644 index 080493849..000000000 --- a/test/API/wchar-CX.SUSv4.syms +++ /dev/null @@ -1,13 +0,0 @@ -mbsnrtowcs -open_wmemstream -wcpcpy -wcpncpy -wcscasecmp -wcscasecmp_l -wcscoll_l -wcsdup -wcsncasecmp -wcsncasecmp_l -wcsnlen -wcsnrtombs -wcsxfrm_l diff --git a/test/API/wchar-OBXSI.SUSv4.syms b/test/API/wchar-OBXSI.SUSv4.syms deleted file mode 100644 index bc76ee66a..000000000 --- a/test/API/wchar-OBXSI.SUSv4.syms +++ /dev/null @@ -1,15 +0,0 @@ -iswalnum -iswalpha -iswcntrl -iswctype -iswdigit -iswgraph -iswlower -iswprint -iswpunct -iswspace -iswupper -iswxdigit -towlower -towupper -wctype diff --git a/test/API/wchar-XSI.SUSv4.syms b/test/API/wchar-XSI.SUSv4.syms deleted file mode 100644 index 834731c9e..000000000 --- a/test/API/wchar-XSI.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -wcswidth -wcwidth diff --git a/test/API/wchar.SUSv4.syms b/test/API/wchar.SUSv4.syms deleted file mode 100644 index d58f600b6..000000000 --- a/test/API/wchar.SUSv4.syms +++ /dev/null @@ -1,59 +0,0 @@ -btowc -fgetwc -fgetws -fputwc -fputws -fwide -fwprintf -fwscanf -getwc -getwchar -mbrlen -mbrtowc -mbsinit -mbsrtowcs -putwc -putwchar -swprintf -swscanf -ungetwc -vfwprintf -vfwscanf -vswprintf -vswscanf -vwprintf -vwscanf -wcrtomb -wcscat -wcschr -wcscmp -wcscoll -wcscpy -wcscspn -wcsftime -wcslen -wcsncat -wcsncmp -wcsncpy -wcspbrk -wcsrchr -wcsrtombs -wcsspn -wcsstr -wcstod -wcstof -wcstok -wcstol -wcstold -wcstoll -wcstoul -wcstoull -wcsxfrm -wctob -wmemchr -wmemcmp -wmemcpy -wmemmove -wmemset -wprintf -wscanf diff --git a/test/API/wctype-CX.SUSv4.syms b/test/API/wctype-CX.SUSv4.syms deleted file mode 100644 index 81c0331b9..000000000 --- a/test/API/wctype-CX.SUSv4.syms +++ /dev/null @@ -1,18 +0,0 @@ -iswalnum_l -iswalpha_l -iswblank_l -iswcntrl_l -iswctype_l -iswdigit_l -iswgraph_l -iswlower_l -iswprint_l -iswpunct_l -iswspace_l -iswupper_l -iswxdigit_l -towctrans_l -towlower_l -towupper_l -wctrans_l -wctype_l diff --git a/test/API/wctype.SUSv4.syms b/test/API/wctype.SUSv4.syms deleted file mode 100644 index fddc3955a..000000000 --- a/test/API/wctype.SUSv4.syms +++ /dev/null @@ -1,18 +0,0 @@ -iswalnum -iswalpha -iswblank -iswcntrl -iswctype -iswdigit -iswgraph -iswlower -iswprint -iswpunct -iswspace -iswupper -iswxdigit -towctrans -towlower -towupper -wctrans -wctype diff --git a/test/API/wordexp.SUSv4.syms b/test/API/wordexp.SUSv4.syms deleted file mode 100644 index 3681b3c4b..000000000 --- a/test/API/wordexp.SUSv4.syms +++ /dev/null @@ -1,2 +0,0 @@ -wordexp -wordfree diff --git a/test/Makefile b/test/Makefile index 787c530d4..e4f64181e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -18,7 +18,7 @@ endif ifneq ($(findstring -static,$(LDFLAGS)),) DIRS := $(filter-out dlopen,$(DIRS)) endif -ifneq ($(UCLIBC_HAS_THREADS),y) +ifneq ($(UCLIBC_HAS_THREADS)$(ARCH_USE_MMU),yy) DIRS := $(filter-out pthread,$(DIRS)) endif ifneq ($(UCLIBC_HAS_FULL_RPC),y) diff --git a/test/Rules.mak b/test/Rules.mak index 805a3498d..c5d1d636c 100644 --- a/test/Rules.mak +++ b/test/Rules.mak @@ -115,6 +115,12 @@ ifeq ($(LDSO_GNU_HASH_SUPPORT),y) LDFLAGS += $(CFLAG_-Wl--hash-style=gnu) endif +ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"") +CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS)) +endif +ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS)),"") +LDFLAGS += $(call qstrip,$(UCLIBC_EXTRA_LDFLAGS)) +endif ifneq ($(findstring -s,$(MAKEFLAGS)),) DISP := sil diff --git a/test/assert/Makefile.in b/test/assert/Makefile.in index 8e3514f4c..3f4fb4dfe 100644 --- a/test/assert/Makefile.in +++ b/test/assert/Makefile.in @@ -3,3 +3,4 @@ RET_assert := 134 WRAPPER_assert := trap ":" ABRT ; +CFLAGS_assert := -fPIC diff --git a/test/ctype/Makefile.in b/test/ctype/Makefile.in index ee10d592e..041e85176 100644 --- a/test/ctype/Makefile.in +++ b/test/ctype/Makefile.in @@ -2,3 +2,4 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. TESTS := ctype +CFLAGS_ctype = -fPIC diff --git a/test/inet/Makefile.in b/test/inet/Makefile.in index 2c84729bf..38aec616b 100644 --- a/test/inet/Makefile.in +++ b/test/inet/Makefile.in @@ -15,3 +15,6 @@ TESTS_DISABLED += tst-res else LDFLAGS_tst-res_glibc := -lresolv # assume it's glibc or somebody with that lib endif + +CFLAGS_bug-if1 = -fPIC +CFLAGS_tst-sock-nonblock = -fPIC diff --git a/test/locale-mbwc/Makefile.in b/test/locale-mbwc/Makefile.in index 7c0e9d529..e70a61393 100644 --- a/test/locale-mbwc/Makefile.in +++ b/test/locale-mbwc/Makefile.in @@ -23,5 +23,5 @@ TESTS_DISABLED := tst_strfmon DODIFF_rint := 1 -EXTRA_CFLAGS := -D__USE_GNU -fno-builtin +EXTRA_CFLAGS := -D__USE_GNU -fno-builtin -fPIC diff --git a/test/malloc/Makefile.in b/test/malloc/Makefile.in index 669ef6adf..f1726dd08 100644 --- a/test/malloc/Makefile.in +++ b/test/malloc/Makefile.in @@ -10,3 +10,5 @@ endif ifneq ($(UCLIBC_HAS_OBSTACK),y) TESTS_DISABLED += tst-obstack endif + +CFLAGS_tst-mallocfork = -fPIC diff --git a/test/misc/Makefile.in b/test/misc/Makefile.in index 09f631fe3..d78b276c2 100644 --- a/test/misc/Makefile.in +++ b/test/misc/Makefile.in @@ -2,6 +2,11 @@ # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. TESTS_DISABLED := outb tst-fnmatch bug-glob1 tst-gnuglob + +ifeq ($(TARGET_avr32),y) +TESTS_DISABLED += tst-inotify +endif + ifeq ($(UCLIBC_HAS_LFS),) TESTS_DISABLED += dirent64 TESTS_DISABLED += tst-statfs # assuming host has LFS on @@ -35,3 +40,8 @@ OPTS_tst-fnmatch := < tst-fnmatch.input MNTENTS = $(shell mount | while read dev on mp rest; do echo $$mp; done) OPTS_tst-statfs := $(MNTENTS) OPTS_tst-statvfs := $(MNTENTS) + +CFLAGS_bug-glob2 = -fPIC +CFLAGS_opendir-tst1 = -fPIC +CFLAGS_tst-inotify = -fPIC +CFLAGS_tst-utmp = -fPIC diff --git a/test/nptl/Makefile.in b/test/nptl/Makefile.in index 42a4654d6..700a464cf 100644 --- a/test/nptl/Makefile.in +++ b/test/nptl/Makefile.in @@ -38,11 +38,10 @@ TESTS := tst-align tst-align2 tst-atfork1 tst-attr1 tst-attr2 tst-attr3 \ tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15 tst-cancelx16 \ tst-cancelx18 tst-cancelx20 tst-cancelx21 tst-cleanupx0 tst-cleanupx1 \ tst-cleanupx2 tst-cleanupx3 tst-cleanupx4 tst-cond22 tst-cond23 \ - tst-dlsym1 tst-getpid1 tst-getpid2 tst-getpid3 tst-join6 tst-tsd6 \ + tst-getpid1 tst-getpid2 tst-getpid3 tst-join6 tst-tsd6 \ tst-oddstacklimit tst-oncex3 tst-oncex4 tst-rwlock2a \ - tst-basic7 tst-fini1 tst-signal7 \ - tst-unload tst-vfork1x tst-vfork2x tst-sem10 tst-sem11 tst-sem12 \ - tst-typesizes tst-initializers1-c89 tst-initializers1-c99 \ + tst-basic7 tst-signal7 tst-vfork1x tst-vfork2x tst-sem10 tst-sem11 \ + tst-sem12 tst-typesizes tst-initializers1-c89 tst-initializers1-c99 \ tst-initializers1-gnu89 tst-initializers1-gnu99 # @@ -68,7 +67,8 @@ GLIBC_TESTS_DISABLED := tst-eintr1_glibc tst-eintr2_glibc \ ifeq ($(HAVE_SHARED),) -TESTS_DISABLED += tst-tls3 tst-tls4 tst-tls5 +TESTS_DISABLED += tst-tls3 tst-tls4 tst-tls5 tst-dlsym1 tst-fini1 \ + tst-unload else GLIBC_TESTS_DISABLED += tst-tls3_glibc tst-tls4_glibc tst-tls5_glibc endif @@ -109,7 +109,7 @@ LDFLAGS_tst-rwlock14 = -lrt LDFLAGS_tst-fini1 = -Wl,-rpath=./ tst-fini1mod.so LDFLAGS_tst-fini1mod.so = -Wl,-soname=tst-fini1mod.so LDFLAGS_tst-unload = -ldl -LDFLAGS_tst-cancel5 := -lpthread -lpthread_nonshared +LDFLAGS_tst-cancel5 := -lpthread LDFLAGS_tst-cancel23 := -lc -lpthread LDFLAGS_tst-vfork1x := -lc -lpthread LDFLAGS_tst-vfork2x := -lc -lpthread diff --git a/test/nptl/tst-cancel7.c b/test/nptl/tst-cancel7.c index bb9f739d3..9e7d22ed5 100644 --- a/test/nptl/tst-cancel7.c +++ b/test/nptl/tst-cancel7.c @@ -193,14 +193,8 @@ do_cleanup (void) } #endif -#define OPT_COMMAND 10000 -#define OPT_PIDFILE 10001 #define CMDLINE_OPTIONS \ "c:p:" -/* - { "command", required_argument, NULL, OPT_COMMAND }, \ - { "pidfile", required_argument, NULL, OPT_PIDFILE }, -*/ #define CMDLINE_PROCESS \ case 'c': \ command = optarg; \ @@ -208,7 +202,6 @@ do_cleanup (void) case 'p': \ pidfile = optarg; \ break; -// #define CLEANUP_HANDLER do_cleanup () #define PREPARE(argc, argv) do_prepare (argc, argv) #define TEST_FUNCTION do_test () #define TIMEOUT 5 diff --git a/test/nptl/tst-mqueue7.c b/test/nptl/tst-mqueue7.c index 12c6d9a37..1892f951a 100644 --- a/test/nptl/tst-mqueue7.c +++ b/test/nptl/tst-mqueue7.c @@ -33,9 +33,7 @@ static mqd_t after_exec = (mqd_t) -1; #define CMDLINE_OPTIONS \ "a:" -/* - { "after-exec", required_argument, NULL, OPT_AFTEREXEC }, -*/ + #define CMDLINE_PROCESS \ case 'a': \ after_exec = (mqd_t) strtoul (optarg, NULL, 0); \ diff --git a/test/nptl/tst-unload.c b/test/nptl/tst-unload.c index c7de2cb91..74a714ecb 100644 --- a/test/nptl/tst-unload.c +++ b/test/nptl/tst-unload.c @@ -23,17 +23,17 @@ static int do_test (void) { - void *p = dlopen ("libpthread.so.0", RTLD_LAZY); + void *p = dlopen ("libpthread.so.1", RTLD_LAZY); if (p == NULL) { - puts ("failed to load libpthread.so.0"); + puts ("failed to load libpthread.so.1"); return 1; } if (dlclose (p) != 0) { - puts ("dlclose (libpthread.so.0) failed"); + puts ("dlclose (libpthread.so.1) failed"); return 1; } diff --git a/test/regex/Makefile.in b/test/regex/Makefile.in new file mode 100644 index 000000000..1573840b9 --- /dev/null +++ b/test/regex/Makefile.in @@ -0,0 +1 @@ +CFLAGS_tst-regex2 = -fPIC diff --git a/test/setjmp/Makefile.in b/test/setjmp/Makefile.in new file mode 100644 index 000000000..a5b7b591a --- /dev/null +++ b/test/setjmp/Makefile.in @@ -0,0 +1 @@ +CFLAGS_bug269-setjmp = -fPIC diff --git a/test/signal/Makefile.in b/test/signal/Makefile.in index c8e2545fa..27791a911 100644 --- a/test/signal/Makefile.in +++ b/test/signal/Makefile.in @@ -4,3 +4,7 @@ ifeq ($(UCLIBC_HAS_OBSOLETE_BSD_SIGNAL),) TESTS_DISABLED := tst-sigsimple endif + +CFLAGS_tst-signalfd = -fPIC +CFLAGS_tst-sigset = -fPIC +CFLAGS_tst-sigsimple = -fPIC diff --git a/test/stdlib/Makefile.in b/test/stdlib/Makefile.in index e1cbccfca..91dfde412 100644 --- a/test/stdlib/Makefile.in +++ b/test/stdlib/Makefile.in @@ -7,13 +7,13 @@ DODIFF_teston_exit := 1 DODIFF_teststrtol := 1 TESTS_DISABLED := -GLIBC_TESTS_DISABLED := ifeq ($(UCLIBC_HAS_PTY),) TESTS_DISABLED += ptytest endif - ifeq ($(UCLIBC_HAS_ARC4RANDOM),) TESTS_DISABLED += testarc4random -else -GLIBC_TESTS_DISABLED += testarc4random_glibc endif + +CFLAGS_test-canon = -fPIC +CFLAGS_test-canon2 = -fPIC +CFLAGS_testatexit = -fPIC diff --git a/test/test-skeleton.c b/test/test-skeleton.c index 69ef99f76..03c2ff883 100644 --- a/test/test-skeleton.c +++ b/test/test-skeleton.c @@ -18,6 +18,7 @@ <http://www.gnu.org/licenses/>. */ #include <errno.h> +#include <getopt.h> #include <malloc.h> #include <search.h> #include <signal.h> @@ -42,21 +43,6 @@ # define TEST_DATA_LIMIT (64 << 20) /* Data limit (bytes) to run with. */ #endif -#define OPT_DIRECT 1000 -#define OPT_TESTDIR 1001 - -#if 0 /* Not used in uClibc */ -static struct option options[] = -{ -#ifdef CMDLINE_OPTIONS - CMDLINE_OPTIONS -#endif - { "direct", no_argument, NULL, OPT_DIRECT }, - { "test-dir", required_argument, NULL, OPT_TESTDIR }, - { NULL, 0, NULL, 0 } -}; -#endif - /* PID of the test itself. */ static pid_t pid; @@ -242,22 +228,18 @@ main (int argc, char *argv[]) setbuf (stdout, NULL); #endif -#if 0 /* Not used in uClibc */ - while ((opt = getopt_long (argc, argv, "+", options, NULL)) != -1) -#else # ifndef CMDLINE_OPTIONS # define CMDLINE_OPTIONS "" # endif - while ((opt = getopt (argc, argv, "+" CMDLINE_OPTIONS)) >= 0) -#endif + while ((opt = getopt (argc, argv, "+dt:" CMDLINE_OPTIONS)) >= 0) switch (opt) { case '?': exit (1); - case OPT_DIRECT: + case 'd': direct = 1; break; - case OPT_TESTDIR: + case 't': test_dir = optarg; break; #ifdef CMDLINE_PROCESS diff --git a/test/time/Makefile.in b/test/time/Makefile.in index bb11e18bd..8afc013d7 100644 --- a/test/time/Makefile.in +++ b/test/time/Makefile.in @@ -4,6 +4,10 @@ TESTS_DISABLED := bug-asctime bug-asctime_r time tst-mktime2 tst-posixtz \ tst-strftime tst-strptime tst-timezone +ifeq ($(TARGET_avr32),y) +TESTS_DISABLED += tst-timerfd +endif + ifneq ($(UCLIBC_HAS_XLOCALE),y) TESTS_DISABLED += tst-ftime_l endif @@ -13,5 +17,9 @@ TESTS_DISABLED += tst_wcsftime endif CFLAGS_tst-strptime2 := -std=c99 +CFLAGS_tst-ctime = -fPIC +CFLAGS_tst-futimens1 = -fPIC +CFLAGS_tst-timerfd = -fPIC + DODIFF_futimens1 := 1 DODIFF_tst_wcsftime := 1 diff --git a/test/tls/Makefile.in b/test/tls/Makefile.in index 7ab4e2ad3..0a9833757 100644 --- a/test/tls/Makefile.in +++ b/test/tls/Makefile.in @@ -12,6 +12,10 @@ ifeq ($(HAVE_SHARED),) TESTS_DISABLED := $(TESTS) endif +ifeq ($(TARGET_ARCH),arc) +TESTS_DISABLED += tst-tls12 tst-tls-at-ctor +endif + # All these tests need tls.h, which is not installed with glibc GLIBC_TESTS_DISABLED := $(addsuffix _glibc,$(filter-out $(TESTS_DISABLED),$(TESTS))) diff --git a/test/tls/tls-macros.h b/test/tls/tls-macros.h index 2787809f5..a41aef688 100644 --- a/test/tls/tls-macros.h +++ b/test/tls/tls-macros.h @@ -885,6 +885,43 @@ register void *__gp __asm__("$29"); : "=&r" (__result) : "r" (tp)); \ __result; }) +#elif defined __xtensa__ + +#define TLS_GD(x) \ + ({ int *__l; \ + __asm__ ("movi a8, " #x "@TLSFUNC\n\t" \ + "movi a10, " #x "@TLSARG\n\t" \ + "callx8.tls a8, " #x "@TLSCALL\n\t" \ + "mov %0, a10\n\t" \ + : "=r" (__l) \ + : \ + : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \ + __l; }) + +#define TLS_LD(x) \ + ({ int *__l; \ + __asm__ ("movi a8, " #x "@TLSFUNC\n\t" \ + "movi a10, " #x "@TLSARG\n\t" \ + "callx8.tls a8, " #x "@TLSCALL\n\t" \ + "movi %0, " #x "@TPOFF\n\t" \ + "add %0, %0, a10\n\t" \ + : "=r" (__l) \ + : \ + : "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \ + __l; }) + +#define TLS_IE(x) TLS_LE(x) + +#define TLS_LE(x) \ + ({ int *__l; \ + int __t; \ + __asm__ ("rur %0, threadptr\n\t" \ + "movi %1, " #x "@TPOFF\n\t" \ + "add %0, %0, %1\n\t" \ + : "=r" (__l), "=r" (__t) ); \ + __l; }); \ + + #elif !defined TLS_LE || !defined TLS_IE \ || !defined TLS_LD || !defined TLS_GD # error "No support for this architecture so far." diff --git a/test/unistd/Makefile.in b/test/unistd/Makefile.in index ed33d9ae8..da59a3689 100644 --- a/test/unistd/Makefile.in +++ b/test/unistd/Makefile.in @@ -1,9 +1,10 @@ # uClibc unistd tests # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. +TESTS_DISABLED := # If LFS is not set, get rid of all *64 tests up front ifeq ($(UCLIBC_HAS_LFS),) -TESTS_DISABLED := tst-preadwrite64 tst-posix_fallocate64 tst-fallocate64 +TESTS_DISABLED += tst-preadwrite64 endif # If we don't have LINUX_SPECIFIC, then get rid of tst-fallocate @@ -11,6 +12,10 @@ ifeq ($(UCLIBC_LINUX_SPECIFIC),) TESTS_DISABLED += tst-fallocate endif +ifeq ($(TARGET_avr32),y) +TESTS_DISABLED += tst-fallocate tst-posix_fallocate tst-fallocate64 +endif + # The logic is similar for HAS_ADVANCED_REALTIME and # tst-posix_fallocate/tst-posix_fallocate64 ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),) @@ -26,6 +31,14 @@ else OPTS_tstgetopt := -a -b -cfoobar --required foobar --optional=bazbug --none --colou --color --colour random endif +# for embedded systems 4 GB disk space is not available +TESTS_DISABLED += tst-posix_fallocate64 tst-fallocate64 + +CFLAGS_tst-fallocate = -fPIC +CFLAGS_tst-posix_fallocate = -fPIC +CFLAGS_tst-preadwrite = -fPIC +CFLAGS_tst-preadwrite64 = -fPIC + # getconf.c lives in utils/ # Testsuite cannot currently be built with O= anyway, so hardcode path here getconf.c: |