From: Andre Przywara <andre.przywara@arm.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 04/23] SPL: tiny-printf: add "l" modifier
Date: Mon, 5 Dec 2016 01:52:11 +0000 [thread overview]
Message-ID: <1480902750-839-5-git-send-email-andre.przywara@arm.com> (raw)
In-Reply-To: <1480902750-839-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. Also there are printfs
using the '-' modifier, which we choose to ignore for simplicity.
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>
---
lib/tiny-printf.c | 50 +++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 39 insertions(+), 11 deletions(-)
diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 30ac759..dfa8432 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,8 +66,12 @@ 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 == '-')
+ ch = *(fmt++);
+
if (ch == '0') {
ch = *(fmt++);
lz = 1;
@@ -80,6 +84,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 +98,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
next prev parent reply other threads:[~2016-12-05 1:52 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-05 1:52 [U-Boot] [PATCH v2 00/23] sunxi: Allwinner A64: SPL support Andre Przywara
2016-12-05 1:52 ` [U-Boot] [PATCH v2 01/23] sun6i: Restrict some register initialization to Allwinner A31 SoC Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 7:17 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 02/23] armv8: prevent using THUMB Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 7:30 ` Maxime Ripard
2016-12-05 21:57 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 03/23] armv8: add lowlevel_init.S Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 2:55 ` André Przywara
2016-12-17 22:46 ` Simon Glass
2016-12-05 21:56 ` Tom Rini
2016-12-06 8:04 ` André Przywara
2016-12-06 12:18 ` Tom Rini
2016-12-05 1:52 ` Andre Przywara [this message]
2016-12-05 6:25 ` [U-Boot] [PATCH v2 04/23] SPL: tiny-printf: add "l" modifier Simon Glass
2016-12-05 8:01 ` Siarhei Siamashka
2016-12-05 1:52 ` [U-Boot] [PATCH v2 05/23] move UL() macro from armv8/mmu.h into common.h Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 06/23] SPL: make struct spl_image 64-bit safe Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 22:04 ` Tom Rini
2016-12-06 10:49 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 07/23] armv8: add simple sdelay implementation Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 08/23] armv8: move reset branch into boot hook Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 13:43 ` Andre Przywara
2016-12-08 22:21 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 09/23] ARM: boot0 hook: remove macro, include whole header file Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-30 20:13 ` Steve Rae
2016-12-05 1:52 ` [U-Boot] [PATCH v2 10/23] sunxi: introduce extra config option for boot0 header Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 15:49 ` Andre Przywara
2016-12-06 10:52 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 11/23] sunxi: A64: do an RMR switch if started in AArch32 mode Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-05 10:41 ` Andre Przywara
2016-12-06 10:56 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 12/23] sunxi: provide default DRAM config for sun50i in Kconfig Andre Przywara
2016-12-05 6:25 ` Simon Glass
2016-12-06 10:56 ` Maxime Ripard
2016-12-06 11:21 ` Andre Przywara
2016-12-12 12:33 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 13/23] sunxi: H3: add and rename some DRAM contoller registers Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 2:30 ` André Przywara
2016-12-06 10:58 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 14/23] sunxi: H3: add DRAM controller single bit delay support Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 7:58 ` Chen-Yu Tsai
2016-12-05 11:28 ` Andre Przywara
2016-12-07 3:48 ` Simon Glass
2016-12-17 2:33 ` André Przywara
2016-12-06 11:02 ` Maxime Ripard
2016-12-05 1:52 ` [U-Boot] [PATCH v2 15/23] sunxi: A64: use H3 DRAM initialization code for A64 Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-16 17:30 ` Andre Przywara
2016-12-17 22:48 ` Simon Glass
2016-12-06 11:20 ` Maxime Ripard
2016-12-06 14:15 ` Andre Przywara
2016-12-12 12:29 ` Maxime Ripard
2016-12-12 16:06 ` Andre Przywara
2016-12-05 1:52 ` [U-Boot] [PATCH v2 16/23] sunxi: H3/A64: fix non-ODT setting Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 17/23] sunxi: DRAM: fix H3 DRAM size display on aarch64 Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 18/23] sunxi: A64: enable SPL Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-16 17:40 ` Andre Przywara
2016-12-17 22:48 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 19/23] SPL: read and store arch property from U-Boot image Andre Przywara
2016-12-05 22:56 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 20/23] Makefile: use "arm64" architecture for U-Boot image files Andre Przywara
2016-12-05 23:11 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 21/23] ARM: SPL/FIT: differentiate between arm and arm64 arch properties Andre Przywara
2016-12-06 0:27 ` Tom Rini
2016-12-05 1:52 ` [U-Boot] [PATCH v2 22/23] sunxi: introduce RMR switch to enter payloads in 64-bit mode Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-05 1:52 ` [U-Boot] [PATCH v2 23/23] sunxi: A64: add 32-bit SPL support Andre Przywara
2016-12-05 6:26 ` Simon Glass
2016-12-17 14:44 ` André Przywara
2016-12-19 8:20 ` Maxime Ripard
2016-12-19 10:26 ` Andre Przywara
2016-12-06 11:28 ` Maxime Ripard
2016-12-06 12:22 ` Andre Przywara
2016-12-12 15:13 ` Maxime Ripard
2016-12-12 16:04 ` Andre Przywara
2016-12-12 16:18 ` Chen-Yu Tsai
2016-12-12 16:32 ` Andre Przywara
2016-12-16 14:52 ` Maxime Ripard
2016-12-16 15:39 ` Andre Przywara
2016-12-19 8:17 ` Maxime Ripard
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=1480902750-839-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.