mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
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:
parent
7d544dd049
commit
874214db62
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 ();
|
||||
|
@ -61,7 +61,6 @@ struct La_x32_retval;
|
||||
struct La_x86_64_retval *, \
|
||||
const char *)
|
||||
|
||||
#include <cet-control.h>
|
||||
#include_next <ldsodefs.h>
|
||||
|
||||
#endif
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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 */
|
6
sysdeps/x86_64/features-offsets.sym
Normal file
6
sysdeps/x86_64/features-offsets.sym
Normal 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
26
sysdeps/x86_64/ldsodefs.h
Normal 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
|
Loading…
Reference in New Issue
Block a user