diff for duplicates of <200901020213.30658.rob@landley.net> diff --git a/a/1.txt b/N1/1.txt index fd845ac..1d5bdc2 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,505 +1,6 @@ From: Rob Landley <rob@landley.net> - -Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell script -is much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003. - -Peter Anvin added this perl to 2.6.25. Before that, the kernel had never -required perl to build. - -Signed-off-by: Rob Landley <rob@landley.net> ---- - - kernel/Makefile | 4 - kernel/timeconst.pl | 378 ------------------------------------------ - kernel/timeconst.sh | 91 ++++++++++ - 3 files changed, 93 insertions(+), 380 deletions(-) - -diff -r d0c7611dcfd6 kernel/Makefile ---- a/kernel/Makefile Tue Dec 30 17:48:25 2008 -0800 -+++ b/kernel/Makefile Fri Jan 02 00:10:44 2009 -0600 -@@ -115,7 +115,7 @@ - $(obj)/time.o: $(obj)/timeconst.h - - quiet_cmd_timeconst = TIMEC $@ -- cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@ -+ cmd_timeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ) > $@ - targets += timeconst.h --$(obj)/timeconst.h: $(src)/timeconst.pl FORCE -+$(obj)/timeconst.h: $(src)/timeconst.sh FORCE - $(call if_changed,timeconst) ---- /dev/null 1969-12-31 00:00:00.000000000 -0600 -+++ hg/kernel/timeconst.sh 2009-01-01 23:53:17.000000000 -0600 -@@ -0,0 +1,91 @@ -+#!/bin/bash -+ -+if [ $# -ne 1 ] -+then -+ echo "Usage: timeconst.sh HZ" -+ exit 1 -+fi -+ -+HZ=$1 -+ -+# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math. -+ -+[ $((1<<32)) -lt 0 ] && exit 1 -+ -+# Output start of header file -+ -+cat << EOF -+/* Automatically generated by kernel/timeconst.sh */ -+/* Conversion constants for HZ == $HZ */ -+ -+#ifndef KERNEL_TIMECONST_H -+#define KERNEL_TIMECONST_H -+ -+#include <linux/param.h> -+#include <linux/types.h> -+ -+#if HZ != $HZ -+#error "kernel/timeconst.h has the wrong HZ value!" -+#endif -+ -+EOF -+ -+# For both Miliseconds and Microseconds -+ -+for i in "MSEC 1000" "USEC 1000000" -+do -+ NAME=$(echo $i | awk '{print $1}') -+ PERIOD=$(echo $i | awk '{print $2}') -+ -+ # Find greatest common denominator (using Euclid's algorithm) -+ -+ A=$HZ -+ B=$PERIOD -+ -+ while [ $B -ne 0 ] -+ do -+ C=$(($A%$B)) -+ A=$B -+ B=$C -+ done -+ -+ GCD=$A -+ -+ # Do this for each direction (HZ_TO_PERIOD and PERIOD_TO_HZ) -+ -+ for DIRECTION in 0 1 -+ do -+ if [ $DIRECTION -eq 0 ] -+ then -+ CONVERT="HZ_TO_${NAME}" -+ FROM=$HZ -+ TO=$PERIOD -+ else -+ CONVERT="${NAME}_TO_HZ" -+ FROM=$PERIOD -+ TO=$HZ -+ fi -+ -+ # How many shift bits give 32 bits of significant data? -+ -+ SHIFT=0 -+ while [ $(( (($TO<<$SHIFT)+$FROM-1)/$FROM )) -lt $((1<<31)) ] -+ do -+ SHIFT=$(( $SHIFT+1 )) -+ done -+ -+ MUL32=$(( (($TO<<$SHIFT)+$FROM-1)/$FROM )) -+ MUL32=$(printf %x $MUL32) -+ echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)" -+ ADJ32=$(($FROM/$GCD)) -+ ADJ32=$(( (($ADJ32-1)<<$SHIFT)/$ADJ32 )) -+ ADJ32=$(printf %x $ADJ32) -+ echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)" -+ echo "#define ${CONVERT}_SHR32 $SHIFT" -+ echo "#define ${CONVERT}_NUM U64_C($(($TO/$GCD)))" -+ echo "#define ${CONVERT}_DEN U64_C($(($FROM/$GCD)))" -+ done -+done -+ -+echo -+echo "#endif /* KERNEL_TIMECHONST_H */" ---- hg/kernel/timeconst.pl 2008-11-22 19:09:13.000000000 -0600 -+++ /dev/null 1969-12-31 00:00:00.000000000 -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 --# -- --# 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, -- ] --); -- --$has_bigint = eval 'use Math::BigInt qw(bgcd); 1;'; -- --sub bint($) --{ -- my($x) = @_; -- return Math::BigInt->new($x); --} -- --# --# 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; --} -- --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); -- } -- 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(); -- -- return (length($s) > 18) ? undef : $s; --} -- --# 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); --} -- --# 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)); -- -- # xx_TO_HZ -- push(@val, muladj(32, $hz, $t)); -- push(@val, numden($hz, $t)); -- -- return @val; --} -- --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"; -- } -- -- # MSEC conversions -- push(@val, conversions(1000, $hz)); -- -- # USEC conversions -- push(@val, conversions(1000000, $hz)); -- -- return @val; --} -- --sub outputval($$) --{ -- my($name, $val) = @_; -- my $csuf; -- -- if (defined($val)) { -- if ($name !~ /SHR/) { -- $val = "U64_C($val)"; -- } -- printf "#define %-23s %s\n", $name.$csuf, $val.$csuf; -- } --} -- --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"; -- -- 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); -- -- 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; -\0 +Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell scriptis much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003. +Peter Anvin added this perl to 2.6.25. Before that, the kernel had neverrequired perl to build. +Signed-off-by: Rob Landley <rob@landley.net>--- + kernel/Makefile | 4 kernel/timeconst.pl | 378 ------------------------------------------ kernel/timeconst.sh | 91 ++++++++++ 3 files changed, 93 insertions(+), 380 deletions(-) +diff -r d0c7611dcfd6 kernel/Makefile--- a/kernel/Makefile Tue Dec 30 17:48:25 2008 -0800+++ b/kernel/Makefile Fri Jan 02 00:10:44 2009 -0600@@ -115,7 +115,7 @@ $(obj)/time.o: $(obj)/timeconst.h quiet_cmd_timeconst = TIMEC $@- cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@+ cmd_timeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ) > $@ targets += timeconst.h-$(obj)/timeconst.h: $(src)/timeconst.pl FORCE+$(obj)/timeconst.h: $(src)/timeconst.sh FORCE $(call if_changed,timeconst)--- /dev/null 1969-12-31 00:00:00.000000000 -0600+++ hg/kernel/timeconst.sh 2009-01-01 23:53:17.000000000 -0600@@ -0,0 +1,91 @@+#!/bin/bash++if [ $# -ne 1 ]+then+ echo "Usage: timeconst.sh HZ"+ exit 1+fi++HZ=$1++# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.++[ $((1<<32)) -lt 0 ] && exit 1++# Output start of header file++cat << EOF+/* Automatically generated by kernel/timeconst.sh */+/* Conversion constants for HZ == $HZ */++#ifndef KERNEL_TIMECONST_H+#define KERNEL_TIMECONST_H++#include <linux/param.h>+#include <linux/types.h>++#if HZ != $HZ+#error "kernel/timeconst.h has the wrong HZ value!"+#endif++EOF++# For both Miliseconds and Microseconds++for i in "MSEC 1000" "USEC 1000000"+do+ NAME=$(echo $i | awk '{print $1}')+ PERIOD=$(echo $i | awk '{print $2}')++ # Find greatest common denominator (using Euclid's algorithm)++ A=$HZ+ B=$PERIOD++ while [ $B -ne 0 ]+ do+ C=$(($A%$B))+ A=$B+ B=$C+ done++ GCD=$A++ # Do this for each direction (HZ_TO_PERIOD and PERIOD_TO_HZ)++ for DIRECTION in 0 1+ do+ if [ $DIRECTION -eq 0 ]+ then+ CONVERT="HZ_TO_${NAME}"+ FROM=$HZ+ TO=$PERIOD+ else+ CONVERT="${NAME}_TO_HZ"+ FROM=$PERIOD+ TO=$HZ+ fi++ # How many shift bits give 32 bits of significant data?++ SHIFT=0+ while [ $(( (($TO<<$SHIFT)+$FROM-1)/$FROM )) -lt $((1<<31)) ]+ do+ SHIFT=$(( $SHIFT+1 ))+ done++ MUL32=$(( (($TO<<$SHIFT)+$FROM-1)/$FROM ))+ MUL32=$(printf %x $MUL32)+ echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)"+ ADJ32=$(($FROM/$GCD))+ ADJ32=$(( (($ADJ32-1)<<$SHIFT)/$ADJ32 ))+ ADJ32=$(printf %x $ADJ32)+ echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)"+ echo "#define ${CONVERT}_SHR32 $SHIFT"+ echo "#define ${CONVERT}_NUM U64_C($(($TO/$GCD)))"+ echo "#define ${CONVERT}_DEN U64_C($(($FROM/$GCD)))"+ done+done++echo+echo "#endif /* KERNEL_TIMECHONST_H */"--- hg/kernel/timeconst.pl 2008-11-22 19:09:13.000000000 -0600+++ /dev/null 1969-12-31 00:00:00.000000000 -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-#--# 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,- ]-);--$has_bigint = eval 'use Math::BigInt qw(bgcd); 1;';--sub bint($)-{- my($x) = @_;- return Math::BigInt->new($x);-}--#-# 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;-}--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);- }- 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();-- return (length($s) > 18) ? undef : $s;-}--# 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);-}--# 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));-- # xx_TO_HZ- push(@val, muladj(32, $hz, $t));- push(@val, numden($hz, $t));-- return @val;-}--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";- }-- # MSEC conversions- push(@val, conversions(1000, $hz));-- # USEC conversions- push(@val, conversions(1000000, $hz));-- return @val;-}--sub outputval($$)-{- my($name, $val) = @_;- my $csuf;-- if (defined($val)) {- if ($name !~ /SHR/) {- $val = "U64_C($val)";- }- printf "#define %-23s %s\n", $name.$csuf, $val.$csuf;- }-}--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";-- 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);-- 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;\0ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥ diff --git a/a/content_digest b/N1/content_digest index d52a4dd..d31f5c0 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -10,509 +10,10 @@ "\00:1\0" "b\0" "From: Rob Landley <rob@landley.net>\n" - "\n" - "Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell script\n" - "is much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003.\n" - "\n" - "Peter Anvin added this perl to 2.6.25. Before that, the kernel had never\n" - "required perl to build.\n" - "\n" - "Signed-off-by: Rob Landley <rob@landley.net>\n" - "---\n" - "\n" - " kernel/Makefile | 4 \n" - " kernel/timeconst.pl | 378 ------------------------------------------\n" - " kernel/timeconst.sh | 91 ++++++++++\n" - " 3 files changed, 93 insertions(+), 380 deletions(-)\n" - "\n" - "diff -r d0c7611dcfd6 kernel/Makefile\n" - "--- a/kernel/Makefile\tTue Dec 30 17:48:25 2008 -0800\n" - "+++ b/kernel/Makefile\tFri Jan 02 00:10:44 2009 -0600\n" - "@@ -115,7 +115,7 @@\n" - " $(obj)/time.o: $(obj)/timeconst.h\n" - " \n" - " quiet_cmd_timeconst = TIMEC $@\n" - "- cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@\n" - "+ cmd_timeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ) > $@\n" - " targets += timeconst.h\n" - "-$(obj)/timeconst.h: $(src)/timeconst.pl FORCE\n" - "+$(obj)/timeconst.h: $(src)/timeconst.sh FORCE\n" - " \t$(call if_changed,timeconst)\n" - "--- /dev/null\t1969-12-31 00:00:00.000000000 -0600\n" - "+++ hg/kernel/timeconst.sh\t2009-01-01 23:53:17.000000000 -0600\n" - "@@ -0,0 +1,91 @@\n" - "+#!/bin/bash\n" - "+\n" - "+if [ $# -ne 1 ]\n" - "+then\n" - "+\techo \"Usage: timeconst.sh HZ\"\n" - "+\texit 1\n" - "+fi\n" - "+\n" - "+HZ=$1\n" - "+\n" - "+# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.\n" - "+\n" - "+[ $((1<<32)) -lt 0 ] && exit 1\n" - "+\n" - "+# Output start of header file\n" - "+\n" - "+cat << EOF\n" - "+/* Automatically generated by kernel/timeconst.sh */\n" - "+/* Conversion constants for HZ == $HZ */\n" - "+\n" - "+#ifndef KERNEL_TIMECONST_H\n" - "+#define KERNEL_TIMECONST_H\n" - "+\n" - "+#include <linux/param.h>\n" - "+#include <linux/types.h>\n" - "+\n" - "+#if HZ != $HZ\n" - "+#error \"kernel/timeconst.h has the wrong HZ value!\"\n" - "+#endif\n" - "+\n" - "+EOF\n" - "+\n" - "+# For both Miliseconds and Microseconds\n" - "+\n" - "+for i in \"MSEC 1000\" \"USEC 1000000\"\n" - "+do\n" - "+\tNAME=$(echo $i | awk '{print $1}')\n" - "+\tPERIOD=$(echo $i | awk '{print $2}')\n" - "+\n" - "+\t# Find greatest common denominator (using Euclid's algorithm)\n" - "+\n" - "+\tA=$HZ\n" - "+\tB=$PERIOD\n" - "+\n" - "+\twhile [ $B -ne 0 ]\n" - "+\tdo\n" - "+\t\tC=$(($A%$B))\n" - "+\t\tA=$B\n" - "+\t\tB=$C\n" - "+\tdone\n" - "+\n" - "+\tGCD=$A\n" - "+\n" - "+\t# Do this for each direction (HZ_TO_PERIOD and PERIOD_TO_HZ)\n" - "+\n" - "+\tfor DIRECTION in 0 1\n" - "+\tdo\n" - "+\t\tif [ $DIRECTION -eq 0 ]\n" - "+\t\tthen\n" - "+\t\t\tCONVERT=\"HZ_TO_${NAME}\"\n" - "+\t\t\tFROM=$HZ\n" - "+\t\t\tTO=$PERIOD\n" - "+\t\telse\n" - "+\t\t\tCONVERT=\"${NAME}_TO_HZ\"\n" - "+\t\t\tFROM=$PERIOD\n" - "+\t\t\tTO=$HZ\n" - "+\t\tfi\n" - "+\n" - "+\t\t# How many shift bits give 32 bits of significant data?\n" - "+\n" - "+\t\tSHIFT=0\n" - "+\t\twhile [ $(( (($TO<<$SHIFT)+$FROM-1)/$FROM )) -lt $((1<<31)) ]\n" - "+\t\tdo\n" - "+\t\t\tSHIFT=$(( $SHIFT+1 ))\n" - "+\t\tdone\n" - "+\n" - "+\t\tMUL32=$(( (($TO<<$SHIFT)+$FROM-1)/$FROM ))\n" - "+\t\tMUL32=$(printf %x $MUL32)\n" - "+\t\techo \"#define ${CONVERT}_MUL32\tU64_C(0x$MUL32)\"\n" - "+\t\tADJ32=$(($FROM/$GCD))\n" - "+\t\tADJ32=$(( (($ADJ32-1)<<$SHIFT)/$ADJ32 ))\n" - "+\t\tADJ32=$(printf %x $ADJ32)\n" - "+\t\techo \"#define ${CONVERT}_ADJ32\tU64_C(0x$ADJ32)\"\n" - "+\t\techo \"#define ${CONVERT}_SHR32\t$SHIFT\"\n" - "+\t\techo \"#define ${CONVERT}_NUM\t\tU64_C($(($TO/$GCD)))\"\n" - "+\t\techo \"#define ${CONVERT}_DEN\t\tU64_C($(($FROM/$GCD)))\"\n" - "+\tdone\n" - "+done\n" - "+\n" - "+echo\n" - "+echo \"#endif /* KERNEL_TIMECHONST_H */\"\n" - "--- hg/kernel/timeconst.pl\t2008-11-22 19:09:13.000000000 -0600\n" - "+++ /dev/null\t1969-12-31 00:00:00.000000000 -0600\n" - "@@ -1,378 +0,0 @@\n" - "-#!/usr/bin/perl\n" - "-# -----------------------------------------------------------------------\n" - "-#\n" - "-# Copyright 2007-2008 rPath, Inc. - All Rights Reserved\n" - "-#\n" - "-# This file is part of the Linux kernel, and is made available under\n" - "-# the terms of the GNU General Public License version 2 or (at your\n" - "-# option) any later version; incorporated herein by reference.\n" - "-#\n" - "-# -----------------------------------------------------------------------\n" - "-#\n" - "-\n" - "-#\n" - "-# Usage: timeconst.pl HZ > timeconst.h\n" - "-#\n" - "-\n" - "-# Precomputed values for systems without Math::BigInt\n" - "-# Generated by:\n" - "-# timeconst.pl --can 24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200\n" - "-%canned_values = (\n" - "-\t24 => [\n" - "-\t\t'0xa6aaaaab','0x2aaaaaa',26,\n" - "-\t\t125,3,\n" - "-\t\t'0xc49ba5e4','0x1fbe76c8b4',37,\n" - "-\t\t3,125,\n" - "-\t\t'0xa2c2aaab','0xaaaa',16,\n" - "-\t\t125000,3,\n" - "-\t\t'0xc9539b89','0x7fffbce4217d',47,\n" - "-\t\t3,125000,\n" - "-\t], 32 => [\n" - "-\t\t'0xfa000000','0x6000000',27,\n" - "-\t\t125,4,\n" - "-\t\t'0x83126e98','0xfdf3b645a',36,\n" - "-\t\t4,125,\n" - "-\t\t'0xf4240000','0x0',17,\n" - "-\t\t31250,1,\n" - "-\t\t'0x8637bd06','0x3fff79c842fa',46,\n" - "-\t\t1,31250,\n" - "-\t], 48 => [\n" - "-\t\t'0xa6aaaaab','0x6aaaaaa',27,\n" - "-\t\t125,6,\n" - "-\t\t'0xc49ba5e4','0xfdf3b645a',36,\n" - "-\t\t6,125,\n" - "-\t\t'0xa2c2aaab','0x15555',17,\n" - "-\t\t62500,3,\n" - "-\t\t'0xc9539b89','0x3fffbce4217d',46,\n" - "-\t\t3,62500,\n" - "-\t], 64 => [\n" - "-\t\t'0xfa000000','0xe000000',28,\n" - "-\t\t125,8,\n" - "-\t\t'0x83126e98','0x7ef9db22d',35,\n" - "-\t\t8,125,\n" - "-\t\t'0xf4240000','0x0',18,\n" - "-\t\t15625,1,\n" - "-\t\t'0x8637bd06','0x1fff79c842fa',45,\n" - "-\t\t1,15625,\n" - "-\t], 100 => [\n" - "-\t\t'0xa0000000','0x0',28,\n" - "-\t\t10,1,\n" - "-\t\t'0xcccccccd','0x733333333',35,\n" - "-\t\t1,10,\n" - "-\t\t'0x9c400000','0x0',18,\n" - "-\t\t10000,1,\n" - "-\t\t'0xd1b71759','0x1fff2e48e8a7',45,\n" - "-\t\t1,10000,\n" - "-\t], 122 => [\n" - "-\t\t'0x8325c53f','0xfbcda3a',28,\n" - "-\t\t500,61,\n" - "-\t\t'0xf9db22d1','0x7fbe76c8b',35,\n" - "-\t\t61,500,\n" - "-\t\t'0x8012e2a0','0x3ef36',18,\n" - "-\t\t500000,61,\n" - "-\t\t'0xffda4053','0x1ffffbce4217',45,\n" - "-\t\t61,500000,\n" - "-\t], 128 => [\n" - "-\t\t'0xfa000000','0x1e000000',29,\n" - "-\t\t125,16,\n" - "-\t\t'0x83126e98','0x3f7ced916',34,\n" - "-\t\t16,125,\n" - "-\t\t'0xf4240000','0x40000',19,\n" - "-\t\t15625,2,\n" - "-\t\t'0x8637bd06','0xfffbce4217d',44,\n" - "-\t\t2,15625,\n" - "-\t], 200 => [\n" - "-\t\t'0xa0000000','0x0',29,\n" - "-\t\t5,1,\n" - "-\t\t'0xcccccccd','0x333333333',34,\n" - "-\t\t1,5,\n" - "-\t\t'0x9c400000','0x0',19,\n" - "-\t\t5000,1,\n" - "-\t\t'0xd1b71759','0xfff2e48e8a7',44,\n" - "-\t\t1,5000,\n" - "-\t], 250 => [\n" - "-\t\t'0x80000000','0x0',29,\n" - "-\t\t4,1,\n" - "-\t\t'0x80000000','0x180000000',33,\n" - "-\t\t1,4,\n" - "-\t\t'0xfa000000','0x0',20,\n" - "-\t\t4000,1,\n" - "-\t\t'0x83126e98','0x7ff7ced9168',43,\n" - "-\t\t1,4000,\n" - "-\t], 256 => [\n" - "-\t\t'0xfa000000','0x3e000000',30,\n" - "-\t\t125,32,\n" - "-\t\t'0x83126e98','0x1fbe76c8b',33,\n" - "-\t\t32,125,\n" - "-\t\t'0xf4240000','0xc0000',20,\n" - "-\t\t15625,4,\n" - "-\t\t'0x8637bd06','0x7ffde7210be',43,\n" - "-\t\t4,15625,\n" - "-\t], 300 => [\n" - "-\t\t'0xd5555556','0x2aaaaaaa',30,\n" - "-\t\t10,3,\n" - "-\t\t'0x9999999a','0x1cccccccc',33,\n" - "-\t\t3,10,\n" - "-\t\t'0xd0555556','0xaaaaa',20,\n" - "-\t\t10000,3,\n" - "-\t\t'0x9d495183','0x7ffcb923a29',43,\n" - "-\t\t3,10000,\n" - "-\t], 512 => [\n" - "-\t\t'0xfa000000','0x7e000000',31,\n" - "-\t\t125,64,\n" - "-\t\t'0x83126e98','0xfdf3b645',32,\n" - "-\t\t64,125,\n" - "-\t\t'0xf4240000','0x1c0000',21,\n" - "-\t\t15625,8,\n" - "-\t\t'0x8637bd06','0x3ffef39085f',42,\n" - "-\t\t8,15625,\n" - "-\t], 1000 => [\n" - "-\t\t'0x80000000','0x0',31,\n" - "-\t\t1,1,\n" - "-\t\t'0x80000000','0x0',31,\n" - "-\t\t1,1,\n" - "-\t\t'0xfa000000','0x0',22,\n" - "-\t\t1000,1,\n" - "-\t\t'0x83126e98','0x1ff7ced9168',41,\n" - "-\t\t1,1000,\n" - "-\t], 1024 => [\n" - "-\t\t'0xfa000000','0xfe000000',32,\n" - "-\t\t125,128,\n" - "-\t\t'0x83126e98','0x7ef9db22',31,\n" - "-\t\t128,125,\n" - "-\t\t'0xf4240000','0x3c0000',22,\n" - "-\t\t15625,16,\n" - "-\t\t'0x8637bd06','0x1fff79c842f',41,\n" - "-\t\t16,15625,\n" - "-\t], 1200 => [\n" - "-\t\t'0xd5555556','0xd5555555',32,\n" - "-\t\t5,6,\n" - "-\t\t'0x9999999a','0x66666666',31,\n" - "-\t\t6,5,\n" - "-\t\t'0xd0555556','0x2aaaaa',22,\n" - "-\t\t2500,3,\n" - "-\t\t'0x9d495183','0x1ffcb923a29',41,\n" - "-\t\t3,2500,\n" - "-\t]\n" - "-);\n" - "-\n" - "-$has_bigint = eval 'use Math::BigInt qw(bgcd); 1;';\n" - "-\n" - "-sub bint($)\n" - "-{\n" - "-\tmy($x) = @_;\n" - "-\treturn Math::BigInt->new($x);\n" - "-}\n" - "-\n" - "-#\n" - "-# Constants for division by reciprocal multiplication.\n" - "-# (bits, numerator, denominator)\n" - "-#\n" - "-sub fmul($$$)\n" - "-{\n" - "-\tmy ($b,$n,$d) = @_;\n" - "-\n" - "-\t$n = bint($n);\n" - "-\t$d = bint($d);\n" - "-\n" - "-\treturn scalar (($n << $b)+$d-bint(1))/$d;\n" - "-}\n" - "-\n" - "-sub fadj($$$)\n" - "-{\n" - "-\tmy($b,$n,$d) = @_;\n" - "-\n" - "-\t$n = bint($n);\n" - "-\t$d = bint($d);\n" - "-\n" - "-\t$d = $d/bgcd($n, $d);\n" - "-\treturn scalar (($d-bint(1)) << $b)/$d;\n" - "-}\n" - "-\n" - "-sub fmuls($$$) {\n" - "-\tmy($b,$n,$d) = @_;\n" - "-\tmy($s,$m);\n" - "-\tmy($thres) = bint(1) << ($b-1);\n" - "-\n" - "-\t$n = bint($n);\n" - "-\t$d = bint($d);\n" - "-\n" - "-\tfor ($s = 0; 1; $s++) {\n" - "-\t\t$m = fmul($s,$n,$d);\n" - "-\t\treturn $s if ($m >= $thres);\n" - "-\t}\n" - "-\treturn 0;\n" - "-}\n" - "-\n" - "-# Generate a hex value if the result fits in 64 bits;\n" - "-# otherwise skip.\n" - "-sub bignum_hex($) {\n" - "-\tmy($x) = @_;\n" - "-\tmy $s = $x->as_hex();\n" - "-\n" - "-\treturn (length($s) > 18) ? undef : $s;\n" - "-}\n" - "-\n" - "-# Provides mul, adj, and shr factors for a specific\n" - "-# (bit, time, hz) combination\n" - "-sub muladj($$$) {\n" - "-\tmy($b, $t, $hz) = @_;\n" - "-\tmy $s = fmuls($b, $t, $hz);\n" - "-\tmy $m = fmul($s, $t, $hz);\n" - "-\tmy $a = fadj($s, $t, $hz);\n" - "-\treturn (bignum_hex($m), bignum_hex($a), $s);\n" - "-}\n" - "-\n" - "-# Provides numerator, denominator values\n" - "-sub numden($$) {\n" - "-\tmy($n, $d) = @_;\n" - "-\tmy $g = bgcd($n, $d);\n" - "-\treturn ($n/$g, $d/$g);\n" - "-}\n" - "-\n" - "-# All values for a specific (time, hz) combo\n" - "-sub conversions($$) {\n" - "-\tmy ($t, $hz) = @_;\n" - "-\tmy @val = ();\n" - "-\n" - "-\t# HZ_TO_xx\n" - "-\tpush(@val, muladj(32, $t, $hz));\n" - "-\tpush(@val, numden($t, $hz));\n" - "-\n" - "-\t# xx_TO_HZ\n" - "-\tpush(@val, muladj(32, $hz, $t));\n" - "-\tpush(@val, numden($hz, $t));\n" - "-\n" - "-\treturn @val;\n" - "-}\n" - "-\n" - "-sub compute_values($) {\n" - "-\tmy($hz) = @_;\n" - "-\tmy @val = ();\n" - "-\tmy $s, $m, $a, $g;\n" - "-\n" - "-\tif (!$has_bigint) {\n" - "-\t\tdie \"$0: HZ == $hz not canned and \".\n" - "-\t\t \"Math::BigInt not available\\n\";\n" - "-\t}\n" - "-\n" - "-\t# MSEC conversions\n" - "-\tpush(@val, conversions(1000, $hz));\n" - "-\n" - "-\t# USEC conversions\n" - "-\tpush(@val, conversions(1000000, $hz));\n" - "-\n" - "-\treturn @val;\n" - "-}\n" - "-\n" - "-sub outputval($$)\n" - "-{\n" - "-\tmy($name, $val) = @_;\n" - "-\tmy $csuf;\n" - "-\n" - "-\tif (defined($val)) {\n" - "-\t if ($name !~ /SHR/) {\n" - "-\t\t$val = \"U64_C($val)\";\n" - "-\t }\n" - "-\t printf \"#define %-23s %s\\n\", $name.$csuf, $val.$csuf;\n" - "-\t}\n" - "-}\n" - "-\n" - "-sub output($@)\n" - "-{\n" - "-\tmy($hz, @val) = @_;\n" - "-\tmy $pfx, $bit, $suf, $s, $m, $a;\n" - "-\n" - "-\tprint \"/* Automatically generated by kernel/timeconst.pl */\\n\";\n" - "-\tprint \"/* Conversion constants for HZ == $hz */\\n\";\n" - "-\tprint \"\\n\";\n" - "-\tprint \"#ifndef KERNEL_TIMECONST_H\\n\";\n" - "-\tprint \"#define KERNEL_TIMECONST_H\\n\";\n" - "-\tprint \"\\n\";\n" - "-\n" - "-\tprint \"#include <linux/param.h>\\n\";\n" - "-\tprint \"#include <linux/types.h>\\n\";\n" - "-\n" - "-\tprint \"\\n\";\n" - "-\tprint \"#if HZ != $hz\\n\";\n" - "-\tprint \"#error \\\"kernel/timeconst.h has the wrong HZ value!\\\"\\n\";\n" - "-\tprint \"#endif\\n\";\n" - "-\tprint \"\\n\";\n" - "-\n" - "-\tforeach $pfx ('HZ_TO_MSEC','MSEC_TO_HZ',\n" - "-\t\t 'HZ_TO_USEC','USEC_TO_HZ') {\n" - "-\t\tforeach $bit (32) {\n" - "-\t\t\tforeach $suf ('MUL', 'ADJ', 'SHR') {\n" - "-\t\t\t\toutputval(\"${pfx}_$suf$bit\", shift(@val));\n" - "-\t\t\t}\n" - "-\t\t}\n" - "-\t\tforeach $suf ('NUM', 'DEN') {\n" - "-\t\t\toutputval(\"${pfx}_$suf\", shift(@val));\n" - "-\t\t}\n" - "-\t}\n" - "-\n" - "-\tprint \"\\n\";\n" - "-\tprint \"#endif /* KERNEL_TIMECONST_H */\\n\";\n" - "-}\n" - "-\n" - "-# Pretty-print Perl values\n" - "-sub perlvals(@) {\n" - "-\tmy $v;\n" - "-\tmy @l = ();\n" - "-\n" - "-\tforeach $v (@_) {\n" - "-\t\tif (!defined($v)) {\n" - "-\t\t\tpush(@l, 'undef');\n" - "-\t\t} elsif ($v =~ /^0x/) {\n" - "-\t\t\tpush(@l, \"\\'\".$v.\"\\'\");\n" - "-\t\t} else {\n" - "-\t\t\tpush(@l, $v.'');\n" - "-\t\t}\n" - "-\t}\n" - "-\treturn join(',', @l);\n" - "-}\n" - "-\n" - "-($hz) = @ARGV;\n" - "-\n" - "-# Use this to generate the %canned_values structure\n" - "-if ($hz eq '--can') {\n" - "-\tshift(@ARGV);\n" - "-\t@hzlist = sort {$a <=> $b} (@ARGV);\n" - "-\n" - "-\tprint \"# Precomputed values for systems without Math::BigInt\\n\";\n" - "-\tprint \"# Generated by:\\n\";\n" - "-\tprint \"# timeconst.pl --can \", join(' ', @hzlist), \"\\n\";\n" - "-\tprint \"\\%canned_values = (\\n\";\n" - "-\tmy $pf = \"\\t\";\n" - "-\tforeach $hz (@hzlist) {\n" - "-\t\tmy @values = compute_values($hz);\n" - "-\t\tprint \"$pf$hz => [\\n\";\n" - "-\t\twhile (scalar(@values)) {\n" - "-\t\t\tmy $bit;\n" - "-\t\t\tforeach $bit (32) {\n" - "-\t\t\t\tmy $m = shift(@values);\n" - "-\t\t\t\tmy $a = shift(@values);\n" - "-\t\t\t\tmy $s = shift(@values);\n" - "-\t\t\t\tprint \"\\t\\t\", perlvals($m,$a,$s), \",\\n\";\n" - "-\t\t\t}\n" - "-\t\t\tmy $n = shift(@values);\n" - "-\t\t\tmy $d = shift(@values);\n" - "-\t\t\tprint \"\\t\\t\", perlvals($n,$d), \",\\n\";\n" - "-\t\t}\n" - "-\t\tprint \"\\t]\";\n" - "-\t\t$pf = ', ';\n" - "-\t}\n" - "-\tprint \"\\n);\\n\";\n" - "-} else {\n" - "-\t$hz += 0;\t\t\t# Force to number\n" - "-\tif ($hz < 1) {\n" - "-\t\tdie \"Usage: $0 HZ\\n\";\n" - "-\t}\n" - "-\n" - "-\t@val = @{$canned_values{$hz}};\n" - "-\tif (!defined(@val)) {\n" - "-\t\t@val = compute_values($hz);\n" - "-\t}\n" - "-\toutput($hz, @val);\n" - "-}\n" - "-exit 0;\n" - "\0" + "Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell scriptis much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003.\n" + "Peter Anvin added this perl to 2.6.25. Before that, the kernel had neverrequired perl to build.\n" + "Signed-off-by: Rob Landley <rob@landley.net>---\n" + " kernel/Makefile | 4 kernel/timeconst.pl | 378 ------------------------------------------ kernel/timeconst.sh | 91 ++++++++++ 3 files changed, 93 insertions(+), 380 deletions(-)\n" + "diff -r d0c7611dcfd6 kernel/Makefile--- a/kernel/Makefile\tTue Dec 30 17:48:25 2008 -0800+++ b/kernel/Makefile\tFri Jan 02 00:10:44 2009 -0600@@ -115,7 +115,7 @@ $(obj)/time.o: $(obj)/timeconst.h quiet_cmd_timeconst = TIMEC $@- cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@+ cmd_timeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ) > $@ targets += timeconst.h-$(obj)/timeconst.h: $(src)/timeconst.pl FORCE+$(obj)/timeconst.h: $(src)/timeconst.sh FORCE \t$(call if_changed,timeconst)--- /dev/null\t1969-12-31 00:00:00.000000000 -0600+++ hg/kernel/timeconst.sh\t2009-01-01 23:53:17.000000000 -0600@@ -0,0 +1,91 @@+#!/bin/bash++if [ $# -ne 1 ]+then+\techo \"Usage: timeconst.sh HZ\"+\texit 1+fi++HZ=$1++# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.++[ $((1<<32)) -lt 0 ] && exit 1++# Output start of header file++cat << EOF+/* Automatically generated by kernel/timeconst.sh */+/* Conversion constants for HZ == $HZ */++#ifndef KERNEL_TIMECONST_H+#define KERNEL_TIMECONST_H++#include <linux/param.h>+#include <linux/types.h>++#if HZ != $HZ+#error \"kernel/timeconst.h has the wrong HZ value!\"+#endif++EOF++# For both Miliseconds and Microseconds++for i in \"MSEC 1000\" \"USEC 1000000\"+do+\tNAME=$(echo $i | awk '{print $1}')+\tPERIOD=$(echo $i | awk '{print $2}')++\t# Find greatest common denominator (using Euclid's algorithm)++\tA=$HZ+\tB=$PERIOD++\twhile [ $B -ne 0 ]+\tdo+\t\tC=$(($A%$B))+\t\tA=$B+\t\tB=$C+\tdone++\tGCD=$A++\t# Do this for each direction (HZ_TO_PERIOD and PERIOD_TO_HZ)++\tfor DIRECTION in 0 1+\tdo+\t\tif [ $DIRECTION -eq 0 ]+\t\tthen+\t\t\tCONVERT=\"HZ_TO_${NAME}\"+\t\t\tFROM=$HZ+\t\t\tTO=$PERIOD+\t\telse+\t\t\tCONVERT=\"${NAME}_TO_HZ\"+\t\t\tFROM=$PERIOD+\t\t\tTO=$HZ+\t\tfi++\t\t# How many shift bits give 32 bits of significant data?++\t\tSHIFT=0+\t\twhile [ $(( (($TO<<$SHIFT)+$FROM-1)/$FROM )) -lt $((1<<31)) ]+\t\tdo+\t\t\tSHIFT=$(( $SHIFT+1 ))+\t\tdone++\t\tMUL32=$(( (($TO<<$SHIFT)+$FROM-1)/$FROM ))+\t\tMUL32=$(printf %x $MUL32)+\t\techo \"#define ${CONVERT}_MUL32\tU64_C(0x$MUL32)\"+\t\tADJ32=$(($FROM/$GCD))+\t\tADJ32=$(( (($ADJ32-1)<<$SHIFT)/$ADJ32 ))+\t\tADJ32=$(printf %x $ADJ32)+\t\techo \"#define ${CONVERT}_ADJ32\tU64_C(0x$ADJ32)\"+\t\techo \"#define ${CONVERT}_SHR32\t$SHIFT\"+\t\techo \"#define ${CONVERT}_NUM\t\tU64_C($(($TO/$GCD)))\"+\t\techo \"#define ${CONVERT}_DEN\t\tU64_C($(($FROM/$GCD)))\"+\tdone+done++echo+echo \"#endif /* KERNEL_TIMECHONST_H */\"--- hg/kernel/timeconst.pl\t2008-11-22 19:09:13.000000000 -0600+++ /dev/null\t1969-12-31 00:00:00.000000000 -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-#--# 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 = (-\t24 => [-\t\t'0xa6aaaaab','0x2aaaaaa',26,-\t\t125,3,-\t\t'0xc49ba5e4','0x1fbe76c8b4',37,-\t\t3,125,-\t\t'0xa2c2aaab','0xaaaa',16,-\t\t125000,3,-\t\t'0xc9539b89','0x7fffbce4217d',47,-\t\t3,125000,-\t], 32 => [-\t\t'0xfa000000','0x6000000',27,-\t\t125,4,-\t\t'0x83126e98','0xfdf3b645a',36,-\t\t4,125,-\t\t'0xf4240000','0x0',17,-\t\t31250,1,-\t\t'0x8637bd06','0x3fff79c842fa',46,-\t\t1,31250,-\t], 48 => [-\t\t'0xa6aaaaab','0x6aaaaaa',27,-\t\t125,6,-\t\t'0xc49ba5e4','0xfdf3b645a',36,-\t\t6,125,-\t\t'0xa2c2aaab','0x15555',17,-\t\t62500,3,-\t\t'0xc9539b89','0x3fffbce4217d',46,-\t\t3,62500,-\t], 64 => [-\t\t'0xfa000000','0xe000000',28,-\t\t125,8,-\t\t'0x83126e98','0x7ef9db22d',35,-\t\t8,125,-\t\t'0xf4240000','0x0',18,-\t\t15625,1,-\t\t'0x8637bd06','0x1fff79c842fa',45,-\t\t1,15625,-\t], 100 => [-\t\t'0xa0000000','0x0',28,-\t\t10,1,-\t\t'0xcccccccd','0x733333333',35,-\t\t1,10,-\t\t'0x9c400000','0x0',18,-\t\t10000,1,-\t\t'0xd1b71759','0x1fff2e48e8a7',45,-\t\t1,10000,-\t], 122 => [-\t\t'0x8325c53f','0xfbcda3a',28,-\t\t500,61,-\t\t'0xf9db22d1','0x7fbe76c8b',35,-\t\t61,500,-\t\t'0x8012e2a0','0x3ef36',18,-\t\t500000,61,-\t\t'0xffda4053','0x1ffffbce4217',45,-\t\t61,500000,-\t], 128 => [-\t\t'0xfa000000','0x1e000000',29,-\t\t125,16,-\t\t'0x83126e98','0x3f7ced916',34,-\t\t16,125,-\t\t'0xf4240000','0x40000',19,-\t\t15625,2,-\t\t'0x8637bd06','0xfffbce4217d',44,-\t\t2,15625,-\t], 200 => [-\t\t'0xa0000000','0x0',29,-\t\t5,1,-\t\t'0xcccccccd','0x333333333',34,-\t\t1,5,-\t\t'0x9c400000','0x0',19,-\t\t5000,1,-\t\t'0xd1b71759','0xfff2e48e8a7',44,-\t\t1,5000,-\t], 250 => [-\t\t'0x80000000','0x0',29,-\t\t4,1,-\t\t'0x80000000','0x180000000',33,-\t\t1,4,-\t\t'0xfa000000','0x0',20,-\t\t4000,1,-\t\t'0x83126e98','0x7ff7ced9168',43,-\t\t1,4000,-\t], 256 => [-\t\t'0xfa000000','0x3e000000',30,-\t\t125,32,-\t\t'0x83126e98','0x1fbe76c8b',33,-\t\t32,125,-\t\t'0xf4240000','0xc0000',20,-\t\t15625,4,-\t\t'0x8637bd06','0x7ffde7210be',43,-\t\t4,15625,-\t], 300 => [-\t\t'0xd5555556','0x2aaaaaaa',30,-\t\t10,3,-\t\t'0x9999999a','0x1cccccccc',33,-\t\t3,10,-\t\t'0xd0555556','0xaaaaa',20,-\t\t10000,3,-\t\t'0x9d495183','0x7ffcb923a29',43,-\t\t3,10000,-\t], 512 => [-\t\t'0xfa000000','0x7e000000',31,-\t\t125,64,-\t\t'0x83126e98','0xfdf3b645',32,-\t\t64,125,-\t\t'0xf4240000','0x1c0000',21,-\t\t15625,8,-\t\t'0x8637bd06','0x3ffef39085f',42,-\t\t8,15625,-\t], 1000 => [-\t\t'0x80000000','0x0',31,-\t\t1,1,-\t\t'0x80000000','0x0',31,-\t\t1,1,-\t\t'0xfa000000','0x0',22,-\t\t1000,1,-\t\t'0x83126e98','0x1ff7ced9168',41,-\t\t1,1000,-\t], 1024 => [-\t\t'0xfa000000','0xfe000000',32,-\t\t125,128,-\t\t'0x83126e98','0x7ef9db22',31,-\t\t128,125,-\t\t'0xf4240000','0x3c0000',22,-\t\t15625,16,-\t\t'0x8637bd06','0x1fff79c842f',41,-\t\t16,15625,-\t], 1200 => [-\t\t'0xd5555556','0xd5555555',32,-\t\t5,6,-\t\t'0x9999999a','0x66666666',31,-\t\t6,5,-\t\t'0xd0555556','0x2aaaaa',22,-\t\t2500,3,-\t\t'0x9d495183','0x1ffcb923a29',41,-\t\t3,2500,-\t]-);--$has_bigint = eval 'use Math::BigInt qw(bgcd); 1;';--sub bint($)-{-\tmy($x) = @_;-\treturn Math::BigInt->new($x);-}--#-# Constants for division by reciprocal multiplication.-# (bits, numerator, denominator)-#-sub fmul($$$)-{-\tmy ($b,$n,$d) = @_;--\t$n = bint($n);-\t$d = bint($d);--\treturn scalar (($n << $b)+$d-bint(1))/$d;-}--sub fadj($$$)-{-\tmy($b,$n,$d) = @_;--\t$n = bint($n);-\t$d = bint($d);--\t$d = $d/bgcd($n, $d);-\treturn scalar (($d-bint(1)) << $b)/$d;-}--sub fmuls($$$) {-\tmy($b,$n,$d) = @_;-\tmy($s,$m);-\tmy($thres) = bint(1) << ($b-1);--\t$n = bint($n);-\t$d = bint($d);--\tfor ($s = 0; 1; $s++) {-\t\t$m = fmul($s,$n,$d);-\t\treturn $s if ($m >= $thres);-\t}-\treturn 0;-}--# Generate a hex value if the result fits in 64 bits;-# otherwise skip.-sub bignum_hex($) {-\tmy($x) = @_;-\tmy $s = $x->as_hex();--\treturn (length($s) > 18) ? undef : $s;-}--# Provides mul, adj, and shr factors for a specific-# (bit, time, hz) combination-sub muladj($$$) {-\tmy($b, $t, $hz) = @_;-\tmy $s = fmuls($b, $t, $hz);-\tmy $m = fmul($s, $t, $hz);-\tmy $a = fadj($s, $t, $hz);-\treturn (bignum_hex($m), bignum_hex($a), $s);-}--# Provides numerator, denominator values-sub numden($$) {-\tmy($n, $d) = @_;-\tmy $g = bgcd($n, $d);-\treturn ($n/$g, $d/$g);-}--# All values for a specific (time, hz) combo-sub conversions($$) {-\tmy ($t, $hz) = @_;-\tmy @val = ();--\t# HZ_TO_xx-\tpush(@val, muladj(32, $t, $hz));-\tpush(@val, numden($t, $hz));--\t# xx_TO_HZ-\tpush(@val, muladj(32, $hz, $t));-\tpush(@val, numden($hz, $t));--\treturn @val;-}--sub compute_values($) {-\tmy($hz) = @_;-\tmy @val = ();-\tmy $s, $m, $a, $g;--\tif (!$has_bigint) {-\t\tdie \"$0: HZ == $hz not canned and \".-\t\t \"Math::BigInt not available\\n\";-\t}--\t# MSEC conversions-\tpush(@val, conversions(1000, $hz));--\t# USEC conversions-\tpush(@val, conversions(1000000, $hz));--\treturn @val;-}--sub outputval($$)-{-\tmy($name, $val) = @_;-\tmy $csuf;--\tif (defined($val)) {-\t if ($name !~ /SHR/) {-\t\t$val = \"U64_C($val)\";-\t }-\t printf \"#define %-23s %s\\n\", $name.$csuf, $val.$csuf;-\t}-}--sub output($@)-{-\tmy($hz, @val) = @_;-\tmy $pfx, $bit, $suf, $s, $m, $a;--\tprint \"/* Automatically generated by kernel/timeconst.pl */\\n\";-\tprint \"/* Conversion constants for HZ == $hz */\\n\";-\tprint \"\\n\";-\tprint \"#ifndef KERNEL_TIMECONST_H\\n\";-\tprint \"#define KERNEL_TIMECONST_H\\n\";-\tprint \"\\n\";--\tprint \"#include <linux/param.h>\\n\";-\tprint \"#include <linux/types.h>\\n\";--\tprint \"\\n\";-\tprint \"#if HZ != $hz\\n\";-\tprint \"#error \\\"kernel/timeconst.h has the wrong HZ value!\\\"\\n\";-\tprint \"#endif\\n\";-\tprint \"\\n\";--\tforeach $pfx ('HZ_TO_MSEC','MSEC_TO_HZ',-\t\t 'HZ_TO_USEC','USEC_TO_HZ') {-\t\tforeach $bit (32) {-\t\t\tforeach $suf ('MUL', 'ADJ', 'SHR') {-\t\t\t\toutputval(\"${pfx}_$suf$bit\", shift(@val));-\t\t\t}-\t\t}-\t\tforeach $suf ('NUM', 'DEN') {-\t\t\toutputval(\"${pfx}_$suf\", shift(@val));-\t\t}-\t}--\tprint \"\\n\";-\tprint \"#endif /* KERNEL_TIMECONST_H */\\n\";-}--# Pretty-print Perl values-sub perlvals(@) {-\tmy $v;-\tmy @l = ();--\tforeach $v (@_) {-\t\tif (!defined($v)) {-\t\t\tpush(@l, 'undef');-\t\t} elsif ($v =~ /^0x/) {-\t\t\tpush(@l, \"\\'\".$v.\"\\'\");-\t\t} else {-\t\t\tpush(@l, $v.'');-\t\t}-\t}-\treturn join(',', @l);-}--($hz) = @ARGV;--# Use this to generate the %canned_values structure-if ($hz eq '--can') {-\tshift(@ARGV);-\t@hzlist = sort {$a <=> $b} (@ARGV);--\tprint \"# Precomputed values for systems without Math::BigInt\\n\";-\tprint \"# Generated by:\\n\";-\tprint \"# timeconst.pl --can \", join(' ', @hzlist), \"\\n\";-\tprint \"\\%canned_values = (\\n\";-\tmy $pf = \"\\t\";-\tforeach $hz (@hzlist) {-\t\tmy @values = compute_values($hz);-\t\tprint \"$pf$hz => [\\n\";-\t\twhile (scalar(@values)) {-\t\t\tmy $bit;-\t\t\tforeach $bit (32) {-\t\t\t\tmy $m = shift(@values);-\t\t\t\tmy $a = shift(@values);-\t\t\t\tmy $s = shift(@values);-\t\t\t\tprint \"\\t\\t\", perlvals($m,$a,$s), \",\\n\";-\t\t\t}-\t\t\tmy $n = shift(@values);-\t\t\tmy $d = shift(@values);-\t\t\tprint \"\\t\\t\", perlvals($n,$d), \",\\n\";-\t\t}-\t\tprint \"\\t]\";-\t\t$pf = ', ';-\t}-\tprint \"\\n);\\n\";-} else {-\t$hz += 0;\t\t\t# Force to number-\tif ($hz < 1) {-\t\tdie \"Usage: $0 HZ\\n\";-\t}--\t@val = @{$canned_values{$hz}};-\tif (!defined(@val)) {-\t\t@val = compute_values($hz);-\t}-\toutput($hz, @val);-}-exit 0;\0\303\277\303\264\303\250\302\272{.n\303\207+\302\211\302\267\302\237\302\256\302\211\302\255\302\206+%\302\212\303\213\303\277\302\261\303\251\303\235\302\266\027\302\245\302\212w\303\277\302\272{.n\303\207+\302\211\302\267\302\245\302\212{\302\261\303\276G\302\253\302\235\303\251\303\277\302\212{ay\302\272\035\303\212\302\207\303\232\302\231\303\253,j\a\302\255\302\242f\302\243\302\242\302\267h\302\232\302\217\303\257\302\201\303\252\303\277\302\221\303\252\303\247z_\303\250\302\256\003(\302\255\303\251\302\232\302\216\302\212\303\235\302\242j\"\302\235\303\272\032\302\266\033m\302\247\303\277\303\277\302\276\a\302\253\303\276G\302\253\302\235\303\251\303\277\302\242\302\270?\302\231\302\250\303\250\302\255\303\232&\302\243\303\270\302\247~\302\217\303\241\302\266iO\302\225\303\246\302\254z\302\267\302\232v\303\230^\024\004\032\302\266\033m\302\247\303\277\303\277\303\203\f\303\277\302\266\303\254\303\277\302\242\302\270?\302\226I\302\245" -20dab5975fb6f31ee3415bcc05b0793128e4bbda8ccfb7ddbb165e1a6c4ce222 +1ac399e4961d18f3bfa856927df0f87d547ca3c5633e847a13a14248e775de65
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.