libc: Adapt to TFTF
Add support for functions used in TFTF but not in TF-A.
Replaced calls to plat_panic_handler with calls to panic, since there is no
implementation of the former in TFTF.
Change-Id: Ic10de2c6e749db97b932cd7ffbb6067b5befe914
Signed-off-by: Ambroise Vincent <ambroise.vincent@arm.com>
diff --git a/lib/libc/printf.c b/lib/libc/printf.c
index 2715a72..60203fb 100644
--- a/lib/libc/printf.c
+++ b/lib/libc/printf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -21,17 +21,36 @@
(((_lcount) == 1) ? va_arg(_args, unsigned long int) : \
va_arg(_args, unsigned int)))
-static int string_print(const char *str)
+static int string_print(const char *str, char padc, int padn)
{
- int count = 0;
+ int i = 0, count = 0;
assert(str != NULL);
+ while (str[i] != '\0')
+ i++;
+
+ if (padn > 0) {
+ while (i < padn) {
+ (void)putchar(padc);
+ count++;
+ padn--;
+ }
+ }
+
for ( ; *str != '\0'; str++) {
(void)putchar(*str);
count++;
}
+ if (padn < 0) {
+ while (i < -padn) {
+ (void)putchar(padc);
+ count++;
+ padn++;
+ }
+ }
+
return count;
}
@@ -41,6 +60,7 @@
/* Just need enough space to store 64 bit decimal integer */
char num_buf[20];
int i = 0, count = 0;
+ int width;
unsigned int rem;
do {
@@ -53,8 +73,10 @@
unum /= radix;
} while (unum > 0U);
+ width = i;
+
if (padn > 0) {
- while (i < padn) {
+ while (width < padn) {
(void)putchar(padc);
count++;
padn--;
@@ -66,11 +88,19 @@
count++;
}
+ if (padn < 0) {
+ while (width < -padn) {
+ (void)putchar(padc);
+ count++;
+ padn++;
+ }
+ }
+
return count;
}
/*******************************************************************
- * Reduced format print for Trusted firmware.
+ * Simplified version of printf() with smaller memory footprint.
* The following type specifiers are supported by this print
* %x - hexadecimal format
* %s - string format
@@ -85,6 +115,8 @@
*
* The following padding specifiers are supported by this print
* %0NN - Left-pad the number with 0s (NN is a decimal number)
+ * %NN - Left-pad the number or string with spaces (NN is a decimal number)
+ * %-NN - Right-pad the number or string with spaces (NN is a decimal number)
*
* The print exits on all other formats specifiers other than valid
* combinations of the above specifiers.
@@ -92,15 +124,18 @@
int vprintf(const char *fmt, va_list args)
{
int l_count;
+ int left;
long long int num;
unsigned long long int unum;
char *str;
- char padc = '\0'; /* Padding character */
+ char padc; /* Padding character */
int padn; /* Number of characters to pad */
int count = 0; /* Number of printed characters */
while (*fmt != '\0') {
l_count = 0;
+ left = 0;
+ padc = '\0';
padn = 0;
if (*fmt == '%') {
@@ -108,6 +143,25 @@
/* Check the format specifier */
loop:
switch (*fmt) {
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ padc = ' ';
+ for (padn = 0; *fmt >= '0' && *fmt <= '9'; fmt++)
+ padn = (padn * 10) + (*fmt - '0');
+ if (left)
+ padn = -padn;
+ goto loop;
+ case '-':
+ left = 1;
+ fmt++;
+ goto loop;
case 'i': /* Fall through to next one */
case 'd':
num = get_num_va_args(args, l_count);
@@ -123,12 +177,12 @@
break;
case 's':
str = va_arg(args, char *);
- count += string_print(str);
+ count += string_print(str, padc, padn);
break;
case 'p':
unum = (uintptr_t)va_arg(args, void *);
if (unum > 0U) {
- count += string_print("0x");
+ count += string_print("0x", padc, 0);
padn -= 2;
}