svn commit: r191973 - in head/sys: amd64/linux32 compat/linux
i386/linux
Dmitry Chagin
dchagin at FreeBSD.org
Sun May 10 18:43:44 UTC 2009
Author: dchagin
Date: Sun May 10 18:43:43 2009
New Revision: 191973
URL: http://svn.freebsd.org/changeset/base/191973
Log:
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)
Modified:
head/sys/amd64/linux32/linux32_sysvec.c
head/sys/compat/linux/linux_mib.h
head/sys/compat/linux/linux_misc.c
head/sys/i386/linux/linux_sysvec.c
Modified: head/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- head/sys/amd64/linux32/linux32_sysvec.c Sun May 10 18:27:20 2009 (r191972)
+++ head/sys/amd64/linux32/linux32_sysvec.c Sun May 10 18:43:43 2009 (r191973)
@@ -261,7 +261,17 @@ elf_linux_fixup(register_t **stack_base,
pos = base + (imgp->args->argc + imgp->args->envc + 2);
AUXARGS_ENTRY_32(pos, LINUX_AT_HWCAP, cpu_feature);
- AUXARGS_ENTRY_32(pos, LINUX_AT_CLKTCK, stclohz);
+
+ /*
+ * 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.
+ * Also see linux_times() implementation.
+ */
+ if (linux_kernver(curthread) >= LINUX_KERNVER_2004000)
+ AUXARGS_ENTRY_32(pos, LINUX_AT_CLKTCK, stclohz);
AUXARGS_ENTRY_32(pos, AT_PHDR, args->phdr);
AUXARGS_ENTRY_32(pos, AT_PHENT, args->phent);
AUXARGS_ENTRY_32(pos, AT_PHNUM, args->phnum);
Modified: head/sys/compat/linux/linux_mib.h
==============================================================================
--- head/sys/compat/linux/linux_mib.h Sun May 10 18:27:20 2009 (r191972)
+++ head/sys/compat/linux/linux_mib.h Sun May 10 18:43:43 2009 (r191973)
@@ -45,6 +45,7 @@ int linux_set_oss_version(struct thread
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)
Modified: head/sys/compat/linux/linux_misc.c
==============================================================================
--- head/sys/compat/linux/linux_misc.c Sun May 10 18:27:20 2009 (r191972)
+++ head/sys/compat/linux/linux_misc.c Sun May 10 18:43:43 2009 (r191973)
@@ -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)
Modified: head/sys/i386/linux/linux_sysvec.c
==============================================================================
--- head/sys/i386/linux/linux_sysvec.c Sun May 10 18:27:20 2009 (r191972)
+++ head/sys/i386/linux/linux_sysvec.c Sun May 10 18:43:43 2009 (r191973)
@@ -255,7 +255,17 @@ elf_linux_fixup(register_t **stack_base,
pos = *stack_base + (imgp->args->argc + imgp->args->envc + 2);
AUXARGS_ENTRY(pos, LINUX_AT_HWCAP, cpu_feature);
- AUXARGS_ENTRY(pos, LINUX_AT_CLKTCK, stclohz);
+
+ /*
+ * 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.
+ * Also see linux_times() implementation.
+ */
+ if (linux_kernver(curthread) >= LINUX_KERNVER_2004000)
+ AUXARGS_ENTRY(pos, LINUX_AT_CLKTCK, stclohz);
AUXARGS_ENTRY(pos, AT_PHDR, args->phdr);
AUXARGS_ENTRY(pos, AT_PHENT, args->phent);
AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum);
More information about the svn-src-head
mailing list