aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2021-03-19aarch64: Optimize __libc_mtag_tag_zero_regionnsz/mtagSzabolcs Nagy
This is a target hook for memory tagging, the original was a naive implementation. Uses the same algorithm as __libc_mtag_tag_region, but with instructions that also zero the memory. This was not benchmarked on real cpu, but expected to be faster than the naive implementation.
2021-03-19aarch64: Optimize __libc_mtag_tag_regionSzabolcs Nagy
This is a target hook for memory tagging, the original was a naive implementation. The optimized version relies on "dc gva" to tag 64 bytes at a time for large allocations and optimizes small cases without adding too many branches. This was not benchmarked on real cpu, but expected to be faster than the naive implementation.
2021-03-19aarch64: inline __libc_mtag_new_tagSzabolcs Nagy
This is a common operation when heap tagging is enabled, so inline the instructions instead of using an extern call.
2021-03-19aarch64: inline __libc_mtag_address_get_tagSzabolcs Nagy
This is a common operation when heap tagging is enabled, so inline the instruction instead of using an extern call. The .inst directive is used instead of the name of the instruction (or acle intrinsics) because malloc.c is not compiled for armv8.5-a+memtag architecture, runtime cpu support detection is used. Prototypes are removed from the comments as they were not always correct.
2021-03-19malloc: Use mtag_enabled instead of USE_MTAGSzabolcs Nagy
Use the runtime check where possible: it should not cause slow down in the !USE_MTAG case since then mtag_enabled is constant false, but it allows compiling the tagging logic so it's less likely to break or diverge when developers only test the !USE_MTAG case. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Use branches instead of mtag_granule_maskSzabolcs Nagy
The branches may be better optimized since mtag_enabled is widely used. Granule size larger than a chunk header is not supported since then we cannot have both the chunk header and user area granule aligned. To fix that for targets with large granule, the chunk layout has to change. So code that attempted to handle the granule mask generally was changed. This simplified CHUNK_AVAILABLE_SIZE and the logic in malloc_usable_size. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Change calloc when tagging is disabledSzabolcs Nagy
When glibc is built with memory tagging support (USE_MTAG) but it is not enabled at runtime (mtag_enabled) then unconditional memset was used even though that can be often avoided. This is for performance when tagging is supported but not enabled. The extra check should have no overhead: tag_new_zero_region already had a runtime check which the compiler can now optimize away. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Only support zeroing and not arbitrary memset with mtagSzabolcs Nagy
The memset api is suboptimal and does not provide much benefit. Memory tagging only needs a zeroing memset (and only for memory that's sized and aligned to multiples of the tag granule), so change the internal api and the target hooks accordingly. This is to simplify the implementation of the target hook. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Use global flag instead of function pointer dispatch for mtagSzabolcs Nagy
A flag check can be faster than function pointers because of how branch prediction and speculation works and it can also remove a layer of indirection when there is a mismatch between the malloc internal tag_* api and __libc_mtag_* target hooks. Memory tagging wrapper functions are moved to malloc.c from arena.c and the logic now checks mmap_enabled. The definition of tag_new_usable is moved after chunk related definitions. This refactoring also allows using mtag_enabled checks instead of USE_MTAG ifdefs when memory tagging support only changes code logic when memory tagging is enabled at runtime. Note: an "if (false)" code block is optimized away even at -O0 by gcc. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Refactor TAG_ macros to avoid indirectionSzabolcs Nagy
This does not change behaviour, just removes one layer of indirection in the internal memory tagging logic. Use tag_ and mtag_ prefixes instead of __tag_ and __mtag_ since these are all symbols with internal linkage, private to malloc.c, so there is no user namespace pollution issue. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Ensure the generic mtag hooks are not usedSzabolcs Nagy
Use inline functions instead of macros, because macros can cause unused variable warnings and type conversion issues. We assume these functions may appear in the code but only in dead code paths (hidden by a runtime check), so it's important that they can compile with correct types, but if they are actually used that should be an error. Currently the hooks are only used when USE_MTAG is true which only happens on aarch64 and then the aarch64 specific code is used not this generic header. However followup refactoring will allow the hooks to be used with !USE_MTAG. Note: the const qualifier in the comment was wrong: changing tags is a write operation. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Avoid taggig mmaped memory on freeSzabolcs Nagy
Either the memory belongs to the dumped area, in which case we don't want to tag (the dumped area has the same tag as malloc internal data so tagging is unnecessary, but chunks there may not have the right alignment for the tag granule), or the memory will be unmapped immediately (and thus tagging is not useful). Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Simplify __mtag_tag_new_usableSzabolcs Nagy
The chunk cannot be a dumped one here. The only non-obvious cases are free and realloc which may be called on a dumped area chunk, but in both cases it can be verified that tagging is already avoided for dumped area chunks. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19malloc: Move MTAG_MMAP_FLAGS definitionSzabolcs Nagy
This is only used internally in malloc.c, the extern declaration was wrong, __mtag_mmap_flags has internal linkage. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-19Remove PR_TAGGED_ADDR_ENABLE from sys/prctl.hSzabolcs Nagy
The value of PR_TAGGED_ADDR_ENABLE was incorrect in the installed headers and the prctl command macros were missing that are needed for it to be useful (PR_SET_TAGGED_ADDR_CTRL). Linux headers have the definitions since 5.4 so it's widely available, we don't need to repeat these definitions. The remaining definitions are from Linux 5.10. To build glibc with --enable-memory-tagging, Linux 5.4 headers and binutils 2.33.1 or newer is needed.
2021-03-19malloc: Fix a potential realloc issue with memory taggingSzabolcs Nagy
At an _int_free call site in realloc the wrong size was used for tag clearing: the chunk header of the next chunk was also cleared which in practice may work, but logically wrong. The tag clearing is moved before the memcpy to save a tag computation, this avoids a chunk2mem. Another chunk2mem is removed because newmem does not have to be recomputed. Whitespaces got fixed too.
2021-03-19malloc: Fix a realloc crash with heap tagging [BZ 27468]Szabolcs Nagy
_int_free must be called with a chunk that has its tag reset. This was missing in a rare case that could crash when heap tagging is enabled: when in a multi-threaded process the current arena runs out of memory during realloc, but another arena still has space to finish the realloc then _int_free was called without clearing the user allocation tags. Fixes bug 27468. Reviewed-by: DJ Delorie <dj@redhat.com>
2021-03-18support: Use syscall function instead of INLINE_SYSCALL_CALLAdhemerval Zanella
It fixes the build on ARM in thumb mode that requires an out of the line helper (__libc_do_syscall) to issue the syscall.
2021-03-18signal: Add __libc_sigactionAdhemerval Zanella
The generic implementation basically handle the system agnostic logic (filtering out the invalid signals) while the __libc_sigaction is the function with implements the system and architecture bits. Checked on x86_64-linux-gnu and i686-linux-gnu.
2021-03-18nptl: Move system to libcAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Move fcntl from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sendmsg from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recvmsg from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sigwait from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove tcdrain from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove pause from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove msync from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove fsync from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove sendto from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recvfrom from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove recv from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove connect from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove accept from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove close from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove read from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-18nptl: Remove write from libpthreadAdhemerval Zanella
The libc version is identical and built with same flags. Checked on x86_64-linux-gnu.
2021-03-16benchtests: Add ilogb* testsRaphael Moreira Zinsly
Add a benchtest to ilogb, ilogbf and ilogbf128 based on the logb* benchtests.
2021-03-16powerpc: Add optimized llogb* for POWER9Raphael Moreira Zinsly
The POWER9 builtins used to improve the ilogb* functions can be used in the llogb* functions as well.
2021-03-16powerpc: Add optimized ilogb* for POWER9Raphael Moreira Zinsly
The instructions xsxexpdp and xsxexpqp introduced on POWER9 extract the exponent from a double-precision and quad-precision floating-point respectively, thus they can be used to improve ilogb, ilogbf and ilogbf128.
2021-03-16glibcymbols.read_abilist: Add check for duplicate symbolsFlorian Weimer
This detects some bogus abilist files. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-16scripts/glibcsymbols.py: Extract from scripts/move-symbol-to-libc.pyFlorian Weimer
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-16Legacy unwinder: Remove definition of _Unwind_GetCFAFlorian Weimer
It is not actually used by the legacy unwinder linked into libc.so, and it conflicts with the unwind-link functionality in libpthread. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-16support: Pass environ to child processSiddhesh Poyarekar
Pass environ to posix_spawn so that the child process can inherit environment of the test.
2021-03-16powerpc: Update libm-test-ulpsMatheus Castanho
Generated with 'make regen-ulps' on POWER8. Tested on powerpc, powerpc64, and powerpc64le
2021-03-15Build libc-start with stack protector for SHAREDSiddhesh Poyarekar
This does not change the emitted code since __libc_start_main does not return, but is important for formal flags compliance. This also cleans up the cosmetic inconsistency in the stack protector flags in csu, especially the incorrect value of STACK_PROTECTOR_LEVEL. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-15Build get-cpuid-feature-leaf.c without stack-protector [BZ #27555]Siddhesh Poyarekar
__x86_get_cpuid_feature_leaf is called during early startup, before the stack check guard is initialized and is hence not safe to build with stack-protector. Additionally, IFUNC resolvers for static tst-ifunc-isa tests get called too early for stack protector to be useful, so fix them to disable stack protector for the resolver functions. This fixes all failures seen with --enable-stack-protector=all configuration. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-15Add inhibit_stack_protector to ifuncmain9 [BZ #25680]David Hughes
Enabling --enable-stack-protector=all causes the following tests to fail: FAIL: elf/ifuncmain9picstatic FAIL: elf/ifuncmain9static Nick Alcock (who committed the stack protector code) marked the IFUNC resolvers with inhibit_stack_protector when he done the original work and suggested doing so again @ BZ #25680. This patch adds inhibit_stack_protector to ifuncmain9. After patch is applied, --enable-stack-protector=all does not fail the above tests. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2021-03-15support: Typo and formatting fixesSiddhesh Poyarekar
- Add a newline to the end of error messages in transfer(). - Fixed the name of support_subprocess_init().
2021-03-15elf: ld.so --help calls _dl_init_paths without a main map [BZ #27577]Florian Weimer
In this case, use the link map of the dynamic loader itself as a replacement. This is more than just a hack: if we ever support DT_RUNPATH/DT_RPATH for the dynamic loader, reporting it for ld.so --help (without further command line arguments) would be the right thing to do. Fixes commit 332421312576bd7095e70589154af99b124dd2d1 ("elf: Always set l in _dl_init_paths (bug 23462)").
2021-03-15x86: Handle _SC_LEVEL1_ICACHE_LINESIZE [BZ #27444]H.J. Lu
commit 2d651eb9265d1366d7b9e881bfddd46db9c1ecc4 Author: H.J. Lu <hjl.tools@gmail.com> Date: Fri Sep 18 07:55:14 2020 -0700 x86: Move x86 processor cache info to cpu_features missed _SC_LEVEL1_ICACHE_LINESIZE. 1. Add level1_icache_linesize to struct cpu_features. 2. Initialize level1_icache_linesize by calling handle_intel, handle_zhaoxin and handle_amd with _SC_LEVEL1_ICACHE_LINESIZE. 3. Return level1_icache_linesize for _SC_LEVEL1_ICACHE_LINESIZE. Reviewed-by: Carlos O'Donell <carlos@redhat.com>