about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--INSTALL4
-rw-r--r--NEWS3
-rw-r--r--config.h.in3
-rwxr-xr-xconfigure16
-rw-r--r--configure.ac8
-rw-r--r--manual/install.texi4
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h16
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S14
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/syscall.S2
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/sysdep.h2
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 a86bcf7671..9619c10991 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]
@@ -3814,6 +3817,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 f2588f394f..34ecbba540 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 ?	\