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.16-ports-merge-371-g8ad11b9


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  8ad11b9a9cf1de82bd7771306b42070b91417c11 (commit)
      from  7e2fca8dd22e3bd932581d6479b0c552deff00b6 (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://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=8ad11b9a9cf1de82bd7771306b42070b91417c11

commit 8ad11b9a9cf1de82bd7771306b42070b91417c11
Author: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Date:   Tue Sep 25 14:48:28 2012 -0500

    Add __ppc_get_timebase_freq to ppc.h.

diff --git a/ChangeLog b/ChangeLog
index 1fff9ba..5acd55b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2012-09-25  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
+
+	* manual/platform.texi (PowerPC): Document __ppc_get_timebase_freq.
+	* sysdeps/powerpc/sys/platform/ppc.h: Include the operating
+	system header.
+	* sysdeps/unix/sysv/linux/powerpc/Makefile (sysdep_headers):
+	Likewise.
+	(sydep_routines): Add the new and the internal functions.
+	* sysdeps/unix/sysv/linux/powerpc/bits/ppc.h: New file.
+	* sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
+	(GLIBC_2.17): Add the new function.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
+	(GLIBC_2.17): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions
+	(GLIBC_2.17): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
+	(GLIBC_2.17): Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/test-gettimebasefreq.c: New file.
+
 2012-09-25  Alan Modra  <amodra@gmail.com>
 
 	* sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once):
diff --git a/manual/platform.texi b/manual/platform.texi
index 02b5c55..e387ff4 100644
--- a/manual/platform.texi
+++ b/manual/platform.texi
@@ -26,3 +26,11 @@ different from the processor frequency.  More information is available in
 without requiring assistance from the operating system, so it is very
 efficient.
 @end deftypefun
+
+@deftypefun {uint64_t} __ppc_get_timebase_freq (void)
+Read the current frequency at which the Time Base Register is updated.
+
+This frequency is not related to the processor clock or the bus clock.
+It is also possible that this frequency is not constant.  More information is
+available in @cite{Power ISA 2.06b - Book II - Section 5.2}.
+@end deftypefun
diff --git a/sysdeps/powerpc/sys/platform/ppc.h b/sysdeps/powerpc/sys/platform/ppc.h
index 165652c..3780f57 100644
--- a/sysdeps/powerpc/sys/platform/ppc.h
+++ b/sysdeps/powerpc/sys/platform/ppc.h
@@ -20,6 +20,7 @@
 #define _SYS_PLATFORM_PPC_H	1
 
 #include <stdint.h>
+#include <bits/ppc.h>
 
 /* Read the Time Base Register.   */
 static inline uint64_t
diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
index f6dccd9..6bdf4dc 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Makefile
+++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
@@ -16,3 +16,9 @@ endif
 ifeq ($(subdir),elf)
 sysdep_routines += dl-vdso
 endif
+
+ifeq ($(subdir),misc)
+sysdep_headers += bits/ppc.h
+sysdep_routines += get_clockfreq get_timebase_freq
+tests += test-gettimebasefreq
+endif
diff --git a/sysdeps/powerpc/sys/platform/ppc.h b/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
similarity index 51%
copy from sysdeps/powerpc/sys/platform/ppc.h
copy to sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
index 165652c..76542d9 100644
--- a/sysdeps/powerpc/sys/platform/ppc.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
@@ -1,4 +1,4 @@
-/* Facilities specific to the PowerPC architecture
+/* Facilities specific to the PowerPC architecture on Linux
    Copyright (C) 2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,32 +16,18 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_PPC_H
+#define _BITS_PPC_H
+
 #ifndef _SYS_PLATFORM_PPC_H
-#define _SYS_PLATFORM_PPC_H	1
-
-#include <stdint.h>
-
-/* Read the Time Base Register.   */
-static inline uint64_t
-__ppc_get_timebase (void)
-{
-#ifdef __powerpc64__
-  uint64_t __tb;
-  /* "volatile" is necessary here, because the user expects this assembly
-     isn't moved after an optimization.  */
-  __asm__ volatile ("mfspr %0, 268" : "=r" (__tb));
-  return __tb;
-#else  /* not __powerpc64__ */
-  uint32_t __tbu, __tbl, __tmp; \
-  __asm__ volatile ("0:\n\t"
-		    "mftbu %0\n\t"
-		    "mftbl %1\n\t"
-		    "mftbu %2\n\t"
-		    "cmpw %0, %2\n\t"
-		    "bne- 0b"
-		    : "=r" (__tbu), "=r" (__tbl), "=r" (__tmp));
-  return (((uint64_t) __tbu << 32) | __tbl);
-#endif  /* not __powerpc64__ */
-}
-
-#endif  /* sys/platform/ppc.h */
+# error "Never include this file directly; use <sys/platform/ppc.h> instead."
+#endif
+
+__BEGIN_DECLS
+
+/* Read the time base frequency.   */
+extern uint64_t __ppc_get_timebase_freq (void);
+
+__END_DECLS
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c b/sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c
new file mode 100644
index 0000000..f62ed86
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c
@@ -0,0 +1,26 @@
+/* Get the frequency of the time base.
+   Copyright (C) 2012 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 <libc-internal.h>
+
+uint64_t
+__get_timebase_freq (void)
+{
+  return (uint64_t) __get_clockfreq ();
+}
+weak_alias (__get_timebase_freq, __ppc_get_timebase_freq)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
index 6fa0119..8d1c3a5 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions
@@ -30,4 +30,7 @@ libc {
   GLIBC_2.11 {
     fallocate64;
   }
+  GLIBC_2.17 {
+    __ppc_get_timebase_freq;
+  }
 }
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
index 75123b9..ab96361 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/nptl/libc.abilist
@@ -1775,6 +1775,7 @@ GLIBC_2.16
 GLIBC_2.17
  GLIBC_2.17 A
  secure_getenv F
+ __ppc_get_timebase_freq F
 GLIBC_2.2
  GLIBC_2.2 A
  _IO_adjust_wcolumn F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions b/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions
index 8334741..3ff01d1 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions
@@ -19,4 +19,7 @@ libc {
     setcontext; 
     swapcontext;
   }
+  GLIBC_2.17 {
+    __ppc_get_timebase_freq;
+  }
 }
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
index e2484d3..a60b72a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/nptl/libc.abilist
@@ -81,6 +81,7 @@ GLIBC_2.16
 GLIBC_2.17
  GLIBC_2.17 A
  secure_getenv F
+ __ppc_get_timebase_freq F
 GLIBC_2.3
  GLIBC_2.3 A
  _Exit F
diff --git a/sysdeps/unix/sysv/linux/powerpc/test-gettimebasefreq.c b/sysdeps/unix/sysv/linux/powerpc/test-gettimebasefreq.c
new file mode 100644
index 0000000..a3f3bd6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/test-gettimebasefreq.c
@@ -0,0 +1,62 @@
+/* Check __ppc_get_timebase_freq() for architecture changes
+   Copyright (C) 2012 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 if __ppc_get_timebase_freq() works and is different from zero.  A read
+   failure might indicate a Linux Kernel change.
+   This test also use the frequency to compute the real elapsed time.  */
+
+#include <inttypes.h>
+#include <stdio.h>
+
+#include <sys/platform/ppc.h>
+
+/* Maximum value of the Time Base Register: 2^60 - 1.  */
+#define MAX_TB 0xFFFFFFFFFFFFFFF
+
+static int
+do_test (void)
+{
+  uint64_t t1, t2, f, diff;
+
+  t1 = __ppc_get_timebase ();
+  printf ("t1 = %"PRIu64"\n", t1);
+
+  f = __ppc_get_timebase_freq ();
+  printf ("Time Base frequency = %"PRIu64" Hz\n", f);
+
+  if (f == 0) {
+      printf ("Fail: The time base frequency can't be zero.");
+      return 1;
+  }
+
+  t2 = __ppc_get_timebase ();
+  printf ("t2 = %"PRIu64"\n", t2);
+
+  if (t2 > t1) {
+    diff = t2 - t1;
+  } else {
+    diff = (MAX_TB - t2) + t1;
+  }
+
+  printf ("Elapsed time  = %1.2f usecs\n", (double) diff * 1000000 / f );
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

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

Summary of changes:
 ChangeLog                                          |   20 ++++++
 manual/platform.texi                               |    8 +++
 sysdeps/powerpc/sys/platform/ppc.h                 |    1 +
 sysdeps/unix/sysv/linux/powerpc/Makefile           |    6 ++
 sysdeps/unix/sysv/linux/powerpc/bits/ppc.h         |   33 ++++++++++
 .../unix/sysv/linux/powerpc/get_timebase_freq.c    |   26 ++++++++
 sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions |    3 +
 .../linux/powerpc/powerpc32/fpu/nptl/libc.abilist  |    1 +
 sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions |    3 +
 .../sysv/linux/powerpc/powerpc64/nptl/libc.abilist |    1 +
 .../unix/sysv/linux/powerpc/test-gettimebasefreq.c |   62 ++++++++++++++++++++
 11 files changed, 164 insertions(+), 0 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/bits/ppc.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/get_timebase_freq.c
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/test-gettimebasefreq.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]