x86-64: Add glibc.cpu.prefer_map_32bit_exec [BZ #28656]
commit317f1c0a8a71a862b1e600ff5386b08e02cf4b95
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 26 Jan 2023 16:26:18 +0000 (26 08:26 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 23 Feb 2023 02:28:37 +0000 (22 18:28 -0800)
treec380e1c78d06fbb479bb39c82e8dd28119eef13f
parentbde121872001d8f3224eeafa5b7effb871c3fbca
x86-64: Add glibc.cpu.prefer_map_32bit_exec [BZ #28656]

Crossing 2GB boundaries with indirect calls and jumps can use more
branch prediction resources on Intel Golden Cove CPU (see the
"Misprediction for Branches >2GB" section in Intel 64 and IA-32
Architectures Optimization Reference Manual.)  There is visible
performance improvement on workloads with many PLT calls when executable
and shared libraries are mmapped below 2GB.  Add the Prefer_MAP_32BIT_EXEC
bit so that mmap will try to map executable or denywrite pages in shared
libraries with MAP_32BIT first.

NB: Prefer_MAP_32BIT_EXEC reduces bits available for address space
layout randomization (ASLR), which is always disabled for SUID programs
and can only be enabled by the tunable, glibc.cpu.prefer_map_32bit_exec,
or the environment variable, LD_PREFER_MAP_32BIT_EXEC.  This works only
between shared libraries or between shared libraries and executables with
addresses below 2GB.  PIEs are usually loaded at a random address above
4GB by the kernel.
manual/tunables.texi
sysdeps/unix/sysv/linux/x86_64/64/Makefile
sysdeps/unix/sysv/linux/x86_64/64/dl-tunables.list [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/64/mmap_internal.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/64/tst-map-32bit-1a.c [copied from sysdeps/x86/include/cpu-features-preferred_feature_index_1.def with 59% similarity]
sysdeps/unix/sysv/linux/x86_64/64/tst-map-32bit-1b.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/64/tst-map-32bit-mod.c [copied from sysdeps/x86/include/cpu-features-preferred_feature_index_1.def with 59% similarity]
sysdeps/x86/cpu-features.c
sysdeps/x86/include/cpu-features-preferred_feature_index_1.def