[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20191029210250.17007-1-e5ten.arch@gmail.com>
Date: Tue, 29 Oct 2019 17:02:44 -0400
From: Ethan Sommer <e5ten.arch@...il.com>
To: unlisted-recipients:; (no To-header on input)
Cc: "H . Peter Anvin" <hpa@...or.com>,
Ethan Sommer <e5ten.arch@...il.com>,
Jonathan Corbet <corbet@....net>,
Federico Vaga <federico.vaga@...a.pv.it>,
"Chang S. Bae" <chang.seok.bae@...el.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Arnd Bergmann <arnd@...db.de>,
Masahiro Yamada <yamada.masahiro@...ionext.com>,
Kieran Bingham <kieran.bingham@...asonboard.com>,
Ingo Molnar <mingo@...nel.org>, Borislav Petkov <bp@...e.de>,
Mark Rutland <mark.rutland@....com>,
John Stultz <john.stultz@...aro.org>,
Kees Cook <keescook@...omium.org>,
Corey Minyard <cminyard@...sta.com>,
Thomas Gleixner <tglx@...utronix.de>,
linux-doc@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: [PATCH v3] replace timeconst bc script with an sh script
removes the bc build dependency introduced when timeconst.pl was
replaced by timeconst.bc:
commit 70730bca1331 ("kernel: Replace timeconst.pl with a bc script")
the reason for this change is that this is the only use of bc in the
actual compilation of the kernel, so by replacing it with a shell script
compiling the kernel no longer depends on bc.
Signed-off-by: Ethan Sommer <e5ten.arch@...il.com>
---
Documentation/process/changes.rst | 6 --
Kbuild | 4 +-
kernel/time/timeconst.bc | 117 ------------------------------
kernel/time/timeconst.sh | 111 ++++++++++++++++++++++++++++
4 files changed, 113 insertions(+), 125 deletions(-)
delete mode 100644 kernel/time/timeconst.bc
create mode 100644 kernel/time/timeconst.sh
diff --git a/Documentation/process/changes.rst b/Documentation/process/changes.rst
index 2284f2221f02..3ae168387109 100644
--- a/Documentation/process/changes.rst
+++ b/Documentation/process/changes.rst
@@ -105,12 +105,6 @@ Perl
You will need perl 5 and the following modules: ``Getopt::Long``,
``Getopt::Std``, ``File::Basename``, and ``File::Find`` to build the kernel.
-BC
---
-
-You will need bc to build kernels 3.10 and higher
-
-
OpenSSL
-------
diff --git a/Kbuild b/Kbuild
index 3109ac786e76..7eba24cbdb78 100644
--- a/Kbuild
+++ b/Kbuild
@@ -18,9 +18,9 @@ $(bounds-file): kernel/bounds.s FORCE
timeconst-file := include/generated/timeconst.h
-filechk_gentimeconst = echo $(CONFIG_HZ) | bc -q $<
+filechk_gentimeconst = $(CONFIG_SHELL) $< $(CONFIG_HZ)
-$(timeconst-file): kernel/time/timeconst.bc FORCE
+$(timeconst-file): kernel/time/timeconst.sh FORCE
$(call filechk,gentimeconst)
#####
diff --git a/kernel/time/timeconst.bc b/kernel/time/timeconst.bc
deleted file mode 100644
index 7ed0e0fb5831..000000000000
--- a/kernel/time/timeconst.bc
+++ /dev/null
@@ -1,117 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-scale=0
-
-define gcd(a,b) {
- auto t;
- while (b) {
- t = b;
- b = a % b;
- a = t;
- }
- return a;
-}
-
-/* Division by reciprocal multiplication. */
-define fmul(b,n,d) {
- return (2^b*n+d-1)/d;
-}
-
-/* Adjustment factor when a ceiling value is used. Use as:
- (imul * n) + (fmulxx * n + fadjxx) >> xx) */
-define fadj(b,n,d) {
- auto v;
- d = d/gcd(n,d);
- v = 2^b*(d-1)/d;
- return v;
-}
-
-/* Compute the appropriate mul/adj values as well as a shift count,
- which brings the mul value into the range 2^b-1 <= x < 2^b. Such
- a shift value will be correct in the signed integer range and off
- by at most one in the upper half of the unsigned range. */
-define fmuls(b,n,d) {
- auto s, m;
- for (s = 0; 1; s++) {
- m = fmul(s,n,d);
- if (m >= 2^(b-1))
- return s;
- }
- return 0;
-}
-
-define timeconst(hz) {
- print "/* Automatically generated by kernel/time/timeconst.bc */\n"
- print "/* Time conversion constants for HZ == ", hz, " */\n"
- print "\n"
-
- print "#ifndef KERNEL_TIMECONST_H\n"
- print "#define KERNEL_TIMECONST_H\n\n"
-
- print "#include <linux/param.h>\n"
- print "#include <linux/types.h>\n\n"
-
- print "#if HZ != ", hz, "\n"
- print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n"
- print "#endif\n\n"
-
- if (hz < 2) {
- print "#error Totally bogus HZ value!\n"
- } else {
- s=fmuls(32,1000,hz)
- obase=16
- print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
- print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
- obase=10
- print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
-
- s=fmuls(32,hz,1000)
- obase=16
- print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
- print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
- obase=10
- print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
-
- obase=10
- cd=gcd(hz,1000)
- print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
- print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
- print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
- print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
- print "\n"
-
- s=fmuls(32,1000000,hz)
- obase=16
- print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
- print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
- obase=10
- print "#define HZ_TO_USEC_SHR32\t", s, "\n"
-
- s=fmuls(32,hz,1000000)
- obase=16
- print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
- print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
- obase=10
- print "#define USEC_TO_HZ_SHR32\t", s, "\n"
-
- obase=10
- cd=gcd(hz,1000000)
- print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
- print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
- print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
- print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
-
- cd=gcd(hz,1000000000)
- print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n"
- print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n"
- print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
- print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n"
- print "\n"
-
- print "#endif /* KERNEL_TIMECONST_H */\n"
- }
- halt
-}
-
-hz = read();
-timeconst(hz)
diff --git a/kernel/time/timeconst.sh b/kernel/time/timeconst.sh
new file mode 100644
index 000000000000..d1aa25f46be8
--- /dev/null
+++ b/kernel/time/timeconst.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+if [ -z "$1" ]; then
+ printf '%s <HZ>\n' "$0" >&2
+ exit 1
+fi
+
+# 2 to the power of n
+pot() {
+ local i=1 j=0
+ while [ "$((j += 1))" -le "$1" ]; do
+ : "$((i *= 2))"
+ done
+ printf '%u' "${i}"
+}
+
+# Greatest common denominator
+gcd() {
+ local i="$1" j="$2" k
+ while [ "${j}" -ne 0 ]; do
+ k="${j}" j="$((i % j))" i="${k}"
+ done
+ printf '%u' "${i}"
+}
+
+# Division by reciprocal multiplication.
+fmul() {
+ printf '%u' "$((($(pot "$1") * $2 + $3 - 1) / $3))"
+}
+
+# Adjustment factor when a ceiling value is used.
+fadj() {
+ local i
+ i="$(gcd "$2" "$3")"
+ printf '%u' "$(($(pot "$1") * ($3 / i - 1) / ($3 / i)))"
+}
+
+# Compute the appropriate mul/adj values as well as a shift count,
+# which brings the mul value into the range 2^b-1 <= x < 2^b. Such
+# a shift value will be correct in the signed integer range and off
+# by at most one in the upper half of the unsigned range.
+fmuls() {
+ local i=0 j
+ while true; do
+ j="$(fmul "${i}" "$2" "$3")"
+ if [ "${j}" -ge "$(pot "$(($1 - 1))")" ]; then
+ printf '%u' "${i}"
+ return
+ fi
+ : "$((i += 1))"
+ done
+}
+
+printf '/* Automatically generated by kernel/time/timeconst.sh */\n'
+printf '/* Time conversion constants for HZ == %u */\n\n' "$1"
+
+printf '#ifndef KERNEL_TIMECONST_H\n'
+printf '#define KERNEL_TIMECONST_H\n\n'
+
+printf '#include <linux/param.h>\n'
+printf '#include <linux/types.h>\n\n'
+
+printf '#if HZ != %u\n' "$1"
+printf '#error "include/generated/timeconst.h has the wrong HZ value!"\n'
+printf '#endif\n\n'
+
+if [ "$1" -lt 2 ]; then
+ printf '#error Totally bogus HZ value!\n'
+ exit 1
+fi
+
+s="$(fmuls 32 1000 "$1")"
+printf '#define HZ_TO_MSEC_MUL32\tU64_C(0x%X)\n' "$(fmul "${s}" 1000 "$1")"
+printf '#define HZ_TO_MSEC_ADJ32\tU64_C(0x%X)\n' "$(fadj "${s}" 1000 "$1")"
+printf '#define HZ_TO_MSEC_SHR32\t%u\n' "${s}"
+
+s="$(fmuls 32 "$1" 1000)"
+printf '#define MSEC_TO_HZ_MUL32\tU64_C(0x%X)\n' "$(fmul "${s}" "$1" 1000)"
+printf '#define MSEC_TO_HZ_ADJ32\tU64_C(0x%X)\n' "$(fadj "${s}" "$1" 1000)"
+printf '#define MSEC_TO_HZ_SHR32\t%u\n' "${s}"
+
+cd="$(gcd "$1" 1000)"
+printf '#define HZ_TO_MSEC_NUM\t\t%u\n' "$((1000 / cd))"
+printf '#define HZ_TO_MSEC_DEN\t\t%u\n' "$(($1 / cd))"
+printf '#define MSEC_TO_HZ_NUM\t\t%u\n' "$(($1 / cd))"
+printf '#define MSEC_TO_HZ_DEN\t\t%u\n\n' "$((1000 / cd))"
+
+s="$(fmuls 32 1000000 "$1")"
+printf '#define HZ_TO_USEC_MUL32\tU64_C(0x%X)\n' "$(fmul "${s}" 1000000 "$1")"
+printf '#define HZ_TO_USEC_ADJ32\tU64_C(0x%X)\n' "$(fadj "${s}" 1000000 "$1")"
+printf '#define HZ_TO_USEC_SHR32\t%u\n' "${s}"
+
+s="$(fmuls 32 "$1" 1000000)"
+printf '#define USEC_TO_HZ_MUL32\tU64_C(0x%X)\n' "$(fmul "${s}" "$1" 1000000)"
+printf '#define USEC_TO_HZ_ADJ32\tU64_C(0x%X)\n' "$(fadj "${s}" "$1" 1000000)"
+printf '#define USEC_TO_HZ_SHR32\t%u\n' "${s}"
+
+cd="$(gcd "$1" 1000000)"
+printf '#define HZ_TO_USEC_NUM\t\t%u\n' "$((1000000 / cd))"
+printf '#define HZ_TO_USEC_DEN\t\t%u\n' "$(($1 / cd))"
+printf '#define USEC_TO_HZ_NUM\t\t%u\n' "$(($1 / cd))"
+printf '#define USEC_TO_HZ_DEN\t\t%u\n' "$((1000000 / cd))"
+
+cd="$(gcd "$1" 1000000000)"
+printf '#define HZ_TO_NSEC_NUM\t\t%u\n' "$((1000000000 / cd))"
+printf '#define HZ_TO_NSEC_DEN\t\t%u\n' "$(($1 / cd))"
+printf '#define NSEC_TO_HZ_NUM\t\t%u\n' "$(($1 / cd))"
+printf '#define NSEC_TO_HZ_DEN\t\t%u\n' "$((1000000000 / cd))"
+
+printf '\n#endif /* KERNEL_TIMECONST_H */\n'
--
2.23.0
Powered by blists - more mailing lists