A patch in 2.6.25 added perl as a build requirement for the Linux kernel, by making the file kernel/timeconst.h generated by a perl script.
Oddly, the perl script in question tested whether or not you had _enough_ perl installed, and if you didn't have an optional bignum package out of cpan it checked if the HZ value you wanted to generate #defines for matched one of 15 cached values it had precomputed numbers for. (This cached information took up half the perl file). These values are in fact all the ones currently used by the Linux kernel. Every HZ value for every platform is set by a kconfig choice menu, so the only way to add a new HZ value is modify the kernel source. After 17 years, with hundreds of target boards, there are currently 15 only values in use. This patch moves the cache out of the perl program and instead pregenerates a kernel/timeconst.h file, which it checks in. The start of that file is: > /* Conversion constants for HZ */ > /* DO NOT EDIT! Automatically generated by: > kernel/timeconst.pl 24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200 > */ I.E. it gives you the command line to run to regenerate the file. If you need to add another value, cut and paste that command line to generate a new timeconst.h file, and submit the diff. (Note that the perl script records the command line it was run with automatically, that will be part of the diff.) This patch: 1) Removes half the perl script (all the conditional cached stuff). The result is a much smaller and simpler perl script. 2) Changes the perl script to generate a single include file with 15 #ifdefs rather than generating an #include file with the one HZ value currently selected by kconfig. (The last #else case #errors out with the existing error message about an unknown HZ value.) 3) Removes all mention of kernel/timeconst.h from the makefiles. They don't need to know anymore. The only other potential change (which I didn't make) is to move kernel/timeconst.pl into scripts/timeconst.pl, since it's now in the same class with the python script bloat-o-meter; something developers can run but which is not required to simply compile an unmodified kernel tarball. Comments welcome. Rob -- "One of my most productive days was throwing away 1000 lines of code." - Ken Thompson.
diff -ru linux-2.6.26/kernel/Makefile linux-2.6.26-new/kernel/Makefile --- linux-2.6.26/kernel/Makefile 2008-07-13 16:51:29.000000000 -0500 +++ linux-2.6.26-new/kernel/Makefile 2008-07-25 11:46:15.000000000 -0500 @@ -95,8 +95,3 @@ $(obj)/time.o: $(obj)/timeconst.h -quiet_cmd_timeconst = TIMEC $@ - cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@ -targets += timeconst.h -$(obj)/timeconst.h: $(src)/timeconst.pl FORCE - $(call if_changed,timeconst) diff -ru linux-2.6.26/kernel/timeconst.pl linux-2.6.26-new/kernel/timeconst.pl --- linux-2.6.26/kernel/timeconst.pl 2008-07-13 16:51:29.000000000 -0500 +++ linux-2.6.26-new/kernel/timeconst.pl 2008-07-25 12:01:27.000000000 -0500 @@ -11,150 +11,12 @@ # # -# Usage: timeconst.pl HZ > timeconst.h +# 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;'; @@ -252,8 +114,7 @@ my $s, $m, $a, $g; if (!$has_bigint) { - die "$0: HZ == $hz not canned and ". - "Math::BigInt not available\n"; + die "$0: Math::BigInt not available\n"; } # MSEC conversions @@ -283,21 +144,7 @@ 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"; + print "HZ == $hz\n"; foreach $pfx ('HZ_TO_MSEC','MSEC_TO_HZ', 'HZ_TO_USEC','USEC_TO_HZ') { @@ -311,8 +158,7 @@ } } - print "\n"; - print "#endif /* KERNEL_TIMECONST_H */\n"; + print "\n#elif "; } # Pretty-print Perl values @@ -332,47 +178,36 @@ return join(',', @l); } -($hz) = @ARGV; +print "/* Conversion constants for HZ */\n"; +print "/* DO NOT EDIT! Automatically generated by:\n"; +print " kernel/timeconst.pl @ARGV\n */\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 "; + +foreach $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); - } + @val = compute_values($hz); output($hz, @val); } + +print "1\n"; +print "#error \"kernel/timeconst.h has unknown HZ value!\"\n"; +print "#endif\n"; +print "\n"; +print "#endif /* KERNEL_TIMECONST_H */\n"; + exit 0; --- /dev/null 2007-10-16 17:06:33.000000000 -0500 +++ linux-2.6.26-new/kernel/timeconst.h 2008-07-25 12:02:02.000000000 -0500 @@ -0,0 +1,346 @@ +/* Conversion constants for HZ */ +/* DO NOT EDIT! Automatically generated by: + kernel/timeconst.pl 24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200 + */ + +#ifndef KERNEL_TIMECONST_H +#define KERNEL_TIMECONST_H + +#include <linux/param.h> +#include <linux/types.h> + +#if HZ == 24 +#define HZ_TO_MSEC_MUL32 U64_C(0xa6aaaaab) +#define HZ_TO_MSEC_ADJ32 U64_C(0x2aaaaaa) +#define HZ_TO_MSEC_SHR32 26 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(3) +#define MSEC_TO_HZ_MUL32 U64_C(0xc49ba5e4) +#define MSEC_TO_HZ_ADJ32 U64_C(0x1fbe76c8b4) +#define MSEC_TO_HZ_SHR32 37 +#define MSEC_TO_HZ_NUM U64_C(3) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xa2c2aaab) +#define HZ_TO_USEC_ADJ32 U64_C(0xaaaa) +#define HZ_TO_USEC_SHR32 16 +#define HZ_TO_USEC_NUM U64_C(125000) +#define HZ_TO_USEC_DEN U64_C(3) +#define USEC_TO_HZ_MUL32 U64_C(0xc9539b89) +#define USEC_TO_HZ_ADJ32 U64_C(0x7fffbce4217d) +#define USEC_TO_HZ_SHR32 47 +#define USEC_TO_HZ_NUM U64_C(3) +#define USEC_TO_HZ_DEN U64_C(125000) + +#elif HZ == 32 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x6000000) +#define HZ_TO_MSEC_SHR32 27 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(4) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0xfdf3b645a) +#define MSEC_TO_HZ_SHR32 36 +#define MSEC_TO_HZ_NUM U64_C(4) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 17 +#define HZ_TO_USEC_NUM U64_C(31250) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0x3fff79c842fa) +#define USEC_TO_HZ_SHR32 46 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(31250) + +#elif HZ == 48 +#define HZ_TO_MSEC_MUL32 U64_C(0xa6aaaaab) +#define HZ_TO_MSEC_ADJ32 U64_C(0x6aaaaaa) +#define HZ_TO_MSEC_SHR32 27 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(6) +#define MSEC_TO_HZ_MUL32 U64_C(0xc49ba5e4) +#define MSEC_TO_HZ_ADJ32 U64_C(0xfdf3b645a) +#define MSEC_TO_HZ_SHR32 36 +#define MSEC_TO_HZ_NUM U64_C(6) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xa2c2aaab) +#define HZ_TO_USEC_ADJ32 U64_C(0x15555) +#define HZ_TO_USEC_SHR32 17 +#define HZ_TO_USEC_NUM U64_C(62500) +#define HZ_TO_USEC_DEN U64_C(3) +#define USEC_TO_HZ_MUL32 U64_C(0xc9539b89) +#define USEC_TO_HZ_ADJ32 U64_C(0x3fffbce4217d) +#define USEC_TO_HZ_SHR32 46 +#define USEC_TO_HZ_NUM U64_C(3) +#define USEC_TO_HZ_DEN U64_C(62500) + +#elif HZ == 64 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0xe000000) +#define HZ_TO_MSEC_SHR32 28 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(8) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0x7ef9db22d) +#define MSEC_TO_HZ_SHR32 35 +#define MSEC_TO_HZ_NUM U64_C(8) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 18 +#define HZ_TO_USEC_NUM U64_C(15625) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0x1fff79c842fa) +#define USEC_TO_HZ_SHR32 45 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(15625) + +#elif HZ == 100 +#define HZ_TO_MSEC_MUL32 U64_C(0xa0000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x0) +#define HZ_TO_MSEC_SHR32 28 +#define HZ_TO_MSEC_NUM U64_C(10) +#define HZ_TO_MSEC_DEN U64_C(1) +#define MSEC_TO_HZ_MUL32 U64_C(0xcccccccd) +#define MSEC_TO_HZ_ADJ32 U64_C(0x733333333) +#define MSEC_TO_HZ_SHR32 35 +#define MSEC_TO_HZ_NUM U64_C(1) +#define MSEC_TO_HZ_DEN U64_C(10) +#define HZ_TO_USEC_MUL32 U64_C(0x9c400000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 18 +#define HZ_TO_USEC_NUM U64_C(10000) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0xd1b71759) +#define USEC_TO_HZ_ADJ32 U64_C(0x1fff2e48e8a7) +#define USEC_TO_HZ_SHR32 45 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(10000) + +#elif HZ == 122 +#define HZ_TO_MSEC_MUL32 U64_C(0x8325c53f) +#define HZ_TO_MSEC_ADJ32 U64_C(0xfbcda3a) +#define HZ_TO_MSEC_SHR32 28 +#define HZ_TO_MSEC_NUM U64_C(500) +#define HZ_TO_MSEC_DEN U64_C(61) +#define MSEC_TO_HZ_MUL32 U64_C(0xf9db22d1) +#define MSEC_TO_HZ_ADJ32 U64_C(0x7fbe76c8b) +#define MSEC_TO_HZ_SHR32 35 +#define MSEC_TO_HZ_NUM U64_C(61) +#define MSEC_TO_HZ_DEN U64_C(500) +#define HZ_TO_USEC_MUL32 U64_C(0x8012e2a0) +#define HZ_TO_USEC_ADJ32 U64_C(0x3ef36) +#define HZ_TO_USEC_SHR32 18 +#define HZ_TO_USEC_NUM U64_C(500000) +#define HZ_TO_USEC_DEN U64_C(61) +#define USEC_TO_HZ_MUL32 U64_C(0xffda4053) +#define USEC_TO_HZ_ADJ32 U64_C(0x1ffffbce4217) +#define USEC_TO_HZ_SHR32 45 +#define USEC_TO_HZ_NUM U64_C(61) +#define USEC_TO_HZ_DEN U64_C(500000) + +#elif HZ == 128 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x1e000000) +#define HZ_TO_MSEC_SHR32 29 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(16) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0x3f7ced916) +#define MSEC_TO_HZ_SHR32 34 +#define MSEC_TO_HZ_NUM U64_C(16) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0x40000) +#define HZ_TO_USEC_SHR32 19 +#define HZ_TO_USEC_NUM U64_C(15625) +#define HZ_TO_USEC_DEN U64_C(2) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0xfffbce4217d) +#define USEC_TO_HZ_SHR32 44 +#define USEC_TO_HZ_NUM U64_C(2) +#define USEC_TO_HZ_DEN U64_C(15625) + +#elif HZ == 200 +#define HZ_TO_MSEC_MUL32 U64_C(0xa0000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x0) +#define HZ_TO_MSEC_SHR32 29 +#define HZ_TO_MSEC_NUM U64_C(5) +#define HZ_TO_MSEC_DEN U64_C(1) +#define MSEC_TO_HZ_MUL32 U64_C(0xcccccccd) +#define MSEC_TO_HZ_ADJ32 U64_C(0x333333333) +#define MSEC_TO_HZ_SHR32 34 +#define MSEC_TO_HZ_NUM U64_C(1) +#define MSEC_TO_HZ_DEN U64_C(5) +#define HZ_TO_USEC_MUL32 U64_C(0x9c400000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 19 +#define HZ_TO_USEC_NUM U64_C(5000) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0xd1b71759) +#define USEC_TO_HZ_ADJ32 U64_C(0xfff2e48e8a7) +#define USEC_TO_HZ_SHR32 44 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(5000) + +#elif HZ == 250 +#define HZ_TO_MSEC_MUL32 U64_C(0x80000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x0) +#define HZ_TO_MSEC_SHR32 29 +#define HZ_TO_MSEC_NUM U64_C(4) +#define HZ_TO_MSEC_DEN U64_C(1) +#define MSEC_TO_HZ_MUL32 U64_C(0x80000000) +#define MSEC_TO_HZ_ADJ32 U64_C(0x180000000) +#define MSEC_TO_HZ_SHR32 33 +#define MSEC_TO_HZ_NUM U64_C(1) +#define MSEC_TO_HZ_DEN U64_C(4) +#define HZ_TO_USEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 20 +#define HZ_TO_USEC_NUM U64_C(4000) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define USEC_TO_HZ_ADJ32 U64_C(0x7ff7ced9168) +#define USEC_TO_HZ_SHR32 43 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(4000) + +#elif HZ == 256 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x3e000000) +#define HZ_TO_MSEC_SHR32 30 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(32) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0x1fbe76c8b) +#define MSEC_TO_HZ_SHR32 33 +#define MSEC_TO_HZ_NUM U64_C(32) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0xc0000) +#define HZ_TO_USEC_SHR32 20 +#define HZ_TO_USEC_NUM U64_C(15625) +#define HZ_TO_USEC_DEN U64_C(4) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0x7ffde7210be) +#define USEC_TO_HZ_SHR32 43 +#define USEC_TO_HZ_NUM U64_C(4) +#define USEC_TO_HZ_DEN U64_C(15625) + +#elif HZ == 300 +#define HZ_TO_MSEC_MUL32 U64_C(0xd5555556) +#define HZ_TO_MSEC_ADJ32 U64_C(0x2aaaaaaa) +#define HZ_TO_MSEC_SHR32 30 +#define HZ_TO_MSEC_NUM U64_C(10) +#define HZ_TO_MSEC_DEN U64_C(3) +#define MSEC_TO_HZ_MUL32 U64_C(0x9999999a) +#define MSEC_TO_HZ_ADJ32 U64_C(0x1cccccccc) +#define MSEC_TO_HZ_SHR32 33 +#define MSEC_TO_HZ_NUM U64_C(3) +#define MSEC_TO_HZ_DEN U64_C(10) +#define HZ_TO_USEC_MUL32 U64_C(0xd0555556) +#define HZ_TO_USEC_ADJ32 U64_C(0xaaaaa) +#define HZ_TO_USEC_SHR32 20 +#define HZ_TO_USEC_NUM U64_C(10000) +#define HZ_TO_USEC_DEN U64_C(3) +#define USEC_TO_HZ_MUL32 U64_C(0x9d495183) +#define USEC_TO_HZ_ADJ32 U64_C(0x7ffcb923a29) +#define USEC_TO_HZ_SHR32 43 +#define USEC_TO_HZ_NUM U64_C(3) +#define USEC_TO_HZ_DEN U64_C(10000) + +#elif HZ == 512 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x7e000000) +#define HZ_TO_MSEC_SHR32 31 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(64) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0xfdf3b645) +#define MSEC_TO_HZ_SHR32 32 +#define MSEC_TO_HZ_NUM U64_C(64) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0x1c0000) +#define HZ_TO_USEC_SHR32 21 +#define HZ_TO_USEC_NUM U64_C(15625) +#define HZ_TO_USEC_DEN U64_C(8) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0x3ffef39085f) +#define USEC_TO_HZ_SHR32 42 +#define USEC_TO_HZ_NUM U64_C(8) +#define USEC_TO_HZ_DEN U64_C(15625) + +#elif HZ == 1000 +#define HZ_TO_MSEC_MUL32 U64_C(0x80000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0x0) +#define HZ_TO_MSEC_SHR32 31 +#define HZ_TO_MSEC_NUM U64_C(1) +#define HZ_TO_MSEC_DEN U64_C(1) +#define MSEC_TO_HZ_MUL32 U64_C(0x80000000) +#define MSEC_TO_HZ_ADJ32 U64_C(0x0) +#define MSEC_TO_HZ_SHR32 31 +#define MSEC_TO_HZ_NUM U64_C(1) +#define MSEC_TO_HZ_DEN U64_C(1) +#define HZ_TO_USEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_USEC_ADJ32 U64_C(0x0) +#define HZ_TO_USEC_SHR32 22 +#define HZ_TO_USEC_NUM U64_C(1000) +#define HZ_TO_USEC_DEN U64_C(1) +#define USEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define USEC_TO_HZ_ADJ32 U64_C(0x1ff7ced9168) +#define USEC_TO_HZ_SHR32 41 +#define USEC_TO_HZ_NUM U64_C(1) +#define USEC_TO_HZ_DEN U64_C(1000) + +#elif HZ == 1024 +#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000) +#define HZ_TO_MSEC_ADJ32 U64_C(0xfe000000) +#define HZ_TO_MSEC_SHR32 32 +#define HZ_TO_MSEC_NUM U64_C(125) +#define HZ_TO_MSEC_DEN U64_C(128) +#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98) +#define MSEC_TO_HZ_ADJ32 U64_C(0x7ef9db22) +#define MSEC_TO_HZ_SHR32 31 +#define MSEC_TO_HZ_NUM U64_C(128) +#define MSEC_TO_HZ_DEN U64_C(125) +#define HZ_TO_USEC_MUL32 U64_C(0xf4240000) +#define HZ_TO_USEC_ADJ32 U64_C(0x3c0000) +#define HZ_TO_USEC_SHR32 22 +#define HZ_TO_USEC_NUM U64_C(15625) +#define HZ_TO_USEC_DEN U64_C(16) +#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06) +#define USEC_TO_HZ_ADJ32 U64_C(0x1fff79c842f) +#define USEC_TO_HZ_SHR32 41 +#define USEC_TO_HZ_NUM U64_C(16) +#define USEC_TO_HZ_DEN U64_C(15625) + +#elif HZ == 1200 +#define HZ_TO_MSEC_MUL32 U64_C(0xd5555556) +#define HZ_TO_MSEC_ADJ32 U64_C(0xd5555555) +#define HZ_TO_MSEC_SHR32 32 +#define HZ_TO_MSEC_NUM U64_C(5) +#define HZ_TO_MSEC_DEN U64_C(6) +#define MSEC_TO_HZ_MUL32 U64_C(0x9999999a) +#define MSEC_TO_HZ_ADJ32 U64_C(0x66666666) +#define MSEC_TO_HZ_SHR32 31 +#define MSEC_TO_HZ_NUM U64_C(6) +#define MSEC_TO_HZ_DEN U64_C(5) +#define HZ_TO_USEC_MUL32 U64_C(0xd0555556) +#define HZ_TO_USEC_ADJ32 U64_C(0x2aaaaa) +#define HZ_TO_USEC_SHR32 22 +#define HZ_TO_USEC_NUM U64_C(2500) +#define HZ_TO_USEC_DEN U64_C(3) +#define USEC_TO_HZ_MUL32 U64_C(0x9d495183) +#define USEC_TO_HZ_ADJ32 U64_C(0x1ffcb923a29) +#define USEC_TO_HZ_SHR32 41 +#define USEC_TO_HZ_NUM U64_C(3) +#define USEC_TO_HZ_DEN U64_C(2500) + +#elif 1 +#error "kernel/timeconst.h has unknown HZ value!" +#endif + +#endif /* KERNEL_TIMECONST_H */