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--