This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.25-448-gcdfbe50


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  cdfbe5037f2f67bf5f560b73732b69d0fabe2314 (commit)
       via  d6bd839b9acfe619afa1db67a2882c0ce839861f (commit)
      from  a17973efc647439757388bcbee74d73c550af0e1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=cdfbe5037f2f67bf5f560b73732b69d0fabe2314

commit cdfbe5037f2f67bf5f560b73732b69d0fabe2314
Author: Paul Clarke <pc@us.ibm.com>
Date:   Fri Jun 9 14:36:22 2017 -0300

    powerpc: add sysconf support for cache geometries
    
    There is currently no "cross-platform" (x86 and POWER) support for
    determining the cacheline size.
    
    This patch adds support to sysconf() to correctly report cacheline sizes
    based on the information in the auxilliary vector.
    
    Thus, using sysconf() is a cross-platform (x86 and POWER) solution for
    determining cacheline sizes.
    
    Support is added (on powerpc) for:
    _SC_LEVEL1_ICACHE_SIZE _SC_LEVEL1_ICACHE_ASSOC _SC_LEVEL1_ICACHE_LINESIZE
    _SC_LEVEL1_DCACHE_SIZE _SC_LEVEL1_DCACHE_ASSOC _SC_LEVEL1_DCACHE_LINESIZE
    _SC_LEVEL2_CACHE_SIZE  _SC_LEVEL2_CACHE_ASSOC  _SC_LEVEL2_CACHE_LINESIZE
    _SC_LEVEL3_CACHE_SIZE  _SC_LEVEL3_CACHE_ASSOC  _SC_LEVEL3_CACHE_LINESIZE
    
    	* sysdeps/unix/sysv/linux/powerpc/sysconf.c: New file.
    	Add powerpc-specific overrides for L1, L2, L3 CACHE_SIZEs,
    	CACHE_ASSOCs, and CACHE_LINESIZEs, retrieving from auxv.
    	* sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c:
    	New file.  Invoke newly supported sysconf values for powerpc,
    	and report results.  If none are supported, report so.
    	* sysdeps/unix/sysv/linux/powerpc/Makefile (tests):  Add new test,
    	tst-sysconf.

diff --git a/ChangeLog b/ChangeLog
index 82e17d1..1fee177 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2017-06-09  Paul A. Clarke  <pc@us.ibm.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/sysconf.c: New file.
+	Add powerpc-specific overrides for L1, L2, L3 CACHE_SIZEs,
+	CACHE_ASSOCs, and CACHE_LINESIZEs, retrieving from auxv.
+	* sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c:
+	New file.  Invoke newly supported sysconf values for powerpc,
+	and report results.  If none are supported, report so.
+	* sysdeps/unix/sysv/linux/powerpc/Makefile (tests):  Add new test,
+	tst-sysconf.
+
 2017-06-09  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
 
 	* include/sys/auxv.h (__getauxval): Add a prototype and its
diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
index 2cfb46e..c16172c 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Makefile
+++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
@@ -29,6 +29,7 @@ ifeq ($(subdir),misc)
 sysdep_headers += bits/ppc.h
 sysdep_routines += get_timebase_freq
 tests += test-gettimebasefreq
+tests += test-powerpc-linux-sysconf
 endif
 
 ifeq ($(subdir),nptl)
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysconf.c b/sysdeps/unix/sysv/linux/powerpc/sysconf.c
new file mode 100644
index 0000000..10c4aa0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/sysconf.c
@@ -0,0 +1,96 @@
+/* Get system-specific information at run-time.  Linux/powerpc version.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/auxv.h>
+
+static long linux_sysconf (int name);
+
+static long
+auxv2sysconf (unsigned long type)
+{
+  long rc;
+  rc = __getauxval (type);
+  if (rc == 0)
+  {
+    __set_errno (EINVAL);
+    rc = -1;
+  }
+  return rc;
+}
+
+static long
+auxv2sysconf_cache_associativity (unsigned long type)
+{
+  long rc;
+  rc = auxv2sysconf (type);
+  if (rc != -1)
+    rc = (rc & 0xffff0000) >> 16;
+  return rc;
+}
+
+static long
+auxv2sysconf_cache_linesize (unsigned long type)
+{
+  long rc;
+  rc = auxv2sysconf (type);
+  if (rc != -1)
+    rc = rc & 0xffff;
+  return rc;
+}
+
+/* Get the value of the system variable NAME.  */
+long int
+__sysconf (int name)
+{
+  switch (name)
+    {
+      case _SC_LEVEL1_ICACHE_SIZE:
+	return auxv2sysconf (AT_L1I_CACHESIZE);
+      case _SC_LEVEL1_ICACHE_ASSOC:
+	return auxv2sysconf_cache_associativity (AT_L1I_CACHEGEOMETRY);
+      case _SC_LEVEL1_ICACHE_LINESIZE:
+	return auxv2sysconf_cache_linesize (AT_L1I_CACHEGEOMETRY);
+      case _SC_LEVEL1_DCACHE_SIZE:
+	return auxv2sysconf (AT_L1D_CACHESIZE);
+      case _SC_LEVEL1_DCACHE_ASSOC:
+	return auxv2sysconf_cache_associativity (AT_L1D_CACHEGEOMETRY);
+      case _SC_LEVEL1_DCACHE_LINESIZE:
+	return auxv2sysconf_cache_linesize (AT_L1D_CACHEGEOMETRY);
+      case _SC_LEVEL2_CACHE_SIZE:
+	return auxv2sysconf (AT_L2_CACHESIZE);
+      case _SC_LEVEL2_CACHE_ASSOC:
+	return auxv2sysconf_cache_associativity (AT_L2_CACHEGEOMETRY);
+      case _SC_LEVEL2_CACHE_LINESIZE:
+	return auxv2sysconf_cache_linesize (AT_L2_CACHEGEOMETRY);
+      case _SC_LEVEL3_CACHE_SIZE:
+	return auxv2sysconf (AT_L3_CACHESIZE);
+      case _SC_LEVEL3_CACHE_ASSOC:
+	return auxv2sysconf_cache_associativity (AT_L3_CACHEGEOMETRY);
+      case _SC_LEVEL3_CACHE_LINESIZE:
+	return auxv2sysconf_cache_linesize (AT_L3_CACHEGEOMETRY);
+      default:
+	return linux_sysconf (name);
+    }
+}
+
+/* Now the generic Linux version.  */
+#undef __sysconf
+#define __sysconf static linux_sysconf
+#include "../sysconf.c"
diff --git a/sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c b/sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c
new file mode 100644
index 0000000..94e9f41
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c
@@ -0,0 +1,73 @@
+/* Check use of sysconf() for cache geometries.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* Test use of sysconf() to get cache sizes, cache set associativity
+   and cache line sizes.  */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <support/test-driver.h>
+
+#define call_str(f, name) f(name, #name)
+
+long
+do_sysconf (int name, const char * str)
+{
+  int rc = 0;
+  long val;
+  errno = 0;
+  val = sysconf (name);
+  if (val == -1) {
+    if (errno != EINVAL) {
+      printf("error: sysconf(%s): unexpected errno(%d)\n", str, errno);
+      exit (1);
+    }
+    printf ("info: sysconf(%s): unsupported\n", str);
+    rc = 1;
+  } else
+    printf ("sysconf(%s) = 0x%lx (%ld)\n", str, val, val);
+  return rc;
+}
+
+static int
+do_test (void)
+{
+  int rc = 0;
+
+  rc += call_str (do_sysconf, _SC_LEVEL1_ICACHE_SIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL1_ICACHE_ASSOC);
+  rc += call_str (do_sysconf, _SC_LEVEL1_ICACHE_LINESIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL1_DCACHE_SIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL1_DCACHE_ASSOC);
+  rc += call_str (do_sysconf, _SC_LEVEL1_DCACHE_LINESIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL2_CACHE_SIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL2_CACHE_ASSOC);
+  rc += call_str (do_sysconf, _SC_LEVEL2_CACHE_LINESIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL3_CACHE_SIZE);
+  rc += call_str (do_sysconf, _SC_LEVEL3_CACHE_ASSOC);
+  rc += call_str (do_sysconf, _SC_LEVEL3_CACHE_LINESIZE);
+
+  if (rc)
+    return EXIT_UNSUPPORTED;
+  return 0;
+}
+
+#include <support/test-driver.c>

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d6bd839b9acfe619afa1db67a2882c0ce839861f

commit d6bd839b9acfe619afa1db67a2882c0ce839861f
Author: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Date:   Fri Jun 9 14:36:22 2017 -0300

    Add a way to bypass the PLT when calling getauxval
    
    	* include/sys/auxv.h (__getauxval): Add a prototype and its
    	libc_hidden_proto.
    	* misc/getauxval.c (__getauxval): Use libc_hidden_def.

diff --git a/ChangeLog b/ChangeLog
index 519959a..82e17d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-09  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
+
+	* include/sys/auxv.h (__getauxval): Add a prototype and its
+	libc_hidden_proto.
+	* misc/getauxval.c (__getauxval): Use libc_hidden_def.
+
 2017-06-09  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #21561]
diff --git a/include/sys/auxv.h b/include/sys/auxv.h
index dede2c3..3bab6d0 100644
--- a/include/sys/auxv.h
+++ b/include/sys/auxv.h
@@ -1 +1,8 @@
 #include <misc/sys/auxv.h>
+
+#ifndef _ISOMAC
+
+extern __typeof (getauxval) __getauxval;
+libc_hidden_proto (__getauxval)
+
+#endif  /* !_ISOMAC */
diff --git a/misc/getauxval.c b/misc/getauxval.c
index c83fbce..14f4298 100644
--- a/misc/getauxval.c
+++ b/misc/getauxval.c
@@ -43,3 +43,4 @@ __getauxval (unsigned long int type)
 }
 
 weak_alias (__getauxval, getauxval)
+libc_hidden_def (__getauxval)

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   17 ++++
 include/sys/auxv.h                                 |    7 ++
 misc/getauxval.c                                   |    1 +
 sysdeps/unix/sysv/linux/powerpc/Makefile           |    1 +
 sysdeps/unix/sysv/linux/powerpc/sysconf.c          |   96 ++++++++++++++++++++
 .../linux/powerpc/test-powerpc-linux-sysconf.c     |   73 +++++++++++++++
 6 files changed, 195 insertions(+), 0 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/sysconf.c
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/test-powerpc-linux-sysconf.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]