Mercurial > hg > aboriginal
changeset 1337:1bc0c01950ca
Switch to the noperl patches for 2.6.38.
author | Rob Landley <rob@landley.net> |
---|---|
date | Fri, 18 Mar 2011 23:02:13 -0500 |
parents | c7dfe0e54a80 |
children | 7bfb2374802c |
files | sources/patches/linux-2.6.25-rc1-noperl.patch sources/patches/linux-2.6.28-perl2.patch sources/patches/linux-2.6.28-perl3.patch sources/patches/linux-noperl-capflags.patch sources/patches/linux-noperl-headers.patch sources/patches/linux-noperl-timeconst.patch |
diffstat | 6 files changed, 919 insertions(+), 792 deletions(-) [+] |
line wrap: on
line diff
--- a/sources/patches/linux-2.6.25-rc1-noperl.patch Fri Mar 18 19:28:50 2011 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,560 +0,0 @@ -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 -ge $(( 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_TIMECONST_H */" -+) >> $FILENAME || exit 1 -+ -+# Don't rm $FILENAME on exit anymore. -+ -+trap "" EXIT -+ -+exit 0
--- a/sources/patches/linux-2.6.28-perl2.patch Fri Mar 18 19:28:50 2011 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -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.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) ---- linux/scripts/headers_install.pl 2010-08-01 17:11:14.000000000 -0500 -+++ /dev/null 2010-07-26 16:01:48.630190848 -0500 -@@ -1,50 +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) { -- my $tmpfile = "$installdir/$file.tmp"; -- -- open(my $in, '<', "$readdir/$file") -- or die "$readdir/$file: $!\n"; -- open(my $out, '>', $tmpfile) -- or die "$tmpfile: $!\n"; -- while (my $line = <$in>) { -- $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 {$out} "%s", $line; -- } -- close $out; -- close $in; -- -- system $unifdef . " $tmpfile > $installdir/$file"; -- unlink $tmpfile; --} --exit 0;
--- a/sources/patches/linux-2.6.28-perl3.patch Fri Mar 18 19:28:50 2011 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/patches/linux-noperl-capflags.patch Fri Mar 18 23:02:13 2011 -0500 @@ -0,0 +1,149 @@ +X-Mozilla-Status: 0001 +X-Mozilla-Status2: 00000000 +Delivered-To: rob@landley.net +Received: by 10.223.124.142 with SMTP id u14cs100561far; + Sun, 16 Jan 2011 12:00:04 -0800 (PST) +Received: by 10.231.145.68 with SMTP id c4mr3277484ibv.47.1295208003912; + Sun, 16 Jan 2011 12:00:03 -0800 (PST) +Return-Path: <linux-kernel-owner@vger.kernel.org> +Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) + by mx.google.com with ESMTP id u12si9169065ibe.45.2011.01.16.12.00.03; + Sun, 16 Jan 2011 12:00:03 -0800 (PST) +Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; +Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S1753900Ab1APT7y (ORCPT <rfc822;rob@landley.net>); + Sun, 16 Jan 2011 14:59:54 -0500 +Received: from mx2.parallels.com ([64.131.90.16]:40919 "EHLO mx2.parallels.com" + rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP + id S1752978Ab1APT7u (ORCPT <rfc822;linux-kernel@vger.kernel.org>); + Sun, 16 Jan 2011 14:59:50 -0500 +Received: from rr-ah-dc.swsoft.net ([96.31.168.200] helo=mail.parallels.com) + by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) + (Exim 4.72) + (envelope-from <rlandley@parallels.com>) + id 1PeYlF-0007jN-AX; Sun, 16 Jan 2011 14:59:37 -0500 +Received: from [192.168.5.91] (64.134.26.60) by mail.parallels.com + (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.0.702.0; Sun, 16 Jan + 2011 11:59:35 -0800 +Message-ID: <4D334E1E.7090708@parallels.com> +Date: Sun, 16 Jan 2011 13:59:26 -0600 +From: Rob Landley <rlandley@parallels.com> +User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Thunderbird/3.1.7 +MIME-Version: 1.0 +To: <linux-kernel@vger.kernel.org>, <tglx@linuxtronix.de>, + <mingo@redhat.com>, <hpa@zytor.com>, <x86@kernel.org>, + "K. Y. Srinivasan" <ksrinivasan@novell.com>, + Greg Kroah-Hartman <gregkh@suse.de> +Subject: [PATCH] Use sed instead of perl to generate x86/kernel/cpu/capflags.c. +Content-Type: text/plain; charset="ISO-8859-1" +Content-Transfer-Encoding: 7bit +Sender: linux-kernel-owner@vger.kernel.org +Precedence: bulk +List-ID: <linux-kernel.vger.kernel.org> +X-Mailing-List: linux-kernel@vger.kernel.org + +From: Rob Landley <rlandley@parallels.com> + +Generate capflags.c with sed (POSIX 2008) instead of perl. + +Signed-off-by: Rob Landley <rlandley@parallels.com> +--- + +This patch hasn't changed since 2009. + + 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 +-- +To unsubscribe from this list: send the line "unsubscribe linux-kernel" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Please read the FAQ at http://www.tux.org/lkml/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/patches/linux-noperl-headers.patch Fri Mar 18 23:02:13 2011 -0500 @@ -0,0 +1,197 @@ +X-Mozilla-Status: 0001 +X-Mozilla-Status2: 00000000 +Delivered-To: rob@landley.net +Received: by 10.223.124.142 with SMTP id u14cs15891far; + Tue, 18 Jan 2011 06:06:52 -0800 (PST) +Received: by 10.231.11.2 with SMTP id r2mr5976931ibr.174.1295359611366; + Tue, 18 Jan 2011 06:06:51 -0800 (PST) +Return-Path: <linux-kernel-owner@vger.kernel.org> +Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) + by mx.google.com with ESMTP id fm28si4777782vbb.87.2011.01.18.06.06.50; + Tue, 18 Jan 2011 06:06:51 -0800 (PST) +Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; +Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mail=linux-kernel-owner@vger.kernel.org +Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand + id S1751955Ab1AROGm (ORCPT <rfc822;rob@landley.net>); + Tue, 18 Jan 2011 09:06:42 -0500 +Received: from mx2.parallels.com ([64.131.90.16]:45151 "EHLO mx2.parallels.com" + rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP + id S1751229Ab1AROGk (ORCPT <rfc822;linux-kernel@vger.kernel.org>); + Tue, 18 Jan 2011 09:06:40 -0500 +Received: from rr-ah-dc.swsoft.net ([96.31.168.200] helo=mail.parallels.com) + by mx2.parallels.com with esmtps (TLSv1:AES128-SHA:128) + (Exim 4.72) + (envelope-from <rlandley@parallels.com>) + id 1PfCCl-0001Xc-I0; Tue, 18 Jan 2011 09:06:40 -0500 +Received: from [192.168.6.242] (64.134.148.71) by mail.parallels.com + (10.255.249.32) with Microsoft SMTP Server (TLS) id 14.0.702.0; Tue, 18 Jan + 2011 06:06:36 -0800 +Message-ID: <4D359E5C.1070002@parallels.com> +Date: Tue, 18 Jan 2011 08:06:20 -0600 +From: Rob Landley <rlandley@parallels.com> +User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Thunderbird/3.1.7 +MIME-Version: 1.0 +To: Michal Marek <mmarek@suse.cz>, <linux-kernel@vger.kernel.org>, + <linux-kbuild@vger.kernel.org>, Jesper Juhl <jj@chaosbits.net> +Subject: [PATCH] Replace scripts/headers_install.pl with a shell script. +Content-Type: text/plain; charset="ISO-8859-1" +Content-Transfer-Encoding: 7bit +Sender: linux-kernel-owner@vger.kernel.org +Precedence: bulk +List-ID: <linux-kernel.vger.kernel.org> +X-Mailing-List: linux-kernel@vger.kernel.org + +From: Rob Landley <rlandley@parallels.com> + +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. + +Change from last time: better error handling. Split "sed | unifdef" into +two stages with a temp file because dash hasn't got PIPEFAIL. Add check +for exit code, add trap handler to delete output when exiting prematurely. + +Signed-off-by: Rob Landley <rlandley@parallels.com> +--- + + 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.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,42 @@ ++#!/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 ++ ++trap "rm -f $OUTDIR/$i $OUTDIR.sed" EXIT ++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" > "$OUTDIR/$i.sed" || exit 1 ++ scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$i.sed" \ ++ > "$OUTDIR/$i" ++ [ $? -gt 1 ] && exit 1 ++ rm -f "$OUTDIR/$i.sed" ++done ++trap - EXIT +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 +@@ -45,8 +45,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) +@@ -69,7 +69,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) +--- a/scripts/headers_install.pl ++++ /dev/null +@@ -1,57 +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) { +- my $tmpfile = "$installdir/$file.tmp"; +- +- open(my $in, '<', "$readdir/$file") +- or die "$readdir/$file: $!\n"; +- open(my $out, '>', $tmpfile) +- or die "$tmpfile: $!\n"; +- while (my $line = <$in>) { +- $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 {$out} "%s", $line; +- } +- close $out; +- close $in; +- +- system $unifdef . " $tmpfile > $installdir/$file"; +- # unifdef will exit 0 on success, and will exit 1 when the +- # file was processed successfully but no changes were made, +- # so abort only when it's higher than that. +- my $e = $? >> 8; +- if ($e > 1) { +- die "$tmpfile: $!\n"; +- } +- unlink $tmpfile; +-} +-exit 0; +-- +To unsubscribe from this list: send the line "unsubscribe linux-kernel" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html +Please read the FAQ at http://www.tux.org/lkml/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/patches/linux-noperl-timeconst.patch Fri Mar 18 23:02:13 2011 -0500 @@ -0,0 +1,573 @@ +Message-ID: <4D35FEF3.4070001@parallels.com> +Date: Tue, 18 Jan 2011 14:58:27 -0600 +From: Rob Landley <rlandley@parallels.com> +User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101208 Thunderbird/3.1.7 +To: Jesper Juhl <jj@chaosbits.net>, Ingo Molnar <mingo@elte.hu>, "H. Peter + Anvin" <hpa@zytor.com>, Yinghai Lu <yinghai@kernel.org>, Tejun Heo + <tj@kernel.org>, Don Zickus <dzickus@redhat.com>, + <linux-kernel@vger.kernel.org> +Subject: Re: [PATCH] Use sed instead of perl to generate x86/kernel/cpu/capflags.c. +References: <4D334E1E.7090708@parallels.com> <alpine.LNX.2.00.1101162103450.13377@swampdragon.chaosbits.net> <4D335554.7020403@parallels.com> <alpine.LNX.2.00.1101162136360.13377@swampdragon.chaosbits.net> +In-Reply-To: <alpine.LNX.2.00.1101162136360.13377@swampdragon.chaosbits.net> +Content-Type: multipart/mixed; + boundary="------------070402000802050303040701" +MIME-Version: 1.0 + +--------------070402000802050303040701 +Content-Type: text/plain; charset="ISO-8859-1" +Content-Transfer-Encoding: 7bit + + +From: Rob Landley <rlandley@parallels.com> + +Replace perl header file generator with smaller/faster/simpler C version. + +Signed-off-by: Rob Landley <rlandley@parallels.com> +--- + +I ran the attached test script to compare the output of the C program +with the output of the perl version for every HZ from 1 to 5000 to make +sure it was producing the same constants. + + kernel/Makefile | 10 - + kernel/mktimeconst.c | 109 +++++++++++ + kernel/timeconst.pl | 378 ----------------------------------------- + 3 files changed, 115 insertions(+), 382 deletions(-) + +diff --git a/kernel/Makefile b/kernel/Makefile +index 5669f71..ba9ce6d 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -133,8 +133,10 @@ $(obj)/config_data.h: $(obj)/config_data.gz FORCE + + $(obj)/time.o: $(obj)/timeconst.h + +-quiet_cmd_timeconst = TIMEC $@ +- cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@ ++hostprogs-y += mktimeconst ++quiet_cmd_mktimeconst = TIMEC $@ ++ cmd_mktimeconst = $(obj)/mktimeconst $(CONFIG_HZ) $@ || ( rm -f $@ && exit 1 ) ++ + targets += timeconst.h +-$(obj)/timeconst.h: $(src)/timeconst.pl FORCE +- $(call if_changed,timeconst) ++$(obj)/timeconst.h: $(obj)/mktimeconst FORCE ++ $(call if_changed,mktimeconst) +--- /dev/null 2011-01-13 17:00:36.470564274 -0600 ++++ b/kernel/mktimeconst.c 2011-01-16 12:44:04.091168778 -0600 +@@ -0,0 +1,109 @@ ++/* Copyright 2010 Parallels Inc, licensed under GPLv2 */ ++ ++#include <inttypes.h> ++#include <stdio.h> ++#include <stdlib.h> ++ ++int main(int argc, char *argv[]) ++{ ++ uint64_t hz, periods[] = {1000, 1000000}; ++ char *names[] = {"MSEC", "USEC"}; ++ FILE *file; ++ int i, j; ++ ++ if (argc != 3 || (hz = atol(argv[1])) < 1 ++ || !(file = fopen(argv[2], "w"))) ++ { ++ fprintf(stderr, "Usage: mktimeconst HZ FILENAME\n\n"); ++ fprintf(stderr, "Generate a header file with constants to convert between\n"); ++ fprintf(stderr, "decimal HZ timer ticks and milisecond or microsecond delays,\n"); ++ fprintf(stderr, "using reciprocal multiplication to avoid 64 bit division.\n"); ++ exit(1); ++ } ++ ++ fprintf(file, ++ "/* Automatically generated by kernel/mktimeconst */\n" ++ "/* Conversion constants for HZ == %"PRIu64" */\n\n" ++ "#ifndef __KERNEL_TIMECONST_H\n" ++ "#define __KERNEL_TIMECONST_H\n\n" ++ "#include <linux/param.h>\n" ++ "#include <linux/types.h>\n\n" ++ "#if HZ != %"PRIu64"\n" ++ "#error \"kernel/timeconst.h has the wrong HZ value!\"\n" ++ "#endif\n\n", hz, hz); ++ ++ /* Repeat for MSEC and USEC */ ++ ++ for (i = 0; i < 2; i++) { ++ uint64_t gcd, period; ++ ++ /* Find greatest common denominator using Euclid's algorithm. */ ++ ++ gcd = hz; ++ period = periods[i]; ++ while (period) { ++ uint64_t temp = gcd % period; ++ gcd = period; ++ period = temp; ++ } ++ ++ /* Output both directions (HZ_TO_PERIOD and PERIOD_TO_HZ) */ ++ ++ for (j = 0; j < 2; j++) { ++ char name[16]; ++ uint64_t from = j ? periods[i] : hz; ++ uint64_t to = j ? hz : periods[i]; ++ uint64_t mul32 = 0, adj32 = 0, shift = 0; ++ ++ sprintf(name, j ? "%s_TO_HZ" : "HZ_TO_%s", names[i]); ++ ++ /* Figure out what shift value gives 32 significant ++ bits of MUL32 data. (Worst case to=1 from=1000000 ++ uses 52 bits, to<<shift won't overflow 64 bit math.) ++ */ ++ ++ for (;;) { ++ mul32 = ((to << shift) + from - 1) / from; ++ if (mul32 >= (1L<<31)) ++ break; ++ shift++; ++ } ++ ++ /* ADJ32 is is just (((FROM/GCD)-1)<<SHIFT)/(FROM/GCD) ++ but this can overflow 64 bit math (examples, HZ=24 ++ or HZ=122). Worst case scenario uses 32+20+20=72 ++ bits. Workaround: split off bottom 32 bits and ++ reassemble after calculation (32+64=96 bits). */ ++ ++ adj32 = from / gcd; ++ ++ if (shift > 32) { ++ uint64_t upper, lower; ++ ++ upper = (adj32 - 1) << (shift - 32); ++ lower = (upper % adj32) << 32; ++ adj32 = ((upper/adj32) << 32) + (lower/adj32); ++ } else ++ adj32 = ((adj32 - 1) << shift) / adj32; ++ ++ /* Emit the constants into the header file. */ ++ ++ fprintf(file, "#define %s_MUL32\tU64_C(0x%"PRIx64")\n", ++ name, mul32); ++ fprintf(file, "#define %s_ADJ32\tU64_C(0x%"PRIx64")\n", ++ name, adj32); ++ fprintf(file, "#define %s_SHR32\t%"PRIu64"\n", ++ name, shift); ++ fprintf(file, "#define %s_NUM\t\tU64_C(%"PRIu64")\n", ++ name, to/gcd); ++ fprintf(file, "#define %s_DEN\t\tU64_C(%"PRIu64")\n\n", ++ name, from/gcd); ++ } ++ } ++ fprintf(file, "#endif /* __KERNEL_TIMECONST_H */\n"); ++ ++ /* Notice if the disk fills up. */ ++ ++ fflush(stdout); ++ return ferror(stdout); ++} +--- a/kernel/timeconst.pl 2010-12-19 11:33:53.969732934 -0600 ++++ /dev/null 2011-01-13 17:00:36.470564274 -0600 +@@ -1,378 +0,0 @@ +-#!/usr/bin/perl +-# ----------------------------------------------------------------------- +-# +-# Copyright 2007-2008 rPath, Inc. - All Rights Reserved +-# +-# This file is part of the Linux kernel, and is made available under +-# the terms of the GNU General Public License version 2 or (at your +-# option) any later version; incorporated herein by reference. +-# +-# ----------------------------------------------------------------------- +-# +- +-# +-# Usage: timeconst.pl HZ > timeconst.h +-# +- +-# 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; + +--------------070402000802050303040701 +Content-Type: application/x-sh; name="loopy.sh" +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="loopy.sh" + +#!/bin/bash + +gcc mktimeconst.c || exit 1 + +X=1 +while [ $X -lt 5000 ] +do + echo $X + + perl ~/linux/linux/kernel/timeconst.pl $X | sed 's/KERNEL_TIMECONST/__KERNEL_TIMECONST/;/Automatically generated/d;/^$/d'> temp.txt + ./a.out $X temp2.txt + sed -i '/Automatically generated/d;/^$/d' temp2.txt + + diff -uw temp.txt temp2.txt || exit 1 + + X=$(($X+1)) +done + +--------------070402000802050303040701--