Message ID | 20210604134422.68987-1-msc@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | [v2] Add build option to disable usage of scv on powerpc | expand |
Hi Matheus, This patch LGTM. Reviewed-by: Raphael M Zinsly <rzinsly@linux.ibm.com> On 04/06/2021 10:44, Matheus Castanho via Libc-alpha wrote: > Commit 68ab82f56690ada86ac1e0c46bad06ba189a10ef added support for the scv > syscall ABI on powerpc. Since then systems that have kernel and processor > support started using scv. However adding the proper support for a new syscall > ABI requires changes to several other projects (e.g. qemu, valgrind, strace, > kernel), which are gradually receiving support. > > Meanwhile, having a way to disable scv on glibc at build time can be useful for > distros that may encounter conflicts with projects that still do not support the > scv ABI, buying time until proper support is added. > > This commit adds a --disable-scv option that disables scv support and uses sc > for all syscalls, like before commit 68ab82f56690ada86ac1e0c46bad06ba189a10ef. > --- > Changes from v1: > - Update INSTALL with info about the new configure option > --- > INSTALL | 4 ++++ > NEWS | 3 +++ > config.h.in | 3 +++ > configure | 16 ++++++++++++++++ > configure.ac | 8 ++++++++ > manual/install.texi | 4 ++++ > sysdeps/powerpc/powerpc64/sysdep.h | 16 ++++++++-------- > .../unix/sysv/linux/powerpc/powerpc64/clone.S | 14 +++++++++++--- > sysdeps/unix/sysv/linux/powerpc/syscall.S | 2 +- > sysdeps/unix/sysv/linux/powerpc/sysdep.h | 2 +- > 10 files changed, 59 insertions(+), 13 deletions(-) > > diff --git a/INSTALL b/INSTALL > index bc761ab98b..56ed01d438 100644 > --- a/INSTALL > +++ b/INSTALL > @@ -253,6 +253,10 @@ if 'CFLAGS' is specified it must enable optimization. For example: > (set glibc.malloc.tcache_count to zero), this option can be used to > remove it from the build completely. > > +'--disable-scv' > + Disable using 'scv' instruction for syscalls. All syscalls will > + use 'sc' instead, even if the kernel supports 'scv'. PowerPC only. > + > '--build=BUILD-SYSTEM' > '--host=HOST-SYSTEM' > These options are for cross-compiling. If you specify both options > diff --git a/NEWS b/NEWS > index 1bf3daa502..e0fe9d70f0 100644 > --- a/NEWS > +++ b/NEWS > @@ -31,6 +31,9 @@ Major new features: > __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is > defined, and when _GNU_SOURCE is defined. > > +* On powerpc64*, glibc can now be compiled without scv support using the > + --disable-scv configure option. > + > Deprecated and removed features, and other changes affecting compatibility: > > * The function pthread_mutex_consistent_np has been deprecated; programs > diff --git a/config.h.in b/config.h.in > index dbeb7c6243..8b45a3a61d 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -26,6 +26,9 @@ > /* On powerpc64, define if the compiler supports -mcpu=power10. */ > #undef USE_PPC64_MCPU_POWER10 > > +/* On powerpc*, define if scv should be used for syscalls (when available). */ > +#undef USE_PPC_SCV > + > /* Define if _Unwind_Find_FDE should be exported from glibc. */ > #undef EXPORT_UNWIND_FIND_FDE > > diff --git a/configure b/configure > index 5dde2ba355..c588c90d21 100755 > --- a/configure > +++ b/configure > @@ -791,6 +791,7 @@ enable_pt_chown > enable_tunables > enable_mathvec > enable_cet > +enable_scv > with_cpu > ' > ac_precious_vars='build_alias > @@ -1463,6 +1464,8 @@ Optional Features: > depends on architecture] > --enable-cet enable Intel Control-flow Enforcement Technology > (CET), x86 only > + --disable-scv syscalls will not use scv instruction, even if the > + kernel supports it, powerpc only > > Optional Packages: > --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] > @@ -3776,6 +3779,19 @@ else > fi > > > +# Check whether --enable-scv was given. > +if test "${enable_scv+set}" = set; then : > + enableval=$enable_scv; use_scv=$enableval > +else > + use_scv=yes > +fi > + > + > +if test "$use_scv" != "no"; then : > + $as_echo "#define USE_PPC_SCV 1" >>confdefs.h > + > +fi > + > # We keep the original values in `$config_*' and never modify them, so we > # can write them unchanged into config.make. Everything else uses > # $machine, $vendor, and $os, and changes them whenever convenient. > diff --git a/configure.ac b/configure.ac > index 19051b8ee0..857e237e1b 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -470,6 +470,14 @@ AC_ARG_ENABLE([cet], > [enable_cet=$enableval], > [enable_cet=$libc_cv_compiler_default_cet]) > > +AC_ARG_ENABLE([scv], > + AC_HELP_STRING([--disable-scv], > + [syscalls will not use scv instruction, even if the kernel supports it, powerpc only]), > + [use_scv=$enableval], > + [use_scv=yes]) > + > +AS_IF([[test "$use_scv" != "no"]],[AC_DEFINE(USE_PPC_SCV)]) > + > # We keep the original values in `$config_*' and never modify them, so we > # can write them unchanged into config.make. Everything else uses > # $machine, $vendor, and $os, and changes them whenever convenient. > diff --git a/manual/install.texi b/manual/install.texi > index f1d858fb78..254a8a9a79 100644 > --- a/manual/install.texi > +++ b/manual/install.texi > @@ -282,6 +282,10 @@ this cache can be disabled on a per-application basis using tunables > (set glibc.malloc.tcache_count to zero), this option can be used to > remove it from the build completely. > > +@item --disable-scv > +Disable using @code{scv} instruction for syscalls. All syscalls will use > +@code{sc} instead, even if the kernel supports @code{scv}. PowerPC only. > + > @item --build=@var{build-system} > @itemx --host=@var{host-system} > These options are for cross-compiling. If you specify both options and > diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h > index 1ea4c3b917..589f7c8d18 100644 > --- a/sysdeps/powerpc/powerpc64/sysdep.h > +++ b/sysdeps/powerpc/powerpc64/sysdep.h > @@ -306,7 +306,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > beq \JUMPFALSE > .endm > > -#if IS_IN(rtld) > +#if !defined(USE_PPC_SCV) || IS_IN(rtld) > # define DO_CALL(syscall) \ > li r0,syscall; \ > DO_CALL_SC > @@ -323,7 +323,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > b 1f; \ > 0: DO_CALL_SC; \ > 1: > -#endif /* IS_IN(rtld) */ > +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ > > /* DO_CALL_SC and DO_CALL_SCV expect the syscall number to be in r0. */ > #define DO_CALL_SC \ > @@ -378,7 +378,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > .endif > #endif > > -#if IS_IN(rtld) > +#if !defined(USE_PPC_SCV) || IS_IN(rtld) > # define PSEUDO_RET \ > RET_SC; \ > TAIL_CALL_SYSCALL_ERROR > @@ -395,7 +395,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > b 1f; \ > 0: RET_SC; \ > 1: TAIL_CALL_SYSCALL_ERROR > -#endif > +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ > > #define RET_SCV \ > li r9,-4095; \ > @@ -417,7 +417,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > ENTRY (name); \ > DO_CALL (SYS_ify (syscall_name)) > > -#if IS_IN(rtld) > +#if !defined(USE_PPC_SCV) || IS_IN(rtld) > # define PSEUDO_RET_NOERRNO \ > blr > #else > @@ -425,7 +425,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > # define PSEUDO_RET_NOERRNO \ > NVOLREG_RESTORE; \ > blr > -#endif /* IS_IN(rtld) */ > +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ > > #define ret_NOERRNO PSEUDO_RET_NOERRNO > > @@ -438,7 +438,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > ENTRY (name); \ > DO_CALL (SYS_ify (syscall_name)) > > -#if IS_IN(rtld) > +#if !defined(USE_PPC_SCV) || IS_IN(rtld) > # define PSEUDO_RET_ERRVAL \ > blr > #else > @@ -446,7 +446,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ > # define PSEUDO_RET_ERRVAL \ > NVOLREG_RESTORE; \ > blr > -#endif /* IS_IN(rtld) */ > +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ > > #define ret_ERRVAL PSEUDO_RET_ERRVAL > > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S > index e9bd8cb960..777ead80b0 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S > @@ -38,11 +38,13 @@ ENTRY (__clone) > beq- cr0,L(badargs) > > /* Save some regs in the "red zone". */ > +#ifdef USE_PPC_SCV > std r28,-32(r1) > + cfi_offset(r28,-32) > +#endif > std r29,-24(r1) > std r30,-16(r1) > std r31,-8(r1) > - cfi_offset(r28,-32) > cfi_offset(r29,-24) > cfi_offset(r30,-16) > cfi_offset(r31,-8) > @@ -71,6 +73,7 @@ ENTRY (__clone) > > /* Do the call. */ > li r0,SYS_ify(clone) > +#ifdef USE_PPC_SCV > CHECK_SCV_SUPPORT r28 0f > /* This is equivalent to DO_CALL_SCV, but we cannot use the macro here > because it uses CFI directives and we just called cfi_endproc. */ > @@ -87,6 +90,7 @@ ENTRY (__clone) > /* When using scv, error is indicated by negative r3. */ > cmpdi cr1,r3,0 > b 1f > +#endif /* USE_PPC_SCV */ > 0: DO_CALL_SC > > /* Check for child process. */ > @@ -119,22 +123,26 @@ L(parent): > cmpdi cr1,r28,0 > > /* Parent. Restore registers & return. */ > +#ifdef USE_PPC_SCV > cfi_offset(r28,-32) > + ld r28,-32(r1) > + cfi_restore(r28) > +#endif > cfi_offset(r29,-24) > cfi_offset(r30,-16) > cfi_offset(r31,-8) > - ld r28,-32(r1) > ld r29,-24(r1) > ld r30,-16(r1) > ld r31,-8(r1) > - cfi_restore(r28) > cfi_restore(r29) > cfi_restore(r30) > cfi_restore(r31) > > +#ifdef USE_PPC_SCV > beq cr1,0f > RET_SCV > b 1f > +#endif > 0: RET_SC > 1: TAIL_CALL_SYSCALL_ERROR > > diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S > index d6ec87f006..a29652feaf 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S > +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S > @@ -25,7 +25,7 @@ ENTRY (syscall) > mr r6,r7 > mr r7,r8 > mr r8,r9 > -#if !IS_IN(rtld) && (defined(__PPC64__) || defined(__powerpc64__)) > +#if defined(USE_PPC_SCV) && !IS_IN(rtld) && (defined(__PPC64__) || defined(__powerpc64__)) > CHECK_SCV_SUPPORT r9 0f > DO_CALL_SCV > RET_SCV > diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h > index 2f31f9177b..4b9d43c636 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h > +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h > @@ -125,7 +125,7 @@ > > /* When inside the dynamic loader, the thread pointer may not have been > initialized yet, so don't check for scv support in that case. */ > -# if !IS_IN(rtld) > +# if defined(USE_PPC_SCV) && !IS_IN(rtld) > # undef TRY_SYSCALL_SCV > # define TRY_SYSCALL_SCV(nr) \ > CHECK_THREAD_POINTER && THREAD_GET_HWCAP() & PPC_FEATURE2_SCV ? \ >
Push as ebae2f5a6f971a8f0b6c99e00f9c45ef7433924a Thanks, Matheus Castanho
diff --git a/INSTALL b/INSTALL index bc761ab98b..56ed01d438 100644 --- a/INSTALL +++ b/INSTALL @@ -253,6 +253,10 @@ if 'CFLAGS' is specified it must enable optimization. For example: (set glibc.malloc.tcache_count to zero), this option can be used to remove it from the build completely. +'--disable-scv' + Disable using 'scv' instruction for syscalls. All syscalls will + use 'sc' instead, even if the kernel supports 'scv'. PowerPC only. + '--build=BUILD-SYSTEM' '--host=HOST-SYSTEM' These options are for cross-compiling. If you specify both options diff --git a/NEWS b/NEWS index 1bf3daa502..e0fe9d70f0 100644 --- a/NEWS +++ b/NEWS @@ -31,6 +31,9 @@ Major new features: __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is defined, and when _GNU_SOURCE is defined. +* On powerpc64*, glibc can now be compiled without scv support using the + --disable-scv configure option. + Deprecated and removed features, and other changes affecting compatibility: * The function pthread_mutex_consistent_np has been deprecated; programs diff --git a/config.h.in b/config.h.in index dbeb7c6243..8b45a3a61d 100644 --- a/config.h.in +++ b/config.h.in @@ -26,6 +26,9 @@ /* On powerpc64, define if the compiler supports -mcpu=power10. */ #undef USE_PPC64_MCPU_POWER10 +/* On powerpc*, define if scv should be used for syscalls (when available). */ +#undef USE_PPC_SCV + /* Define if _Unwind_Find_FDE should be exported from glibc. */ #undef EXPORT_UNWIND_FIND_FDE diff --git a/configure b/configure index 5dde2ba355..c588c90d21 100755 --- a/configure +++ b/configure @@ -791,6 +791,7 @@ enable_pt_chown enable_tunables enable_mathvec enable_cet +enable_scv with_cpu ' ac_precious_vars='build_alias @@ -1463,6 +1464,8 @@ Optional Features: depends on architecture] --enable-cet enable Intel Control-flow Enforcement Technology (CET), x86 only + --disable-scv syscalls will not use scv instruction, even if the + kernel supports it, powerpc only Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -3776,6 +3779,19 @@ else fi +# Check whether --enable-scv was given. +if test "${enable_scv+set}" = set; then : + enableval=$enable_scv; use_scv=$enableval +else + use_scv=yes +fi + + +if test "$use_scv" != "no"; then : + $as_echo "#define USE_PPC_SCV 1" >>confdefs.h + +fi + # We keep the original values in `$config_*' and never modify them, so we # can write them unchanged into config.make. Everything else uses # $machine, $vendor, and $os, and changes them whenever convenient. diff --git a/configure.ac b/configure.ac index 19051b8ee0..857e237e1b 100644 --- a/configure.ac +++ b/configure.ac @@ -470,6 +470,14 @@ AC_ARG_ENABLE([cet], [enable_cet=$enableval], [enable_cet=$libc_cv_compiler_default_cet]) +AC_ARG_ENABLE([scv], + AC_HELP_STRING([--disable-scv], + [syscalls will not use scv instruction, even if the kernel supports it, powerpc only]), + [use_scv=$enableval], + [use_scv=yes]) + +AS_IF([[test "$use_scv" != "no"]],[AC_DEFINE(USE_PPC_SCV)]) + # We keep the original values in `$config_*' and never modify them, so we # can write them unchanged into config.make. Everything else uses # $machine, $vendor, and $os, and changes them whenever convenient. diff --git a/manual/install.texi b/manual/install.texi index f1d858fb78..254a8a9a79 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -282,6 +282,10 @@ this cache can be disabled on a per-application basis using tunables (set glibc.malloc.tcache_count to zero), this option can be used to remove it from the build completely. +@item --disable-scv +Disable using @code{scv} instruction for syscalls. All syscalls will use +@code{sc} instead, even if the kernel supports @code{scv}. PowerPC only. + @item --build=@var{build-system} @itemx --host=@var{host-system} These options are for cross-compiling. If you specify both options and diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h index 1ea4c3b917..589f7c8d18 100644 --- a/sysdeps/powerpc/powerpc64/sysdep.h +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -306,7 +306,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ beq \JUMPFALSE .endm -#if IS_IN(rtld) +#if !defined(USE_PPC_SCV) || IS_IN(rtld) # define DO_CALL(syscall) \ li r0,syscall; \ DO_CALL_SC @@ -323,7 +323,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ b 1f; \ 0: DO_CALL_SC; \ 1: -#endif /* IS_IN(rtld) */ +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ /* DO_CALL_SC and DO_CALL_SCV expect the syscall number to be in r0. */ #define DO_CALL_SC \ @@ -378,7 +378,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ .endif #endif -#if IS_IN(rtld) +#if !defined(USE_PPC_SCV) || IS_IN(rtld) # define PSEUDO_RET \ RET_SC; \ TAIL_CALL_SYSCALL_ERROR @@ -395,7 +395,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ b 1f; \ 0: RET_SC; \ 1: TAIL_CALL_SYSCALL_ERROR -#endif +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ #define RET_SCV \ li r9,-4095; \ @@ -417,7 +417,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ ENTRY (name); \ DO_CALL (SYS_ify (syscall_name)) -#if IS_IN(rtld) +#if !defined(USE_PPC_SCV) || IS_IN(rtld) # define PSEUDO_RET_NOERRNO \ blr #else @@ -425,7 +425,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ # define PSEUDO_RET_NOERRNO \ NVOLREG_RESTORE; \ blr -#endif /* IS_IN(rtld) */ +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ #define ret_NOERRNO PSEUDO_RET_NOERRNO @@ -438,7 +438,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ ENTRY (name); \ DO_CALL (SYS_ify (syscall_name)) -#if IS_IN(rtld) +#if !defined(USE_PPC_SCV) || IS_IN(rtld) # define PSEUDO_RET_ERRVAL \ blr #else @@ -446,7 +446,7 @@ LT_LABELSUFFIX(name,_name_end): ; \ # define PSEUDO_RET_ERRVAL \ NVOLREG_RESTORE; \ blr -#endif /* IS_IN(rtld) */ +#endif /* !defined(USE_PPC_SCV) || IS_IN(rtld) */ #define ret_ERRVAL PSEUDO_RET_ERRVAL diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S index e9bd8cb960..777ead80b0 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S @@ -38,11 +38,13 @@ ENTRY (__clone) beq- cr0,L(badargs) /* Save some regs in the "red zone". */ +#ifdef USE_PPC_SCV std r28,-32(r1) + cfi_offset(r28,-32) +#endif std r29,-24(r1) std r30,-16(r1) std r31,-8(r1) - cfi_offset(r28,-32) cfi_offset(r29,-24) cfi_offset(r30,-16) cfi_offset(r31,-8) @@ -71,6 +73,7 @@ ENTRY (__clone) /* Do the call. */ li r0,SYS_ify(clone) +#ifdef USE_PPC_SCV CHECK_SCV_SUPPORT r28 0f /* This is equivalent to DO_CALL_SCV, but we cannot use the macro here because it uses CFI directives and we just called cfi_endproc. */ @@ -87,6 +90,7 @@ ENTRY (__clone) /* When using scv, error is indicated by negative r3. */ cmpdi cr1,r3,0 b 1f +#endif /* USE_PPC_SCV */ 0: DO_CALL_SC /* Check for child process. */ @@ -119,22 +123,26 @@ L(parent): cmpdi cr1,r28,0 /* Parent. Restore registers & return. */ +#ifdef USE_PPC_SCV cfi_offset(r28,-32) + ld r28,-32(r1) + cfi_restore(r28) +#endif cfi_offset(r29,-24) cfi_offset(r30,-16) cfi_offset(r31,-8) - ld r28,-32(r1) ld r29,-24(r1) ld r30,-16(r1) ld r31,-8(r1) - cfi_restore(r28) cfi_restore(r29) cfi_restore(r30) cfi_restore(r31) +#ifdef USE_PPC_SCV beq cr1,0f RET_SCV b 1f +#endif 0: RET_SC 1: TAIL_CALL_SYSCALL_ERROR diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S index d6ec87f006..a29652feaf 100644 --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S @@ -25,7 +25,7 @@ ENTRY (syscall) mr r6,r7 mr r7,r8 mr r8,r9 -#if !IS_IN(rtld) && (defined(__PPC64__) || defined(__powerpc64__)) +#if defined(USE_PPC_SCV) && !IS_IN(rtld) && (defined(__PPC64__) || defined(__powerpc64__)) CHECK_SCV_SUPPORT r9 0f DO_CALL_SCV RET_SCV diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h index 2f31f9177b..4b9d43c636 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h +++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h @@ -125,7 +125,7 @@ /* When inside the dynamic loader, the thread pointer may not have been initialized yet, so don't check for scv support in that case. */ -# if !IS_IN(rtld) +# if defined(USE_PPC_SCV) && !IS_IN(rtld) # undef TRY_SYSCALL_SCV # define TRY_SYSCALL_SCV(nr) \ CHECK_THREAD_POINTER && THREAD_GET_HWCAP() & PPC_FEATURE2_SCV ? \