From: Michal Marek <mmarek@suse.cz>
To: Rob Landley <rob@landley.net>
Cc: linux-kernel@vger.kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
linux-kbuild@vger.kernel.org
Subject: Re: [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh
Date: Wed, 09 Dec 2009 16:45:37 +0100 [thread overview]
Message-ID: <4B1FC621.8060500@suse.cz> (raw)
In-Reply-To: <200912080319.30679.rob@landley.net>
[CC hpa who wrote the timeconst.pl script]
On 8.12.2009 10:19, Rob Landley wrote:
> From: Rob Landley <rob@landley.net>
>
> Replace kernel/timeconst.pl with kernel/timeconst.sh. The new shell script
> is much simpler, about 1/4 the size, and runs on Red Hat 9 from 2003.
I tried the shell script with the precomputed values in timeconst.pl and
it gave me different results than the perl version for 250 and 1000:
with HZ=250:
--- perl
+++ bash
@@ -8,14 +8,14 @@
#error "kernel/timeconst.h has the wrong HZ value!"
#endif
-#define HZ_TO_MSEC_MUL32 U64_C(0x80000000)
+#define HZ_TO_MSEC_MUL32 U64_C(0x100000000)
#define HZ_TO_MSEC_ADJ32 U64_C(0x0)
-#define HZ_TO_MSEC_SHR32 29
+#define HZ_TO_MSEC_SHR32 30
#define HZ_TO_MSEC_NUM U64_C(4)
#define HZ_TO_MSEC_DEN U64_C(1)
-#define MSEC_TO_HZ_MUL32 U64_C(0x80000000)
-#define MSEC_TO_HZ_ADJ32 U64_C(0x180000000)
-#define MSEC_TO_HZ_SHR32 33
+#define MSEC_TO_HZ_MUL32 U64_C(0x100000000)
+#define MSEC_TO_HZ_ADJ32 U64_C(0x300000000)
+#define MSEC_TO_HZ_SHR32 34
#define MSEC_TO_HZ_NUM U64_C(1)
#define MSEC_TO_HZ_DEN U64_C(4)
#define HZ_TO_USEC_MUL32 U64_C(0xfa000000)
and with HZ=1000:
--- perl
+++ bash
@@ -8,14 +8,14 @@
#error "kernel/timeconst.h has the wrong HZ value!"
#endif
-#define HZ_TO_MSEC_MUL32 U64_C(0x80000000)
+#define HZ_TO_MSEC_MUL32 U64_C(0x100000000)
#define HZ_TO_MSEC_ADJ32 U64_C(0x0)
-#define HZ_TO_MSEC_SHR32 31
+#define HZ_TO_MSEC_SHR32 32
#define HZ_TO_MSEC_NUM U64_C(1)
#define HZ_TO_MSEC_DEN U64_C(1)
-#define MSEC_TO_HZ_MUL32 U64_C(0x80000000)
+#define MSEC_TO_HZ_MUL32 U64_C(0x100000000)
#define MSEC_TO_HZ_ADJ32 U64_C(0x0)
-#define MSEC_TO_HZ_SHR32 31
+#define MSEC_TO_HZ_SHR32 32
#define MSEC_TO_HZ_NUM U64_C(1)
#define MSEC_TO_HZ_DEN U64_C(1)
#define HZ_TO_USEC_MUL32 U64_C(0xfa000000)
$ bash --version
GNU bash, version 4.0.33(1)-release (x86_64-suse-linux-gnu)
...
You're trying to avoid the build dependency on Perl. What about adding a
timeconst.h_shipped with the precomputed values from timeconst.pl:
#if HZ == 24
#define ...
...
#endif
#if HZ == 32
...
#endif
...
#ifndef HZ_TO_MSEC_MUL32
# error "Unknown HZ value, please update kernel/timeconst.h using
kernel/timeconst.pl"
#endif
plus some makefile automagic to run the script iff the HZ value isn't
precomputed. Then you would only need Perl for exotic HZ configurations.
>
> Signed-off-by: Rob Landley <rob@landley.net>
> --
>
> kernel/Makefile | 4
> kernel/timeconst.pl | 378 ------------------------------------------
> kernel/timeconst.sh | 91 ++++++++++
> 3 files changed, 93 insertions(+), 380 deletions(-)
>
> diff -ruN linux-2.6.30/kernel/Makefile linux-2.6.30.new/kernel/Makefile
> --- linux-2.6.30/kernel/Makefile 2009-06-09 22:05:27.000000000 -0500
> +++ linux-2.6.30.new/kernel/Makefile 2009-06-22 14:29:16.000000000 -0500
> @@ -123,7 +123,7 @@
> $(obj)/time.o: $(obj)/timeconst.h
>
> quiet_cmd_timeconst = TIMEC $@
> - cmd_timeconst = $(PERL) $< $(CONFIG_HZ) > $@
> + cmd_timeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ) $@
> targets += timeconst.h
> -$(obj)/timeconst.h: $(src)/timeconst.pl FORCE
> +$(obj)/timeconst.h: $(src)/timeconst.sh FORCE
> $(call if_changed,timeconst)
> diff -ruN linux-2.6.30/kernel/timeconst.pl linux-2.6.30.new/kernel/timeconst.pl
> --- linux-2.6.30/kernel/timeconst.pl 2009-06-09 22:05:27.000000000 -0500
> +++ linux-2.6.30.new/kernel/timeconst.pl 1969-12-31 18:00:00.000000000 -0600
> @@ -1,378 +0,0 @@
> -#!/usr/bin/perl
> -# -----------------------------------------------------------------------
> -#
> -# Copyright 2007-2008 rPath, Inc. - All Rights Reserved
> -#
> -# This file is part of the Linux kernel, and is made available under
> -# the terms of the GNU General Public License version 2 or (at your
> -# option) any later version; incorporated herein by reference.
> -#
> -# -----------------------------------------------------------------------
> -#
> -
> -#
> -# Usage: timeconst.pl HZ > timeconst.h
[snip]
> diff -ruN linux-2.6.30/kernel/timeconst.sh linux-2.6.30.new/kernel/timeconst.sh
> --- linux-2.6.30/kernel/timeconst.sh 1969-12-31 18:00:00.000000000 -0600
> +++ linux-2.6.30.new/kernel/timeconst.sh 2009-06-22 14:29:16.000000000 -0500
> @@ -0,0 +1,148 @@
> +#!/bin/sh
> +
> +if [ $# -ne 2 ]
> +then
> + echo "Usage: timeconst.sh HZ FILENAME"
> + echo
> + echo "Generate a header file with constants for coverting between"
> + echo "decimal HZ timer ticks and milisecond or microsecond delays."
> + echo
> + exit 1
> +fi
> +
> +HZ=$1
> +shift
> +FILENAME=$1
> +
> +# Sanity test: even the shell in Red Hat 9 (circa 2003) supported 64 bit math.
> +
> +if [ $((1 << 32)) -lt 0 ]
> +then
> + echo "timeconst.sh needs a shell with 64 bit math, such as bash,"
> + echo "busybox ash, or dash running on a 64 bit host."
> + exit 1
> +fi
> +
> +# If this script exits for any reason before this trap is removed,
> +# delete the output file so a partial file won't confuse the build.
> +
> +trap "rm $FILENAME" EXIT
> +
> +# Output start of header file
> +
> +cat > $FILENAME << EOF || exit 1
> +/* Automatically generated by kernel/timeconst.sh */
> +/* Conversion constants for HZ == $HZ */
> +
> +#ifndef __KERNEL_TIMECONST_H
> +#define __KERNEL_TIMECONST_H
> +
> +#include <linux/param.h>
> +#include <linux/types.h>
> +
> +#if HZ != $HZ
> +#error "kernel/timeconst.h has the wrong HZ value!"
> +#endif
> +
> +EOF
> +
> +# For both Milliseconds and Microseconds
> +
> +cat << EOF |
> +MSEC 1000
> +USEC 1000000
> +EOF
> +while read NAME PERIOD
> +do
> + # Find greatest common denominator (using Euclid's algorithm)
> +
> + A=$HZ
> + B=$PERIOD
> +
> + while [ $B -ne 0 ]
> + do
> + C=$(( $A % $B ))
> + A=$B
> + B=$C
> + done
> +
> + GCD=$A
> +
> + # Do this for each direction (HZ_TO_PERIOD and PERIOD_TO_HZ)
> +
> + for DIRECTION in 0 1
> + do
> + if [ $DIRECTION -eq 0 ]
> + then
> + CONVERT="HZ_TO_${NAME}"
> + FROM=$HZ
> + TO=$PERIOD
> + else
> + CONVERT="${NAME}_TO_HZ"
> + FROM=$PERIOD
> + TO=$HZ
> + fi
> +
> + # Calculate 32 significant bits of MUL32 data.
> +
> + SHIFT=0
> + while true
> + do
> + # This can't overflow 64 bit math. Pathological case
> + # (TO=1, FROM=1000000) uses around 32+20=52 bits.
> +
> + MUL32=$(( ( ( $TO << $SHIFT ) + $FROM - 1 ) / $FROM ))
> +
> + # Keep increasing $SHIFT until we've got 32 bits.
> +
> + [ $MUL32 -gt $(( 1 << 31 )) ] && break
> + SHIFT=$(( $SHIFT + 1 ))
> + done
> + MUL32=$( printf %x $MUL32 )
> +
> + # ADJ32 is just (((FROM/GCD)-1)<<SHIFT)/(FROM/GCD) but this
> + # can overflow 64 bit math (examples, HZ=24 or HZ=122).
> + # Pathological case could use 32+20+20=72 bits. (And this is
> + # the pathological case because a larger $HZ results in a
> + # smaller $SHIFT, so even insane HZ>USEC cases should be ok.)
> +
> + # To get around this, we chop the bottom 32 bits off the
> + # calculation and then reassemble it to avoid overflow:
> + # 32+64=96, which is > 72.
> +
> + ADJ32=$(( $FROM / $GCD ))
> + if [ $SHIFT -gt 32 ]
> + then
> + UPPER=$(( ( $ADJ32 - 1 ) << ( $SHIFT - 32 ) ))
> + LOWER=$(( ( $UPPER % $ADJ32 ) << 32 ))
> + ADJ32=$(( ( ( $UPPER / $ADJ32 ) << 32 ) + ( $LOWER / $ADJ32 )))
> + else
> + ADJ32=$(( ( ( $ADJ32 - 1 ) << $SHIFT) / $ADJ32 ))
> + fi
> + ADJ32=$( printf %x $ADJ32 )
> +
> + NUM=$(( $TO / $GCD ))
> + DEN=$(( $FROM / $GCD ))
> +
> + # Output next chunk of header data to file
> +
> + (
> + echo "#define ${CONVERT}_MUL32 U64_C(0x$MUL32)" &&
> + echo "#define ${CONVERT}_ADJ32 U64_C(0x$ADJ32)" &&
> + echo "#define ${CONVERT}_SHR32 $SHIFT" &&
> + echo "#define ${CONVERT}_NUM U64_C($NUM)" &&
> + echo "#define ${CONVERT}_DEN U64_C($DEN)"
> + ) >> $FILENAME || exit 1
> + done
> +done
> +
> +(
> + echo
> + echo "#endif /* __KERNEL_TIMECHONST_H */"
^
Should be "__KERNEL_TIMECONST_H".
> +) >> $FILENAME || exit 1
> +
> +# Don't rm $FILENAME on exit anymore.
> +
> +trap "" EXIT
> +
> +exit 0
>
Michal
next prev parent reply other threads:[~2009-12-09 15:46 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-08 9:17 [PATCH 0/3] clean out Perl from build system Rob Landley
2009-12-08 9:19 ` [PATCH 1/3] Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-12-09 15:45 ` Michal Marek [this message]
2009-12-09 23:40 ` Rob Landley
2009-12-09 23:45 ` H. Peter Anvin
2009-12-10 1:50 ` Rob Landley
2009-12-10 1:53 ` H. Peter Anvin
2009-12-10 13:52 ` Michal Marek
2009-12-10 23:16 ` Rob Landley
2009-12-11 15:31 ` Michal Marek
2009-12-11 19:13 ` H. Peter Anvin
2009-12-12 0:49 ` Rob Landley
2009-12-08 9:21 ` [PATCH 2/3] Remove perl from make headers_install Rob Landley
2009-12-08 9:22 ` [PATCH 3/3] Convert kernel/cpu/mkcapflags.pl to kernel/cpu/mkcapflags.sh Rob Landley
2009-12-08 10:23 ` [PATCH 0/3] clean out Perl from build system Michal Marek
2009-12-08 15:08 ` Rob Landley
-- strict thread matches above, loose matches on Subject: below --
2009-09-19 1:25 [PATCH 0/3] Perl removal patches for 2.6.31 Rob Landley
2009-09-19 1:33 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 8:07 PATCH [0/3]: Simplify the kernel build by removing perl Rob Landley
2009-01-02 8:13 ` [PATCH 1/3]: Replace kernel/timeconst.pl with kernel/timeconst.sh Rob Landley
2009-01-02 9:04 ` Sam Ravnborg
2009-01-02 12:00 ` Rob Landley
2009-01-02 19:33 ` H. Peter Anvin
2009-01-04 1:32 ` Rob Landley
2009-01-04 1:35 ` H. Peter Anvin
2009-01-04 12:07 ` Alan Cox
2009-01-04 18:36 ` H. Peter Anvin
2009-01-04 19:03 ` Rob Landley
2009-01-04 20:39 ` H. Peter Anvin
2009-01-05 0:59 ` Rob Landley
2009-01-03 6:28 ` Harvey Harrison
2009-01-03 12:28 ` Ingo Oeser
2009-01-04 1:36 ` Rob Landley
2009-01-04 5:07 ` Valdis.Kletnieks
2009-01-04 6:43 ` Rob Landley
2009-01-04 22:13 ` Jamie Lokier
2009-01-05 0:15 ` Bernd Petrovitsch
2009-01-05 2:23 ` Jamie Lokier
2009-01-05 10:46 ` Bernd Petrovitsch
2009-01-05 15:01 ` Jamie Lokier
2009-01-05 16:18 ` Bernd Petrovitsch
2009-01-06 0:06 ` Rob Landley
2009-01-05 21:07 ` Rob Landley
2009-01-05 4:50 ` Rob Landley
2009-01-05 12:29 ` Bernd Petrovitsch
2009-01-04 21:51 ` Alejandro Mery
2009-01-04 7:15 ` Michal Jaegermann
2009-01-05 0:41 ` Ray Lee
2009-01-05 5:08 ` Rob Landley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B1FC621.8060500@suse.cz \
--to=mmarek@suse.cz \
--cc=hpa@zytor.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rob@landley.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).