1. 05 2月, 2020 2 次提交
  2. 31 1月, 2020 1 次提交
    • R
      remove legacy clock_gettime and gettimeofday from public syscall.h · 5a105f19
      Rich Felker 提交于
      some nontrivial number of applications have historically performed
      direct syscalls for these operations rather than using the public
      functions. such usage is invalid now that time_t is 64-bit and these
      syscalls no longer match the types they are used with, and it was
      already harmful before (by suppressing use of vdso).
      
      since syscall() has no type safety, incorrect usage of these syscalls
      can't be caught at compile-time. so, without manually inspecting or
      running additional tools to check sources, the risk of such errors
      slipping through is high.
      
      this patch renames the syscalls on 32-bit archs to clock_gettime32 and
      gettimeofday_time32, so that applications using the original names
      will fail to build without being fixed.
      
      note that there are a number of other syscalls that may also be unsafe
      to use directly after the time64 switchover, but (1) these are the
      main two that seem to be in widespread use, and (2) most of the others
      continue to have valid usage with a null timeval/timespec argument, as
      the argument is an optional timeout or similar.
      5a105f19
  3. 18 12月, 2019 1 次提交
    • R
      implement SO_TIMESTAMP[NS] fallback for kernels without time64 versions · ae388bec
      Rich Felker 提交于
      the definitions of SO_TIMESTAMP* changed on 32-bit archs in commit
      38143339 to the new versions that
      provide 64-bit versions of timeval/timespec structure in control
      message payload. socket options, being state attached to the socket
      rather than function calls, are not trivial to implement as fallbacks
      on ENOSYS, and support for them was initially omitted on the
      assumption that the ioctl-based polling alternatives (SIOCGSTAMP*)
      could be used instead by applications if setsockopt fails.
      
      unfortunately, it turns out that SO_TIMESTAMP is sufficiently old and
      widely supported that a number of applications assume it's available
      and treat errors as fatal.
      
      this patch introduces emulation of SO_TIMESTAMP[NS] on pre-time64
      kernels by falling back to setting the "_OLD" (time32) versions of the
      options if the time64 ones are not recognized, and performing
      translation of the SCM_TIMESTAMP[NS] control messages in recvmsg.
      since recvmsg does not know whether its caller is legacy time32 code
      or time64, it performs translation for any SCM_TIMESTAMP[NS]_OLD
      control messages it sees, leaving the original time32 timestamp as-is
      (it can't be rewritten in-place anyway, and memmove would be mildly
      expensive) and appending the converted time64 control message at the
      end of the buffer. legacy time32 callers will see the converted one as
      a spurious control message of unknown type; time64 callers running on
      pre-time64 kernels will see the original one as a spurious control
      message of unknown type. a time64 caller running on a kernel with
      native time64 support will only see the time64 version of the control
      message.
      
      emulation of SO_TIMESTAMPING is not included at this time since (1)
      applications which use it seem to be prepared for the possibility that
      it's not present or working, and (2) it can also be used in sendmsg
      control messages, in a manner that looks complex to emulate
      completely, and costly even when running on a time64-supporting
      kernel.
      
      corresponding changes in recvmmsg are not made at this time; they will
      be done separately.
      ae388bec
  4. 01 8月, 2019 3 次提交
    • R
      ioctl: add fallback for new time64 SIOCGSTAMP[NS] · 2e554617
      Rich Felker 提交于
      without this, the SIOCGSTAMP and SIOCGSTAMPNS ioctl commands, for
      obtaining timestamps, would stop working on pre-5.1 kernels after
      time_t is switched to 64-bit and their values are changed to the new
      time64 versions.
      
      new code is written such that it's statically unreachable on 64-bit
      archs, and on existing 32-bit archs until the macro values are changed
      to activate 64-bit time_t.
      2e554617
    • R
      get/setsockopt: add fallback for new time64 SO_RCVTIMEO/SO_SNDTIMEO · 51fd67fc
      Rich Felker 提交于
      without this, the SO_RCVTIMEO and SO_SNDTIMEO socket options would
      stop working on pre-5.1 kernels after time_t is switched to 64-bit and
      their values are changed to the new time64 versions.
      
      new code is written such that it's statically unreachable on 64-bit
      archs, and on existing 32-bit archs until the macro values are changed
      to activate 64-bit time_t.
      51fd67fc
    • R
      make __socketcall analogous to __syscall, error-returning · 59324c8b
      Rich Felker 提交于
      the __socketcall and __socketcall_cp macros are remnants from a really
      old version of the syscall-mechanism infrastructure, and don't follow
      the pattern that the "__" version of the macro returns the raw negated
      error number rather than setting errno and returning -1.
      
      for time64 purposes, some socket syscalls will need to operate on the
      error value rather than returning immediately, so fix this up so they
      can use it.
      59324c8b
  5. 28 7月, 2019 1 次提交
    • R
      internally, define plain syscalls, if missing, as their time64 variants · 4bbd7bae
      Rich Felker 提交于
      this commit has no effect whatsoever right now, but is in preparation
      for a future riscv32 port and other future 32-bit archs that will be
      "time64-only" from the start on the kernel side.
      
      together with the previous x32 changes, this commit ensures that
      syscall call points that don't care about time (passing null timeouts,
      etc.) can continue to do so without having to special-case time64-only
      archs, and allows code using the time64 syscalls to uniformly test for
      the need to fallback with SYS_foo != SYS_foo_time64, rather than
      needing to check defined(SYS_foo) && SYS_foo != SYS_foo_time64.
      4bbd7bae
  6. 05 5月, 2019 1 次提交
    • R
      allow archs to provide a 7-argument syscall if needed · d7b58342
      Rich Felker 提交于
      commit 788d5e24 noted that we could
      add this if needed, and in fact it is needed, but not for one of the
      archs documented as having a 7th syscall arg register. rather, it's
      needed for mips (o32), where all but the first 4 arguments are passed
      on the stack, and the stack can accommodate a 7th.
      d7b58342
  7. 11 4月, 2019 1 次提交
    • R
      remove external __syscall function and last remaining users · 788d5e24
      Rich Felker 提交于
      the weak version of __syscall_cp_c was using a tail call to __syscall
      to avoid duplicating the 6-argument syscall code inline in small
      static-linked programs, but now that __syscall no longer exists, the
      inline expansion is no longer duplication.
      
      the syscall.h machinery suppported up to 7 syscall arguments, only via
      an external __syscall function, but we presently have no syscall call
      points that actually make use of that many, and the kernel only
      defines 7-argument calling conventions for arm, powerpc (32-bit), and
      sh. if it turns out we need them in the future, they can easily be
      added.
      788d5e24
  8. 13 9月, 2018 5 次提交
    • R
      fix regression with compilers not incorporating C99 DR#289 resolution · 036df43d
      Rich Felker 提交于
      as originally published, the C99 syntax only allowed static index
      parameter declarators when a gratuitous parameter name was included.
      gcc 3, which some projects use for bootstrapping, is a supported C99
      compiler, but does not have the fix to the standard incorporated, so
      edit the affected declaration to conform to the earlier buggy C99
      syntax.
      036df43d
    • R
      reduce spurious inclusion of libc.h · 5ce37379
      Rich Felker 提交于
      libc.h was intended to be a header for access to global libc state and
      related interfaces, but ended up included all over the place because
      it was the way to get the weak_alias macro. most of the inclusions
      removed here are places where weak_alias was needed. a few were
      recently introduced for hidden. some go all the way back to when
      libc.h defined CANCELPT_BEGIN and _END, and all (wrongly implemented)
      cancellation points had to include it.
      
      remaining spurious users are mostly callers of the LOCK/UNLOCK macros
      and files that use the LFS64 macro to define the awful *64 aliases.
      
      in a few places, new inclusion of libc.h is added because several
      internal headers no longer implicitly include libc.h.
      
      declarations for __lockfile and __unlockfile are moved from libc.h to
      stdio_impl.h so that the latter does not need libc.h. putting them in
      libc.h made no sense at all, since the macros in stdio_impl.h are
      needed to use them correctly anyway.
      5ce37379
    • R
      7e399fab
    • R
      cb229f61
    • R
      move and deduplicate declarations of __procfdname to make it checkable · 6fcd60dd
      Rich Felker 提交于
      syscall.h was chosen as the header to declare it, since its intended
      usage is alongside syscalls as a fallback for operations the direct
      syscall does not support.
      6fcd60dd
  9. 06 9月, 2018 1 次提交
    • R
      define and use internal macros for hidden visibility, weak refs · 9b95fd09
      Rich Felker 提交于
      this cleans up what had become widespread direct inline use of "GNU C"
      style attributes directly in the source, and lowers the barrier to
      increased use of hidden visibility, which will be useful to recovering
      some of the efficiency lost when the protected visibility hack was
      dropped in commit dc2f368e, especially
      on archs where the PLT ABI is costly.
      9b95fd09
  10. 12 8月, 2016 1 次提交
    • R
      fix pread/pwrite syscall calling convention on sh · 7cc3a28e
      Rich Felker 提交于
      despite sh not generally using register-pair alignment for 64-bit
      syscall arguments, there are arch-specific versions of the syscall
      entry points for pread and pwrite which include a dummy argument for
      alignment before the 64-bit offset argument.
      7cc3a28e
  11. 27 1月, 2016 1 次提交
    • S
      change the internal socketcall selection logic · a5e133bf
      Szabolcs Nagy 提交于
      only use SYS_socketcall if SYSCALL_USE_SOCKETCALL is defined
      internally, otherwise use direct syscalls.
      
      this commit does not change the current behaviour, it is
      preparation for adding direct syscall numbers for i386.
      a5e133bf
  12. 12 11月, 2015 1 次提交
    • R
      eliminate use of SHARED macro to suppress visibility attributes · 8a8fdf63
      Rich Felker 提交于
      this is the first and simplest stage of removal of the SHARED macro,
      which will eventually allow libc.a and libc.so to be produced from the
      same object files.
      
      the original motivation for these #ifdefs which are now being removed
      was to allow building a static-only libc using a compiler that does
      not support visibility. however, SHARED was the wrong condition to
      test for this anyway; various assembly-language sources refer to
      hidden symbols and declare them with the .hidden directive, making it
      wrong to define the referenced symbols as non-hidden. if there is a
      need in the future to build libc using compilers that lack visibility,
      support could be moved to the build system or perhaps the __PIC__
      macro could be checked instead of SHARED.
      8a8fdf63
  13. 15 4月, 2015 1 次提交
  14. 08 2月, 2015 1 次提交
    • S
      remove cruft from x86_64 syscall.h · e63833cd
      Szabolcs Nagy 提交于
      x86_64 syscall.h defined some musl internal syscall names and made
      them public. These defines were already moved to src/internal/syscall.h
      (except for SYS_fadvise which is added now) so the cruft in x86_64
      syscall.h is not needed.
      e63833cd
  15. 23 11月, 2014 1 次提交
    • R
      unify non-inline version of syscall code across archs · 4134c68d
      Rich Felker 提交于
      except powerpc, which still lacks inline syscalls simply because
      nobody has written the code, these are all fallbacks used to work
      around a clang bug that probably does not exist in versions of clang
      that can compile musl. however, it's useful to have the generic
      non-inline code anyway, as it eases the task of porting to new archs:
      writing inline syscall code is now optional. this approach could also
      help support compilers which don't understand inline asm or lack
      support for the needed register constraints.
      
      mips could not be unified because it has special fixup code for broken
      layout of the kernel's struct stat.
      4134c68d
  16. 31 7月, 2014 1 次提交
  17. 30 5月, 2014 3 次提交
    • S
      fix for broken kernel side RLIM_INFINITY on mips · 8258014f
      Szabolcs Nagy 提交于
      On 32 bit mips the kernel uses -1UL/2 to mark RLIM_INFINITY (and
      this is the definition in the userspace api), but since it is in
      the middle of the valid range of limits and limits are often
      compared with relational operators, various kernel side logic is
      broken if larger than -1UL/2 limits are used. So we truncate the
      limits to -1UL/2 in get/setrlimit and prlimit.
      
      Even if the kernel side logic consistently treated -1UL/2 as greater
      than any other limit value, there wouldn't be any clean workaround
      that allowed using large limits:
      * using -1UL/2 as RLIM_INFINITY in userspace would mean different
      infinity value for get/setrlimt and prlimit (where infinity is always
      -1ULL) and userspace logic could break easily (just like the kernel
      is broken now) and more special case code would be needed for mips.
      * translating -1UL/2 kernel side value to -1ULL in userspace would
      mean that -1UL/2 limit cannot be set (eg. -1UL/2+1 had to be passed
      to the kernel instead).
      8258014f
    • R
      break down coarse-grained 64-bit-off_t syscall remappings · 106e65d6
      Rich Felker 提交于
      using the existence of SYS_stat64 as the condition for remapping other
      related syscalls is no longer valid, since new archs that omit the old
      syscalls will not have SYS_stat or SYS_stat64, but still potentially
      need SYS_fstat and others remapped. it would probably be possible to
      get by with just one or two extra conditionals, but just breaking them
      all down into separate conditions is robust and not significantly
      heavier for the preprocessor.
      106e65d6
    • R
      fix sendfile syscall to use 64-bit off_t · 55f45bc7
      Rich Felker 提交于
      somehow the remapping of this syscall to the 64-bit version was
      overlooked. the issue was found, and patch provided, by Stefan
      Kristiansson. presumably the reason this bug was not caught earlier is
      that the syscall takes a pointer to off_t rather than a value, so on
      little-endian systems, everything appears to work as long as the
      offset value fits in the low 31 bits. on big-endian systems, though,
      sendfile was presumably completely non-functional.
      55f45bc7
  18. 27 5月, 2014 2 次提交
  19. 25 5月, 2014 1 次提交
    • R
      support kernels with no SYS_open syscall, only SYS_openat · 594c827a
      Rich Felker 提交于
      open is handled specially because it is used from so many places, in
      so many variants (2 or 3 arguments, setting errno or not, and
      cancellable or not). trying to do it as a function would not only
      increase bloat, but would also risk subtle breakage.
      
      this is the first step towards supporting "new" archs where linux
      lacks "old" syscalls.
      594c827a
  20. 18 4月, 2014 1 次提交
  21. 12 4月, 2014 1 次提交
    • R
      use hidden visibility rather than protected for syscall internals · 83c98aac
      Rich Felker 提交于
      the use of visibility at all is purely an optimization to avoid the
      need for the caller to load the GOT register or similar to prepare for
      a call via the PLT. there is no reason for these symbols to be
      externally visible, so hidden works just as well as protected, and
      using protected visibility is undesirable due to toolchain bugs and
      the lack of testing it receives.
      
      in particular, GCC's microblaze target is known to generate symbolic
      relocations in the GOT for functions with protected visibility. this
      in turn results in a dynamic linker which crashes under any nontrivial
      usage that requires making a syscall before symbolic relocations are
      processed.
      83c98aac
  22. 23 2月, 2014 1 次提交
  23. 22 2月, 2014 2 次提交
    • R
      internal/syscall.h: add syscall_arg_t macro · 5cc1d920
      rofl0r 提交于
      some 32-on-64 archs require that the actual syscall args be long long.
      in that case syscall_arch.h can define syscall_arg_t to whatever it needs
      and syscall.h picks it up.
      all other archs just use long as usual.
      5cc1d920
    • R
      internal/syscall.h: use a macro for the syscall args casts · bf84967c
      rofl0r 提交于
      this allows syscall_arch.h to define the macro __scc if special
      casting is needed, as is the case for x32, where the actual syscall
      arguments are 64bit, but, in case of pointers, would get sign-extended
      and thus become invalid.
      bf84967c
  24. 17 7月, 2013 1 次提交
  25. 26 10月, 2012 1 次提交
    • R
      use explicit visibility to optimize a few hot-path function calls · 607b05ac
      Rich Felker 提交于
      on x86 and some other archs, functions which make function calls which
      might go through a PLT incur a significant overhead cost loading the
      GOT register prior to making the call. this load is utterly useless in
      musl, since all calls are bound at library-creation time using
      -Bsymbolic-functions, but the compiler has no way of knowing this, and
      attempts to set the default visibility to protected have failed due to
      bugs in GCC and binutils.
      
      this commit simply manually assigns hidden/protected visibility, as
      appropriate, to a few internal-use-only functions which have many
      callers, or which have callers that are hot paths like getc/putc. it
      shaves about 5k off the i386 libc.so with -Os. many of the
      improvements are in syscall wrappers, where the benefit is just size
      and performance improvement is unmeasurable noise amid the syscall
      overhead. however, stdio may be measurably faster.
      
      if in the future there are toolchains that can do the same thing
      globally without introducing linking bugs, it might be worth
      considering removing these workarounds.
      607b05ac
  26. 10 9月, 2012 1 次提交
    • R
      add 7-arg syscall support for mips · 9a3bbce4
      Rich Felker 提交于
      no syscalls actually use that many arguments; the issue is that some
      syscalls with 64-bit arguments have them ordered badly so that
      breaking them into aligned 32-bit half-arguments wastes slots with
      padding, and a 7th slot is needed for the last argument.
      9a3bbce4
  27. 09 9月, 2012 1 次提交
    • R
      syscall organization overhaul · 208eb584
      Rich Felker 提交于
      now public syscall.h only exposes __NR_* and SYS_* constants and the
      variadic syscall function. no macros or inline functions, no
      __syscall_ret or other internal details, no 16-/32-bit legacy syscall
      renaming, etc. this logic has all been moved to src/internal/syscall.h
      with the arch-specific parts in arch/$(ARCH)/syscall_arch.h, and the
      amount of arch-specific stuff has been reduced to a minimum.
      
      changes still need to be reviewed/double-checked. minimal testing on
      i386 and mips has already been performed.
      208eb584
  28. 02 5月, 2011 1 次提交
    • R
      workaround for preprocessor bug in pcc · a9be201c
      Rich Felker 提交于
      with this patch, musl compiles and mostly works with pcc 1.0.0. a few
      tests are still failing and i'm uncertain whether they are due to
      portability problems in musl, or bugs in pcc, but i suspect the
      latter.
      a9be201c
  29. 17 4月, 2011 1 次提交
    • R
      overhaul pthread cancellation · feee9890
      Rich Felker 提交于
      this patch improves the correctness, simplicity, and size of
      cancellation-related code. modulo any small errors, it should now be
      completely conformant, safe, and resource-leak free.
      
      the notion of entering and exiting cancellation-point context has been
      completely eliminated and replaced with alternative syscall assembly
      code for cancellable syscalls. the assembly is responsible for setting
      up execution context information (stack pointer and address of the
      syscall instruction) which the cancellation signal handler can use to
      determine whether the interrupted code was in a cancellable state.
      
      these changes eliminate race conditions in the previous generation of
      cancellation handling code (whereby a cancellation request received
      just prior to the syscall would not be processed, leaving the syscall
      to block, potentially indefinitely), and remedy an issue where
      non-cancellable syscalls made from signal handlers became cancellable
      if the signal handler interrupted a cancellation point.
      
      x86_64 asm is untested and may need a second try to get it right.
      feee9890