* [PATCH 0/3] clean out Perl from build system.
@ 2009-12-08 9:17 Rob Landley
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
` (3 more replies)
0 siblings, 4 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-08 9:17 UTC (permalink / raw)
To: linux-kernel
Perl was introduced as a build dependency in 2.6.25. My cross-compile
environment does not use perl, so ever since then I've patched it back out.
With these patches I've personally built kernels for x86, x86_64, arm, mips,
powerpc, sparc, sh4, and m68k.
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
@ 2009-12-08 9:19 ` Rob Landley
2009-12-09 15:45 ` Michal Marek
2009-12-08 9:21 ` [PATCH 2/3] Remove perl from make headers_install Rob Landley
` (2 subsequent siblings)
3 siblings, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-12-08 9:19 UTC (permalink / raw)
To: linux-kernel
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.
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 -ruN linux-2.6.30/kernel/Makefile linux-2.6.30.new/kernel/Makefile
--- linux-2.6.30/kernel/Makefile 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30.new/kernel/Makefile 2009-06-22 14:29:16.000000000 -0500
@@ -123,7 +123,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)
diff -ruN linux-2.6.30/kernel/timeconst.pl linux-2.6.30.new/kernel/timeconst.pl
--- linux-2.6.30/kernel/timeconst.pl 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30.new/kernel/timeconst.pl 1969-12-31 18: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;
diff -ruN linux-2.6.30/kernel/timeconst.sh linux-2.6.30.new/kernel/timeconst.sh
--- linux-2.6.30/kernel/timeconst.sh 1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.30.new/kernel/timeconst.sh 2009-06-22 14:29:16.000000000 -0500
@@ -0,0 +1,148 @@
+#!/bin/sh
+
+if [ $# -ne 2 ]
+then
+ echo "Usage: timeconst.sh HZ FILENAME"
+ echo
+ echo "Generate a header file with constants for coverting between"
+ echo "decimal HZ timer ticks and milisecond or microsecond delays."
+ echo
+ exit 1
+fi
+
+HZ=$1
+shift
+FILENAME=$1
+
+# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.
+
+if [ $((1 << 32)) -lt 0 ]
+then
+ echo "timeconst.sh needs a shell with 64 bit math, such as bash,"
+ echo "busybox ash, or dash running on a 64 bit host."
+ exit 1
+fi
+
+# If this script exits for any reason before this trap is removed,
+# delete the output file so a partial file won't confuse the build.
+
+trap "rm $FILENAME" EXIT
+
+# Output start of header file
+
+cat > $FILENAME << EOF || exit 1
+/* 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 Milliseconds and Microseconds
+
+cat << EOF |
+MSEC 1000
+USEC 1000000
+EOF
+while read NAME PERIOD
+do
+ # 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
+
+ # Calculate 32 significant bits of MUL32 data.
+
+ SHIFT=0
+ while true
+ do
+ # This can't overflow 64 bit math. Pathological case
+ # (TO=1, FROM=1000000) uses around 32+20=52 bits.
+
+ MUL32=$(( ( ( $TO << $SHIFT ) + $FROM - 1 ) / $FROM ))
+
+ # Keep increasing $SHIFT until we've got 32 bits.
+
+ [ $MUL32 -gt $(( 1 << 31 )) ] && break
+ SHIFT=$(( $SHIFT + 1 ))
+ done
+ MUL32=$( printf %x $MUL32 )
+
+ # ADJ32 is just (((FROM/GCD)-1)<<SHIFT)/(FROM/GCD) but this
+ # can overflow 64 bit math (examples, HZ=24 or HZ=122).
+ # Pathological case could use 32+20+20=72 bits. (And this is
+ # the pathological case because a larger $HZ results in a
+ # smaller $SHIFT, so even insane HZ>USEC cases should be ok.)
+
+ # To get around this, we chop the bottom 32 bits off the
+ # calculation and then reassemble it to avoid overflow:
+ # 32+64=96, which is > 72.
+
+ ADJ32=$(( $FROM / $GCD ))
+ if [ $SHIFT -gt 32 ]
+ then
+ UPPER=$(( ( $ADJ32 - 1 ) << ( $SHIFT - 32 ) ))
+ LOWER=$(( ( $UPPER % $ADJ32 ) << 32 ))
+ ADJ32=$(( ( ( $UPPER / $ADJ32 ) << 32 ) + ( $LOWER / $ADJ32 )))
+ else
+ ADJ32=$(( ( ( $ADJ32 - 1 ) << $SHIFT) / $ADJ32 ))
+ fi
+ ADJ32=$( printf %x $ADJ32 )
+
+ NUM=$(( $TO / $GCD ))
+ DEN=$(( $FROM / $GCD ))
+
+ # Output next chunk of header data to file
+
+ (
+ echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)" &&
+ echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)" &&
+ echo "#define ${CONVERT}_SHR32 $SHIFT" &&
+ echo "#define ${CONVERT}_NUM U64_C($NUM)" &&
+ echo "#define ${CONVERT}_DEN U64_C($DEN)"
+ ) >> $FILENAME || exit 1
+ done
+done
+
+(
+ echo
+ echo "#endif /* __KERNEL_TIMECHONST_H */"
+) >> $FILENAME || exit 1
+
+# Don't rm $FILENAME on exit anymore.
+
+trap "" EXIT
+
+exit 0
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* [PATCH 2/3] Remove perl from make headers_install
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
@ 2009-12-08 9:21 ` Rob Landley
2009-12-08 9:22 ` [PATCH 3/3] Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh Rob Landley
2009-12-08 10:23 ` [PATCH 0/3] clean out Perl from build system Michal Marek
3 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-08 9:21 UTC (permalink / raw)
To: linux-kernel
From: Rob Landley <rob@landley.net>
Remove perl from make headers_install by replacing a perl script (doing
a simple regex search and replace) with a smaller and faster shell script
implementation. The new shell script is a single for loop calling sed and
piping its output through unifdef to produce the target file.
Signed-off-by: Rob Landley <rob@landley.net>
---
scripts/Makefile.headersinst | 6 ++--
scripts/headers_install.pl | 49 ---------------------------------
scripts/headers_install.sh | 39 ++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 52 deletions(-)
diff -ruN linux-2.6.30.old/scripts/headers_install.pl linux-2.6.30/scripts/headers_install.pl
--- linux-2.6.30.old/scripts/headers_install.pl 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30/scripts/headers_install.pl 1969-12-31 18:00:00.000000000 -0600
@@ -1,49 +0,0 @@
-#!/usr/bin/perl -w
-#
-# headers_install prepare the listed header files for use in
-# user space and copy the files to their destination.
-#
-# Usage: headers_install.pl readdir installdir arch [files...]
-# readdir: dir to open files
-# installdir: dir to install the files
-# arch: current architecture
-# arch is used to force a reinstallation when the arch
-# changes because kbuild then detect a command line change.
-# files: list of files to check
-#
-# Step in preparation for users space:
-# 1) Drop all use of compiler.h definitions
-# 2) Drop include of compiler.h
-# 3) Drop all sections defined out by __KERNEL__ (using unifdef)
-
-use strict;
-
-my ($readdir, $installdir, $arch, @files) = @ARGV;
-
-my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__";
-
-foreach my $file (@files) {
- local *INFILE;
- local *OUTFILE;
- my $tmpfile = "$installdir/$file.tmp";
- open(INFILE, "<$readdir/$file")
- or die "$readdir/$file: $!\n";
- open(OUTFILE, ">$tmpfile") or die "$tmpfile: $!\n";
- while (my $line = <INFILE>) {
- $line =~ s/([\s(])__user\s/$1/g;
- $line =~ s/([\s(])__force\s/$1/g;
- $line =~ s/([\s(])__iomem\s/$1/g;
- $line =~ s/\s__attribute_const__\s/ /g;
- $line =~ s/\s__attribute_const__$//g;
- $line =~ s/^#include <linux\/compiler.h>//;
- $line =~ s/(^|\s)(inline)\b/$1__$2__/g;
- $line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g;
- $line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g;
- printf OUTFILE "%s", $line;
- }
- close OUTFILE;
- close INFILE;
- system $unifdef . " $tmpfile > $installdir/$file";
- unlink $tmpfile;
-}
-exit 0;
diff -ruN linux-2.6.30.old/scripts/headers_install.sh linux-2.6.30/scripts/headers_install.sh
--- linux-2.6.30.old/scripts/headers_install.sh 1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.30/scripts/headers_install.sh 2009-06-22 16:21:23.000000000 -0500
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+if [ $# -lt 2 ]
+then
+ echo "Usage: headers_install.sh INDIR OUTDIR [FILES...]
+ echo
+ echo "Prepares kernel header files for use by user space, by removing"
+ echo "all compiler.h definitions and #includes, removing any"
+ echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
+ echo "asm/inline/volatile keywords."
+ echo
+ echo "INDIR: directory to read each kernel header FILE from."
+ echo "OUTDIR: directory to write each userspace header FILE to."
+ echo "FILES: list of header files to operate on."
+
+ exit 1
+fi
+
+# Grab arguments
+
+INDIR="$1"
+shift
+OUTDIR="$1"
+shift
+
+# Iterate through files listed on command line
+
+for i in "$@"
+do
+ sed -r \
+ -e 's/([ \t(])(__user|__force|__iomem)[ \t]/\1/g' \
+ -e 's/__attribute_const__([ \t]|$)/\1/g' \
+ -e 's@^#include <linux/compiler.h>@@' \
+ -e 's/(^|[ \t])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
+ "$INDIR/$i" |
+ scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ - > "$OUTDIR/$i"
+done
+
+exit 0
diff -ruN linux-2.6.30.old/scripts/Makefile.headersinst linux-2.6.30/scripts/Makefile.headersinst
--- linux-2.6.30.old/scripts/Makefile.headersinst 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30/scripts/Makefile.headersinst 2009-06-22 16:21:23.000000000 -0500
@@ -46,8 +46,8 @@
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
file$(if $(word 2, $(all-files)),s))
cmd_install = \
- $(PERL) $< $(srctree)/$(obj) $(install) $(SRCARCH) $(header-y); \
- $(PERL) $< $(objtree)/$(obj) $(install) $(SRCARCH) $(objhdr-y); \
+ $(CONFIG_SHELL) $< $(srctree)/$(obj) $(install) $(header-y); \
+ $(CONFIG_SHELL) $< $(objtree)/$(obj) $(install) $(objhdr-y); \
touch $@
quiet_cmd_remove = REMOVE $(unwanted)
@@ -70,7 +70,7 @@
@:
targets += $(install-file)
-$(install-file): scripts/headers_install.pl $(input-files) FORCE
+$(install-file): scripts/headers_install.sh $(input-files) FORCE
$(if $(unwanted),$(call cmd,remove),)
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
$(call if_changed,install)
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* [PATCH 3/3] Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-12-08 9:21 ` [PATCH 2/3] Remove perl from make headers_install Rob Landley
@ 2009-12-08 9:22 ` Rob Landley
2009-12-08 10:23 ` [PATCH 0/3] clean out Perl from build system Michal Marek
3 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-08 9:22 UTC (permalink / raw)
To: linux-kernel
From: Rob Landley <rob@landley.net>
Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh.
This script generates kernel/cpu/capflags.c from include/asm/cpufeature.h.
Signed-off-by: Rob Landley <rob@landley.net>
---
arch/x86/kernel/cpu/Makefile | 4 +--
arch/x86/kernel/cpu/mkcapflags.pl | 32 ----------------------------
arch/x86/kernel/cpu/mkcapflags.sh | 28 ++++++++++++++++++++++++
3 files changed, 30 insertions(+), 34 deletions(-)
diff -ruN linux-2.6.30.old/arch/x86/kernel/cpu/Makefile linux-2.6.30/arch/x86/kernel/cpu/Makefile
--- linux-2.6.30.old/arch/x86/kernel/cpu/Makefile 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30/arch/x86/kernel/cpu/Makefile 2009-06-22 16:39:06.000000000 -0500
@@ -36,10 +36,10 @@
obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o
quiet_cmd_mkcapflags = MKCAP $@
- cmd_mkcapflags = $(PERL) $(srctree)/$(src)/mkcapflags.pl $< $@
+ cmd_mkcapflags = $(CONFIG_SHELL) $(srctree)/$(src)/mkcapflags.sh $< $@
cpufeature = $(src)/../../include/asm/cpufeature.h
targets += capflags.c
-$(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.pl FORCE
+$(obj)/capflags.c: $(cpufeature) $(src)/mkcapflags.sh FORCE
$(call if_changed,mkcapflags)
diff -ruN linux-2.6.30.old/arch/x86/kernel/cpu/mkcapflags.pl
linux-2.6.30/arch/x86/kernel/cpu/mkcapflags.pl
--- linux-2.6.30.old/arch/x86/kernel/cpu/mkcapflags.pl 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30/arch/x86/kernel/cpu/mkcapflags.pl 1969-12-31 18:00:00.000000000 -0600
@@ -1,32 +0,0 @@
-#!/usr/bin/perl
-#
-# Generate the x86_cap_flags[] array from include/asm-x86/cpufeature.h
-#
-
-($in, $out) = @ARGV;
-
-open(IN, "< $in\0") or die "$0: cannot open: $in: $!\n";
-open(OUT, "> $out\0") or die "$0: cannot create: $out: $!\n";
-
-print OUT "#include <asm/cpufeature.h>\n\n";
-print OUT "const char * const x86_cap_flags[NCAPINTS*32] = {\n";
-
-while (defined($line = <IN>)) {
- if ($line =~ /^\s*\#\s*define\s+(X86_FEATURE_(\S+))\s+(.*)$/) {
- $macro = $1;
- $feature = $2;
- $tail = $3;
- if ($tail =~ /\/\*\s*\"([^"]*)\".*\*\//) {
- $feature = $1;
- }
-
- if ($feature ne '') {
- printf OUT "\t%-32s = \"%s\",\n",
- "[$macro]", "\L$feature";
- }
- }
-}
-print OUT "};\n";
-
-close(IN);
-close(OUT);
diff -ruN linux-2.6.30.old/arch/x86/kernel/cpu/mkcapflags.sh
linux-2.6.30/arch/x86/kernel/cpu/mkcapflags.sh
--- linux-2.6.30.old/arch/x86/kernel/cpu/mkcapflags.sh 1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.30/arch/x86/kernel/cpu/mkcapflags.sh 2009-06-22 16:39:06.000000000 -0500
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# Generate the x86_cap_flags[] array from include/asm/cpufeature.h
+#
+
+IN=$1
+OUT=$2
+
+(
+ echo "#include <asm/cpufeature.h>"
+ echo ""
+ echo "const char * const x86_cap_flags[NCAPINTS*32] = {"
+
+ # Iterate through any input lines starting with #define X86_FEATURE_
+ sed -n -e 's/\t/ /g' -e 's/^ *# *define *X86_FEATURE_//p' $IN |
+ while read i
+ do
+ # Name is everything up to the first whitespace
+ NAME="$(echo "$i" | sed 's/ .*//')"
+
+ # If the /* comment */ starts with a quote string, grab that.
+ VALUE="$(echo "$i" | sed -n 's@.*/\* *\("[^"]*"\).*\*/@\1@p')"
+ [ -z "$VALUE" ] && VALUE="\"$(echo "$NAME" | tr A-Z a-z)\""
+
+ [ "$VALUE" != '""' ] && echo " [X86_FEATURE_$NAME] = $VALUE,"
+ done
+ echo "};"
+) > $OUT
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 0/3] clean out Perl from build system.
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
` (2 preceding siblings ...)
2009-12-08 9:22 ` [PATCH 3/3] Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh Rob Landley
@ 2009-12-08 10:23 ` Michal Marek
2009-12-08 15:08 ` Rob Landley
3 siblings, 1 reply; 47+ messages in thread
From: Michal Marek @ 2009-12-08 10:23 UTC (permalink / raw)
To: Rob Landley; +Cc: linux-kernel, linux-kbuild
On 8.12.2009 10:17, Rob Landley wrote:
> Perl was introduced as a build dependency in 2.6.25. My cross-compile
> environment does not use perl, so ever since then I've patched it back out.
>
> With these patches I've personally built kernels for x86, x86_64, arm, mips,
> powerpc, sparc, sh4, and m68k.
Hi Rob,
you should CC linux-kbuild@ on patches like this (added now, the whole
series is at http://lkml.org/lkml/2009/12/8/93).
Michal
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 0/3] clean out Perl from build system.
2009-12-08 10:23 ` [PATCH 0/3] clean out Perl from build system Michal Marek
@ 2009-12-08 15:08 ` Rob Landley
0 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-08 15:08 UTC (permalink / raw)
To: Michal Marek; +Cc: linux-kernel, linux-kbuild
On Tuesday 08 December 2009 04:23:06 Michal Marek wrote:
> On 8.12.2009 10:17, Rob Landley wrote:
> > Perl was introduced as a build dependency in 2.6.25. My cross-compile
> > environment does not use perl, so ever since then I've patched it back
> > out.
> >
> > With these patches I've personally built kernels for x86, x86_64, arm,
> > mips, powerpc, sparc, sh4, and m68k.
>
> Hi Rob,
>
> you should CC linux-kbuild@ on patches like this (added now, the whole
> series is at http://lkml.org/lkml/2009/12/8/93).
>
> Michal
Thanks. LWN said Sam Ravnborg was stepping down, and I haven't kept up with
who's in charge now.
Rob
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
@ 2009-12-09 15:45 ` Michal Marek
2009-12-09 23:40 ` Rob Landley
0 siblings, 1 reply; 47+ messages in thread
From: Michal Marek @ 2009-12-09 15:45 UTC (permalink / raw)
To: Rob Landley; +Cc: linux-kernel, H. Peter Anvin, linux-kbuild
[CC hpa who wrote the timeconst.pl script]
On 8.12.2009 10:19, Rob Landley wrote:
> 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.
I tried the shell script with the precomputed values in timeconst.pl and
it gave me different results than the perl version for 250 and 1000:
with HZ=250:
--- perl
+++ bash
@@ -8,14 +8,14 @@
#error "kernel/timeconst.h has the wrong HZ value!"
#endif
-#define HZ_TO_MSEC_MUL32 U64_C(0x80000000)
+#define HZ_TO_MSEC_MUL32 U64_C(0x100000000)
#define HZ_TO_MSEC_ADJ32 U64_C(0x0)
-#define HZ_TO_MSEC_SHR32 29
+#define HZ_TO_MSEC_SHR32 30
#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_MUL32 U64_C(0x100000000)
+#define MSEC_TO_HZ_ADJ32 U64_C(0x300000000)
+#define MSEC_TO_HZ_SHR32 34
#define MSEC_TO_HZ_NUM U64_C(1)
#define MSEC_TO_HZ_DEN U64_C(4)
#define HZ_TO_USEC_MUL32 U64_C(0xfa000000)
and with HZ=1000:
--- perl
+++ bash
@@ -8,14 +8,14 @@
#error "kernel/timeconst.h has the wrong HZ value!"
#endif
-#define HZ_TO_MSEC_MUL32 U64_C(0x80000000)
+#define HZ_TO_MSEC_MUL32 U64_C(0x100000000)
#define HZ_TO_MSEC_ADJ32 U64_C(0x0)
-#define HZ_TO_MSEC_SHR32 31
+#define HZ_TO_MSEC_SHR32 32
#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_MUL32 U64_C(0x100000000)
#define MSEC_TO_HZ_ADJ32 U64_C(0x0)
-#define MSEC_TO_HZ_SHR32 31
+#define MSEC_TO_HZ_SHR32 32
#define MSEC_TO_HZ_NUM U64_C(1)
#define MSEC_TO_HZ_DEN U64_C(1)
#define HZ_TO_USEC_MUL32 U64_C(0xfa000000)
$ bash --version
GNU bash, version 4.0.33(1)-release (x86_64-suse-linux-gnu)
...
You're trying to avoid the build dependency on Perl. What about adding a
timeconst.h_shipped with the precomputed values from timeconst.pl:
#if HZ == 24
#define ...
...
#endif
#if HZ == 32
...
#endif
...
#ifndef HZ_TO_MSEC_MUL32
# error "Unknown HZ value, please update kernel/timeconst.h using
kernel/timeconst.pl"
#endif
plus some makefile automagic to run the script iff the HZ value isn't
precomputed. Then you would only need Perl for exotic HZ configurations.
>
> 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 -ruN linux-2.6.30/kernel/Makefile linux-2.6.30.new/kernel/Makefile
> --- linux-2.6.30/kernel/Makefile 2009-06-09 22:05:27.000000000 -0500
> +++ linux-2.6.30.new/kernel/Makefile 2009-06-22 14:29:16.000000000 -0500
> @@ -123,7 +123,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)
> diff -ruN linux-2.6.30/kernel/timeconst.pl linux-2.6.30.new/kernel/timeconst.pl
> --- linux-2.6.30/kernel/timeconst.pl 2009-06-09 22:05:27.000000000 -0500
> +++ linux-2.6.30.new/kernel/timeconst.pl 1969-12-31 18: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
[snip]
> diff -ruN linux-2.6.30/kernel/timeconst.sh linux-2.6.30.new/kernel/timeconst.sh
> --- linux-2.6.30/kernel/timeconst.sh 1969-12-31 18:00:00.000000000 -0600
> +++ linux-2.6.30.new/kernel/timeconst.sh 2009-06-22 14:29:16.000000000 -0500
> @@ -0,0 +1,148 @@
> +#!/bin/sh
> +
> +if [ $# -ne 2 ]
> +then
> + echo "Usage: timeconst.sh HZ FILENAME"
> + echo
> + echo "Generate a header file with constants for coverting between"
> + echo "decimal HZ timer ticks and milisecond or microsecond delays."
> + echo
> + exit 1
> +fi
> +
> +HZ=$1
> +shift
> +FILENAME=$1
> +
> +# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.
> +
> +if [ $((1 << 32)) -lt 0 ]
> +then
> + echo "timeconst.sh needs a shell with 64 bit math, such as bash,"
> + echo "busybox ash, or dash running on a 64 bit host."
> + exit 1
> +fi
> +
> +# If this script exits for any reason before this trap is removed,
> +# delete the output file so a partial file won't confuse the build.
> +
> +trap "rm $FILENAME" EXIT
> +
> +# Output start of header file
> +
> +cat > $FILENAME << EOF || exit 1
> +/* 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 Milliseconds and Microseconds
> +
> +cat << EOF |
> +MSEC 1000
> +USEC 1000000
> +EOF
> +while read NAME PERIOD
> +do
> + # 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
> +
> + # Calculate 32 significant bits of MUL32 data.
> +
> + SHIFT=0
> + while true
> + do
> + # This can't overflow 64 bit math. Pathological case
> + # (TO=1, FROM=1000000) uses around 32+20=52 bits.
> +
> + MUL32=$(( ( ( $TO << $SHIFT ) + $FROM - 1 ) / $FROM ))
> +
> + # Keep increasing $SHIFT until we've got 32 bits.
> +
> + [ $MUL32 -gt $(( 1 << 31 )) ] && break
> + SHIFT=$(( $SHIFT + 1 ))
> + done
> + MUL32=$( printf %x $MUL32 )
> +
> + # ADJ32 is just (((FROM/GCD)-1)<<SHIFT)/(FROM/GCD) but this
> + # can overflow 64 bit math (examples, HZ=24 or HZ=122).
> + # Pathological case could use 32+20+20=72 bits. (And this is
> + # the pathological case because a larger $HZ results in a
> + # smaller $SHIFT, so even insane HZ>USEC cases should be ok.)
> +
> + # To get around this, we chop the bottom 32 bits off the
> + # calculation and then reassemble it to avoid overflow:
> + # 32+64=96, which is > 72.
> +
> + ADJ32=$(( $FROM / $GCD ))
> + if [ $SHIFT -gt 32 ]
> + then
> + UPPER=$(( ( $ADJ32 - 1 ) << ( $SHIFT - 32 ) ))
> + LOWER=$(( ( $UPPER % $ADJ32 ) << 32 ))
> + ADJ32=$(( ( ( $UPPER / $ADJ32 ) << 32 ) + ( $LOWER / $ADJ32 )))
> + else
> + ADJ32=$(( ( ( $ADJ32 - 1 ) << $SHIFT) / $ADJ32 ))
> + fi
> + ADJ32=$( printf %x $ADJ32 )
> +
> + NUM=$(( $TO / $GCD ))
> + DEN=$(( $FROM / $GCD ))
> +
> + # Output next chunk of header data to file
> +
> + (
> + echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)" &&
> + echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)" &&
> + echo "#define ${CONVERT}_SHR32 $SHIFT" &&
> + echo "#define ${CONVERT}_NUM U64_C($NUM)" &&
> + echo "#define ${CONVERT}_DEN U64_C($DEN)"
> + ) >> $FILENAME || exit 1
> + done
> +done
> +
> +(
> + echo
> + echo "#endif /* __KERNEL_TIMECHONST_H */"
^
Should be "__KERNEL_TIMECONST_H".
> +) >> $FILENAME || exit 1
> +
> +# Don't rm $FILENAME on exit anymore.
> +
> +trap "" EXIT
> +
> +exit 0
>
Michal
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-09 15:45 ` Michal Marek
@ 2009-12-09 23:40 ` Rob Landley
2009-12-09 23:45 ` H. Peter Anvin
2009-12-10 13:52 ` Michal Marek
0 siblings, 2 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-09 23:40 UTC (permalink / raw)
To: Michal Marek; +Cc: linux-kernel, H. Peter Anvin, linux-kbuild
On Wednesday 09 December 2009 09:45:37 Michal Marek wrote:
> [CC hpa who wrote the timeconst.pl script]
>
> On 8.12.2009 10:19, Rob Landley wrote:
> > 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.
>
> I tried the shell script with the precomputed values in timeconst.pl and
> it gave me different results than the perl version for 250 and 1000:
You're right.
They're functionally equivalent (due to the relationship between MUL32 and
SHR32), which is why this code has worked for me and other people for a year
now. The difference is the possibility of an integer overflow if you try to
convert a time period of "0xffffffff".
Trivial fix:
--- a/sources/patches/linux-2.6.25-rc1-noperl.patch Tue Dec 08 20:22:53 2009
-0600
+++ b/sources/patches/linux-2.6.25-rc1-noperl.patch Wed Dec 09 17:28:26 2009
-0600
@@ -507,7 +507,7 @@
+
+ # Keep increasing $SHIFT until we've got 32 bits.
+
-+ [ $MUL32 -gt $(( 1 << 31 )) ] && break
++ [ $MUL32 -ge $(( 1 << 31 )) ] && break
+ SHIFT=$(( $SHIFT + 1 ))
+ done
+ MUL32=$( printf %x $MUL32 )
As long as MUL32 fits in 32 bits than you can multiply it by another 32 bit
number without overflow, and that's probably all the kernel's enforcing.
> #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_MUL32 U64_C(0x100000000)
> +#define MSEC_TO_HZ_ADJ32 U64_C(0x300000000)
> +#define MSEC_TO_HZ_SHR32 34
> #define MSEC_TO_HZ_NUM U64_C(1)
> #define MSEC_TO_HZ_DEN U64_C(4)
> #define HZ_TO_USEC_MUL32 U64_C(0xfa000000)
The same.
> and with HZ=1000:
> --- perl
> +++ bash
> @@ -8,14 +8,14 @@
> #error "kernel/timeconst.h has the wrong HZ value!"
> #endif
>
> -#define HZ_TO_MSEC_MUL32 U64_C(0x80000000)
> +#define HZ_TO_MSEC_MUL32 U64_C(0x100000000)
> #define HZ_TO_MSEC_ADJ32 U64_C(0x0)
> -#define HZ_TO_MSEC_SHR32 31
> +#define HZ_TO_MSEC_SHR32 32
And again.
> #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_MUL32 U64_C(0x100000000)
> #define MSEC_TO_HZ_ADJ32 U64_C(0x0)
> -#define MSEC_TO_HZ_SHR32 31
> +#define MSEC_TO_HZ_SHR32 32
Same thing.
> You're trying to avoid the build dependency on Perl. What about adding a
> timeconst.h_shipped with the precomputed values from timeconst.pl:
Been there, done that. My first patch (way back for 2.6.25) took that
approach:
http://landley.net/hg/hgwebdir.cgi/firmware/file/a791ca629d9c/sources/patches/linux-2.6.25-
rc1-noperl.patch
But it turns out various non-x86 targets (such as ARM OMAP) allow HZ to be
specified by an entry field in the config file, into which the user can type a
range of numbers. See this post from last year for details:
http://lists.impactlinux.com/pipermail/firmware-impactlinux.com/2008-
December/000022.html
This is why reducing the perl version to just the precomputed constants
wouldn't work either. (They're there so that you only need to install a
random cpan library when surprised by a build break on non-x86 machines.)
> > + echo
> > + echo "#endif /* __KERNEL_TIMECHONST_H */"
>
> ^
>
> Should be "__KERNEL_TIMECONST_H".
Yeah, Joe Perches pointed that out to me off-list. It's just a comment so I
didn't resubmit the patch for that, but I've fixed my local version already.
Rob
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-09 23:40 ` Rob Landley
@ 2009-12-09 23:45 ` H. Peter Anvin
2009-12-10 1:50 ` Rob Landley
2009-12-10 13:52 ` Michal Marek
1 sibling, 1 reply; 47+ messages in thread
From: H. Peter Anvin @ 2009-12-09 23:45 UTC (permalink / raw)
To: Rob Landley; +Cc: Michal Marek, linux-kernel, linux-kbuild
On 12/09/2009 03:40 PM, Rob Landley wrote:
>
> This is why reducing the perl version to just the precomputed constants
> wouldn't work either. (They're there so that you only need to install a
> random cpan library when surprised by a build break on non-x86 machines.)
>
It's not "a random CPAN library" - it's a core module.
-hpa
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-09 23:45 ` H. Peter Anvin
@ 2009-12-10 1:50 ` Rob Landley
2009-12-10 1:53 ` H. Peter Anvin
0 siblings, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-12-10 1:50 UTC (permalink / raw)
To: H. Peter Anvin; +Cc: Michal Marek, linux-kernel, linux-kbuild
On Wednesday 09 December 2009 17:45:21 H. Peter Anvin wrote:
> On 12/09/2009 03:40 PM, Rob Landley wrote:
> > This is why reducing the perl version to just the precomputed constants
> > wouldn't work either. (They're there so that you only need to install a
> > random cpan library when surprised by a build break on non-x86 machines.)
>
> It's not "a random CPAN library" - it's a core module.
Then why cache large quantities of its output and test for its existence?
Rob
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-10 1:50 ` Rob Landley
@ 2009-12-10 1:53 ` H. Peter Anvin
0 siblings, 0 replies; 47+ messages in thread
From: H. Peter Anvin @ 2009-12-10 1:53 UTC (permalink / raw)
To: Rob Landley; +Cc: Michal Marek, linux-kernel, linux-kbuild
On 12/09/2009 05:50 PM, Rob Landley wrote:
> On Wednesday 09 December 2009 17:45:21 H. Peter Anvin wrote:
>> On 12/09/2009 03:40 PM, Rob Landley wrote:
>>> This is why reducing the perl version to just the precomputed constants
>>> wouldn't work either. (They're there so that you only need to install a
>>> random cpan library when surprised by a build break on non-x86 machines.)
>>
>> It's not "a random CPAN library" - it's a core module.
>
> Then why cache large quantities of its output and test for its existence?
>
To support archaic Perl versions and Perl binaries without libraries.
-hpa
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-09 23:40 ` Rob Landley
2009-12-09 23:45 ` H. Peter Anvin
@ 2009-12-10 13:52 ` Michal Marek
2009-12-10 23:16 ` Rob Landley
1 sibling, 1 reply; 47+ messages in thread
From: Michal Marek @ 2009-12-10 13:52 UTC (permalink / raw)
To: Rob Landley; +Cc: linux-kernel, H. Peter Anvin, linux-kbuild
On 10.12.2009 00:40, Rob Landley wrote:
> On Wednesday 09 December 2009 09:45:37 Michal Marek wrote:
>> You're trying to avoid the build dependency on Perl. What about adding a
>> timeconst.h_shipped with the precomputed values from timeconst.pl:
>
> Been there, done that. My first patch (way back for 2.6.25) took that
> approach:
>
> http://landley.net/hg/hgwebdir.cgi/firmware/file/a791ca629d9c/sources/patches/linux-2.6.25-
> rc1-noperl.patch
>
> But it turns out various non-x86 targets (such as ARM OMAP) allow HZ to be
> specified by an entry field in the config file, into which the user can type a
> range of numbers. See this post from last year for details:
>
> http://lists.impactlinux.com/pipermail/firmware-impactlinux.com/2008-
> December/000022.html
>
> This is why reducing the perl version to just the precomputed constants
> wouldn't work either. (They're there so that you only need to install a
> random cpan library when surprised by a build break on non-x86 machines.)
That's why I wrote
>> plus some makefile automagic to run the script iff the HZ value isn't
>> precomputed. Then you would only need Perl for exotic HZ configurations.
E.g. make it
...
#elif HZ == 1200
...
#else
#include "timeconst_custom.h"
#endif
and the makefile would run timeconst.pl to generate timeconst_custom.h
iff HZ is set to something arbitrary. I don't have a patch for that, but
I don't see a fundamental problem with such approach.
Michal
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-10 13:52 ` Michal Marek
@ 2009-12-10 23:16 ` Rob Landley
2009-12-11 15:31 ` Michal Marek
0 siblings, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-12-10 23:16 UTC (permalink / raw)
To: Michal Marek; +Cc: linux-kernel, H. Peter Anvin, linux-kbuild
On Thursday 10 December 2009 07:52:44 Michal Marek wrote:
> On 10.12.2009 00:40, Rob Landley wrote:
> > On Wednesday 09 December 2009 09:45:37 Michal Marek wrote:
> >> You're trying to avoid the build dependency on Perl. What about adding a
> >> timeconst.h_shipped with the precomputed values from timeconst.pl:
> >
> > Been there, done that. My first patch (way back for 2.6.25) took that
> > approach:
> >
> > http://landley.net/hg/hgwebdir.cgi/firmware/file/a791ca629d9c/sources/pat
> >ches/linux-2.6.25- rc1-noperl.patch
> >
> > But it turns out various non-x86 targets (such as ARM OMAP) allow HZ to
> > be specified by an entry field in the config file, into which the user
> > can type a range of numbers. See this post from last year for details:
> >
> > http://lists.impactlinux.com/pipermail/firmware-impactlinux.com/2008-
> > December/000022.html
> >
> > This is why reducing the perl version to just the precomputed constants
> > wouldn't work either. (They're there so that you only need to install a
> > random cpan library when surprised by a build break on non-x86 machines.)
>
> That's why I wrote
>
> >> plus some makefile automagic to run the script iff the HZ value isn't
> >> precomputed. Then you would only need Perl for exotic HZ configurations.
>
> E.g. make it
> ...
> #elif HZ == 1200
> ...
> #else
> #include "timeconst_custom.h"
> #endif
>
> and the makefile would run timeconst.pl to generate timeconst_custom.h
> iff HZ is set to something arbitrary. I don't have a patch for that, but
> I don't see a fundamental problem with such approach.
I looked at that when I was attempting to update (rather than replace) my
original patch. There's a reason I didn't go there. You're suggesting there
be two code paths, one maintained by hand and the other just about never
tested against bit-rot. You want to add logic to the makefile so it knows when
to run the perl script and when not to, meaning the makefile needs its own list
of the cached HZ values, which needs to be kept in sync with the header of
cached values, and thus the same information has to live in two places.
Meanwhile the shell script exists, works, and takes a fraction of a second to
run. Using it every build provides a single consistent code path which works
the same for everybody. I'm not seeing any advantage in cacheing values that
are easy to calculate at compile time. It's just as easy to completely
eliminate the perl dependency as to merely mitigate it.
> Michal
Rob
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-10 23:16 ` Rob Landley
@ 2009-12-11 15:31 ` Michal Marek
2009-12-11 19:13 ` H. Peter Anvin
0 siblings, 1 reply; 47+ messages in thread
From: Michal Marek @ 2009-12-11 15:31 UTC (permalink / raw)
To: Rob Landley; +Cc: linux-kernel, H. Peter Anvin, linux-kbuild
Rob Landley wrote:
> On Thursday 10 December 2009 07:52:44 Michal Marek wrote:
>> and the makefile would run timeconst.pl to generate timeconst_custom.h
>> iff HZ is set to something arbitrary. I don't have a patch for that, but
>> I don't see a fundamental problem with such approach.
>
> I looked at that when I was attempting to update (rather than replace) my
> original patch. There's a reason I didn't go there. You're suggesting there
> be two code paths, one maintained by hand and the other just about never
> tested against bit-rot.
OK, that's valid point, indeed. Peter, would you ack Rob's patch with
the oneline fix added (http://lkml.org/lkml/2009/12/8/94 plus
http://lkml.org/lkml/2009/12/9/435)?
Michal
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-11 15:31 ` Michal Marek
@ 2009-12-11 19:13 ` H. Peter Anvin
2009-12-12 0:49 ` Rob Landley
0 siblings, 1 reply; 47+ messages in thread
From: H. Peter Anvin @ 2009-12-11 19:13 UTC (permalink / raw)
To: Michal Marek; +Cc: Rob Landley, linux-kernel, linux-kbuild
On 12/11/2009 07:31 AM, Michal Marek wrote:
>
> OK, that's valid point, indeed. Peter, would you ack Rob's patch with
> the oneline fix added (http://lkml.org/lkml/2009/12/8/94 plus
> http://lkml.org/lkml/2009/12/9/435)?
>
I strongly dislike his patch, as he open-codes specific multiprecision
arithmetic. This makes it hard for other people to maintain, and makes
it prone to errors -- as evidenced by the fact that it didn't even
replicate the known-good results.
I have made my position clear on this and other patches several times
before: I consider it a fool's errand, and a result of a completely
pointless crusade to make a particular science fair-type project a wee
bit easier. We have already seen real damage caused by it, since people
have used awk instead, and have gotten bitten by incompatibilities
between awk implementations.
As such, no, I will not ack this patch, and will consider myself
released of any obligation to maintain the code if this goes in anyway.
I would consider acking a C program which does proper multiprecision
arithmetic, but I'm also not going to spend my time on it.
-hpa
--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-12-11 19:13 ` H. Peter Anvin
@ 2009-12-12 0:49 ` Rob Landley
0 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-12-12 0:49 UTC (permalink / raw)
To: H. Peter Anvin; +Cc: Michal Marek, linux-kernel, linux-kbuild
On Friday 11 December 2009 13:13:39 H. Peter Anvin wrote:
> On 12/11/2009 07:31 AM, Michal Marek wrote:
> > OK, that's valid point, indeed. Peter, would you ack Rob's patch with
> > the oneline fix added (http://lkml.org/lkml/2009/12/8/94 plus
> > http://lkml.org/lkml/2009/12/9/435)?
>
> I strongly dislike his patch, as he open-codes specific multiprecision
> arithmetic. This makes it hard for other people to maintain, and makes
> it prone to errors
It's always easier to understand code that you wrote, doubly so with perl.
The perl code this is replacing has comments, function names like fmul() and
fmuls() with no way to distinguish what they do except by reading their
implementation, and half of it is devoting to cacheing the output of the other
half for reasons which are never explained in the code.
The few comments the perl code does have are sometimes actually misleading.
For example, bignum_hex() has the comment "generate a hex value if the result
fits in 64 bits; otherwise skip". What would skpping mean in this context?
Would it silently emit a broken header, or would it break the build? (My first
guess is that "undef" without an expr would be a build break, but maybe this
is perl's way of saying "None"? I do know that whatever happened the result
wouldn't be a usable kernel, so "skip" is disingenous.)
That said, I read through and managed to understand the perl code. But it
took me more than a day, and I was motivated by the desire to replace it.
> -- as evidenced by the fact that it didn't even
> replicate the known-good results.
Actually I had noticed the difference back at the time I wrote the script, but
the value plus shift were functionally equivalent, and at the time (a year
ago) I vaguely recall working through the math (and looking at the kernel code
using the output) convinced me that that integer overflow couldn't actually
happen for real inputs. But I don't remember why (perhaps the value to be
converted is range checked somewhere so ffffffff couldn't actually make it to this
code, I don't remember) and thus my version would give more precision to the
result (which seemed to be the whole point of the exercise).
No point in trying to reconstruct my reasoning from a year ago when it's a one
line change to make it non-controversial, and the "value always fits in 32 bits
so you can safely multiply by an unsigned int due to LP64" is easier to
explain/document anyway. (On the other end of things, I do remember that the
admittedly insane HZ of ffffffff would have a GCD of 5 with 1000 and thus not be
saved as that. That came up because I was worried an ffffffff value times ffffffff
might _round_ up to overflow when adj32 was added. I did attempt to document
some of the edge cases in the shell script comments...)
> I have made my position clear on this and other patches several times
> before: I consider it a fool's errand,
I.E. your fundamental objection is to removing perl form the build.
You are the one who added this perl to the build system. You're also the one
who added perl to all the other projects you maintain (klibc and syslinux I
noticed) at approximately the same time, after years of those not requiring
perl. I don't know why you suddenly decided perl needed to be everywhere, but
the Linux kernel is not the only project you simultaneously applied this
philosophy to.
I strongly suspect the other objections you've raised in the past two years
are a proxy for the objection to removing perl. However, your central
objection to removing perl hasn't convinced people like Alan Cox, who called
Perl "a bad candidate for our toolchain dependencies" here:
http://lkml.indiana.edu/hypermail/linux/kernel/0901.1/02108.html
Thus you raise other issues, which seem to be proxies for that fundamental
objection. I've tried to address the ones that look like they were actually
intended to be addressed, but I note that your current objection is to the
something like the seventh submission of this patch, and I believe this is the
first time you've raised this particular issue. I believe I first submitted an
ancestor of this patch on February 15, 2008. Just this year I've submitted
previous versions of this patch (more or less in its current form) on January
2, 2009 (with a resubmit on January 3 in response to feedback), on June 22,
and on September 18. And again now. The patch hasn't changed much, your
objections to it have.
I don't even remember you previously complaining about the output differing.
(At a guess, you never actually tried my patch?) But it has been a while, I
could easily be forgetting details by now.
I'm posting these here because they're useful to other people, not because I
expect you to ever stop objecting to them no matter what changes I make.
You've made it clear you object to the _goal_ of the patch. The
implementation seems to be a side issue.
> and a result of a completely
> pointless crusade to make a particular science fair-type project a wee
> bit easier.
Embedded developers' desire to restrict their build environment to something
controllable seems to strike you as weird, yes. Would it help to explain that
it's the same general theory behind Linux From Scratch making a temporary
system, chrooting into it, and then building in there in Chapter 5?
Leaking random crap from the host is bad, often in subtle ways you don't
immediately catch. Some programs (perl, libtool, syscfg) are champions at
leaking context, and to be avoided if at all possible. (I suppose you could
always suggest setting up a different build environment for the kernel as for
userspace, the way Red Hat used to do with kgcc. Doesn't strike me as a good
idea, though.)
> We have already seen real damage caused by it, since people
> have used awk instead, and have gotten bitten by incompatibilities
> between awk implementations.
I'm not using AWK, and I'm sticking with POSIX shell constructs that were
there in susv3, let alone susv4.
Since I wasn't the one proposing any patches extensively using awk (I need the
man page open to make awk do anything more complicated than '{print $2}'), and
this patch isn't using awk at all, I guess you're once again objecting to the
removal of perl in general, not to the patch in front of you. And in doing
so, you're providing evidence that I'm not the only one motivated to submit
perl removal patches, which might undermine your "particular science fair
project" argument a bit.
I am motivated to follow up on this. I've been maintaining perl removal
patches for a couple years now because I personally need them, but I'm not the
only one using these patches, and I've been thanked for tackling this problem
by a dozen embedded developers. I wasn't the one who first noticed the perl
dependency when it went in back in .25, David Anders notified me of the issue
before I'd tested the -rc that introduced it. The most recent guy to say, and
I quote, "Thanks for eliminating the perl dependency." to me in private email
was Joe Perches (on Tuesday).
Embedded developers tend to do stuff off-list. This is because every new kernel
breaks random stuff on non-x86 targets. For example, I finally got powerpc's
pmac_zilog fixed a few days ago (allowing me to use the serial console on
qemu's mac99 target), after a thread stretching back two months (it broke
after 2.6.28). The "works for me" fix is here:
http://lists.ozlabs.org/pipermail/linuxppc-dev/2009-December/078700.html
The most recent arm breakage turned out to be simple (a new CONFIG_MMU symbol
showed up between 2.6.31 and 2.6.32 and needed to be switched on), but
diagnosing "it doesn't boot, no console messages" is always a pain.
The most recent mips breakage was fixed by commit
d71789b6fa37c21ce5eb588d279f57904a62e7e2 which I asked to be backported to
2.6.31 in the stable series and Greg KH acknowledged on November 5th. (I'd
link to my submission to stable@kernel.org but there's no entry for that in
vger lists and googling doesn't seem to come up with a public archive.)
That's just in the past month or so. Trying to git bisect each of those
problems found huge ranges of "it doesn't even compile" in the repository,
because that's the _norm_ for non-x86 targets during development.
Most embedded developers don't want to deal with this, so they stay a year or
three behind the bleeding edge and only upgrade after crazy people like me
have gotten it working. Since even the ones who _don't_ start their messages
by apologizing about their English know they'll be flamed or ignored if they
raise an issue about an 18 month old kernel here, they develop a fear of
posting on linux-kernel at all because it's an "unfriendly" place. (I try to
talk them out of it, but it's a cultural thing at this point. The new kernel
embedded list hasn't really helped more than 10% of this problem.)
I regularly tackle these issues anyway, am generally friendly to newbies on
the lists I follow, and apparently have no shame, so people sometimes forward
issues to me and hope I'll push them upstream so they don't have to. (And
then go away again once they've managed to upgrade to whatever snapshot
they'll be using for the next 3 years, leaving me to follow up.)
*shrug* I'm used to it. You feed stray issues patches and they wind up
adopting you...
> As such, no, I will not ack this patch, and will consider myself
> released of any obligation to maintain the code if this goes in anyway.
I've been maintaining this patch series for 2 years already. I would be happy
to maintain my changed version in future if it gets in. I expected that.
> I would consider acking a C program which does proper multiprecision
> arithmetic, but I'm also not going to spend my time on it.
Hmmm, "would consider acking" (not "would ack", not even "could ack"), with
the additional caveat that the multiprecision arithmetic must be an unspecified
"proper", whatever that means. The "proxy objections" thesis stated above
would label this an obvious delaying tactic, but if I promise to call your
bluff, then the current patch gets dropped on the floor for another development
cycle...
Well played, sir. I must plead the 5th for now.
> -hpa
Rob
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-09-19 1:25 [PATCH 0/3] Perl removal patches for 2.6.31 Rob Landley
@ 2009-09-19 1:33 ` Rob Landley
0 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-09-19 1:33 UTC (permalink / raw)
To: kernel list
From: Rob Landley <rob@xxxxxxxxxxx>
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@xxxxxxxxxxx>
--
kernel/Makefile | 4
kernel/timeconst.pl | 378 ------------------------------------------
kernel/timeconst.sh | 91 ++++++++++
3 files changed, 93 insertions(+), 380 deletions(-)
diff -ruN linux-2.6.30/kernel/Makefile linux-2.6.30.new/kernel/Makefile
--- linux-2.6.30/kernel/Makefile 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30.new/kernel/Makefile 2009-06-22 14:29:16.000000000 -0500
@@ -127,7 +127,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)
diff -ruN linux-2.6.30/kernel/timeconst.pl linux-2.6.30.new/kernel/timeconst.pl
--- linux-2.6.30/kernel/timeconst.pl 2009-06-09 22:05:27.000000000 -0500
+++ linux-2.6.30.new/kernel/timeconst.pl 1969-12-31 18: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;
diff -ruN linux-2.6.30/kernel/timeconst.sh linux-2.6.30.new/kernel/timeconst.sh
--- linux-2.6.30/kernel/timeconst.sh 1969-12-31 18:00:00.000000000 -0600
+++ linux-2.6.30.new/kernel/timeconst.sh 2009-06-22 14:29:16.000000000 -0500
@@ -0,0 +1,148 @@
+#!/bin/sh
+
+if [ $# -ne 2 ]
+then
+ echo "Usage: timeconst.sh HZ FILENAME"
+ echo
+ echo "Generate a header file with constants for coverting between"
+ echo "decimal HZ timer ticks and milisecond or microsecond delays."
+ echo
+ exit 1
+fi
+
+HZ=$1
+shift
+FILENAME=$1
+
+# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.
+
+if [ $((1 << 32)) -lt 0 ]
+then
+ echo "timeconst.sh needs a shell with 64 bit math, such as bash,"
+ echo "busybox ash, or dash running on a 64 bit host."
+ exit 1
+fi
+
+# If this script exits for any reason before this trap is removed,
+# delete the output file so a partial file won't confuse the build.
+
+trap "rm $FILENAME" EXIT
+
+# Output start of header file
+
+cat > $FILENAME << EOF || exit 1
+/* 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 Milliseconds and Microseconds
+
+cat << EOF |
+MSEC 1000
+USEC 1000000
+EOF
+while read NAME PERIOD
+do
+ # 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
+
+ # Calculate 32 significant bits of MUL32 data.
+
+ SHIFT=0
+ while true
+ do
+ # This can't overflow 64 bit math. Pathological case
+ # (TO=1, FROM=1000000) uses around 32+20=52 bits.
+
+ MUL32=$(( ( ( $TO << $SHIFT ) + $FROM - 1 ) / $FROM ))
+
+ # Keep increasing $SHIFT until we've got 32 bits.
+
+ [ $MUL32 -gt $(( 1 << 31 )) ] && break
+ SHIFT=$(( $SHIFT + 1 ))
+ done
+ MUL32=$( printf %x $MUL32 )
+
+ # ADJ32 is just (((FROM/GCD)-1)<<SHIFT)/(FROM/GCD) but this
+ # can overflow 64 bit math (examples, HZ=24 or HZ=122).
+ # Pathological case could use 32+20+20=72 bits. (And this is
+ # the pathological case because a larger $HZ results in a
+ # smaller $SHIFT, so even insane HZ>USEC cases should be ok.)
+
+ # To get around this, we chop the bottom 32 bits off the
+ # calculation and then reassemble it to avoid overflow:
+ # 32+64=96, which is > 72.
+
+ ADJ32=$(( $FROM / $GCD ))
+ if [ $SHIFT -gt 32 ]
+ then
+ UPPER=$(( ( $ADJ32 - 1 ) << ( $SHIFT - 32 ) ))
+ LOWER=$(( ( $UPPER % $ADJ32 ) << 32 ))
+ ADJ32=$(( ( ( $UPPER / $ADJ32 ) << 32 ) + ( $LOWER / $ADJ32 )))
+ else
+ ADJ32=$(( ( ( $ADJ32 - 1 ) << $SHIFT) / $ADJ32 ))
+ fi
+ ADJ32=$( printf %x $ADJ32 )
+
+ NUM=$(( $TO / $GCD ))
+ DEN=$(( $FROM / $GCD ))
+
+ # Output next chunk of header data to file
+
+ (
+ echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)" &&
+ echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)" &&
+ echo "#define ${CONVERT}_SHR32 $SHIFT" &&
+ echo "#define ${CONVERT}_NUM U64_C($NUM)" &&
+ echo "#define ${CONVERT}_DEN U64_C($DEN)"
+ ) >> $FILENAME || exit 1
+ done
+done
+
+(
+ echo
+ echo "#endif /* __KERNEL_TIMECHONST_H */"
+) >> $FILENAME || exit 1
+
+# Don't rm $FILENAME on exit anymore.
+
+trap "" EXIT
+
+exit 0
--
Latency is more important than throughput. It's that simple. - Linus Torvalds
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 15:01 ` Jamie Lokier
2009-01-05 16:18 ` Bernd Petrovitsch
@ 2009-01-06 0:06 ` Rob Landley
1 sibling, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-06 0:06 UTC (permalink / raw)
To: Jamie Lokier
Cc: Bernd Petrovitsch, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Monday 05 January 2009 09:01:56 Jamie Lokier wrote:
> Bernd Petrovitsch wrote:
> > I assume that the NFS-mounted root filesystem is a real distribution.
>
> Not unless you call uClinux (MMU-less) a real distribution, no.
I want things to be orthogonal. The following should be completely separate
steps:
1) Creating a cross compiler
2) building a native development environment
3) booting a native development environment (on real hardware or under and
emulator)
4) natively building your target system.
You should be able to mix and match. Crosstool for #1, go download "fedora
for arm" instead of #2, qemu or real hardware is your choice for #3, and then
you should be able to natively build gentoo under an ubuntu host or vice
versa. (How is not currently properly documented, but I'm working on that.)
My objection to build systems like buildroot or uClinux is that they bundle
all this together into a big hairball. They create their own cross compiler,
build their own root file system, use their own packaging system, and you have
to take it all or nothing.
My build system is ruthlessly orthogonal. I try not to make it depend on
other bits of _itself_ more than necessary.
> > > (* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
> > > proper shared libs. Feel free to fund this :-)
> >
> > The above mentioned ARMs have a MMU. Without MMU, it would be truly
> > insane IMHO.
>
> We have similar cross-build issues without MMUs... I.e. that a lot of
> useful packages don't cross-build properly (including many which use
> Autoconf), and it might be easier to make a native build environment
> than to debug and patch all the broken-for-cross-build packages.
> Especially as sometimes they build, but fail at run-time in some
> conditions.
If you can get a version of the same architecture with an mmu you can actually
build natively on that. It's not ideal (it's a bit like trying to build i486
code on an i686; the fact it runs on the host is no guarantee it'll run on the
target), but it's better than cross compiling. And most things have a broad
enough compatible "base architecture" that you can mostly get away with it.
> But you're right it's probably insane to try. I haven't dared as I
> suspect GCC and/or Binutils would break too :-)
Oh it does, but you can fix it. :)
> I'm sticking instead with "oh well cross-build a few packages by hand
> and just don't even _try_ to use most of the handy software out there".
Cross compiling doesn't scale, and it bit-rots insanely quickly.
> You mentioned ARM Debian. According to
> http://wiki.debian.org/ArmEabiPort one recommended method of
> bootstrapping it is building natively on an emulated ARM, because
> cross-building is fragile.
That's what my firmware linux project does too. (I believe I was one of the
first doing this back in 2006, but there are three or four others out there
doing it now.)
Native compiling under emulation is an idea whose time has come. Emulators on
cheap x86-64 laptops today are about as powerful as high end tricked out build
servers circa 2001, and Moore's Law continues to advance. More memory, more
CPU (maybe via SMP but distcc can take advantage of that today and qemu will
develop threading someday). You can throw engineering time at the problem
(making cross compiling work) or you can throw hardware at the problem (build
natively and buy fast native or emulator-hosting hardware). The balance used
to be in favor of the former; not so much anymore.
That said, my drive for reproducibility and orthogonality says that your
native development environment must be something you can reproduce entirely
from source on an arbitrary host. You can't make cross compiling go away
entirely, the best you can do is limit it to bootstrapping the native
environment. But I want to keep the parts I have to cross compile as small
and simple as possible, and then run a native build script to get a richer
environment. For the past 5+ years my definition has been "an environment
that can rebuild itself under itself is powerful enough, that's all I need to
cross compile", and from the first time I tried this (late 2002) up until
2.6.25 that was 7 packages. That's why I responded to the addition of perl as
a regression, because for my use case it was.
> -- Jamie
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 10:46 ` Bernd Petrovitsch
2009-01-05 15:01 ` Jamie Lokier
@ 2009-01-05 21:07 ` Rob Landley
1 sibling, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-05 21:07 UTC (permalink / raw)
To: Bernd Petrovitsch
Cc: Jamie Lokier, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Monday 05 January 2009 04:46:18 Bernd Petrovitsch wrote:
> > My 850 Linux boxes are 166MHz ARMs and occasionally NFS-mounted.
> > Their /bin/sh does not do $((...)), and Bash is not there at all.
>
> I assume that the NFS-mounted root filesystem is a real distribution.
> And on the local flash is a usual busybox based firmware.
Building on an nfs mount is evil. Make cares greatly about timestamp
accuracy, and NFS's dentry cacheing doesn't really, especially when it
discards cached copies and re-fetches them, and the server and client's clocks
are a half-second off from each other.
Sometimes you haven't got a choice, but I hate having to debug the build
problems this intermittently causes. If you never do anything except "make
all" it should suck less.
> > If I were installing GCC natively on them, I'd install GNU Make and a
> > proper shell while I were at it. But I don't know if Bash works
>
> ACK.
>
> > properly without fork()* - or even if GCC does :-)
> >
> > Perl might be hard, as shared libraries aren't supported by the
> > toolchain which targets my ARMs* and Perl likes its loadable modules.
>
> The simplest way to go is probably to use CentOS or Debian or another
> ready binary distribution on ARM (or MIPS or PPC or whatever core the
> embedded system has) possibly on a custom build kernel (if necessary).
Building natively on target hardware or under QEMU is growing in popularity.
That's how the non-x86 versions of major distros build, and they even have
policy documents about it.
Here's Fedora's:
http://fedoraproject.org/wiki/Architectures/ARM#Native_Compilation
And here are the guys who opened the door for Ubuntu's official Arm port:
http://mojo.handhelds.org/files/HandheldsMojo_ELC2008.pdf
Of course hobbyists like myself haven't got the budget to buy a cluster of
high-end arm systems and they're not always even _available_ for things like
cris, and for new architectures (Xylinx microblaze anyone?) you'll always have
to cross compile to bootstrap the first development environment on 'em anyway,
and it's nice for your environment to be _reproducible_...
So a more flexible approach is to cross compile just enough to get a working
native development environment on the target, and then continue the build
natively (whether it's under qemu or on a sufficiently powerful piece of
target hardware). That's what my "art piece" Firmware Linux project does, and
there's a scratchbox rewrite (sbox2,
http://www.freedesktop.org/wiki/Software/sbox2 ) that does the same sort of
thing, and there are others out there in various states of development. With
x86 hardware so cheap and powerful, building under emulation for less powerful
targets starts to make sense.
Building natively under emulation (QEMU) is available to hobbyists like me and
avoids most of the fun cross compiling issues you don't find out about until
after you've shipped the system and somebody tries to do something with it you
didn't test. So far the record for diagnosing one of these is the two full-
time weeks my friend Garrett spent back at TimeSys tracking down why perl
signal handling wasn't working on mips; turned out it was using x86 signal
numbers rather which don't match the mips ones. The BSP had been shipping for
over a year at that point, but nobody had ever tried to do signal handling in
perl on mips before, and since the perl ./configure step is written in perl
finding the broken part took some doing. This was back in the mists of early
2007 so it's ancient history by now, of course...
If you have set up a cross compiler, you can configure QEMU to use distcc to
call out through its virtual network to the cross compiler running on the
host, which gives you a speed boost without reintroducing most of the horrible
cross compiling issues: there's still only a native toolchain so your build
doesn't have to keep two contexts (hostcc/targetcc) straight, ./configure
still runs natively so any binaries it builds can run and any questions it
asks about the host it's building on should give the right answers for the
target it's building for (including uname -m and friends), headers are
#included natively and libraries are linked natively (that's just how distcc
works, preprocessing and linking happen on the local machine) and there's only
one set so they can't accidentally mix and the cross compiler isn't even
_involved_ in that, make runs natively so it won't get confused by strange
environment variables (yeah, seen that one)...) Only the heavy lifting of
compiling preprocessed .c files to .o files gets exported, which is the one
thing the cross compiler can't really screw up.
But bootstraping a native build environment to run under the emulator is
something you want to keep down to as few packages as possible, because if
you're trying to get the same behavior across half a dozen boards, cross
compiling breaks every time you upgrade _anything_.
> [...]
>
> > (* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
> > proper shared libs. Feel free to fund this :-)
>
> The above mentioned ARMs have a MMU. Without MMU, it would be truly
> insane IMHO.
Without an mmu you have a restricted set of packages that run anyway. No
variable length stacks, you have to use vfork() instead of fork() (no copy on
write), memory fragmentation is a big problem so malloc() fails way more
often...
So toolchain problems aren't a "hump" to get past on nommu systems: the area
past that it isn't necessarily any easier.
> Bernd
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 15:01 ` Jamie Lokier
@ 2009-01-05 16:18 ` Bernd Petrovitsch
2009-01-06 0:06 ` Rob Landley
1 sibling, 0 replies; 47+ messages in thread
From: Bernd Petrovitsch @ 2009-01-05 16:18 UTC (permalink / raw)
To: Jamie Lokier
Cc: Rob Landley, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Mon, 2009-01-05 at 15:01 +0000, Jamie Lokier wrote:
> Bernd Petrovitsch wrote:
> > I assume that the NFS-mounted root filesystem is a real distribution.
>
> Not unless you call uClinux (MMU-less) a real distribution, no.
Not really.
> > > (* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
> > > proper shared libs. Feel free to fund this :-)
> >
> > The above mentioned ARMs have a MMU. Without MMU, it would be truly
> > insane IMHO.
>
> We have similar cross-build issues without MMUs... I.e. that a lot of
Of course.
> useful packages don't cross-build properly (including many which use
> Autoconf), and it might be easier to make a native build environment
Tell me about it - AC_TRY_RUN() is the culprit.
And `pkg-config` supports cross-compilation only since 18 months or so.
Before one had to rewrite the generated .pc files.
[...]
> You mentioned ARM Debian. According to
> http://wiki.debian.org/ArmEabiPort one recommended method of
> bootstrapping it is building natively on an emulated ARM, because
> cross-building is fragile.
That's of course the other solution - if qemu supports your
$EMBEDDED_CPU good enough.
Bernd
--
Firmix Software GmbH http://www.firmix.at/
mobil: +43 664 4416156 fax: +43 1 7890849-55
Embedded Linux Development and Services
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 10:46 ` Bernd Petrovitsch
@ 2009-01-05 15:01 ` Jamie Lokier
2009-01-05 16:18 ` Bernd Petrovitsch
2009-01-06 0:06 ` Rob Landley
2009-01-05 21:07 ` Rob Landley
1 sibling, 2 replies; 47+ messages in thread
From: Jamie Lokier @ 2009-01-05 15:01 UTC (permalink / raw)
To: Bernd Petrovitsch
Cc: Rob Landley, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
Bernd Petrovitsch wrote:
> I assume that the NFS-mounted root filesystem is a real distribution.
Not unless you call uClinux (MMU-less) a real distribution, no.
> > (* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
> > proper shared libs. Feel free to fund this :-)
>
> The above mentioned ARMs have a MMU. Without MMU, it would be truly
> insane IMHO.
We have similar cross-build issues without MMUs... I.e. that a lot of
useful packages don't cross-build properly (including many which use
Autoconf), and it might be easier to make a native build environment
than to debug and patch all the broken-for-cross-build packages.
Especially as sometimes they build, but fail at run-time in some
conditions.
But you're right it's probably insane to try. I haven't dared as I
suspect GCC and/or Binutils would break too :-)
I'm sticking instead with "oh well cross-build a few packages by hand
and just don't even _try_ to use most of the handy software out there".
You mentioned ARM Debian. According to
http://wiki.debian.org/ArmEabiPort one recommended method of
bootstrapping it is building natively on an emulated ARM, because
cross-building is fragile.
-- Jamie
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 4:50 ` Rob Landley
@ 2009-01-05 12:29 ` Bernd Petrovitsch
0 siblings, 0 replies; 47+ messages in thread
From: Bernd Petrovitsch @ 2009-01-05 12:29 UTC (permalink / raw)
To: Rob Landley
Cc: Jamie Lokier, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Son, 2009-01-04 at 22:50 -0600, Rob Landley wrote:
> On Sunday 04 January 2009 18:15:30 Bernd Petrovitsch wrote:
[...]
> > ACK. A bash can IMHO be expected. Even going for `dash` is IMHO somewhat
> > too extreme.
>
> I have yet to encounter a system that uses dash _without_ bash. (All ubuntu
Hmm, should be doable with a chroot environment quite cheap and simple.
> variants, even jeos, install bash by default. They moved the /bin/sh symlink
Yes, I know (small) embedded systems that have a bash (and not "only"
one of busybox shells). It eases writing somewhat fast shell scripts
without the need for lots of fork()s+exec()s too .....
Bernd
--
Firmix Software GmbH http://www.firmix.at/
mobil: +43 664 4416156 fax: +43 1 7890849-55
Embedded Linux Development and Services
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 2:23 ` Jamie Lokier
@ 2009-01-05 10:46 ` Bernd Petrovitsch
2009-01-05 15:01 ` Jamie Lokier
2009-01-05 21:07 ` Rob Landley
0 siblings, 2 replies; 47+ messages in thread
From: Bernd Petrovitsch @ 2009-01-05 10:46 UTC (permalink / raw)
To: Jamie Lokier
Cc: Rob Landley, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Mon, 2009-01-05 at 02:23 +0000, Jamie Lokier wrote:
> Bernd Petrovitsch wrote:
> > > (I have 850 Linux boxes on my network with a bourne shell which
> > > doesn't do $((...)). I won't be building kernels on them though :-)
> >
> > Believe it or not, but there are folks out there who build the firmware
> > on ARM 200 MHz NFS-mounted systems natively (and not simply
> > cross-compile it on a 2GHz PC .....).
>
> Really?
>
> My 850 Linux boxes are 166MHz ARMs and occasionally NFS-mounted.
> Their /bin/sh does not do $((...)), and Bash is not there at all.
I assume that the NFS-mounted root filesystem is a real distribution.
And on the local flash is a usual busybox based firmware.
> If I were installing GCC natively on them, I'd install GNU Make and a
> proper shell while I were at it. But I don't know if Bash works
ACK.
> properly without fork()* - or even if GCC does :-)
>
> Perl might be hard, as shared libraries aren't supported by the
> toolchain which targets my ARMs* and Perl likes its loadable modules.
The simplest way to go is probably to use CentOS or Debian or another
ready binary distribution on ARM (or MIPS or PPC or whatever core the
embedded system has) possibly on a custom build kernel (if necessary).
[...]
> (* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
> proper shared libs. Feel free to fund this :-)
The above mentioned ARMs have a MMU. Without MMU, it would be truly
insane IMHO.
Bernd
--
Firmix Software GmbH http://www.firmix.at/
mobil: +43 664 4416156 fax: +43 1 7890849-55
Embedded Linux Development and Services
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 0:41 ` Ray Lee
@ 2009-01-05 5:08 ` Rob Landley
0 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-05 5:08 UTC (permalink / raw)
To: Ray Lee
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Sunday 04 January 2009 18:41:15 Ray Lee wrote:
> On Fri, Jan 2, 2009 at 12:13 AM, Rob Landley <rob@landley.net> wrote:
> > 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.
>
> Nice work.
Thanks. You'll definitely want to look at the _second_ version of that patch
rather than the first, though. :)
> As the computations can all be done in 64-bit precision
> now, and there have been concerns expressed about some shells not
> supporting 64 bit integers, is there any reason this can't be done
> using long longs in C?
Nope. Any of this could be done in C. (And that's the approach Sam Ravnborg
prefers to take for the second patch in the series, upgrading unifdef.c to do
everything itself.)
I tend to lean towards scripts that create header files rather than programs
that create header files, but as long as you remember to use HOSTCC it's
fairly straightforward. :)
> Other than ruining a good bike shed argument, anyway.
Oh pile on. It beats being dismissed as the only one on the planet who cares
about the issue (again). :)
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 0:15 ` Bernd Petrovitsch
2009-01-05 2:23 ` Jamie Lokier
@ 2009-01-05 4:50 ` Rob Landley
2009-01-05 12:29 ` Bernd Petrovitsch
1 sibling, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-01-05 4:50 UTC (permalink / raw)
To: Bernd Petrovitsch
Cc: Jamie Lokier, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Sunday 04 January 2009 18:15:30 Bernd Petrovitsch wrote:
> On Son, 2009-01-04 at 22:13 +0000, Jamie Lokier wrote:
> > Rob Landley wrote:
> > > In a private email, Bernd Petrovitsch suggested "set -- $i" and then
> > > using NAME=$1; PERIOD=$2. (I keep getting private email responses
> > > to these sort of threads, and then getting dismissed as the only one
> > > who cares about the issue. Less so this time around, but still...)
> > > This apparently works all the way back to the bourne shell.
> >
> > If you're going "all the way back to the bourne shell", don't use "set
>
> "Going back to a Bourne shell" was neither the intention nor makes it
> sense IMHO.
> I mentioned it to point out that the `set -- ' (or `set x `) is nothing
> new or even a bash-ism.
>
> > -- $i"; use "set x $i" instead, and don't expect to do any arithmetic
> > in the shell; use "expr" or "awk" for arithmetic.
> >
> > (Not relevant to kernel scripts, imho, since you can always assume
> > something a bit more modern and not too stripped down).
>
> ACK. A bash can IMHO be expected. Even going for `dash` is IMHO somewhat
> too extreme.
I have yet to encounter a system that uses dash _without_ bash. (All ubuntu
variants, even jeos, install bash by default. They moved the /bin/sh symlink
but they didn't stop installing bash, and the kernel will preferentially use
bash if it finds it.) People keep telling me they exist. I suppose you could
uninstall bash. You could also uninstall gcc. Not sure what that proves.
(And nobody's shown me this mythical second implementation of perl that all
these perl scripts are supposed to be portable to...)
Busybox ash is a more interesting case, but that implements lots of bash
extensions.
That said, it's easy enough the scripts to work with current versions of dash.
The whole shell portability issue mostly seems to be a stand-in for other
objections (Peter Anvin didn't change syslinux and klibc to require perl to
build this year because of dash), but it's easy enough to just address the
proxy objection and move on rather than arguing about it...
> > (I have 850 Linux boxes on my network with a bourne shell which
> > doesn't do $((...)). I won't be building kernels on them though :-)
>
> Believe it or not, but there are folks out there who build the firmware
> on ARM 200 MHz NFS-mounted systems natively (and not simply
> cross-compile it on a 2GHz PC .....).
Yeah, but according to Changes if they do it with the current kernel they do
it with at least gcc 3.2 (August 2002) and make 3.79.1 (June 2000), so trying
to make it work on software released pre-Y2K probably isn't that high a
priority. :)
> Bernd
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-05 0:15 ` Bernd Petrovitsch
@ 2009-01-05 2:23 ` Jamie Lokier
2009-01-05 10:46 ` Bernd Petrovitsch
2009-01-05 4:50 ` Rob Landley
1 sibling, 1 reply; 47+ messages in thread
From: Jamie Lokier @ 2009-01-05 2:23 UTC (permalink / raw)
To: Bernd Petrovitsch
Cc: Rob Landley, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
Bernd Petrovitsch wrote:
> > (I have 850 Linux boxes on my network with a bourne shell which
> > doesn't do $((...)). I won't be building kernels on them though :-)
>
> Believe it or not, but there are folks out there who build the firmware
> on ARM 200 MHz NFS-mounted systems natively (and not simply
> cross-compile it on a 2GHz PC .....).
Really?
My 850 Linux boxes are 166MHz ARMs and occasionally NFS-mounted.
Their /bin/sh does not do $((...)), and Bash is not there at all.
If I were installing GCC natively on them, I'd install GNU Make and a
proper shell while I were at it. But I don't know if Bash works
properly without fork()* - or even if GCC does :-)
Perl might be hard, as shared libraries aren't supported by the
toolchain which targets my ARMs* and Perl likes its loadable modules.
I'm not sure why I would want to build a kernel on these devices.
But I see why people with mobile ARM devices like gphones might
want to, when they're out travelling.
-- Jamie
(* - No MMU on some ARMs, but I'm working on ARM FDPIC-ELF to add
proper shared libs. Feel free to fund this :-)
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 20:39 ` H. Peter Anvin
@ 2009-01-05 0:59 ` Rob Landley
0 siblings, 0 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-05 0:59 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Alan Cox, Sam Ravnborg, Embedded Linux mailing list,
linux-kernel, Andrew Morton
On Sunday 04 January 2009 14:39:36 H. Peter Anvin wrote:
> Rob Landley wrote:
> > C) The only calculation which can overflow 64 bits (the ADJ32 one) turns
> > out not to need arbitrary precision math, just 72 bits, and if it ever
> > uses more than 32 then bottom 32 are all zero before the divide so you
> > can do it in three lines.
>
> ... for the current code (32 bits). When we get an overflow-less 64-bit
> implementation, this code will have to be redone, which is not true for
> a properly done implementation.
One extra mask and add is a strange definition of "redone", but I can add it
now if you like. (I'd personally prefer to wait for something to actually
need it, but...)
> -hpa
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 8:13 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 9:04 ` Sam Ravnborg
2009-01-03 12:28 ` Ingo Oeser
@ 2009-01-05 0:41 ` Ray Lee
2009-01-05 5:08 ` Rob Landley
2 siblings, 1 reply; 47+ messages in thread
From: Ray Lee @ 2009-01-05 0:41 UTC (permalink / raw)
To: Rob Landley
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Fri, Jan 2, 2009 at 12:13 AM, Rob Landley <rob@landley.net> wrote:
> 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.
Nice work. As the computations can all be done in 64-bit precision
now, and there have been concerns expressed about some shells not
supporting 64 bit integers, is there any reason this can't be done
using long longs in C?
Other than ruining a good bike shed argument, anyway.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 22:13 ` Jamie Lokier
@ 2009-01-05 0:15 ` Bernd Petrovitsch
2009-01-05 2:23 ` Jamie Lokier
2009-01-05 4:50 ` Rob Landley
0 siblings, 2 replies; 47+ messages in thread
From: Bernd Petrovitsch @ 2009-01-05 0:15 UTC (permalink / raw)
To: Jamie Lokier
Cc: Rob Landley, Valdis.Kletnieks, Ingo Oeser,
Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Son, 2009-01-04 at 22:13 +0000, Jamie Lokier wrote:
> Rob Landley wrote:
> > In a private email, Bernd Petrovitsch suggested "set -- $i" and then
> > using NAME=$1; PERIOD=$2. (I keep getting private email responses
> > to these sort of threads, and then getting dismissed as the only one
> > who cares about the issue. Less so this time around, but still...)
> > This apparently works all the way back to the bourne shell.
>
> If you're going "all the way back to the bourne shell", don't use "set
"Going back to a Bourne shell" was neither the intention nor makes it
sense IMHO.
I mentioned it to point out that the `set -- ' (or `set x `) is nothing
new or even a bash-ism.
> -- $i"; use "set x $i" instead, and don't expect to do any arithmetic
> in the shell; use "expr" or "awk" for arithmetic.
>
> (Not relevant to kernel scripts, imho, since you can always assume
> something a bit more modern and not too stripped down).
ACK. A bash can IMHO be expected. Even going for `dash` is IMHO somewhat
too extreme.
> (I have 850 Linux boxes on my network with a bourne shell which
> doesn't do $((...)). I won't be building kernels on them though :-)
Believe it or not, but there are folks out there who build the firmware
on ARM 200 MHz NFS-mounted systems natively (and not simply
cross-compile it on a 2GHz PC .....).
Bernd
--
Firmix Software GmbH http://www.firmix.at/
mobil: +43 664 4416156 fax: +43 1 7890849-55
Embedded Linux Development and Services
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 6:43 ` Rob Landley
@ 2009-01-04 22:13 ` Jamie Lokier
2009-01-05 0:15 ` Bernd Petrovitsch
0 siblings, 1 reply; 47+ messages in thread
From: Jamie Lokier @ 2009-01-04 22:13 UTC (permalink / raw)
To: Rob Landley
Cc: Valdis.Kletnieks, Ingo Oeser, Embedded Linux mailing list,
linux-kernel, Andrew Morton, H. Peter Anvin, Sam Ravnborg
Rob Landley wrote:
> In a private email, Bernd Petrovitsch suggested "set -- $i" and then
> using NAME=$1; PERIOD=$2. (I keep getting private email responses
> to these sort of threads, and then getting dismissed as the only one
> who cares about the issue. Less so this time around, but still...)
> This apparently works all the way back to the bourne shell.
If you're going "all the way back to the bourne shell", don't use "set
-- $i"; use "set x $i" instead, and don't expect to do any arithmetic
in the shell; use "expr" or "awk" for arithmetic.
(Not relevant to kernel scripts, imho, since you can always assume
something a bit more modern and not too stripped down).
(I have 850 Linux boxes on my network with a bourne shell which
doesn't do $((...)). I won't be building kernels on them though :-)
-- Jamie
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 5:07 ` Valdis.Kletnieks
2009-01-04 6:43 ` Rob Landley
@ 2009-01-04 21:51 ` Alejandro Mery
1 sibling, 0 replies; 47+ messages in thread
From: Alejandro Mery @ 2009-01-04 21:51 UTC (permalink / raw)
To: Valdis.Kletnieks
Cc: Rob Landley, Ingo Oeser, Embedded Linux mailing list,
linux-kernel, Andrew Morton, H. Peter Anvin, Sam Ravnborg
[-- Attachment #1: Type: text/plain, Size: 579 bytes --]
Valdis.Kletnieks@vt.edu wrote:
> Close, but no cee-gar. cut does something counter-intuitive with multiple
> blanks:
>
> % echo 'a b' | awk '{print $2}'
> b
> % echo 'a b' | cut -d' ' -f2
>
> % echo 'a b' | sed -r 's/[ ]+/ /g' | cut -d' ' -f2
> b
>
> Unfortunately, 'sed -r' isn't in the opengroup.org list of required options,
> and sed 's/ / /g' doesn't DTRT for 3 or more blanks (as it won't recursively
> apply the change to a *new* double blank formed by the previous change).
echo 'a b' | tr -s ' ' | cut -d' ' -f2
b
that is the light way ;-)
Alejandro Mery
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/x-pkcs7-signature, Size: 5013 bytes --]
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 19:03 ` Rob Landley
@ 2009-01-04 20:39 ` H. Peter Anvin
2009-01-05 0:59 ` Rob Landley
0 siblings, 1 reply; 47+ messages in thread
From: H. Peter Anvin @ 2009-01-04 20:39 UTC (permalink / raw)
To: Rob Landley
Cc: Alan Cox, Sam Ravnborg, Embedded Linux mailing list,
linux-kernel, Andrew Morton
Rob Landley wrote:
>
> C) The only calculation which can overflow 64 bits (the ADJ32 one) turns out
> not to need arbitrary precision math, just 72 bits, and if it ever uses more
> than 32 then bottom 32 are all zero before the divide so you can do it in
> three lines.
>
... for the current code (32 bits). When we get an overflow-less 64-bit
implementation, this code will have to be redone, which is not true for
a properly done implementation.
-hpa
--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 12:07 ` Alan Cox
2009-01-04 18:36 ` H. Peter Anvin
@ 2009-01-04 19:03 ` Rob Landley
2009-01-04 20:39 ` H. Peter Anvin
1 sibling, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-01-04 19:03 UTC (permalink / raw)
To: Alan Cox
Cc: H. Peter Anvin, Sam Ravnborg, Embedded Linux mailing list,
linux-kernel, Andrew Morton
On Sunday 04 January 2009 06:07:35 Alan Cox wrote:
> > I note that sed and printf and such are all susv3. I have an explicit
> > test for 32 bit math in the script that cares, and this worked in Red Hat
> > 9 circa 2003.
>
> If you are trying to do arbitary precision maths using standard posix
> tools just use dc. That way the standard is explicit about what you will
> get.
I looked at that, but:
A) the Open Group Base Specifications (which I normally go by, since they're
roughly synonymous with SUSv3 and Posix and available free on the web; they
just released version 7 a week or so back) don't list dc as one of their
utilities. (They mention bc, but not dc.)
B) The busybox implementation of dc is crap. I got 'em to fix the bug where
the output defaulted to binary instead of decimal, but the math is all done as
floating point rather than arbitrary precision, and they don't implement the
<< operator.
C) The only calculation which can overflow 64 bits (the ADJ32 one) turns out
not to need arbitrary precision math, just 72 bits, and if it ever uses more
than 32 then bottom 32 are all zero before the divide so you can do it in
three lines.
Essentially, the ADJ32 calculation is "(($NUMBER-1)<<$SHIFT)/$NUMBER".
$SHIFT maxes out at 51 and the largest interesting $NUMBER is 1000000.
(That's the pathological case of HZ=1, calculating the USEC_TO_HZ direction.
A larger $HZ results in a smaller $SHIFT by the number of bits needed to store
$HZ, by the way, so a $HZ of 17 would have a shift of 47. So even a HZ bigger
than a million should have a small enough $SHIFT not to cause trouble here,
although that's probably an _insane_ input to this script.)
1 million needs 20 bits to store, so the above calculation has to cope with an
intermediate value of 999999<<51 which takes a little over 70 bits to store,
hence the potential to overflow 63 bits of signed math.
But this calculation has two special properties:
1) The number you start with before the shift is divided back out at the end
(more or less), so the _result_ has to be less than 1<<$SHIFT and thus only
takes $SHIFT bits to store. With a maximum $SHIFT of 51 it has to fit in a 64
bit result with about a dozen bits to spare.
2) The bottom $SHIFT many bits are all zero before the divide.
We can use these two properties to easily break the math into chunks that
can't overflow by:
a) Chopping off the bottom X bits and dividing what's left by $NUMBER, keeping
both the dividend and the remainder. Choose any X that's big enough that this
step won't overflow. (I chose X=32, leaving at most 40-ish bits here).
b) Shift that dividend X bits to the left. This can't overflow because of
special property 1 above.
c) Shift the remainder X bits to the left. The remainder can't be larger than
the $NUMBER you started with, so if X+bits($NUMBER)<64 this has to fit too.
With X=32 and bits=20 we again have a dozen bits to spare.
d) Add the results of (b) and (c) together. Since the bottom X bits were all
zero, this is equivalent to having done the full divide. (Easy enough to mask
those bottom bits off and add them to the remainder before the divide if they
weren't, but we didn't need to do that because we know they were zero.)
So no arbitrary precision math is actually required here, and yes there's a
comment in the source about this. :)
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 12:07 ` Alan Cox
@ 2009-01-04 18:36 ` H. Peter Anvin
2009-01-04 19:03 ` Rob Landley
1 sibling, 0 replies; 47+ messages in thread
From: H. Peter Anvin @ 2009-01-04 18:36 UTC (permalink / raw)
To: Alan Cox
Cc: Rob Landley, Sam Ravnborg, Embedded Linux mailing list,
linux-kernel, Andrew Morton
Alan Cox wrote:
>> I note that sed and printf and such are all susv3. I have an explicit test
>> for 32 bit math in the script that cares, and this worked in Red Hat 9 circa
>> 2003.
>
> If you are trying to do arbitary precision maths using standard posix
> tools just use dc. That way the standard is explicit about what you will
> get.
The original patch used bc. Unfortunately, it ran into bc bugs -- on
some platforms like some of akpm's older test machines it would just hang.
-hpa
--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 1:32 ` Rob Landley
2009-01-04 1:35 ` H. Peter Anvin
@ 2009-01-04 12:07 ` Alan Cox
2009-01-04 18:36 ` H. Peter Anvin
2009-01-04 19:03 ` Rob Landley
1 sibling, 2 replies; 47+ messages in thread
From: Alan Cox @ 2009-01-04 12:07 UTC (permalink / raw)
To: Rob Landley
Cc: H. Peter Anvin, Sam Ravnborg, Embedded Linux mailing list,
linux-kernel, Andrew Morton
> I note that sed and printf and such are all susv3. I have an explicit test
> for 32 bit math in the script that cares, and this worked in Red Hat 9 circa
> 2003.
If you are trying to do arbitary precision maths using standard posix
tools just use dc. That way the standard is explicit about what you will
get.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 1:36 ` Rob Landley
2009-01-04 5:07 ` Valdis.Kletnieks
@ 2009-01-04 7:15 ` Michal Jaegermann
1 sibling, 0 replies; 47+ messages in thread
From: Michal Jaegermann @ 2009-01-04 7:15 UTC (permalink / raw)
To: Rob Landley
Cc: Ingo Oeser, Embedded Linux mailing list, linux-kernel,
Andrew Morton, H. Peter Anvin, Sam Ravnborg
On Sat, Jan 03, 2009 at 07:36:04PM -0600, Rob Landley wrote:
> On Saturday 03 January 2009 06:28:22 Ingo Oeser wrote:
> > > +for i in "MSEC 1000" "USEC 1000000"
> > > +do
> > > + NAME=$(echo $i | awk '{print $1}')
> >
> > cut -d' ' -f1 does the same
> >
> > > + PERIOD=$(echo $i | awk '{print $2}')
> >
> > cut -d' ' -f2 does the same
>
> From a standards perspective
> http://www.opengroup.org/onlinepubs/9699919799/utilities/cut.html vs
> http://www.opengroup.org/onlinepubs/9699919799/utilities/awk.html is probably
> a wash, but from a simplicity perspective using the tool that _isn't_ its own
> programming language is probably a win. :)
Vagaries of 'cut' aside you can limit yourself here to just shell:
set_name_period () {
NAME=$1 ; PERIOD=$2
}
for i in "MSEC 1000" "USEC 1000000"
do
set_name_period $i
....
done
or you may skip a shell function and do 'set $i' within a loop plus
assignments of $1 and $2 to NAME and PERIOD but that overwrites original
positional parameters (which may be already not important).
Michał
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 5:07 ` Valdis.Kletnieks
@ 2009-01-04 6:43 ` Rob Landley
2009-01-04 22:13 ` Jamie Lokier
2009-01-04 21:51 ` Alejandro Mery
1 sibling, 1 reply; 47+ messages in thread
From: Rob Landley @ 2009-01-04 6:43 UTC (permalink / raw)
To: Valdis.Kletnieks
Cc: Ingo Oeser, Embedded Linux mailing list, linux-kernel,
Andrew Morton, H. Peter Anvin, Sam Ravnborg
On Saturday 03 January 2009 23:07:55 Valdis.Kletnieks@vt.edu wrote:
> On Sat, 03 Jan 2009 19:36:04 CST, Rob Landley said:
> > On Saturday 03 January 2009 06:28:22 Ingo Oeser wrote:
> > > > +for i in "MSEC 1000" "USEC 1000000"
> > > > +do
> > > > + NAME=$(echo $i | awk '{print $1}')
> > >
> > > cut -d' ' -f1 does the same
> > >
> > > > + PERIOD=$(echo $i | awk '{print $2}')
> > >
> > > cut -d' ' -f2 does the same
>
> Close, but no cee-gar. cut does something counter-intuitive with multiple
> blanks:
Yes, but in this case I'm the one passing in the data so I know there aren't
multiple blanks. (Or tabs instead of spaces.)
In a private email, Bernd Petrovitsch suggested "set -- $i" and then using
NAME=$1; PERIOD=$2. (I keep getting private email responses to these sort of
threads, and then getting dismissed as the only one who cares about the issue.
Less so this time around, but still...) This apparently works all the way
back to the bourne shell. Not worth rolling another patch for, but if I do
wind up rolling another patch for other reasons I might switch over to that.
Both "cut" and "awk" are susv3, though.
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 1:36 ` Rob Landley
@ 2009-01-04 5:07 ` Valdis.Kletnieks
2009-01-04 6:43 ` Rob Landley
2009-01-04 21:51 ` Alejandro Mery
2009-01-04 7:15 ` Michal Jaegermann
1 sibling, 2 replies; 47+ messages in thread
From: Valdis.Kletnieks @ 2009-01-04 5:07 UTC (permalink / raw)
To: Rob Landley
Cc: Ingo Oeser, Embedded Linux mailing list, linux-kernel,
Andrew Morton, H. Peter Anvin, Sam Ravnborg
[-- Attachment #1: Type: text/plain, Size: 769 bytes --]
On Sat, 03 Jan 2009 19:36:04 CST, Rob Landley said:
> On Saturday 03 January 2009 06:28:22 Ingo Oeser wrote:
> > > +for i in "MSEC 1000" "USEC 1000000"
> > > +do
> > > + NAME=$(echo $i | awk '{print $1}')
> >
> > cut -d' ' -f1 does the same
> >
> > > + PERIOD=$(echo $i | awk '{print $2}')
> >
> > cut -d' ' -f2 does the same
Close, but no cee-gar. cut does something counter-intuitive with multiple
blanks:
% echo 'a b' | awk '{print $2}'
b
% echo 'a b' | cut -d' ' -f2
% echo 'a b' | sed -r 's/[ ]+/ /g' | cut -d' ' -f2
b
Unfortunately, 'sed -r' isn't in the opengroup.org list of required options,
and sed 's/ / /g' doesn't DTRT for 3 or more blanks (as it won't recursively
apply the change to a *new* double blank formed by the previous change).
[-- Attachment #2: Type: application/pgp-signature, Size: 226 bytes --]
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-03 12:28 ` Ingo Oeser
@ 2009-01-04 1:36 ` Rob Landley
2009-01-04 5:07 ` Valdis.Kletnieks
2009-01-04 7:15 ` Michal Jaegermann
0 siblings, 2 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-04 1:36 UTC (permalink / raw)
To: Ingo Oeser
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
On Saturday 03 January 2009 06:28:22 Ingo Oeser wrote:
> > +for i in "MSEC 1000" "USEC 1000000"
> > +do
> > + NAME=$(echo $i | awk '{print $1}')
>
> cut -d' ' -f1 does the same
>
> > + PERIOD=$(echo $i | awk '{print $2}')
>
> cut -d' ' -f2 does the same
>From a standards perspective
http://www.opengroup.org/onlinepubs/9699919799/utilities/cut.html vs
http://www.opengroup.org/onlinepubs/9699919799/utilities/awk.html is probably
a wash, but from a simplicity perspective using the tool that _isn't_ its own
programming language is probably a win. :)
I made the change in the second round of patches I just posted.
Thanks,
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-04 1:32 ` Rob Landley
@ 2009-01-04 1:35 ` H. Peter Anvin
2009-01-04 12:07 ` Alan Cox
1 sibling, 0 replies; 47+ messages in thread
From: H. Peter Anvin @ 2009-01-04 1:35 UTC (permalink / raw)
To: Rob Landley
Cc: Sam Ravnborg, Embedded Linux mailing list, linux-kernel, Andrew Morton
Rob Landley wrote:
>
> I consider this a step up from code with an implicit dependency on a CPAN
> library.
>
There is no CPAN library in use. Math::BigInt is a standard part of
Perl, and the canned values is there only to support extremely old
versions of Perl, or weird system configurations, as a
belt-and-suspenders measure.
-hpa
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 19:33 ` H. Peter Anvin
@ 2009-01-04 1:32 ` Rob Landley
2009-01-04 1:35 ` H. Peter Anvin
2009-01-04 12:07 ` Alan Cox
0 siblings, 2 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-04 1:32 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Sam Ravnborg, Embedded Linux mailing list, linux-kernel, Andrew Morton
On Friday 02 January 2009 13:33:02 H. Peter Anvin wrote:
> Rob Landley wrote:
> > You mean "The new shell script is much simpler, about 1/4 the size, runs
> > on Red Hat 9 from 2003, and isn't perl?" :)
>
> And introduces unclear environment dependencies depending on how
> external utilities are implemented.
I note that sed and printf and such are all susv3. I have an explicit test
for 32 bit math in the script that cares, and this worked in Red Hat 9 circa
2003.
I consider this a step up from code with an implicit dependency on a CPAN
library.
> The whole point of why that script was written in Perl was to have
> access to arbitrary-precision arithmetic -- after it was shown that bc
> would simply lock up on some systems.
A) I'm not using bc.
B) You don't need arbitrary precision arithmetic, you need around 72 bits
worth of arithmetic for the pathological case.
C) Your definition of "access to arbitrary-precision arithmetic" includes the
following, cut and paste verbatim from your old script:
# 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,
]
);
Plus a decent chunk of the remaining logic was code to regenerate that table,
and to figure out when to use the table and when to compute new values. (And
erroring out if the system wasn't capable of doing so.) I don't understand
why you didn't just precompute the actual header file output instead or
precomputing perl source, but that's a side issue.
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 8:13 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 9:04 ` Sam Ravnborg
@ 2009-01-03 12:28 ` Ingo Oeser
2009-01-04 1:36 ` Rob Landley
2009-01-05 0:41 ` Ray Lee
2 siblings, 1 reply; 47+ messages in thread
From: Ingo Oeser @ 2009-01-03 12:28 UTC (permalink / raw)
To: Rob Landley
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton,
H. Peter Anvin, Sam Ravnborg
Hi Robert,
I fully support your argument here: Requiring lots of hacks in various languages
to build a system core sucks. But now sth. more productive:
On Friday 02 January 2009, Rob Landley wrote:
> 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}')
cut -d' ' -f1 does the same
> + PERIOD=$(echo $i | awk '{print $2}')
cut -d' ' -f2 does the same
Best Regards
Ingo Oeser
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 12:00 ` Rob Landley
2009-01-02 19:33 ` H. Peter Anvin
@ 2009-01-03 6:28 ` Harvey Harrison
1 sibling, 0 replies; 47+ messages in thread
From: Harvey Harrison @ 2009-01-03 6:28 UTC (permalink / raw)
To: Rob Landley
Cc: Sam Ravnborg, Embedded Linux mailing list, linux-kernel,
Andrew Morton, H. Peter Anvin
On Fri, 2009-01-02 at 06:00 -0600, Rob Landley wrote:
> On Friday 02 January 2009 03:04:39 Sam Ravnborg wrote:
> > > +# 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
> >
> > Please use __KERNEL_TIMECONST_H. The two underscores are standard.
>
> Sure thing. (I was just copying the perl there, I'll post an updated patch
> after I get some sleep.)
In the x86 discussions recently regarding header guards, I though a single
underscore was eventually decided on as 'standard'.
Harvey
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 12:00 ` Rob Landley
@ 2009-01-02 19:33 ` H. Peter Anvin
2009-01-04 1:32 ` Rob Landley
2009-01-03 6:28 ` Harvey Harrison
1 sibling, 1 reply; 47+ messages in thread
From: H. Peter Anvin @ 2009-01-02 19:33 UTC (permalink / raw)
To: Rob Landley
Cc: Sam Ravnborg, Embedded Linux mailing list, linux-kernel, Andrew Morton
Rob Landley wrote:
>
> You mean "The new shell script is much simpler, about 1/4 the size, runs on
> Red Hat 9 from 2003, and isn't perl?" :)
>
And introduces unclear environment dependencies depending on how
external utilities are implemented.
The whole point of why that script was written in Perl was to have
access to arbitrary-precision arithmetic -- after it was shown that bc
would simply lock up on some systems.
-hpa
--
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel. I don't speak on their behalf.
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 9:04 ` Sam Ravnborg
@ 2009-01-02 12:00 ` Rob Landley
2009-01-02 19:33 ` H. Peter Anvin
2009-01-03 6:28 ` Harvey Harrison
0 siblings, 2 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-02 12:00 UTC (permalink / raw)
To: Sam Ravnborg
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton, H. Peter Anvin
On Friday 02 January 2009 03:04:39 Sam Ravnborg wrote:
> Hi Rob.
>
> On Fri, Jan 02, 2009 at 02:13:30AM -0600, Rob Landley wrote:
> > 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.
>
> This part of the changelog is OK except that is fails to
> address why we want to get away from perl.
You mean "The new shell script is much simpler, about 1/4 the size, runs on
Red Hat 9 from 2003, and isn't perl?" :)
> Please drop the remining part of the changelog (but not the s-o-b).
ok.
> > 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)
>
> OK
>
> > --- /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
>
> That usage is useless. Either extend it or spend a few lines
> in the shell script explainign what the shell script is supposed to do.
Do you mean something more like:
echo "Usage: timeconst.sh HZ"
echo
echo "Generates a header file of constants for converting between decimal"
echo "HZ timer ticks and milisecond or microsecond delays"
I'm happy turning it into a comment instead, I just found a quick check that
I'd remembered to type an argument useful during debugging. :)
> > +
> > +HZ=$1
> > +
> > +# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit
> > math. +
> > +[ $((1<<32)) -lt 0 ] && exit 1
> > +
>
> If it fails then add an error message explaining why. So if we get reports
> that this fails then we at least can see something like:
> "timeconst noticed that the shell did not support 64 bit math - stop"
Ok.
> > +# 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
>
> Please use __KERNEL_TIMECONST_H. The two underscores are standard.
Sure thing. (I was just copying the perl there, I'll post an updated patch
after I get some sleep.)
> > +
> > +#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
>
> Is it a shell limitation that all spaces around operators are missing?
> Makes it hard to read..
No, I was just trying to make sure I didn't go over the 80 char limit.
(Several temporary variables are there primarily because the style guide says
indentation should be via 8 space tabs.)
I'll add some more spaces on the respin.
>
> You should use trap in your shell script so we do not end up with a
> partially generated file.
> Or you should change the rule in the Makefile to use
> a temperary file and then rename it.
>
> We have similar bugs in other places - but no need to add
> in more places.
Well, preserve in this case. :)
I can add an "EXIT" trap and then disarm it later, but the output is
redirected in the makefile, so generating an error won't remove the output if
you run again. Perhaps the file to create should be fed in as a second
argument to the script, so the trap can "rm" the output file if it triggers?
I'll poke at it in the morning.
Thanks for the feedback,
Rob
^ permalink raw reply [flat|nested] 47+ messages in thread
* Re: [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 8:13 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
@ 2009-01-02 9:04 ` Sam Ravnborg
2009-01-02 12:00 ` Rob Landley
2009-01-03 12:28 ` Ingo Oeser
2009-01-05 0:41 ` Ray Lee
2 siblings, 1 reply; 47+ messages in thread
From: Sam Ravnborg @ 2009-01-02 9:04 UTC (permalink / raw)
To: Rob Landley
Cc: Embedded Linux mailing list, linux-kernel, Andrew Morton, H. Peter Anvin
Hi Rob.
On Fri, Jan 02, 2009 at 02:13:30AM -0600, Rob Landley wrote:
> 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.
This part of the changelog is OK except that is fails to
address why we want to get away from perl.
Please drop the remining part of the changelog (but not the s-o-b).
> 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)
OK
> --- /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
That usage is useless. Either extend it or spend a few lines
in the shell script explainign what the shell script is supposed to do.
> +
> +HZ=$1
> +
> +# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.
> +
> +[ $((1<<32)) -lt 0 ] && exit 1
> +
If it fails then add an error message explaining why. So if we get reports that this
fails then we at least can see something like:
"timeconst noticed that the shell did not support 64 bit math - stop"
> +# 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
Please use __KERNEL_TIMECONST_H. The two underscores are standard.
> +
> +#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
Is it a shell limitation that all spaces around operators are missing?
Makes it hard to read..
You should use trap in your shell script so we do not end up with a
partially generated file.
Or you should change the rule in the Makefile to use
a temperary file and then rename it.
We have similar bugs in other places - but no need to add
in more places.
Sam
^ permalink raw reply [flat|nested] 47+ messages in thread
* [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh
2009-01-02 8:07 PATCH [0/3]: Simplify the kernel build by removing perl Rob Landley
@ 2009-01-02 8:13 ` Rob Landley
2009-01-02 9:04 ` Sam Ravnborg
` (2 more replies)
0 siblings, 3 replies; 47+ messages in thread
From: Rob Landley @ 2009-01-02 8:13 UTC (permalink / raw)
To: Embedded Linux mailing list
Cc: linux-kernel, Andrew Morton, H. Peter Anvin, Sam Ravnborg
From: Rob Landley <rob@landley.net>
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¥
^ permalink raw reply [flat|nested] 47+ messages in thread
end of thread, other threads:[~2009-12-12 0:49 UTC | newest]
Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-12-09 15:45 ` Michal Marek
2009-12-09 23:40 ` Rob Landley
2009-12-09 23:45 ` H. Peter Anvin
2009-12-10 1:50 ` Rob Landley
2009-12-10 1:53 ` H. Peter Anvin
2009-12-10 13:52 ` Michal Marek
2009-12-10 23:16 ` Rob Landley
2009-12-11 15:31 ` Michal Marek
2009-12-11 19:13 ` H. Peter Anvin
2009-12-12 0:49 ` Rob Landley
2009-12-08 9:21 ` [PATCH 2/3] Remove perl from make headers_install Rob Landley
2009-12-08 9:22 ` [PATCH 3/3] Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh Rob Landley
2009-12-08 10:23 ` [PATCH 0/3] clean out Perl from build system Michal Marek
2009-12-08 15:08 ` Rob Landley
-- strict thread matches above, loose matches on Subject: below --
2009-09-19 1:25 [PATCH 0/3] Perl removal patches for 2.6.31 Rob Landley
2009-09-19 1:33 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 8:07 PATCH [0/3]: Simplify the kernel build by removing perl Rob Landley
2009-01-02 8:13 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 9:04 ` Sam Ravnborg
2009-01-02 12:00 ` Rob Landley
2009-01-02 19:33 ` H. Peter Anvin
2009-01-04 1:32 ` Rob Landley
2009-01-04 1:35 ` H. Peter Anvin
2009-01-04 12:07 ` Alan Cox
2009-01-04 18:36 ` H. Peter Anvin
2009-01-04 19:03 ` Rob Landley
2009-01-04 20:39 ` H. Peter Anvin
2009-01-05 0:59 ` Rob Landley
2009-01-03 6:28 ` Harvey Harrison
2009-01-03 12:28 ` Ingo Oeser
2009-01-04 1:36 ` Rob Landley
2009-01-04 5:07 ` Valdis.Kletnieks
2009-01-04 6:43 ` Rob Landley
2009-01-04 22:13 ` Jamie Lokier
2009-01-05 0:15 ` Bernd Petrovitsch
2009-01-05 2:23 ` Jamie Lokier
2009-01-05 10:46 ` Bernd Petrovitsch
2009-01-05 15:01 ` Jamie Lokier
2009-01-05 16:18 ` Bernd Petrovitsch
2009-01-06 0:06 ` Rob Landley
2009-01-05 21:07 ` Rob Landley
2009-01-05 4:50 ` Rob Landley
2009-01-05 12:29 ` Bernd Petrovitsch
2009-01-04 21:51 ` Alejandro Mery
2009-01-04 7:15 ` Michal Jaegermann
2009-01-05 0:41 ` Ray Lee
2009-01-05 5:08 ` Rob Landley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).