1. 31 12月, 2019 1 次提交
  2. 23 12月, 2019 5 次提交
    • R
      spare archs without time32 legacy the cost of ioctl fallback conversions · d01fdc77
      Rich Felker 提交于
      adding this condition makes the entire convert_ioctl_struct function
      and compat_map table statically unreachable, and thereby optimized out
      by dead code elimination, on archs where they are not needed.
      d01fdc77
    • R
      add further ioctl time64 fallback conversion for device-specific command · f9895817
      Rich Felker 提交于
      VIDIOC_OMAP3ISP_STAT_REQ is a device-specific command for the omap3isp
      video device. the command number is in a device-private range and
      therefore could theoretically be used by other devices too in the
      future, but problematic clashes should not be able to arise without
      intentional misuse.
      f9895817
    • A
      add uapi guards for new netinet/ip.h conflict with struct iphdr · 0738e6c1
      A. Wilcox 提交于
      This ensures that the musl definition of 'struct iphdr' does not conflict
      with the Linux kernel UAPI definition of it.
      
      Some software, i.e. net-tools, will not compile against 5.4 kernel headers
      without this patch and the corresponding Linux kernel patch.
      0738e6c1
    • R
      adjust utmpx struct layout for time64, 32-/64-bit arch compat · 1e7f0fcd
      Rich Felker 提交于
      since time64 switchover has changed the size and layout of the struct
      anyway, take the opportunity to fix it up so that it can be shared
      between 32- and 64-bit ABIs on the same system as long as byte order
      matches.
      
      the ut_type member is explicitly padded to make up for m68k having
      only 2-byte alignment; explicit padding has no effect on other archs.
      
      ut_session is changed from long to int, with endian-matched padding.
      this affects 64-bit archs as well, but brings the type into alignment
      with glibc's x86_64 struct, so it should not break software, and does
      not break on-disk format. the semantic type is int (pid-like) anyway.
      the padding produces correct alignment for the ut_tv member on 32-bit
      archs that don't naturally align it, so that ABI matches 64-bit.
      
      this type is presently not used anywhere in the ABI between libc and
      libc consumers; it's only used between pairs of consumers if a
      third-party utmp library using the system utmpx.h is in use.
      1e7f0fcd
    • R
      fix elf_prstatus regression on time64, existing wrong definition on x32 · 3f959f6f
      Rich Felker 提交于
      the elf_prstatus structure is used in core dumps, and the timeval
      structures in it are longs matching the elf class, *not* the kernel
      "old timeval" for the arch. this means using timeval here for x32 was
      always wrong, despite kernel uapi headers and glibc also exposing it
      this way, and of course it's wrong for any arch with 64-bit time_t.
      
      rather than just changing the type on affected archs, use a tagless
      struct containing long tv_sec and tv_usec members in place of the
      timevals. this intentionally breaks use of them as timevals (e.g.
      assignment, passing address, etc.) on 64-bit archs as well so that any
      usage unsafe for 32-bit archs is caught even in software that only
      gets tested on 64-bit archs. from what I could gather, there is not
      any software using these members anyway. the only reason they need to
      be fixed to begin with is that the only members which are commonly
      used, the saved registers, follow the time members and have the wrong
      offset if the time members are sized incorrectly.
      3f959f6f
  3. 22 12月, 2019 1 次提交
  4. 21 12月, 2019 1 次提交
  5. 20 12月, 2019 1 次提交
    • R
      add further ioctl time64 fallback conversions · 2412638b
      Rich Felker 提交于
      this commit covers all remaining ioctls I'm aware of that use
      time_t-derived types in their interfaces. it may still be incomplete,
      and has undergone only minimal testing for a few commands used in
      audio playback.
      
      the SNDRV_PCM_IOCTL_SYNC_PTR command is special-cased because, rather
      than the whole structure expanding, it has two substructures each
      padded to 64 bytes that expand within their own 64-byte reserved zone.
      as long as it's the only one of its type, it doesn't really make sense
      to make a general framework for it, but the existing table framework
      is still used for the substructures in the special-case. one of the
      substructures, snd_pcm_mmap_status, has a snd_pcm_uframes_t member
      which is not a timestamp but is expanded just like one, to match the
      64-bit-arch version of the structure. this is handled just like a
      timestamp at offset 8, and is the motivation for the conversions table
      holding offsets of individual values to be expanded rather than
      timespec/timeval type pairs.
      
      for some of the types, the size to which they expand is dependent on
      whether the arch's ABI aligns 8-byte types on 8-byte boundaries.
      new_req entries in the table need to reflect this size to get the
      right ioctl request number that will match what callers pass, but we
      don't have access to the actual structure type definitions here and
      duplicating them would be cumbersome. instead, the new_misaligned
      macro introduced here constructs an artificial object whose size is
      the result of expanding a misaligned timespec/timeval to 64-bit and
      imposing the arch's alignment on the result, which can be passed to
      the _IO{R,W,WR} macros.
      2412638b
  6. 19 12月, 2019 3 次提交
    • R
      improve ioctl time64 conversion fallback framework · 64d0e865
      Rich Felker 提交于
      record offsets of individual slots that expand from 32- to 64-bit,
      rather than timespec/timeval pairs. this flexibility will be needed
      for some ioctls. reduce size of types in table. adjust representation
      of offsets to include a count rather than needing -1 padding so that
      the table is less ugly and doesn't need large diffs if we increase max
      number of slots.
      64d0e865
    • R
      convert ioctl time64 fallbacks to table-driven framework · 221b1a1d
      Rich Felker 提交于
      with the current set of supported ioctls, this conversion is hardly an
      improvement, but it sets the stage for being able to do alsa, v4l2,
      ppp, and other ioctls with timespec/timeval-derived types. without
      this capability, a lot of functionality users depend on would stop
      working with the time64 switchover.
      221b1a1d
    • R
      fix regression in ioctl definitions provided by arch/generic bits · b3290956
      Rich Felker 提交于
      commit b60fdf13 broke the
      SIOCGSTAMP[NS] ioctl fallbacks introduced in commit
      2e554617, as well as use of these
      ioctls, by creating a situation where bits/ioctl.h could be included
      without __LONG_MAX being visible.
      b3290956
  7. 18 12月, 2019 3 次提交
    • R
      hook recvmmsg up to SO_TIMESTAMP[NS] fallback for pre-time64 kernels · 114178dc
      Rich Felker 提交于
      always try the time64 syscall first since we can use its success to
      conclude that no conversion is needed (any setsockopt for the
      timestamp options would have succeeded without need for fallbacks).
      otherwise, we have to remember the original controllen for each
      msghdr, requiring O(vlen) space, so vlen must be bounded. linux clamps
      it to IOV_MAX for sendmmsg only (not recvmmsg), but doing the same for
      recvmmsg is not unreasonable, especially since the limitation will
      only apply to old kernels.
      
      we could optimize to avoid trying SYS_recvmmsg_time64 first if all
      msghdrs have controllen zero, or support unlimited vlen by looping and
      emulating the timeout logic, but I'm not inclined to do complex and
      error-prone optimizations on a function that has so many underlying
      problems it should really never be used.
      114178dc
    • 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
    • R
      signal to kernel headers that time_t is 64-bit · f12bd8e0
      Rich Felker 提交于
      linux/input.h and perhaps others use this macro to determine whether
      the userspace time_t is 64-bit when potentially defining types in
      terms of time_t and derived structures. the name __USE_TIME_BITS64 is
      unfortunate; it really should have been in the __UAPI namespace. but
      this is what was chosen back in v4.16 when first preparing input.h for
      time64 userspace, presumably based on expectations about what the
      glibc-internal features.h macro for time64 would be, and changing it
      now would just put a new minimum version requirement on kernel
      headers.
      
      the __USE_TIME_BITS64 macro is not intended as a public interface. it
      is purely an internal contract between libc and Linux uapi headers.
      f12bd8e0
  8. 08 12月, 2019 4 次提交
  9. 06 11月, 2019 1 次提交
  10. 05 11月, 2019 1 次提交
    • R
      fix build regression on mips64 due to endian.h removal · 90251cf7
      Rich Felker 提交于
      commit 4d3a162d overlooked that the
      mips64 reloc.h dependent on endian.h not only for setting the ABI ldso
      name to match the byte order, but also for use of the byte swapping
      macros. they are needed to override R_TYPE, R_SYM, and R_INFO, to
      compensate for a mips "quirk" of always using big endian order for
      symbol references in relocations.
      
      part of that commit canot be reverted because the original code was
      wrong: it's invalid to define _GNU_SOURCE or any feature test macro
      in reloc.h, or anywhere except at the top of a source file. however,
      thanks to commit 316730cd, the feature
      test macro is no longer needed to access the endian-swapping macros,
      so simply bringing back the #include directive suffices.
      90251cf7
  11. 04 11月, 2019 1 次提交
  12. 03 11月, 2019 14 次提交
    • R
      fix time64 link regression of dlsym stub for static-linked programs · 028092b6
      Rich Felker 提交于
      in commit 22daaea3, the
      __dlsym_redir_time64 function providing the backend for __dlsym_time64
      was defined only in the dynamic linker, and thus was undefined when
      static linking a program referencing dlsym. use the same stub_dlsym
      definition that provides __dlsym (the non-redirecting backend) for
      static linked programs to provide it, conditional on _REDIR_TIME64.
      028092b6
    • R
      move time_t and suseconds_t definitions to common alltypes.h.in · d6dcfe4d
      Rich Felker 提交于
      now that all 32-bit archs have 64-bit time_t (and suseconds_t), the
      arch-provided _Int64 macro (long or long long, as appropriate) can be
      used to define them, and arch-specific definitions are no longer
      needed.
      d6dcfe4d
    • R
      move time64 ioctl numbers to generic bits/ioctl.h · b60fdf13
      Rich Felker 提交于
      now that all 32-bit archs have 64-bit time types, the values for the
      time-related ioctls can be shared. the mechanism for this is an
      arch/generic version of the bits header. archs which don't use the
      generic header still need to duplicate the definitions.
      
      x32, which does not use the new time64 values of the macros, already
      has its own overrides, so this commit does not affect it.
      b60fdf13
    • R
      move time64 socket options from arch bits to top-level sys/socket.h · c71dbb24
      Rich Felker 提交于
      now that all 32-bit archs have 64-bit time types, the values for the
      time-related socket option macros can be treated as universal for
      32-bit archs. the sys/socket.h mechanism for this predates
      arch/generic and is instead in the top-level header.
      
      x32, which does not use the new time64 values of the macros, already
      has its own overrides, so this commit does not affect it.
      c71dbb24
    • R
      switch all existing 32-bit archs to 64-bit time_t · 38143339
      Rich Felker 提交于
      this commit preserves ABI fully for existing interface boundaries
      between libc and libc consumers (applications or libraries), by
      retaining existing symbol names for the legacy 32-bit interfaces and
      redirecting sources compiled against the new headers to alternate
      symbol names. this does not necessarily, however, preserve the
      pairwise ABI of libc consumers with one another; where they use
      time_t-derived types in their interfaces with one another, it may be
      necessary to synchronize updates with each other.
      
      the intent is that ABI resulting from this commit already be stable
      and permanent, but it will not be officially so until a release is
      made. changes to some header-defined types that do not play any role
      in the ABI between libc and its consumers may still be subject to
      change.
      
      mechanically, the changes made by this commit for each 32-bit arch are
      as follows:
      
      - _REDIR_TIME64 is defined to activate the symbol redirections in
        public headers
      
      - COMPAT_SRC_DIRS is defined in arch.mak to activate build of ABI
        compat shims to serve as definitions for the original symbol names
      
      - time_t and suseconds_t definitions are changed to long long (64-bit)
      
      - IPC_STAT definition is changed to add the IPC_TIME64 bit (0x100),
        triggering conversion of semid_ds, shmid_ds, and msqid_ds split
        low/high time bits into new time_t members
      
      - structs semid_ds, shmid_ds, msqid_ds, and stat are modified to add
        new 64-bit time_t/timespec members at the end, maintaining existing
        layout of other members.
      
      - socket options (SO_*) and ioctl (sockios) command macros are
        redefined to use the kernel's "_NEW" values.
      
      in addition, on archs where vdso clock_gettime is used, the
      VDSO_CGT_SYM macro definition in syscall_arch.h is changed to use a
      new time64 vdso function if available, and a new VDSO_CGT32_SYM macro
      is added for use as fallback on kernels lacking time64.
      38143339
    • R
      add x32 bits/ioctl_fix.h defining time-related sockios macros · 5127927f
      Rich Felker 提交于
      these definitions are copied from generic bits/ioctl.h, so that x32
      keeps the "_OLD" versions (which are already time64 on x32) when
      32-bit archs switch to 64-bit time_t.
      5127927f
    • R
      add back x32 bits/socket.h defining time-related socket options · aad3e0c5
      Rich Felker 提交于
      these definitions are merely copied from the top-level sys/socket.h,
      so there is no functional change at this time. however, the top-level
      definitions will change to use the time64 "_NEW" versions on 32-bit
      archs when time_t is switched over to 64-bit. this commit ensures that
      change will be suppressed on x32.
      aad3e0c5
    • R
      move msghdr and cmsghdr out of bits/socket.h · a0252bc7
      Rich Felker 提交于
      these structures can now be defined generically in terms of endianness
      and long size. previously, the 32-bit archs all shared a common
      definition from the generic bits header, and each 64-bit arch had to
      repeat the 64-bit version, with endian conditionals if the arch had
      variants of each endianness.
      
      I would prefer getting rid of the preprocessor conditionals for
      padding and instead using unnamed bitfield members, like commit
      9b2921be did for struct timespec.
      however, at present sendmsg, recvmsg, and recvmmsg need access to the
      padding members by name to zero them. this could perhaps be cleaned up
      in the future.
      a0252bc7
    • R
      fix x32 msghdr struct by removing x32 bits/socket.h · 573a4d2d
      Rich Felker 提交于
      being that it contains pointers and (from the kernel perspective,
      which is wrong) size_t members, x32 uses the 32-bit version of the
      structure, not a half-32-bit, half-64-bit layout like we had here. the
      x86_64 definition was inadvertently copied when x32 was first added.
      
      unlike errors in the opposite direction (missing padding), this error
      was not easily detected breakage, because the layout of the commonly
      used initial subset of members still matched. breakage could only be
      observed in the presence of control messages or flags.
      573a4d2d
    • R
      make time-related socket options overridable by arch bits files · 0bbc04c9
      Rich Felker 提交于
      SO_RCVTIMEO and SO_SNDTIMEO already were, but only in aggregate with
      SO_DEBUG and all of the other low/traditional options that varied per
      arch. SO_TIMESTAMP* are newly overridable. the two groups have to be
      done separately since mips64 and powerpc64 will override the former
      but not the latter.
      
      at some point this should be cleaned up to use bits headers more
      idiomatically.
      0bbc04c9
    • R
      add framework for arch-provided makefile fragments, compat source dirs · de90f38e
      Rich Felker 提交于
      the immediate usage case for this is to let 32-bit archs moving to
      64-bit time_t via symbol redirection pull in wrapper shims that
      provide the old symbol names. in the future it may be used for other
      types of compatibility-only source files that are not relevant to all
      archs.
      de90f38e
    • R
      5a25759a
    • R
      add time64 redirect for, and redirecting implementation of, dlsym · 22daaea3
      Rich Felker 提交于
      if symbols are being redirected to provide the new time64 ABI, dlsym
      must perform matching redirections; otherwise, it would poke a hole in
      the magic and return pointers to functions that are not safe to call
      from a caller using time64 types.
      
      rather than duplicating a table of redirections, use the time64
      symbols present in libc's symbol table to derive the decision for
      whether a particular symbol needs to be redirected.
      22daaea3
    • R
      add time32 ABI compat shims, compat source tree · c0450320
      Rich Felker 提交于
      these files provide the symbols for the traditional 32-bit time_t ABI
      on existing 32-bit archs by wrapping the real, internal versions of
      the corresponding functions, which always work with 64-bit time_t.
      they are written to be as agnostic as possible to the implementation
      details of the real functions, so that they can be written once and
      mostly forgotten, but they are aware of details of the old (and
      sometimes new) ABI, which is okay since ABI is fixed and cannot
      change.
      
      a new compat tree is added, separate from src, which the Makefile does
      not see or use now, but which archs will be able to add to the build
      process. we could also consider moving other things that are compat
      shims here, like functions which are purely for glibc-ABI-compat, with
      the goal of making it optional or just cleaning up the main src tree
      to make the distinction between actual implementation/API files and
      ABI-compat shims clear.
      c0450320
  13. 29 10月, 2019 4 次提交
    • R
      make fstatat fill in old time32 stat fields too · 0961bb94
      Rich Felker 提交于
      here _REDIR_TIME64 is used as an indication that there's an old ABI,
      and thereby the old time32 timespec fields of struct stat.
      
      keeping struct stat compatible and providing both versions of the
      timespec fields is done so that ftw/nftw does not need painful compat
      shims, and (more importantly) so that similar interfaces between pairs
      of libc consumers (applications/libraries) will be less likely to
      break when one has been rebuilt for time64 but the other has not.
      0961bb94
    • R
      disable lfs64 aliases for remapped time64 functions · 50018f92
      Rich Felker 提交于
      these functions cannot provide the glibc lfs64-ABI-compatible symbols
      when time_t differs from what it was in that ABI. instead, the aliases
      need to be provided by the time32 compat shims or through some other
      mechanism.
      50018f92
    • R
      prepare struct sched_param for change in time_t definition · 2d69fcf5
      Rich Felker 提交于
      the time_t members in struct sched_param are just reserved space to
      preserve size and alignment. when time_t changes to 64-bit on 32-bit
      archs, this structure should not change.
      
      make definition conditional on _REDIR_TIME64 to match the size of the
      old time_t, which can be assumed to be long if _REDIR_TIME64 is
      defined.
      2d69fcf5
    • R
      add time64 symbol name redirects to public headers, under arch control · 1febd21d
      Rich Felker 提交于
      a _REDIR_TIME64 macro is introduced, which the arch's alltypes.h is
      expected to define, to control redirection of symbol names for
      interfaces that involve time_t and derived types. this ensures that
      object files will only be linked to libc interfaces matching the ABI
      whose headers they were compiled against.
      
      along with time32 compat shims, which will be introduced separately,
      the redirection also makes it possible for a single libc (static or
      shared) to be used with object files produced with either the old
      (32-bit time_t) headers or the new ones after 64-bit time_t switchover
      takes place. mixing of such object files (or shared libraries) in the
      same program will also be possible, but must be done with care; ABI
      between libc and a consumer of the libc interfaces is guaranteed to
      match by the the symbol name redirection, but pairwise ABI between
      consumers of libc that define interfaces between each other in terms
      of time_t is not guaranteed to match.
      
      this change adds a dependency on an additional "GNU C" feature to the
      public headers for existing 32-bit archs, which is generally
      undesirable; however, the feature is one which glibc has depended on
      for a long time, and thus which any viable alternative compiler is
      going to need to provide. 64-bit archs are not affected, nor will
      future 32-bit archs be, regardless of whether they are "new" on the
      kernel side (e.g. riscv32) or just newly-added (e.g. a new sparc or
      xtensa port). the same applies to newly-added ABIs for existing
      machine-level archs.
      1febd21d