i386: Remove CET support bits

1. Remove _dl_runtime_resolve_shstk and _dl_runtime_profile_shstk.
2. Move CET offsets from x86 cpu-features-offsets.sym to x86-64
features-offsets.sym.
3. Rename x86 cet-control.h to x86-64 feature-control.h since it is only
for x86-64 and also used for PLT rewrite.
4. Add x86-64 ldsodefs.h to include feature-control.h.
5. Change TUNABLE_CALLBACK (set_plt_rewrite) to x86-64 only.
6. Move x86 dl-procruntime.c to x86-64.
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
H.J. Lu 2024-01-09 12:23:27 -08:00
parent 7d544dd049
commit 874214db62
12 changed files with 45 additions and 89 deletions

View File

@ -65,9 +65,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
extern void _dl_runtime_profile (Elf32_Word) attribute_hidden;
extern void _dl_runtime_resolve_shstk (Elf32_Word) attribute_hidden;
extern void _dl_runtime_profile_shstk (Elf32_Word) attribute_hidden;
/* Check if SHSTK is enabled by kernel. */
bool shstk_enabled
= (GL(dl_x86_feature_1) & GNU_PROPERTY_X86_FEATURE_1_SHSTK) != 0;
if (l->l_info[DT_JMPREL] && lazy)
{
@ -95,9 +92,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
#ifdef SHARED
if (__glibc_unlikely (profile))
{
got[2] = (shstk_enabled
? (Elf32_Addr) &_dl_runtime_profile_shstk
: (Elf32_Addr) &_dl_runtime_profile);
got[2] = (Elf32_Addr) &_dl_runtime_profile;
if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l))
@ -109,9 +104,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
#endif
/* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */
got[2] = (shstk_enabled
? (Elf32_Addr) &_dl_runtime_resolve_shstk
: (Elf32_Addr) &_dl_runtime_resolve);
got[2] = (Elf32_Addr) &_dl_runtime_resolve;
}
return lazy;

View File

@ -44,76 +44,7 @@ _dl_runtime_resolve:
cfi_endproc
.size _dl_runtime_resolve, .-_dl_runtime_resolve
# The SHSTK compatible version.
.text
.globl _dl_runtime_resolve_shstk
.type _dl_runtime_resolve_shstk, @function
cfi_startproc
.align 16
_dl_runtime_resolve_shstk:
cfi_adjust_cfa_offset (8)
pushl %eax # Preserve registers otherwise clobbered.
cfi_adjust_cfa_offset (4)
pushl %edx
cfi_adjust_cfa_offset (4)
movl 12(%esp), %edx # Copy args pushed by PLT in register. Note
movl 8(%esp), %eax # that `fixup' takes its parameters in regs.
call _dl_fixup # Call resolver.
movl (%esp), %edx # Get register content back.
movl %eax, %ecx # Store the function address.
movl 4(%esp), %eax # Get register content back.
addl $16, %esp # Adjust stack: PLT1 + PLT2 + %eax + %edx
cfi_adjust_cfa_offset (-16)
jmp *%ecx # Jump to function address.
cfi_endproc
.size _dl_runtime_resolve_shstk, .-_dl_runtime_resolve_shstk
#if !defined PROF && defined SHARED
# The SHSTK compatible version.
.globl _dl_runtime_profile_shstk
.type _dl_runtime_profile_shstk, @function
cfi_startproc
.align 16
_dl_runtime_profile_shstk:
cfi_adjust_cfa_offset (8)
pushl %esp
cfi_adjust_cfa_offset (4)
addl $8, (%esp) # Account for the pushed PLT data
pushl %ebp
cfi_adjust_cfa_offset (4)
pushl %eax # Preserve registers otherwise clobbered.
cfi_adjust_cfa_offset (4)
pushl %ecx
cfi_adjust_cfa_offset (4)
pushl %edx
cfi_adjust_cfa_offset (4)
movl %esp, %ecx
subl $8, %esp
cfi_adjust_cfa_offset (8)
movl $-1, 4(%esp)
leal 4(%esp), %edx
movl %edx, (%esp)
pushl %ecx # Address of the register structure
cfi_adjust_cfa_offset (4)
movl 40(%esp), %ecx # Load return address
movl 36(%esp), %edx # Copy args pushed by PLT in register. Note
movl 32(%esp), %eax # that `fixup' takes its parameters in regs.
call _dl_profile_fixup # Call resolver.
cfi_adjust_cfa_offset (-8)
movl (%esp), %edx
testl %edx, %edx
jns 1f
movl 4(%esp), %edx # Get register content back.
movl %eax, %ecx # Store the function address.
movl 12(%esp), %eax # Get register content back.
# Adjust stack: PLT1 + PLT2 + %esp + %ebp + %eax + %ecx + %edx
# + free.
addl $32, %esp
cfi_adjust_cfa_offset (-32)
jmp *%ecx # Jump to function address.
cfi_endproc
.size _dl_runtime_profile_shstk, .-_dl_runtime_profile_shstk
.globl _dl_runtime_profile
.type _dl_runtime_profile, @function
cfi_startproc

View File

@ -17,7 +17,7 @@
#include <sys/prctl.h>
#include <asm/prctl.h>
#include <cpu-features-offsets.h>
#include <features-offsets.h>
static __always_inline int
dl_cet_disable_cet (unsigned int cet_feature)

View File

@ -2,6 +2,4 @@
#include <ldsodefs.h>
RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET offsetof (struct rtld_global_ro, _dl_x86_cpu_features)
XSAVE_STATE_SIZE_OFFSET offsetof (struct cpu_features, xsave_state_size)
RTLD_GLOBAL_DL_X86_FEATURE_1_OFFSET offsetof (struct rtld_global, _dl_x86_feature_1)

View File

@ -27,7 +27,7 @@
extern void TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *)
attribute_hidden;
#ifdef SHARED
#if defined SHARED && defined __x86_64__
static void
TUNABLE_CALLBACK (set_plt_rewrite) (tunable_val_t *valp)
{
@ -1125,8 +1125,10 @@ no_cpuid:
#endif
#ifdef SHARED
# ifdef __x86_64__
TUNABLE_GET (plt_rewrite, tunable_val_t *,
TUNABLE_CALLBACK (set_plt_rewrite));
# endif
#else
/* NB: In libc.a, call init_cacheinfo. */
init_cacheinfo ();

View File

@ -61,7 +61,6 @@ struct La_x32_retval;
struct La_x86_64_retval *, \
const char *)
#include <cet-control.h>
#include_next <ldsodefs.h>
#endif

View File

@ -10,7 +10,7 @@ LDFLAGS-rtld += -Wl,-z,nomark-plt
endif
ifeq ($(subdir),csu)
gen-as-const-headers += link-defines.sym
gen-as-const-headers += features-offsets.sym link-defines.sym
endif
ifeq ($(subdir),gmon)

View File

@ -1,4 +1,4 @@
/* Data for processor runtime information. x86 version.
/* Data for processor runtime information. x86-64 version.
Copyright (C) 2018-2024 Free Software Foundation, Inc.
This file is part of the GNU C Library.

View File

@ -19,6 +19,7 @@
#include <config.h>
#include <sysdep.h>
#include <cpu-features-offsets.h>
#include <features-offsets.h>
#include <link-defines.h>
#include <isa-level.h>

View File

@ -1,4 +1,4 @@
/* x86 CET tuning.
/* x86-64 feature tuning.
This file is part of the GNU C Library.
Copyright (C) 2018-2024 Free Software Foundation, Inc.
@ -16,8 +16,8 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _CET_CONTROL_H
#define _CET_CONTROL_H
#ifndef _X86_64_FEATURE_CONTROL_H
#define _X86_64_FEATURE_CONTROL_H
/* For each CET feature, IBT and SHSTK, valid control values. */
enum dl_x86_cet_control
@ -50,4 +50,4 @@ struct dl_x86_feature_control
enum dl_plt_rewrite_control plt_rewrite : 2;
};
#endif /* cet-control.h */
#endif /* feature-control.h */

View File

@ -0,0 +1,6 @@
#define SHARED 1
#include <ldsodefs.h>
RTLD_GLOBAL_RO_DL_X86_CPU_FEATURES_OFFSET offsetof (struct rtld_global_ro, _dl_x86_cpu_features)
RTLD_GLOBAL_DL_X86_FEATURE_1_OFFSET offsetof (struct rtld_global, _dl_x86_feature_1)

26
sysdeps/x86_64/ldsodefs.h Normal file
View File

@ -0,0 +1,26 @@
/* Run-time dynamic linker data structures for loaded ELF shared objects.
x86-64 version.
Copyright (C) 2024 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _X86_64_LDSODEFS_H
#define _X86_64_LDSODEFS_H 1
#include <feature-control.h>
#include_next <ldsodefs.h>
#endif