]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
i386: Update I386_USE_SYSENTER for early PIC syscall
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 4 Aug 2017 19:30:22 +0000 (12:30 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 4 Aug 2017 19:30:38 +0000 (12:30 -0700)
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.

ChangeLog
sysdeps/unix/sysv/linux/i386/sysdep.h

index 14dd0bacbc172a7e9f8db4963fa839520173d7a9..6a50d235f59830c086a006e332fb895b70927c12 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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.
index 449b23e49bef5aaea01e969363ca00698a7ea1fe..c455c9b1b40088ecbf31eb0944d057311a4b65d1 100644 (file)
 #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,
 
 /* 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 \