1. 18 10月, 2019 5 次提交
    • R
      remove use of endian.h from arch reloc.h headers, clean up · 4d3a162d
      Rich Felker 提交于
      building on commit 97d35a55,
      __BYTE_ORDER is now available wherever alltypes.h is included. since
      reloc.h is only used from src/internal/dynlink.h, it can be assumed
      that __BYTE_ORDER is exposed. reloc.h is not permitted to be included
      in other contexts, and generally, like most arch headers, lacks
      inclusion guards that would allow such usage. the mips64 version
      mistakenly included such guards; they are removed for consistency.
      4d3a162d
    • R
      remove indirect use of endian.h from public headers · 71d23fbe
      Rich Felker 提交于
      building on commit 97d35a55,
      __BYTE_ORDER is now available wherever alltypes.h is included.
      endian.h should not be used since, in the future, it will expose
      identifiers that are not in the reserved namespace for the headers
      which were previously using it.
      71d23fbe
    • R
      move __BYTE_ORDER definition to alltypes.h · 97d35a55
      Rich Felker 提交于
      this change is motivated by the intersection of several factors.
      presently, despite being a nonstandard header, endian.h is exposing
      the unprefixed byte order macros and functions only if _BSD_SOURCE or
      _GNU_SOURCE is defined. this is to accommodate use of endian.h from
      other headers, including bits headers, which need to define structure
      layout in terms of endianness. with time64 switch-over, even more
      headers will need to do this.
      
      at the same time, the resolution of Austin Group issue 162 makes
      endian.h a standard header for POSIX-future, requiring that it expose
      the unprefixed macros and the functions even in standards-conforming
      profiles. changes to meet this new requirement would break existing
      internal usage of endian.h by causing it to violate namespace where
      it's used.
      
      instead, have the arch's alltypes.h define __BYTE_ORDER, either as a
      fixed constant or depending on the right arch-specific predefined
      macros for determining endianness. explicit literals 1234 and 4321 are
      used instead of __LITTLE_ENDIAN and __BIG_ENDIAN so that there's no
      danger of getting the wrong result if a macro is undefined and
      implicitly evaluates to 0 at the preprocessor level.
      
      the powerpc (32-bit) bits/endian.h being removed had logic for varying
      endianness, but our powerpc arch has never supported that and has
      always been big-endian-only. this logic is not carried over to the new
      __BYTE_ORDER definition in alltypes.h.
      97d35a55
    • R
      remove per-arch definitions for va_list · 00ec11d1
      Rich Felker 提交于
      now that commit f7f10797 removed the
      legacy i386 conditional definition, va_list is in no way
      arch-specific, and has no reason to be in the future. move it to the
      shared part of alltypes.h.in
      00ec11d1
    • R
      remove i386 support for legacy struct __va_list · f7f10797
      Rich Felker 提交于
      commit ffaaa6d2 removed the
      corresponding stdarg.h support for compilers without va_list builtins,
      but failed to remove the alternate type definition, leaving incorrect
      va_list definitions in place with compilers that don't define __GNUC__
      with a value >= 3.
      f7f10797
  2. 02 10月, 2019 1 次提交
    • R
      reintroduce riscv64 struct sigcontext · a0993f8f
      Rich Felker 提交于
      commit ab3eb89a removed it as part of
      correcting the mcontext_t definition, but there is still code using
      struct sigcontext and expecting the member names present in it, most
      notably libgcc_eh. almost all such usage is incorrect, but bring back
      struct sigcontext at least for now so as not to introduce regressions.
      a0993f8f
  3. 30 9月, 2019 2 次提交
    • R
      fix riscv64 elf_fpregset_t type and member names mismatch · 2c2477da
      Rich Felker 提交于
      in order for sys/procfs.h (provided by sys/user.h) to be useful, it
      needs to match the API its consumers (gdb, etc.) expect, including the
      member names established by glibc.
      
      this partly reverts commit 29e8737f,
      which partly reverted d493206d,
      eliminating struct user_fpregs_struct which seems to have had no
      precedent and using union __riscv_mc_fp_state for elf_fpregset_t. this
      requires indirect inclusion of signal.h to make union
      __riscv_mc_fp_state visible, but being that these are nonstandard
      "junk" headers with no official restrictions on what they can pull in,
      that's no big deal.
      
      split off and expanded from patch by Khem Raj.
      2c2477da
    • R
      fix riscv64 signal.h namespace violations and ucontext API mismatches · ab3eb89a
      Rich Felker 提交于
      the top-level mcontext_t member names were namespace-violating in
      standards profiles before, and nested-level member names (some of them
      single-letter) were egregiously bad namespace impositions even in
      non-strict profiles. moreover, they mismatched those used in the
      public API first defined in glibc, breaking any code making use of
      them.
      
      unlike most archs, the public API used in glibc for riscv mcontext_t
      members was designed to be namespace-safe, so we can and should expose
      the members regardless of feature test macros. only the typedefs for
      greg_t, gregset_t, and fpregset_t need to be protected behind FTMs.
      
      the struct tags for mcontext_t and ucontext_t are also changed. for
      mcontext_t this is necessary to make the common definition across
      profiles namespace-safe. for ucontext_t, it's just a matter of
      matching the tag from the glibc-defined API.
      
      these changes are split off and expanded from a patch by Khem Raj.
      ab3eb89a
  4. 27 9月, 2019 2 次提交
    • R
      clean up mips (32-bit, o32) syscall asm constraints · 604f8d3d
      Rich Felker 提交于
      analogous to commit ddc7c4f9 for
      mips64 and n32, remove the hack to load the syscall number into $2 via
      asm, and use a constraint to let the compiler load it instead.
      
      now, only $4, $5, and $6 are potential input-only registers. $2 is
      always input and output, and $7 is both when it's an argument,
      otherwise output-only. previously, $7 was treated as an input (with a
      "1" constraint matching its output position) even when it was not an
      input, which was arguably undefined behavior (asm input from
      indeterminate value). this is corrected.
      
      as before, $8, $9, and $10 are conditionally input-output registers
      for 5-, 6-, and 7-argument syscalls. their role in input is carrying
      in the values that will be stored on the stack for arguments 5-7.
      their role in output is carrying back whatever the kernel has
      clobbered them with, so that the compiler cannot assume they still
      contain the input values.
      604f8d3d
    • R
      fix mips r6 syscall clobber lists not to include hi/lo registers · 9f6dd785
      Rich Felker 提交于
      mips r6 (an incompatible isa from traditional mips) removes the hi and
      lo registers used for mul/div results. older gcc versions accepted
      them in the clobber list for asm, but their presence is incorrect and
      breaks on later versions.
      
      in the process of fixing this, the clobber list for 32-bit mips
      syscalls has been deduplicated via a macro like on mips64 and n32.
      9f6dd785
  5. 26 9月, 2019 1 次提交
    • P
      correct the operand specifiers in the riscv64 CAS routines · 7d5c5706
      Palmer Dabbelt 提交于
      The operand sepcifiers in a_cas and a_cas_p for riscv64 were incorrect:
      there's a backwards branch in the routine, so despite tmp being written
      at the end of the assembly fragment it cannot be allocated in one of the
      input registers because the input values may be needed for another trip
      around the loop.
      
      For code that follows the guaranteed forward progress requirements, the
      backwards branch is rarely taken: SiFive's hardware only fails a store
      conditional on execptional cases (ie, instruction cache misses inside
      the loop), and until recently a bug in QEMU allowed back-to-back
      store conditionals to succeed.  The bug has been fixed in the latest
      QEMU release, but it turns out that the fix caused this latent bug in
      musl to manifest.
      7d5c5706
  6. 11 9月, 2019 2 次提交
    • S
      aarch64: add HWCAP2 flags from linux v5.2 · 9920bf45
      Szabolcs Nagy 提交于
      AT_HWCAP2 flags, see
      
        linux commit 671db581815faf17cbedd7fcbc48823a247d90b1
        arm64: Expose DC CVADP to userspace
      
        linux commit 06a916feca2b262ab0c1a2aeb68882f4b1108a07
        arm64: Expose SVE2 features for userspace
      9920bf45
    • S
      add new syscall numbers from linux v5.2 · b6076309
      Szabolcs Nagy 提交于
      new mount api syscalls were added, same numers on all targets, see
      
        linux commit a07b20004793d8926f78d63eb5980559f7813404
        vfs: syscall: Add open_tree(2) to reference or clone a mount
      
        linux commit 2db154b3ea8e14b04fee23e3fdfd5e9d17fbc6ae
        vfs: syscall: Add move_mount(2) to move mounts around
      
        linux commit 24dcb3d90a1f67fe08c68a004af37df059d74005
        vfs: syscall: Add fsopen() to prepare for superblock creation
      
        linux commit ecdab150fddb42fe6a739335257949220033b782
        vfs: syscall: Add fsconfig() for configuring and managing a context
      
        linux commit 93766fbd2696c2c4453dd8e1070977e9cd4e6b6d
        vfs: syscall: Add fsmount() to create a mount for a superblock
      
        linux commit cf3cba4a429be43e5527a3f78859b1bfd9ebc5fb
        vfs: syscall: Add fspick() to select a superblock for reconfiguration
      
        linux commit 9c8ad7a2ff0bfe58f019ec0abc1fb965114dde7d
        uapi, x86: Fix the syscall numbering of the mount API syscalls [ver #2]
      
        linux commit d8076bdb56af5e5918376cd1573a6b0007fc1a89
        uapi: Wire up the mount API syscalls on non-x86 arches [ver #2]
      b6076309
  7. 09 9月, 2019 1 次提交
    • R
      honor __WCHAR_TYPE__ on archs with legacy long definition of wchar_t · 1f0e9f9c
      Rich Felker 提交于
      historically, a number of 32-bit archs used long rather than int for
      wchar_t, for no good reason. GCC still uses the historical types, but
      clang replaced them all with int, and it seems PCC uses int too.
      mismatching the compiler's type for wchar_t is not an option due to
      wide string literals.
      
      note that the mismatch does not affect C++ ABI since wchar_t is its
      own builtin type/keyword in C++, distinct from both int and long, not
      a typedef.
      
      i386 already worked around this by honoring __WCHAR_TYPE__ if defined
      by the compiler, and only using the official legacy ABI type if not.
      add the same to the other affected archs.
      
      it might make sense at some point to switch to using int as the
      default if __WCHAR_TYPE__ is not defined, if the expectations is that
      new compilers will treat int as the correct choice, but it's unlikely
      that the case where __WCHAR_TYPE__ is undefined will ever be used
      anyway. I actually wanted to move the definition of wchar_t to the
      top-level shared alltypes.h.in, using __WCHAR_TYPE__ and falling back
      to int if not defined, but that can't be done without assuming all
      compilers define __WCHAR_TYPE__ thanks to some pathological archs
      where the ABI has wchar_t as an unsigned type.
      1f0e9f9c
  8. 19 8月, 2019 1 次提交
    • R
      fix clash between sys/user.h and kernel ptrace.h on powerpc[64], sh · 6ad514e4
      Rich Felker 提交于
      due to historical accident/sloppiness in glibc, the powerpc,
      powerpc64, and sh versions of struct user, defined by sys/user.h, used
      struct pt_regs from the kernel asm/ptrace.h for their regs member.
      this made it impossible to define the type in an API-compatible manner
      without either including asm/ptrace.h like glibc does (contrary to our
      policy of not depending on kernel headers), or clashing with
      asm/ptrace.h's definition of struct pt_regs if both headers are
      included (which is almost always the case in software using
      sys/user.h).
      
      for a long time I viewed this problem as having no reasonable fix. I
      even explored the possibility of having the powerpc[64] and sh
      versions of user.h just include the kernel header (breaking with
      policy), but that looked like it might introduce new clashes with
      sys/ptrace.h. and it would also bring in a lot of additional cruft
      that makes no sense for sys/user.h to expose. glibc goes out of its
      way to suppress some of that with #undef, possibly leading to
      different problems. this is a rabbit-hole that should be explored no
      further.
      
      as it turns out, however, nothing actually uses struct user
      sufficiently to care about the type of the regs member; most software
      including sys/user.h does not even use struct user at all. so, the
      problem can be fixed just by doing away with the insistence on strict
      glibc API compatibility for the struct tag of the regs member.
      
      rather than renaming the tag, which might lead to the new name
      entering use as API, simply use an untagged structure inside struct
      user with the same members/layout as struct pt_regs.
      
      for sh, struct pt_dspregs is just removed entirely since it was not
      used.
      6ad514e4
  9. 14 8月, 2019 1 次提交
  10. 12 8月, 2019 1 次提交
    • S
      add support for powerpc/powerpc64 unaligned relocations · 08869deb
      Samuel Holland 提交于
      R_PPC_UADDR32 (R_PPC64_UADDR64) has the same meaning as R_PPC_ADDR32
      (R_PPC64_ADDR64), except that its address need not be aligned. For
      powerpc64, BFD ld(1) will automatically convert between ADDR<->UADDR
      relocations when the address is/isn't at its native alignment. This
      will happen if, for example, there is a pointer in a packed struct.
      
      gold and lld do not currently generate R_PPC64_UADDR64, but pass
      through misaligned R_PPC64_ADDR64 relocations from object files,
      possibly relaxing them to misaligned R_PPC64_RELATIVE. In both cases
      (relaxed or not) this violates the PSABI, which defines the relevant
      field type as "a 64-bit field occupying 8 bytes, the alignment of
      which is 8 bytes unless otherwise specified."
      
      All three linkers violate the PSABI on 32-bit powerpc, where the only
      difference is that the field is 32 bits wide, aligned to 4 bytes.
      
      Currently musl fails to load executables linked by BFD ld containing
      R_PPC64_UADDR64, with the error "unsupported relocation type 43".
      This change provides compatibility with BFD ld on powerpc64, and any
      static linker on either architecture that starts following the PSABI
      more closely.
      08869deb
  11. 07 8月, 2019 2 次提交
    • R
      remove riscv64 bits/user.h contents · d493206d
      Rich Felker 提交于
      the contents conflicted with asm/ptrace.h. glibc does not provide
      anything in user.h for riscv, so software cannot be depending on it.
      
      simplified from patch submitted by Baruch Siach.
      d493206d
    • B
      fix risc64 conflict with kernel headers · 8acc6885
      Baruch Siach 提交于
      Rename user registers struct definitions to avoid conflict with the
      asm/ptrace.h kernel header that defines the same structs. Use the
      __riscv_mc prefix as glibc does.
      8acc6885
  12. 04 8月, 2019 1 次提交
    • R
      update riscv64 syscall numbers to linux v5.1 · 6fcb440d
      Rich Felker 提交于
      commit f3f96f2d added these for the
      rest of the archs, but the patch it corresponded to missed riscv64
      since riscv64 was not yet upstream at the time. this caused commit
      dfc81828 to break riscv64 build, due
      to a wrong assumption that SYS_statx was unconditionally defined.
      6fcb440d
  13. 02 8月, 2019 1 次提交
    • R
      move IPC_STAT definition to a new bits/ipcstat.h file · 006a75a9
      Rich Felker 提交于
      otherwise, 32-bit archs that could otherwise share the generic
      bits/ipc.h would need to duplicate the struct ipc_perm definition,
      obscuring the fact that it's the same. sysvipc is not widely used and
      these headers are not commonly included, so there is no performance
      gain to be had by limiting the number of indirectly included files
      here.
      
      files with the existing time32 definition of IPC_STAT are added to all
      current 32-bit archs now, so that when it's changed the change will
      show up as a change rather than addition of a new file where it's less
      obvious that the value is changing vs the generic one that was used
      before.
      006a75a9
  14. 01 8月, 2019 2 次提交
    • 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
  15. 31 7月, 2019 3 次提交
    • R
      remove gratuitously-different arch-specific bits/ipc.h files · 319b2d02
      Rich Felker 提交于
      these differ from generic only in using endian-matched padding with a
      short __ipc_perm_seq field in place of the int field in generic. this
      is not a documented public interface anyway, and the original intent
      was to use int here. some ports just inadvertently slipped in the
      kernel short+padding form.
      319b2d02
    • R
      remove arch-specific bits/ipc.h that are identical to generic · 2a0bb9e0
      Rich Felker 提交于
      previously these differed from generic because they needed their own
      definitions of IPC_64. now that it's no longer in public header,
      they're identical.
      2a0bb9e0
    • R
      move IPC_64 from public bits/ipc.h to syscall_arch.h · f56d57f8
      Rich Felker 提交于
      the definition of the IPC_64 macro controls the interface between libc
      and the kernel through syscalls; it's not a public API. the meaning is
      rather obscure. long ago, Linux's sysvipc *id_ds structures used
      16-bit uids/gids and wrong types for a few other fields. this was in
      the libc5 era, before glibc. the IPC_64 flag (64 is a misnomer; it's
      more like 32) tells the kernel to use the modern[-ish] versions of the
      structures.
      
      the definition of IPC_64 has nothing to do with whether the arch is
      32- or 64-bit. rather, due to either historical accident or
      intentional obnoxiousness, the kernel only accepts and masks off the
      0x100 IPC_64 flag conditional on CONFIG_ARCH_WANT_IPC_PARSE_VERSION,
      i.e. for archs that want to provide, or that accidentally provided,
      both. for archs which don't define this option, no masking is
      performed and commands with the 0x100 bit set will fail as invalid. so
      ultimately, the definition is just a matter of matching an arbitrary
      switch defined per-arch in the kernel.
      f56d57f8
  16. 30 7月, 2019 12 次提交
  17. 29 7月, 2019 1 次提交
    • R
      remove x32 syscall timespec fixup hacks · 4c307bed
      Rich Felker 提交于
      the x32 syscall interfaces treat timespec's tv_nsec member as 64-bit
      despite the API type being long and long being 32-bit in the ABI. this
      is no problem for syscalls that store timespecs to userspace as
      results, but caused uninitialized padding to be misinterpreted as the
      high bits in syscalls that take timespecs as input.
      
      since the beginning of the port, we've dealt with this situation with
      hacks in syscall_arch.h, and injected between __syscall_cp_c and
      __syscall_cp_asm, to special-case the syscall numbers that involve
      timespecs as inputs and copy them to a form suitable to pass to the
      kernel.
      
      commit 40aa18d5 set the stage for
      removal of these hacks by letting us treat the "normal" x32 syscalls
      dealing with timespec as if they're x32's "time64" syscalls,
      effectively making x32 ax "time64-only 32-bit arch" like riscv32 will
      be when it's added. since then, all users of syscalls that x32's
      syscall_arch.h had hacks for have been updated to use time64 syscalls,
      so the hacks can be removed.
      
      there are still at least a few other timespec-related syscalls broken
      on x32, which were overlooked when the x32 hacks were done or added
      later. these include at least recvmmsg, adjtimex/clock_adjtime, and
      timerfd_settime, and they will be fixed independently later on.
      4c307bed
  18. 28 7月, 2019 1 次提交
    • R
      internally, define time64 syscalls on x32 as the existing syscalls · 40aa18d5
      Rich Felker 提交于
      x32 is odd in that it's the only ILP32 arch/ABI we have where time_t
      is 64-bit rather than (32-bit) long, and this has always been
      problematic in that it results in struct timespec having unused
      padding space, since tv_nsec has type long, which the kernel insists
      be zero- or sign-extended (due to negative tv_nsec being invalid, it
      doesn't matter which) to match the x86_64 type.
      
      up til now, we've had really ugly hacks in x32/syscall_arch.h to patch
      up the timespecs passed to the kernel. but the same requirement to
      zero- or sign-extend tv_nsec also applies to all the new time64
      syscalls on true 32-bit archs. so let's take advantage of this to
      clean things up.
      
      this patch defines all of the time64 syscalls for x32 as aliases for
      the existing syscalls by the same name. this establishes the following
      invariants:
      
      - if the time64 form is defined, it takes time arguments as 64-bit
        objects, and tv_nsec inputs must be zero-/sign-extended to 64-bit.
      
      - if the time64 form is not defined, or if the time64 form is defined
        and is not equal to the "plain" form, the plain form takes time
        arguments as longs.
      
      this will avoid the need for protocols for archs to define appropriate
      types for each family of syscalls, and for the reader of the code to
      have to be aware of such type definitions.
      
      in some sense it might be simpler if the plain syscall form were
      undefined for x32, so that it would always take longs if defined.
      however, a number of these syscalls are used in contexts with a null
      time argument, or (e.g. futex) for commands that don't involve time at
      all, and having to introduce time64-specific logic to all those call
      points does not make sense. thus, while the "plain" forms are kept now
      just because they're needed until the affected code is converted over,
      they'll also almost surely be kept in the future as well.
      40aa18d5