summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2009-05-10 18:43:43 +0000
committerdchagin <dchagin@FreeBSD.org>2009-05-10 18:43:43 +0000
commit51f122997d95d99a2b0e68444995323789c9da37 (patch)
tree80f75650b634fefa8d61d026ce4eb87879a7bdf8 /sys/compat
parente4e6bf246f894df69a22849f9d779e13672a6d83 (diff)
downloadFreeBSD-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.h1
-rw-r--r--sys/compat/linux/linux_misc.c14
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)
OpenPOWER on IntegriCloud