diff mbox

i386: Update I386_USE_SYSENTER for early PIC syscall

Message ID 20170802173609.GA13699@gmail.com
State New
Headers show

Commit Message

H.J. Lu Aug. 2, 2017, 5:36 p.m. UTC
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.

Any comments or objections?


H.J.
---
	* 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.
---
 sysdeps/unix/sysv/linux/i386/sysdep.h | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

Comments

H.J. Lu Aug. 4, 2017, 1:19 p.m. UTC | #1
On Wed, Aug 2, 2017 at 10:36 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> 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.
>
> Any comments or objections?
>

I am checking it in today.

> H.J.
> ---
>         * 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.
> ---
>  sysdeps/unix/sysv/linux/i386/sysdep.h | 26 ++++++++++++++------------
>  1 file changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
> index 449b23e49b..c455c9b1b4 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 \
> --
> 2.13.3
>
diff mbox

Patch

diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 449b23e49b..c455c9b1b4 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 \