U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Andre Przywara <andre.przywara@arm.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 04/26] SPL: tiny-printf: add "l" modifier
Date: Mon, 19 Dec 2016 01:49:54 +0000	[thread overview]
Message-ID: <1482112216-12983-5-git-send-email-andre.przywara@arm.com> (raw)
In-Reply-To: <1482112216-12983-1-git-send-email-andre.przywara@arm.com>

tiny-printf does not know about the "l" modifier so far, which breaks
the crash dump on AArch64, because it uses %lx to print the registers.
Add an easy way of handling longs correctly.

Using a relatively decent compiler (GCC 5.3.0) this does _not_ increase
the code size of tiny-printf.o for 32-bit builds (where long and int
are actually the same), actually it looses three (ARM Thumb2) instructions
from the actual SPL (numbers for orangepi_plus_defconfig):
  text    data     bss     dec     hex filename
   758       0       0     758     2f6 spl/lib/tiny-printf.o	before
 18839     488     232   19559    4c67 spl/u-boot-spl		before
   758       0       0     758     2f6 spl/lib/tiny-printf.o	after
 18833     488     232   19553    4c61 spl/u-boot-spl		after

This adds some substantial amount of code to a 64-bit build, though:
(taken after a later commit, which enables the ARM64 SPL build for sunxi)
  text    data     bss     dec     hex filename
  1542       0       0    1542     606 spl/lib/tiny-printf.o	before
 25830     392     360   26582    67d6 spl/u-boot-spl		before
  1758       0       0    1758     6de spl/lib/tiny-printf.o	after
 26040     392     360   26792    68a8 spl/u-boot-spl		after

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
 lib/tiny-printf.c | 47 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 30ac759..0b8512f 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -38,8 +38,8 @@ static void out_dgt(struct printf_info *info, char dgt)
 	info->zs = 1;
 }
 
-static void div_out(struct printf_info *info, unsigned int *num,
-		    unsigned int div)
+static void div_out(struct printf_info *info, unsigned long *num,
+		    unsigned long div)
 {
 	unsigned char dgt = 0;
 
@@ -56,9 +56,9 @@ int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 {
 	char ch;
 	char *p;
-	unsigned int num;
+	unsigned long num;
 	char buf[12];
-	unsigned int div;
+	unsigned long div;
 
 	while ((ch = *(fmt++))) {
 		if (ch != '%') {
@@ -66,6 +66,7 @@ int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 		} else {
 			bool lz = false;
 			int width = 0;
+			bool islong = false;
 
 			ch = *(fmt++);
 			if (ch == '0') {
@@ -80,6 +81,11 @@ int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 					ch = *fmt++;
 				}
 			}
+			if (ch == 'l') {
+				ch = *(fmt++);
+				islong = true;
+			}
+
 			info->bf = buf;
 			p = info->bf;
 			info->zs = 0;
@@ -89,24 +95,43 @@ int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 				goto abort;
 			case 'u':
 			case 'd':
-				num = va_arg(va, unsigned int);
-				if (ch == 'd' && (int)num < 0) {
-					num = -(int)num;
-					out(info, '-');
+				div = 1000000000;
+				if (islong) {
+					num = va_arg(va, unsigned long);
+					if (sizeof(long) > 4)
+						div *= div * 10;
+				} else {
+					num = va_arg(va, unsigned int);
+				}
+
+				if (ch == 'd') {
+					if (islong && (long)num < 0) {
+						num = -(long)num;
+						out(info, '-');
+					} else if (!islong && (int)num < 0) {
+						num = -(int)num;
+						out(info, '-');
+					}
 				}
 				if (!num) {
 					out_dgt(info, 0);
 				} else {
-					for (div = 1000000000; div; div /= 10)
+					for (; div; div /= 10)
 						div_out(info, &num, div);
 				}
 				break;
 			case 'x':
-				num = va_arg(va, unsigned int);
+				if (islong) {
+					num = va_arg(va, unsigned long);
+					div = 1UL << (sizeof(long) * 8 - 4);
+				} else {
+					num = va_arg(va, unsigned int);
+					div = 0x10000000;
+				}
 				if (!num) {
 					out_dgt(info, 0);
 				} else {
-					for (div = 0x10000000; div; div /= 0x10)
+					for (; div; div /= 0x10)
 						div_out(info, &num, div);
 				}
 				break;
-- 
2.8.2

  parent reply	other threads:[~2016-12-19  1:49 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-19  1:49 [U-Boot] [PATCH v3 00/26] sunxi: Allwinner A64: SPL support Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 01/26] sun6i: Restrict some register initialization to Allwinner A31 SoC Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 02/26] armv8: prevent using THUMB Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 03/26] armv8: add lowlevel_init.S Andre Przywara
2016-12-26  5:23   ` Simon Glass
2016-12-19  1:49 ` Andre Przywara [this message]
2016-12-19  1:49 ` [U-Boot] [PATCH v3 05/26] SPL: tiny-printf: ignore "-" modifier Andre Przywara
2016-12-26  5:23   ` Simon Glass
2016-12-19  1:49 ` [U-Boot] [PATCH v3 06/26] move UL() macro from armv8/mmu.h into common.h Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 07/26] SPL: make struct spl_image 64-bit safe Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 08/26] armv8: add simple sdelay implementation Andre Przywara
2016-12-19  1:49 ` [U-Boot] [PATCH v3 09/26] armv8: move reset branch into boot hook Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 10/26] ARM: boot0 hook: remove macro, include whole header file Andre Przywara
2016-12-30 20:41   ` Steve Rae
2016-12-19  1:50 ` [U-Boot] [PATCH v3 11/26] sunxi: introduce extra config option for boot0 header Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 12/26] sunxi: A64: do an RMR switch if started in AArch32 mode Andre Przywara
2016-12-19  9:43   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 13/26] sunxi: provide default DRAM config for sun50i in Kconfig Andre Przywara
2016-12-19  9:43   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 14/26] sunxi: H3: Rework MBUS priority setup Andre Przywara
2016-12-19  9:44   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 15/26] sunxi: H3: add and rename some DRAM contoller registers Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 16/26] sunxi: H3: add DRAM controller single bit delay support Andre Przywara
2016-12-19  9:57   ` Maxime Ripard
2016-12-19 10:53     ` Andre Przywara
2016-12-20 13:48       ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 17/26] sunxi: clocks: Use the correct pattern register for PLL11 Andre Przywara
2016-12-19  9:58   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 18/26] sunxi: A64: use H3 DRAM initialization code for A64 as well Andre Przywara
2016-12-19 10:00   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 19/26] sunxi: H3/A64: fix non-ODT setting Andre Przywara
2016-12-19 10:01   ` Maxime Ripard
2016-12-19 10:33     ` Andre Przywara
2016-12-19 14:32       ` Jens Kuske
2016-12-20 10:49         ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 20/26] sunxi: DRAM: fix H3 DRAM size display on aarch64 Andre Przywara
2016-12-19 10:01   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 21/26] sunxi: A64: enable SPL Andre Przywara
2016-12-19 10:01   ` Maxime Ripard
2016-12-26  5:23     ` Simon Glass
2016-12-19  1:50 ` [U-Boot] [PATCH v3 22/26] SPL: read and store arch property from U-Boot image Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 23/26] Makefile: use "arm64" architecture for U-Boot image files Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 24/26] ARM: SPL/FIT: differentiate between arm and arm64 arch properties Andre Przywara
2016-12-19  1:50 ` [U-Boot] [PATCH v3 25/26] sunxi: introduce RMR switch to enter payloads in 64-bit mode Andre Przywara
2016-12-19 10:03   ` Maxime Ripard
2016-12-19  1:50 ` [U-Boot] [PATCH v3 26/26] sunxi: A64: add 32-bit SPL support Andre Przywara
2016-12-19 10:05   ` Maxime Ripard
2017-01-01 19:02 ` [U-Boot] [PATCH v3 00/26] sunxi: Allwinner A64: " Jagan Teki

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=1482112216-12983-5-git-send-email-andre.przywara@arm.com \
    --to=andre.przywara@arm.com \
    --cc=u-boot@lists.denx.de \
    /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