diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/sysconf.c | 40 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/Dist | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c | 30 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/has_cpuclock.c | 52 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sysconf.c | 45 |
5 files changed, 134 insertions, 34 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/sysconf.c b/sysdeps/unix/sysv/linux/i386/sysconf.c index cb4706de73..8a9ab61912 100644 --- a/sysdeps/unix/sysv/linux/i386/sysconf.c +++ b/sysdeps/unix/sysv/linux/i386/sysconf.c @@ -319,16 +319,9 @@ handle_amd (int name) } -/* Get the value of the system variable NAME. */ -long int -__sysconf (int name) +static int +i386_i486_test (void) { - /* We only handle the cache information here (for now). */ - if (name < _SC_LEVEL1_ICACHE_SIZE || name > _SC_LEVEL4_CACHE_LINESIZE) - return linux_sysconf (name); - - /* Recognize i386 and compatible. These don't have any cache on - board. */ int eflags; int ac; asm volatile ("pushfl;\n\t" @@ -343,6 +336,35 @@ __sysconf (int name) "pushl %0;\n\t" "popfl" : "=r" (eflags), "=r" (ac)); + + return ac; +} + + +/* Get the value of the system variable NAME. */ +long int +__sysconf (int name) +{ + if (name == _SC_CPUTIME || name == _SC_THREAD_CPUTIME) + { + /* Check dynamically. */ + int ac = i386_i486_test (); + + /* Only i386 and i486 have no TSC. */ + // XXX We can add here test for machines which cannot support a + // XXX usabel TSC. + return ac == 0 || (ac & (1 << 21)) == 0 ? -1 : 200112L; + } + + /* All the remainder, except the cache information, is handled in + the generic code. */ + if (name < _SC_LEVEL1_ICACHE_SIZE || name > _SC_LEVEL4_CACHE_LINESIZE) + return linux_sysconf (name); + + /* Recognize i386 and compatible. These don't have any cache on + board. */ + int ac = i386_i486_test (); + if (ac == 0) /* This is an i386. */ // XXX Is this true for all brands? diff --git a/sysdeps/unix/sysv/linux/ia64/Dist b/sysdeps/unix/sysv/linux/ia64/Dist index c9e81a3e8f..b4118bdead 100644 --- a/sysdeps/unix/sysv/linux/ia64/Dist +++ b/sysdeps/unix/sysv/linux/ia64/Dist @@ -2,6 +2,7 @@ clone.S clone2.S dl-brk.S dl-static.c +has_cpuclock.c ioperm.c ldd-rewrite.sed __start_context.S diff --git a/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c b/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c index 68e5763a8c..229f93d67d 100644 --- a/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c +++ b/sysdeps/unix/sysv/linux/ia64/clock_getcpuclockid.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2003, 2004 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 @@ -24,6 +24,9 @@ #include <fcntl.h> +#include "has_cpuclock.c" + + int clock_getcpuclockid (pid_t pid, clockid_t *clock_id) { @@ -31,30 +34,7 @@ clock_getcpuclockid (pid_t pid, clockid_t *clock_id) if (pid != 0 && pid != getpid ()) return EPERM; - static int itc_usable; - int retval = ENOENT; - - if (__builtin_expect (itc_usable == 0, 0)) - { - int newval = 1; - int fd = open ("/proc/sal/itc_drift", O_RDONLY); - if (__builtin_expect (fd != -1, 1)) - { - char buf[16]; - /* We expect the file to contain a single digit followed by - a newline. If the format changes we better not rely on - the file content. */ - if (read (fd, buf, sizeof buf) != 2 || buf[0] != '0' - || buf[1] != '\n') - newval = -1; - - close (fd); - } - - itc_usable = newval; - } - - if (itc_usable > 0) + if (has_cpuclock () > 0) { /* Store the number. */ *clock_id = CLOCK_PROCESS_CPUTIME_ID; diff --git a/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c new file mode 100644 index 0000000000..ee19161272 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/has_cpuclock.c @@ -0,0 +1,52 @@ +/* Copyright (C) 2000, 2001, 2003, 2004 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> + + +static int itc_usable; + +static int +has_cpuclock (void) +{ + if (__builtin_expect (itc_usable == 0, 0)) + { + int newval = 1; + int fd = open ("/proc/sal/itc_drift", O_RDONLY); + if (__builtin_expect (fd != -1, 1)) + { + char buf[16]; + /* We expect the file to contain a single digit followed by + a newline. If the format changes we better not rely on + the file content. */ + if (read (fd, buf, sizeof buf) != 2 || buf[0] != '0' + || buf[1] != '\n') + newval = -1; + + close (fd); + } + + itc_usable = newval; + } + + return itc_usable; +} diff --git a/sysdeps/unix/sysv/linux/ia64/sysconf.c b/sysdeps/unix/sysv/linux/ia64/sysconf.c new file mode 100644 index 0000000000..ea4bde2e43 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/sysconf.c @@ -0,0 +1,45 @@ +/* Get file-specific information about a file. Linux version. + Copyright (C) 2003, 2004 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <assert.h> +#include <stdbool.h> +#include <stdlib.h> +#include <unistd.h> + + +#include "has_cpuclock.c" + +static long int linux_sysconf (int name); + + +/* Get the value of the system variable NAME. */ +long int +__sysconf (int name) +{ + if (name == _SC_CPUTIME || name == SC_THREAD_CPUTIME) + return has_cpuclock () ? 200112L : -1; + + /* Everything else is handled by the more general code. */ + return linux_sysconf (name); +} + +/* Now the generic Linux version. */ +#undef __sysconf +#define __sysconf static linux_sysconf +#include "../sysconf.c" |