diff options
author | dchagin <dchagin@FreeBSD.org> | 2009-05-10 18:43:43 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2009-05-10 18:43:43 +0000 |
commit | 51f122997d95d99a2b0e68444995323789c9da37 (patch) | |
tree | 80f75650b634fefa8d61d026ce4eb87879a7bdf8 /sys/compat | |
parent | e4e6bf246f894df69a22849f9d779e13672a6d83 (diff) | |
download | FreeBSD-src-51f122997d95d99a2b0e68444995323789c9da37.zip FreeBSD-src-51f122997d95d99a2b0e68444995323789c9da37.tar.gz |
Do not export AT_CLKTCK when emulating Linux kernel prior
to 2.4.0, as it has appeared in the 2.4.0-rc7 first time.
Being exported, AT_CLKTCK is returned by sysconf(_SC_CLK_TCK),
glibc falls back to the hard-coded CLK_TCK value when aux entry
is not present.
Glibc versions prior to 2.2.1 always use hard-coded CLK_TCK value.
For older applications/libc's which depends on hard-coded CLK_TCK
value user should set compat.linux.osrelease less than 2.4.0.
Approved by: kib (mentor)
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linux/linux_mib.h | 1 | ||||
-rw-r--r-- | sys/compat/linux/linux_misc.c | 14 |
2 files changed, 14 insertions, 1 deletions
diff --git a/sys/compat/linux/linux_mib.h b/sys/compat/linux/linux_mib.h index 9f0f41c..f78a5e5 100644 --- a/sys/compat/linux/linux_mib.h +++ b/sys/compat/linux/linux_mib.h @@ -45,6 +45,7 @@ int linux_set_oss_version(struct thread *td, int oss_version); int linux_kernver(struct thread *td); +#define LINUX_KERNVER_2004000 2004000 #define LINUX_KERNVER_2006000 2006000 #define linux_use26(t) (linux_kernver(t) >= LINUX_KERNVER_2006000) diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index c5b1e54..7279197 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -661,7 +661,19 @@ struct l_times_argv { l_clock_t tms_cstime; }; -#define CONVTCK(r) (r.tv_sec * stclohz + r.tv_usec / (1000000 / stclohz)) + +/* + * Glibc versions prior to 2.2.1 always use hard-coded CLK_TCK value. + * Since 2.2.1 Glibc uses value exported from kernel via AT_CLKTCK + * auxiliary vector entry. + */ +#define CLK_TCK 100 + +#define CONVOTCK(r) (r.tv_sec * CLK_TCK + r.tv_usec / (1000000 / CLK_TCK)) +#define CONVNTCK(r) (r.tv_sec * stclohz + r.tv_usec / (1000000 / stclohz)) + +#define CONVTCK(r) (linux_kernver(td) >= LINUX_KERNVER_2004000 ? \ + CONVNTCK(r) : CONVOTCK(r)) int linux_times(struct thread *td, struct linux_times_args *args) |