aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-08-04 12:30:22 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-08-04 12:30:38 -0700
commit627c69c838e75d69f46a7cc7dd2bafca03adbf60 (patch)
tree3a25ac1244ad02a10fa644d20f207c5c188a792d
parentfc11ff8d0acebbf0802854156d45cb1d8bb7c079 (diff)
downloadglibc-627c69c838e75d69f46a7cc7dd2bafca03adbf60.zip
glibc-627c69c838e75d69f46a7cc7dd2bafca03adbf60.tar.gz
glibc-627c69c838e75d69f46a7cc7dd2bafca03adbf60.tar.bz2
i386: Update I386_USE_SYSENTER for early PIC syscall
Define I386_USE_SYSENTER to 0 or 1 so that special versions of syscalls with "int $0x80" can be provided for static PIE during self relocation. Also check PIC instead SHARED for PIC version of syscall macros. * sysdeps/unix/sysv/linux/i386/sysdep.h (I386_USE_SYSENTER): Define to I386_USE_SYSENTER to 0 or 1 if not defined. (ENTER_KERNEL): Check if I386_USE_SYSENTER is 1 and check PIC. (INTERNAL_SYSCALL_MAIN_INLINE): Likewise. (INTERNAL_SYSCALL_NCS): Likewise. (LOADARGS_1): Likewise. (LOADARGS_5): Likewise. (RESTOREARGS_1): Likewise. (RESTOREARGS_5): Likewise.
-rw-r--r--ChangeLog12
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h26
2 files changed, 26 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 14dd0ba..6a50d23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2017-08-04 H.J. Lu <hongjiu.lu@intel.com>
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (I386_USE_SYSENTER):
+ Define to I386_USE_SYSENTER to 0 or 1 if not defined.
+ (ENTER_KERNEL): Check if I386_USE_SYSENTER is 1 and check PIC.
+ (INTERNAL_SYSCALL_MAIN_INLINE): Likewise.
+ (INTERNAL_SYSCALL_NCS): Likewise.
+ (LOADARGS_1): Likewise.
+ (LOADARGS_5): Likewise.
+ (RESTOREARGS_1): Likewise.
+ (RESTOREARGS_5): Likewise.
+
+2017-08-04 H.J. Lu <hongjiu.lu@intel.com>
+
* sysdeps/x86_64/memmove.S (MEMCPY_SYMBOL): Don't check SHARED.
(MEMPCPY_SYMBOL): Likewise.
* sysdeps/x86_64/multiarch/ifunc-impl-list.c
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 449b23e..c455c9b 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -34,11 +34,13 @@
#undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name
-#if defined USE_DL_SYSINFO \
- && (IS_IN (libc) || IS_IN (libpthread))
-# define I386_USE_SYSENTER 1
-#else
-# undef I386_USE_SYSENTER
+#ifndef I386_USE_SYSENTER
+# if defined USE_DL_SYSINFO \
+ && (IS_IN (libc) || IS_IN (libpthread))
+# define I386_USE_SYSENTER 1
+# else
+# define I386_USE_SYSENTER 0
+# endif
#endif
/* Since GCC 5 and above can properly spill %ebx with PIC when needed,
@@ -110,8 +112,8 @@
/* The original calling convention for system calls on Linux/i386 is
to use int $0x80. */
-#ifdef I386_USE_SYSENTER
-# ifdef SHARED
+#if I386_USE_SYSENTER
+# ifdef PIC
# define ENTER_KERNEL call *%gs:SYSINFO_OFFSET
# else
# define ENTER_KERNEL call *_dl_sysinfo
@@ -357,9 +359,9 @@ struct libc_do_syscall_args
register unsigned int resultvar; \
INTERNAL_SYSCALL_MAIN_##nr (name, err, args); \
(int) resultvar; })
-#ifdef I386_USE_SYSENTER
+#if I386_USE_SYSENTER
# ifdef OPTIMIZE_FOR_GCC_5
-# ifdef SHARED
+# ifdef PIC
# define INTERNAL_SYSCALL_MAIN_INLINE(name, err, nr, args...) \
LOADREGS_##nr(args) \
asm volatile ( \
@@ -395,7 +397,7 @@ struct libc_do_syscall_args
(int) resultvar; })
# endif
# else /* GCC 5 */
-# ifdef SHARED
+# ifdef PIC
# define INTERNAL_SYSCALL_MAIN_INLINE(name, err, nr, args...) \
EXTRAVAR_##nr \
asm volatile ( \
@@ -494,7 +496,7 @@ struct libc_do_syscall_args
#define LOADARGS_0
#ifdef __PIC__
-# if defined I386_USE_SYSENTER && defined SHARED
+# if I386_USE_SYSENTER && defined PIC
# define LOADARGS_1 \
"bpushl .L__X'%k3, %k3\n\t"
# define LOADARGS_5 \
@@ -521,7 +523,7 @@ struct libc_do_syscall_args
#define RESTOREARGS_0
#ifdef __PIC__
-# if defined I386_USE_SYSENTER && defined SHARED
+# if I386_USE_SYSENTER && defined PIC
# define RESTOREARGS_1 \
"bpopl .L__X'%k3, %k3\n\t"
# define RESTOREARGS_5 \