Add __ppc_get_timebase_freq to ppc.h.

This commit is contained in:
Tulio Magno Quites Machado Filho 2012-09-25 14:48:28 -05:00 committed by Ryan S. Arnold
parent 7e2fca8dd2
commit 8ad11b9a9c
11 changed files with 164 additions and 0 deletions

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,33 @@
/* Facilities specific to the PowerPC architecture on Linux
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/>. */
#ifndef _BITS_PPC_H
#define _BITS_PPC_H
#ifndef _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

View File

@ -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)

View File

@ -30,4 +30,7 @@ libc {
GLIBC_2.11 {
fallocate64;
}
GLIBC_2.17 {
__ppc_get_timebase_freq;
}
}

View File

@ -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

View File

@ -19,4 +19,7 @@ libc {
setcontext;
swapcontext;
}
GLIBC_2.17 {
__ppc_get_timebase_freq;
}
}

View File

@ -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

View File

@ -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"