changeset 1598:3cbf1abde44a

Update to linux 3.9.
author Rob Landley <rob@landley.net>
date Mon, 29 Apr 2013 22:03:14 -0500
parents 15b4fc37d5f7
children e8d846fb56eb
files download.sh sources/patches/linux-arm.patch sources/patches/linux-noperl-capflags.patch sources/patches/linux-noperl-headers.patch sources/patches/linux-noperl-timeconst.patch
diffstat 5 files changed, 174 insertions(+), 452 deletions(-) [+]
line wrap: on
line diff
--- a/download.sh	Tue Apr 23 19:13:02 2013 -0500
+++ b/download.sh	Mon Apr 29 22:03:14 2013 -0500
@@ -29,8 +29,8 @@
 SHA1=4082df10a2985c36be50a3643a0215b219154049 \
 maybe_fork "download || dienow"
 
-URL=ftp://kernel.org/pub/linux/kernel/v3.x/linux-3.8.tar.bz2 \
-SHA1=04e0496008f6aa08b0bd43963098a87067d00d7f \
+URL=ftp://kernel.org/pub/linux/kernel/v3.x/linux-3.9.tar.bz2 \
+SHA1=eccaff1bf7c671dacb18cfa98f8275fc9afbb0e1 \
 maybe_fork "download || dienow"
 
 
--- a/sources/patches/linux-arm.patch	Tue Apr 23 19:13:02 2013 -0500
+++ b/sources/patches/linux-arm.patch	Mon Apr 29 22:03:14 2013 -0500
@@ -90,16 +90,15 @@
  config ARCH_VERSATILE_PB
  	bool "Support Versatile Platform Baseboard for ARM926EJ-S"
  	default y
-diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c
-index 2f84f40..cd7c8ce 100644
---- a/arch/arm/mach-versatile/pci.c
-+++ b/arch/arm/mach-versatile/pci.c
-@@ -332,7 +332,7 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
- 	 *  26     1     29
- 	 *  27     1     30
+diff -ruN linux/arch/arm/mach-versatile/pci.c linux.bak/arch/arm/mach-versatile/pci.c
+--- linux/arch/arm/mach-versatile/pci.c	2013-04-28 19:36:01.000000000 -0500
++++ linux.bak/arch/arm/mach-versatile/pci.c	2013-04-29 19:09:44.857097553 -0500
+@@ -333,7 +333,7 @@
+ 	 *  26     1     IRQ_SIC_PCI2
+ 	 *  27     1     IRQ_SIC_PCI3
  	 */
--	irq = 27 + ((slot - 24 + pin - 1) & 3);
-+	irq = 59; //27 + ((slot - 24 + pin - 1) & 3);
+-	irq = IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3);
++	irq = 59; //IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3);
  
  	return irq;
  }
--- a/sources/patches/linux-noperl-capflags.patch	Tue Apr 23 19:13:02 2013 -0500
+++ b/sources/patches/linux-noperl-capflags.patch	Mon Apr 29 22:03:14 2013 -0500
@@ -1,3 +1,19 @@
+From: Rob Landley <rob@landley.net>
+Subject: [PATCH 1/3] convert mkcapflags.pl to mkcapflags.sh
+To: linux-kernel@vger.kernel.org
+Cc: Arnd Bergmann <arnd@arndb.de>
+Cc: Dave Jones <davej@redhat.com>
+Cc: David Howells <dhowells@redhat.com>
+Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
+Cc: Cyrill Gorcunov <gorcunov@openvz.org>
+Cc: Vince Weaver <vincent.weaver@maine.edu>
+Cc: Zheng Yan <zheng.z.yan@intel.com>
+Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Cc: x86@kernel.org
+Cc: "H. Peter Anvin" <hpa@zytor.com>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+
 From: Rob Landley <rob@landley.net>
 
 Generate asm-x86/cpufeature.h with posix-2008 commands instead of perl.
@@ -6,9 +22,9 @@
 ---
 
  arch/x86/kernel/cpu/Makefile      |    4 +-
- arch/x86/kernel/cpu/mkcapflags.pl |   45 ----------------------------
- arch/x86/kernel/cpu/mkcapflags.sh |   39 ++++++++++++++++++++++++
- 3 files changed, 41 insertions(+), 47 deletions(-)
+ arch/x86/kernel/cpu/mkcapflags.pl |   48 ----------------------------
+ arch/x86/kernel/cpu/mkcapflags.sh |   41 +++++++++++++++++++++++
+ 3 files changed, 43 insertions(+), 50 deletions(-)
 
 --- linux/arch/x86/kernel/cpu/mkcapflags.pl
 +++ /dev/null
@@ -109,7 +125,7 @@
 index 25f24dc..9edf7e7 100644
 --- a/arch/x86/kernel/cpu/Makefile
 +++ b/arch/x86/kernel/cpu/Makefile
-@@ -40,10 +40,10 @@ obj-$(CONFIG_MTRR)			+= mtrr/
+@@ -43,10 +43,10 @@ obj-$(CONFIG_MTRR)			+= mtrr/
  obj-$(CONFIG_X86_LOCAL_APIC)		+= perfctr-watchdog.o perf_event_amd_ibs.o
  
  quiet_cmd_mkcapflags = MKCAP   $@
--- a/sources/patches/linux-noperl-headers.patch	Tue Apr 23 19:13:02 2013 -0500
+++ b/sources/patches/linux-noperl-headers.patch	Mon Apr 29 22:03:14 2013 -0500
@@ -1,4 +1,13 @@
-Subject: [PATCH] Replace scripts/headers_install.pl with a shell script.
+Subject: [PATCH 3/3] convert headers_install.pl to headers_install.sh
+To: linux-kbuild@vger.kernel.org
+Cc: linux-kernel@vger.kernel.org
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: Josh Boyer <jwboyer@redhat.com>
+Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: David Howells <dhowell@redhat.com>
+Cc: Michal Marek <mmarek@suse.cz>
+Cc: Sam Ravnborg <sam@ravnborg.org>
 
 From: Rob Landley <rob@landley.net>
 
@@ -8,16 +17,19 @@
 for loop calling sed and piping its output through unifdef to produce the
 target file.
 
-Previous submission: Tuesday Jan 18, 2011
-Message-ID: <4D359E5C.1070002@parallels.com>
+Same as last time except for minor tweak to deal with code review from here:
+http://lkml.indiana.edu/hypermail/linux/kernel/1302.3/00078.html
+
+(Note that this drops the "arch" argument, which isn't used. Kbuild
+already points to the right input files on the command line.)
 
 Signed-off-by: Rob Landley <rob@landley.net>
 ---
 
- scripts/Makefile.headersinst |    6 +--
- scripts/headers_install.pl   |   58 ---------------------------------
- scripts/headers_install.sh   |   43 ++++++++++++++++++++++++
- 3 files changed, 46 insertions(+), 61 deletions(-)
+ scripts/Makefile.headersinst |    4 +-
+ scripts/headers_install.pl   |   63 ---------------------------------
+ scripts/headers_install.sh   |   43 ++++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 65 deletions(-)
 
 diff -ruN linux-3.1/scripts/headers_install.sh linux-2.6.30/scripts/headers_install.sh
 --- linux-3.1/scripts/headers_install.sh
@@ -57,7 +69,7 @@
 +		-e 's/__attribute_const__([ \t]|$)/\1/g' \
 +		-e 's@^#include <linux/compiler.h>@@' \
 +		-e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
-+		-e 's/(^|[ \t])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
++		-e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
 +		-e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \
 +		"$i" > "$OUTDIR/$FILE.sed" || exit 1
 +	scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
@@ -69,7 +81,7 @@
 diff -ruN linux-3.1/scripts/Makefile.headersinst
 --- linux-3.1/scripts/Makefile.headersinst
 +++ linux/scripts/Makefile.headersinst
-@@ -55,7 +55,7 @@
+@@ -71,7 +71,7 @@
  quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
                              file$(if $(word 2, $(all-files)),s))
        cmd_install = \
@@ -78,7 +90,7 @@
          for F in $(wrapper-files); do                                   \
                  echo "\#include <asm-generic/$$F>" > $(installdir)/$$F;    \
          done;                                                           \
-@@ -83,7 +83,7 @@
+@@ -97,7 +97,7 @@
  	@:
  
  targets += $(install-file)
--- a/sources/patches/linux-noperl-timeconst.patch	Tue Apr 23 19:13:02 2013 -0500
+++ b/sources/patches/linux-noperl-timeconst.patch	Mon Apr 29 22:03:14 2013 -0500
@@ -1,50 +1,13 @@
-From: Rob Landley <rlandley@parallels.com>
-
-Replace perl header file generator with smaller/faster/simpler C version.
-
-Hasn't changed since last submission, which was:
-
-Message-ID: <4D35FEF3.4070001@parallels.com>
-Subject: Re: [PATCH] Use sed instead of perl to generate x86/kernel/cpu/capflags.c.
-
-Signed-off-by: Rob Landley <rlandley@parallels.com>
----
-
-I ran the attached test script to compare the output of the C program
-with the output of the perl version for every HZ from 1 to 5000 to make
-sure it was producing the same constants.
-
- kernel/Makefile      |   10 -
- kernel/mktimeconst.c |  109 +++++++++++
- kernel/timeconst.pl  |  378 -----------------------------------------
- 3 files changed, 115 insertions(+), 382 deletions(-)
+Replace timeconst.bc with the c version I've been using for years (to replace
+the perl version). Eventually I should add bc to toybox, but for now...
 
 diff --git a/kernel/Makefile b/kernel/Makefile
-index 5669f71..ba9ce6d 100644
---- a/kernel/Makefile
-+++ b/kernel/Makefile
-@@ -133,11 +133,13 @@ $(obj)/config_data.h: $(obj)/config_data.gz FORCE
- 
- $(obj)/time.o: $(obj)/timeconst.h
- 
--quiet_cmd_timeconst  = TIMEC   $@
--      cmd_timeconst  = $(PERL) $< $(CONFIG_HZ) > $@
-+hostprogs-y	+= mktimeconst
-+quiet_cmd_mktimeconst = TIMEC   $@
-+	cmd_mktimeconst = $(obj)/mktimeconst $(CONFIG_HZ) $@ || ( rm -f $@ && exit 1 )
-+
- targets += timeconst.h
--$(obj)/timeconst.h: $(src)/timeconst.pl FORCE
--	$(call if_changed,timeconst)
-+$(obj)/timeconst.h: $(obj)/mktimeconst FORCE
-+	$(call if_changed,mktimeconst)
- 
- ifeq ($(CONFIG_MODULE_SIG),y)
- #
---- /dev/null	2011-01-13 17:00:36.470564274 -0600
-+++ b/kernel/mktimeconst.c	2011-01-16 12:44:04.091168778 -0600
-@@ -0,0 +1,109 @@
+index eceac38..f00be6d 100644
+--- /dev/null
++++ linux/kernel/mktimeconst.c
+@@ -0,0 +1,110 @@
 +/* Copyright 2010 Parallels Inc, licensed under GPLv2 */
++/* Copyright 2010-2013 Rob Landley <rob@landley.net> */
 +
 +#include <inttypes.h>
 +#include <stdio.h>
@@ -153,409 +116,141 @@
 +	fflush(stdout);
 +	return ferror(stdout);
 +}
---- a/kernel/timeconst.pl	2010-12-19 11:33:53.969732934 -0600
-+++ /dev/null	2011-01-13 17:00:36.470564274 -0600
-@@ -1,378 +0,0 @@
--#!/usr/bin/perl
--# -----------------------------------------------------------------------
--#
--#   Copyright 2007-2008 rPath, Inc. - All Rights Reserved
--#
--#   This file is part of the Linux kernel, and is made available under
--#   the terms of the GNU General Public License version 2 or (at your
--#   option) any later version; incorporated herein by reference.
--#
--# -----------------------------------------------------------------------
--#
--
--#
--# Usage: timeconst.pl HZ > timeconst.h
--#
+--- linux/kernel/timeconst.bc	2013-04-28 19:36:01.000000000 -0500
++++ /dev/null	2013-02-23 10:58:11.743993346 -0600
+@@ -1,108 +0,0 @@
+-scale=0
 -
--# Precomputed values for systems without Math::BigInt
--# Generated by:
--# timeconst.pl --can 24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200
--%canned_values = (
--	24 => [
--		'0xa6aaaaab','0x2aaaaaa',26,
--		125,3,
--		'0xc49ba5e4','0x1fbe76c8b4',37,
--		3,125,
--		'0xa2c2aaab','0xaaaa',16,
--		125000,3,
--		'0xc9539b89','0x7fffbce4217d',47,
--		3,125000,
--	], 32 => [
--		'0xfa000000','0x6000000',27,
--		125,4,
--		'0x83126e98','0xfdf3b645a',36,
--		4,125,
--		'0xf4240000','0x0',17,
--		31250,1,
--		'0x8637bd06','0x3fff79c842fa',46,
--		1,31250,
--	], 48 => [
--		'0xa6aaaaab','0x6aaaaaa',27,
--		125,6,
--		'0xc49ba5e4','0xfdf3b645a',36,
--		6,125,
--		'0xa2c2aaab','0x15555',17,
--		62500,3,
--		'0xc9539b89','0x3fffbce4217d',46,
--		3,62500,
--	], 64 => [
--		'0xfa000000','0xe000000',28,
--		125,8,
--		'0x83126e98','0x7ef9db22d',35,
--		8,125,
--		'0xf4240000','0x0',18,
--		15625,1,
--		'0x8637bd06','0x1fff79c842fa',45,
--		1,15625,
--	], 100 => [
--		'0xa0000000','0x0',28,
--		10,1,
--		'0xcccccccd','0x733333333',35,
--		1,10,
--		'0x9c400000','0x0',18,
--		10000,1,
--		'0xd1b71759','0x1fff2e48e8a7',45,
--		1,10000,
--	], 122 => [
--		'0x8325c53f','0xfbcda3a',28,
--		500,61,
--		'0xf9db22d1','0x7fbe76c8b',35,
--		61,500,
--		'0x8012e2a0','0x3ef36',18,
--		500000,61,
--		'0xffda4053','0x1ffffbce4217',45,
--		61,500000,
--	], 128 => [
--		'0xfa000000','0x1e000000',29,
--		125,16,
--		'0x83126e98','0x3f7ced916',34,
--		16,125,
--		'0xf4240000','0x40000',19,
--		15625,2,
--		'0x8637bd06','0xfffbce4217d',44,
--		2,15625,
--	], 200 => [
--		'0xa0000000','0x0',29,
--		5,1,
--		'0xcccccccd','0x333333333',34,
--		1,5,
--		'0x9c400000','0x0',19,
--		5000,1,
--		'0xd1b71759','0xfff2e48e8a7',44,
--		1,5000,
--	], 250 => [
--		'0x80000000','0x0',29,
--		4,1,
--		'0x80000000','0x180000000',33,
--		1,4,
--		'0xfa000000','0x0',20,
--		4000,1,
--		'0x83126e98','0x7ff7ced9168',43,
--		1,4000,
--	], 256 => [
--		'0xfa000000','0x3e000000',30,
--		125,32,
--		'0x83126e98','0x1fbe76c8b',33,
--		32,125,
--		'0xf4240000','0xc0000',20,
--		15625,4,
--		'0x8637bd06','0x7ffde7210be',43,
--		4,15625,
--	], 300 => [
--		'0xd5555556','0x2aaaaaaa',30,
--		10,3,
--		'0x9999999a','0x1cccccccc',33,
--		3,10,
--		'0xd0555556','0xaaaaa',20,
--		10000,3,
--		'0x9d495183','0x7ffcb923a29',43,
--		3,10000,
--	], 512 => [
--		'0xfa000000','0x7e000000',31,
--		125,64,
--		'0x83126e98','0xfdf3b645',32,
--		64,125,
--		'0xf4240000','0x1c0000',21,
--		15625,8,
--		'0x8637bd06','0x3ffef39085f',42,
--		8,15625,
--	], 1000 => [
--		'0x80000000','0x0',31,
--		1,1,
--		'0x80000000','0x0',31,
--		1,1,
--		'0xfa000000','0x0',22,
--		1000,1,
--		'0x83126e98','0x1ff7ced9168',41,
--		1,1000,
--	], 1024 => [
--		'0xfa000000','0xfe000000',32,
--		125,128,
--		'0x83126e98','0x7ef9db22',31,
--		128,125,
--		'0xf4240000','0x3c0000',22,
--		15625,16,
--		'0x8637bd06','0x1fff79c842f',41,
--		16,15625,
--	], 1200 => [
--		'0xd5555556','0xd5555555',32,
--		5,6,
--		'0x9999999a','0x66666666',31,
--		6,5,
--		'0xd0555556','0x2aaaaa',22,
--		2500,3,
--		'0x9d495183','0x1ffcb923a29',41,
--		3,2500,
--	]
--);
+-define gcd(a,b) {
+-	auto t;
+-	while (b) {
+-		t = b;
+-		b = a % b;
+-		a = t;
+-	}
+-	return a;
+-}
 -
--$has_bigint = eval 'use Math::BigInt qw(bgcd); 1;';
--
--sub bint($)
--{
--	my($x) = @_;
--	return Math::BigInt->new($x);
+-/* Division by reciprocal multiplication. */
+-define fmul(b,n,d) {
+-       return (2^b*n+d-1)/d;
 -}
 -
--#
--# Constants for division by reciprocal multiplication.
--# (bits, numerator, denominator)
--#
--sub fmul($$$)
--{
--	my ($b,$n,$d) = @_;
--
--	$n = bint($n);
--	$d = bint($d);
--
--	return scalar (($n << $b)+$d-bint(1))/$d;
+-/* Adjustment factor when a ceiling value is used.  Use as:
+-   (imul * n) + (fmulxx * n + fadjxx) >> xx) */
+-define fadj(b,n,d) {
+-	auto v;
+-	d = d/gcd(n,d);
+-	v = 2^b*(d-1)/d;
+-	return v;
 -}
 -
--sub fadj($$$)
--{
--	my($b,$n,$d) = @_;
--
--	$n = bint($n);
--	$d = bint($d);
--
--	$d = $d/bgcd($n, $d);
--	return scalar (($d-bint(1)) << $b)/$d;
--}
--
--sub fmuls($$$) {
--	my($b,$n,$d) = @_;
--	my($s,$m);
--	my($thres) = bint(1) << ($b-1);
--
--	$n = bint($n);
--	$d = bint($d);
--
--	for ($s = 0; 1; $s++) {
--		$m = fmul($s,$n,$d);
--		return $s if ($m >= $thres);
+-/* Compute the appropriate mul/adj values as well as a shift count,
+-   which brings the mul value into the range 2^b-1 <= x < 2^b.  Such
+-   a shift value will be correct in the signed integer range and off
+-   by at most one in the upper half of the unsigned range. */
+-define fmuls(b,n,d) {
+-	auto s, m;
+-	for (s = 0; 1; s++) {
+-		m = fmul(s,n,d);
+-		if (m >= 2^(b-1))
+-			return s;
 -	}
 -	return 0;
 -}
 -
--# Generate a hex value if the result fits in 64 bits;
--# otherwise skip.
--sub bignum_hex($) {
--	my($x) = @_;
--	my $s = $x->as_hex();
+-define timeconst(hz) {
+-	print "/* Automatically generated by kernel/timeconst.bc */\n"
+-	print "/* Time conversion constants for HZ == ", hz, " */\n"
+-	print "\n"
 -
--	return (length($s) > 18) ? undef : $s;
--}
+-	print "#ifndef KERNEL_TIMECONST_H\n"
+-	print "#define KERNEL_TIMECONST_H\n\n"
+-
+-	print "#include <linux/param.h>\n"
+-	print "#include <linux/types.h>\n\n"
+-
+-	print "#if HZ != ", hz, "\n"
+-	print "#error \qkernel/timeconst.h has the wrong HZ value!\q\n"
+-	print "#endif\n\n"
 -
--# Provides mul, adj, and shr factors for a specific
--# (bit, time, hz) combination
--sub muladj($$$) {
--	my($b, $t, $hz) = @_;
--	my $s = fmuls($b, $t, $hz);
--	my $m = fmul($s, $t, $hz);
--	my $a = fadj($s, $t, $hz);
--	return (bignum_hex($m), bignum_hex($a), $s);
--}
+-	if (hz < 2) {
+-		print "#error Totally bogus HZ value!\n"
+-	} else {
+-		s=fmuls(32,1000,hz)
+-		obase=16
+-		print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
+-		print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
+-		obase=10
+-		print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
 -
--# Provides numerator, denominator values
--sub numden($$) {
--	my($n, $d) = @_;
--	my $g = bgcd($n, $d);
--	return ($n/$g, $d/$g);
--}
--
--# All values for a specific (time, hz) combo
--sub conversions($$) {
--	my ($t, $hz) = @_;
--	my @val = ();
--
--	# HZ_TO_xx
--	push(@val, muladj(32, $t, $hz));
--	push(@val, numden($t, $hz));
+-		s=fmuls(32,hz,1000)
+-		obase=16
+-		print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
+-		print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
+-		obase=10
+-		print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
 -
--	# xx_TO_HZ
--	push(@val, muladj(32, $hz, $t));
--	push(@val, numden($hz, $t));
--
--	return @val;
--}
+-		obase=10
+-		cd=gcd(hz,1000)
+-		print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
+-		print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
+-		print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
+-		print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
+-		print "\n"
 -
--sub compute_values($) {
--	my($hz) = @_;
--	my @val = ();
--	my $s, $m, $a, $g;
--
--	if (!$has_bigint) {
--		die "$0: HZ == $hz not canned and ".
--		    "Math::BigInt not available\n";
--	}
+-		s=fmuls(32,1000000,hz)
+-		obase=16
+-		print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
+-		print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
+-		obase=10
+-		print "#define HZ_TO_USEC_SHR32\t", s, "\n"
 -
--	# MSEC conversions
--	push(@val, conversions(1000, $hz));
--
--	# USEC conversions
--	push(@val, conversions(1000000, $hz));
--
--	return @val;
--}
+-		s=fmuls(32,hz,1000000)
+-		obase=16
+-		print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
+-		print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
+-		obase=10
+-		print "#define USEC_TO_HZ_SHR32\t", s, "\n"
 -
--sub outputval($$)
--{
--	my($name, $val) = @_;
--	my $csuf;
+-		obase=10
+-		cd=gcd(hz,1000000)
+-		print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
+-		print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
+-		print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
+-		print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
+-		print "\n"
 -
--	if (defined($val)) {
--	    if ($name !~ /SHR/) {
--		$val = "U64_C($val)";
--	    }
--	    printf "#define %-23s %s\n", $name.$csuf, $val.$csuf;
+-		print "#endif /* KERNEL_TIMECONST_H */\n"
 -	}
+-	halt
 -}
 -
--sub output($@)
--{
--	my($hz, @val) = @_;
--	my $pfx, $bit, $suf, $s, $m, $a;
--
--	print "/* Automatically generated by kernel/timeconst.pl */\n";
--	print "/* Conversion constants for HZ == $hz */\n";
--	print "\n";
--	print "#ifndef KERNEL_TIMECONST_H\n";
--	print "#define KERNEL_TIMECONST_H\n";
--	print "\n";
--
--	print "#include <linux/param.h>\n";
--	print "#include <linux/types.h>\n";
--
--	print "\n";
--	print "#if HZ != $hz\n";
--	print "#error \"kernel/timeconst.h has the wrong HZ value!\"\n";
--	print "#endif\n";
--	print "\n";
+-timeconst(hz)
+--- linux/kernel/Makefile
++++ linux/kernel/Makefile
+@@ -125,19 +125,13 @@
+ 
+ $(obj)/time.o: $(obj)/timeconst.h
+ 
+-quiet_cmd_hzfile = HZFILE  $@
+-      cmd_hzfile = echo "hz=$(CONFIG_HZ)" > $@
 -
--	foreach $pfx ('HZ_TO_MSEC','MSEC_TO_HZ',
--		      'HZ_TO_USEC','USEC_TO_HZ') {
--		foreach $bit (32) {
--			foreach $suf ('MUL', 'ADJ', 'SHR') {
--				outputval("${pfx}_$suf$bit", shift(@val));
--			}
--		}
--		foreach $suf ('NUM', 'DEN') {
--			outputval("${pfx}_$suf", shift(@val));
--		}
--	}
--
--	print "\n";
--	print "#endif /* KERNEL_TIMECONST_H */\n";
--}
--
--# Pretty-print Perl values
--sub perlvals(@) {
--	my $v;
--	my @l = ();
--
--	foreach $v (@_) {
--		if (!defined($v)) {
--			push(@l, 'undef');
--		} elsif ($v =~ /^0x/) {
--			push(@l, "\'".$v."\'");
--		} else {
--			push(@l, $v.'');
--		}
--	}
--	return join(',', @l);
--}
--
--($hz) = @ARGV;
--
--# Use this to generate the %canned_values structure
--if ($hz eq '--can') {
--	shift(@ARGV);
--	@hzlist = sort {$a <=> $b} (@ARGV);
+-targets += hz.bc
+-$(obj)/hz.bc: $(objtree)/include/config/hz.h FORCE
+-	$(call if_changed,hzfile)
 -
--	print "# Precomputed values for systems without Math::BigInt\n";
--	print "# Generated by:\n";
--	print "# timeconst.pl --can ", join(' ', @hzlist), "\n";
--	print "\%canned_values = (\n";
--	my $pf = "\t";
--	foreach $hz (@hzlist) {
--		my @values = compute_values($hz);
--		print "$pf$hz => [\n";
--		while (scalar(@values)) {
--			my $bit;
--			foreach $bit (32) {
--				my $m = shift(@values);
--				my $a = shift(@values);
--				my $s = shift(@values);
--				print "\t\t", perlvals($m,$a,$s), ",\n";
--			}
--			my $n = shift(@values);
--			my $d = shift(@values);
--			print "\t\t", perlvals($n,$d), ",\n";
--		}
--		print "\t]";
--		$pf = ', ';
--	}
--	print "\n);\n";
--} else {
--	$hz += 0;			# Force to number
--	if ($hz < 1) {
--		die "Usage: $0 HZ\n";
--	}
--
--	@val = @{$canned_values{$hz}};
--	if (!defined(@val)) {
--		@val = compute_values($hz);
--	}
--	output($hz, @val);
--}
--exit 0;
-
---------------070402000802050303040701
-Content-Type: application/x-sh; name="loopy.sh"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment; filename="loopy.sh"
-
-#!/bin/bash
-
-gcc mktimeconst.c || exit 1
-
-X=1
-while [ $X -lt 5000 ]
-do
-  echo $X
-
-  perl ~/linux/linux/kernel/timeconst.pl $X | sed 's/KERNEL_TIMECONST/__KERNEL_TIMECONST/;/Automatically generated/d;/^$/d'> temp.txt
-  ./a.out $X temp2.txt
-  sed -i '/Automatically generated/d;/^$/d' temp2.txt
-
-  diff -uw temp.txt temp2.txt || exit 1
-
-  X=$(($X+1))
-done
-
---------------070402000802050303040701--
+-quiet_cmd_bc  = BC      $@
+-      cmd_bc  = bc -q $(filter-out FORCE,$^) > $@
++hostprogs-y    += mktimeconst
++quiet_cmd_mktimeconst = TIMEC   $@
++	cmd_mktimeconst = $(obj)/mktimeconst $(CONFIG_HZ) $@ || ( rm -f $@ && exit 1 )
+ 
+ targets += timeconst.h
+-$(obj)/timeconst.h: $(obj)/hz.bc $(src)/timeconst.bc FORCE
+-	$(call if_changed,bc)
++$(obj)/timeconst.h: $(obj)/mktimeconst FORCE
++	$(call if_changed,mktimeconst)
+ 
+ ifeq ($(CONFIG_MODULE_SIG),y)
+ #