Message ID | 20170802173609.GA13699@gmail.com |
---|---|
State | New |
Headers | show |
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 --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 \