[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LSU.2.00.1103050436010.4098@sister.anvils>
Date: Sat, 5 Mar 2011 04:42:30 -0800 (PST)
From: Hugh Dickins <hughd@...gle.com>
To: Andrew Morton <akpm@...ux-foundation.org>
cc: Michal Nazarewicz <mina86@...a86.com>,
"Douglas W. Jones" <jones@...uiowa.edu>,
Denis Vlasenko <vda.linux@...glemail.com>,
linux-kernel@...r.kernel.org
Subject: [PATCH mmotm] fix broken bootup on 32-bit
mmotm 2011-03-02-16-52 is utterly broken on 32-bit: panics at boot
with "Couldn't register console driver", and preceding warnings don't
even print their line numbers... which leads to the vsprintf changes.
Comparing the 32-bit version of put_dec() against mod7_put_dec()
in tools/put-dec/put-dec-test.c (ah, it is useful after all!) shows
that someone has decided to invert the ordering of pairs of lines
in the kernel version of the algorithm, making a nonsense of it.
Switch them back, and put in the conditionals from mod7_put_dec()
(absent from mod6_put_dec??): my guess is that less work is better.
My testing has gone no further than booting up, and checking that
the numbers in /proc/partitions come out right (which they didn't
at my first attempt, when I thought just a one-liner was needed).
Signed-off-by: Hugh Dickins <hughd@...gle.com>
---
Diffed to go on the top of mmotm, but can be applied after
lib-vsprintf-optimised-put_dec-function-fix.patch
lib/vsprintf.c | 33 ++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)
--- mmotm/lib/vsprintf.c 2011-03-03 15:43:57.000000000 -0800
+++ linux/lib/vsprintf.c 2011-03-05 03:37:14.000000000 -0800
@@ -310,22 +310,29 @@ char *put_dec(char *buf, unsigned long l
q = 656 * d3 + 7296 * d2 + 5536 * d1 + (n & 0xFFFF);
- q = q / 10000;
buf = put_dec_full4(buf, q % 10000);
+ q = q / 10000;
d1 = q + 7671 * d3 + 9496 * d2 + 6 * d1;
- q = d1 / 10000;
- buf = put_dec_full4(buf, d1 % 10000);
-
- d2 = q + 4749 * d3 + 42 * d2;
- q = d2 / 10000;
- buf = put_dec_full4(buf, d2 % 10000);
-
- d3 = q + 281 * d3;
- q = d3 / 10000;
- buf = put_dec_full4(buf, d3 % 10000);
-
- buf = put_dec_full4(buf, q);
+ if (d1) {
+ buf = put_dec_full4(buf, d1 % 10000);
+ q = d1 / 10000;
+
+ d2 = q + 4749 * d3 + 42 * d2;
+ if (d2) {
+ buf = put_dec_full4(buf, d2 % 10000);
+ q = d2 / 10000;
+
+ d3 = q + 281 * d3;
+ if (d3) {
+ buf = put_dec_full4(buf, d3 % 10000);
+ q = d3 / 10000;
+
+ if (q)
+ buf = put_dec_full4(buf, q);
+ }
+ }
+ }
while (buf[-1] == '0')
--buf;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists