summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorLines
2019-12-31fix crashing ldso on archs where __set_thread_area examines auxvRich Felker-13/+13
commit 1c84c99913bf1cd47b866ed31e665848a0da84a2 moved the call to __init_tp above the initialization of libc.auxv, inadvertently breaking archs where __set_thread_area examines auxv for the sake of determining the TLS/atomic model needed at runtime. this broke armv6 and sh2.
2019-12-31move stage3_func typedef out of shared internal dynlink.h headerRich Felker-1/+2
this interface contract is entirely internal to dynlink.c.
2019-12-30mips: add clone3 syscall numbers from linux v5.4Szabolcs Nagy-0/+3
the syscall numbers were reserved in v5.3 but not wired up on mips, see linux commit 0671c5b84e9e0a6d42d22da9b5d093787ac1c5f3 MIPS: Wire up clone3 syscall
2019-12-30mips: add hwcap bits from linux v5.4Szabolcs Nagy-0/+11
mips application specific isa extensions were previously not exported in hwcaps so userspace could not apply optimized code at runtime. linux commit 38dffe1e4dde1d3174fdce09d67370412843ebb5 MIPS: elf_hwcap: Export userspace ASEs
2019-12-30sys/wait.h: add P_PIDFD from linux v5.4Szabolcs Nagy-1/+2
allows waiting on a pidfd, in the future it might allow retrieving the exit status by a non-parent process, see linux commit 3695eae5fee0605f316fbaad0b9e3de791d7dfaf pidfd: add P_PIDFD to waitid()
2019-12-30netinet/tcp.h: add new tcp_info fields from linux v5.4Szabolcs Nagy-0/+2
tcpi_rcv_ooopack for tracking connection quality: linux commit f9af2dbbfe01def62765a58af7fbc488351893c3 tcp: Add TCP_INFO counter for packets received out-of-order tcpi_snd_wnd peer window size for diagnosing tcp performance problems: linux commit 8f7baad7f03543451af27f5380fc816b008aa1f2 tcp: Add snd_wnd to TCP_INFO
2019-12-30sys/prctl.h: add PR_*_TAGGED_ADDR_* from linux v5.4Szabolcs Nagy-0/+4
per thread prctl commands to relax the syscall abi such that top bits of user pointers are ignored in the kernel. this allows the use of those bits by hwasan or by mte to color pointers and memory on aarch64: linux commit 63f0c60379650d82250f22e4cf4137ef3dc4f43d arm64: Introduce prctl() options to control the tagged user addresses ABI
2019-12-30sys/mman.h: add MADV_COLD and MADV_PAGEOUT from linux v5.4Szabolcs Nagy-0/+2
These were mainly introduced so android can optimize the memory usage of unused apps. MADV_COLD hints that the memory range is currently not needed (unlike with MADV_FREE the content is not garbage, it needs to be swapped): linux commit 9c276cc65a58faf98be8e56962745ec99ab87636 mm: introduce MADV_COLD MADV_PAGEOUT hints that the memory range is not needed for a long time so it can be reclaimed immediately independently of memory pressure (unlike with MADV_DONTNEED the content is not garbage): linux commit 1a4e58cce84ee88129d5d49c064bd2852b481357 mm: introduce MADV_PAGEOUT
2019-12-30add clone3 syscall number from linux v5.3Szabolcs Nagy-0/+12
the syscall number is reserved on all targets, but it is not wired up on all targets, see linux commit 8f6ccf6159aed1f04c6d179f61f6fb2691261e84 Merge tag 'clone3-v5.3' of ... brauner/linux linux commit 8f3220a806545442f6f26195bc491520f5276e7c arch: wire-up clone3() syscall linux commit 7f192e3cd316ba58c88dfa26796cf77789dd9872 fork: add clone3
2019-12-30add pidfd_open syscall number from linux v5.3Szabolcs Nagy-0/+16
see linux commit 7615d9e1780e26e0178c93c55b73309a5dc093d7 arch: wire-up pidfd_open() linux commit 32fcb426ec001cb6d5a4a195091a8486ea77e2df pid: add pidfd_open()
2019-12-30sys/ptrace.h: add PTRACE_GET_SYSCALL_INFO from linux v5.3Szabolcs Nagy-0/+28
ptrace API to get details of the syscall the tracee is blocked in, see linux commit 201766a20e30f982ccfe36bebfad9602c3ff574a ptrace: add PTRACE_GET_SYSCALL_INFO request the align attribute was used to keep the layout the same across targets e.g. on m68k uint32_t is 2 byte aligned, this helps with compat ptrace.
2019-12-30sys/socket.h: add SO_DETACH_REUSEPORT_BPF from linux v5.3Szabolcs Nagy-0/+1
see linux commit 99f3a064bc2e4bd5fe50218646c5be342f2ad18c bpf: net: Add SO_DETACH_REUSEPORT_BPF
2019-12-30netinet/if_ether.h: add ETH_P_LLDP from linux v5.3Szabolcs Nagy-0/+1
see linux commit c54c2c72b2b90a3ba61b8cad032a578ce2bf5b35 net: Add a define for LLDP ethertype
2019-12-30netinet/tcp.h: add TCP_TX_DELAY from linux v5.3Szabolcs Nagy-0/+1
see linux commit a842fe1425cb20f457abd3f8ef98b468f83ca98b tcp: add optional per socket transmit delay
2019-12-30fix types for mips sigcontext/mcontext_t regset membersKhem Raj-2/+6
2019-12-22spare archs without time32 legacy the cost of ioctl fallback conversionsRich Felker-1/+1
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.
2019-12-22add further ioctl time64 fallback conversion for device-specific commandRich Felker-0/+3
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.
2019-12-22add uapi guards for new netinet/ip.h conflict with struct iphdrA. Wilcox-0/+2
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.
2019-12-22adjust utmpx struct layout for time64, 32-/64-bit arch compatRich Felker-1/+6
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.
2019-12-22fix elf_prstatus regression on time64, existing wrong definition on x32Rich Felker-4/+3
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.
2019-12-21don't continue looping through ioctl compat_map after finding matchRich Felker-0/+1
there's only one matching entry for any given command so this had no functional distinction, but additional loops are pointless and wasteful.
2019-12-20revert unwanted and inadvertent change that slipped into mmap.cRich Felker-1/+0
commit ae388becb529428ac926da102f1d025b3c3968da accidentally introduced #define SYSCALL_NO_TLS 1 in mmap.c, which was probably a stale change left around from unrelated syscall timing measurements. reverse it.
2019-12-20add further ioctl time64 fallback conversionsRich Felker-1/+49
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.
2019-12-19improve ioctl time64 conversion fallback frameworkRich Felker-17/+18
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.
2019-12-18convert ioctl time64 fallbacks to table-driven frameworkRich Felker-17/+66
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.
2019-12-18fix regression in ioctl definitions provided by arch/generic bitsRich Felker-0/+1
commit b60fdf133c033d4ad6b04a8237f253563fae5928 broke the SIOCGSTAMP[NS] ioctl fallbacks introduced in commit 2e554617e5a6a41bf3f6c6306c753cd53abf728c, as well as use of these ioctls, by creating a situation where bits/ioctl.h could be included without __LONG_MAX being visible.
2019-12-17hook recvmmsg up to SO_TIMESTAMP[NS] fallback for pre-time64 kernelsRich Felker-6/+14
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.
2019-12-17implement SO_TIMESTAMP[NS] fallback for kernels without time64 versionsRich Felker-0/+71
the definitions of SO_TIMESTAMP* changed on 32-bit archs in commit 38143339646a4ccce8afe298c34467767c899f51 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.
2019-12-17signal to kernel headers that time_t is 64-bitRich Felker-0/+1
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.
2019-12-08fix null pointer dereference in setitimer time32 compat shimRich Felker-4/+6
this interface permits a null pointer for where to store the old itimerval being replaced. an early version of the time32 compat shim code had corresponding bugs for lots of functions; apparently setitimer was overlooked when fixing them.
2019-12-07arm: avoid conditional branch to PLT in sigsetjmpAndre McCurdy-2/+3
The R_ARM_THM_JUMP19 relocation type generated for the original code when targeting Thumb 2 is not supported by the gold linker.
2019-12-07riscv64: fix fesetenv(FE_DFL_ENV) crashRuinland ChuanTzu Tsai-1/+4
When FE_DFL_ENV is passed to fesetenv(), the very first instruction lw t1, 0(a0) will fail since a0 is -1.
2019-12-07update contributor nameAda Worcester-1/+2
This changes my name in the COPYRIGHT file, and adds a .mailmap entry for my new name.
2019-11-05ppc: add configure check for older compilers erroring on 'd' constraintrofl0r-2/+11
2019-11-05fix build regression on mips64 due to endian.h removalRich Felker-0/+2
commit 4d3a162d001a93edd285fb6603a883c30ae553ba 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 316730cdc7a330cddf288b4e5c1de5daa64e19f4, the feature test macro is no longer needed to access the endian-swapping macros, so simply bringing back the #include directive suffices.
2019-11-04fix failure to build time32 compat shims with out-of-tree buildsRich Felker-1/+1
commit de90f38e3b105802655d19d965d66335d25d59ef omitted $(srcdir) from the makefile include pathname it added. since the include directive was prefixed with - to make it optional (for archs that don't use it), the failure to find arch/$(ARCH)/arch.mak was silent.
2019-11-03fix time64 link regression of dlsym stub for static-linked programsRich Felker-0/+4
in commit 22daaea39f1cc5f7391f0a5cd84576ffb58c2860, 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.
2019-11-02move time_t and suseconds_t definitions to common alltypes.h.inRich Felker-48/+2
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.
2019-11-02move time64 ioctl numbers to generic bits/ioctl.hRich Felker-21/+5
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.
2019-11-02move time64 socket options from arch bits to top-level sys/socket.hRich Felker-45/+11
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.
2019-11-02switch all existing 32-bit archs to 64-bit time_tRich Felker-217/+420
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.
2019-11-02add x32 bits/ioctl_fix.h defining time-related sockios macrosRich Felker-0/+4
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.
2019-11-02add back x32 bits/socket.h defining time-related socket optionsRich Felker-0/+5
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.
2019-11-02move msghdr and cmsghdr out of bits/socket.hRich Felker-208/+34
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 9b2921bea1d5017832e1b45d1fd64220047a9802 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.
2019-11-02fix x32 msghdr struct by removing x32 bits/socket.hRich Felker-16/+0
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.
2019-11-02make time-related socket options overridable by arch bits filesRich Felker-6/+11
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.
2019-11-02add framework for arch-provided makefile fragments, compat source dirsRich Felker-2/+3
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.
2019-11-02add __dlsym_time64 asm entry point for all legacy-32bit-time_t archsRich Felker-0/+27
2019-11-02add time64 redirect for, and redirecting implementation of, dlsymRich Felker-0/+31
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.
2019-11-02add time32 ABI compat shims, compat source treeRich Felker-0/+1039
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.