Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
705bf680
Commit
705bf680
authored
Jul 25, 2014
by
Dan Handley
Browse files
Merge pull request #174 from soby-mathew:sm/lean_printf_v2
Implement a leaner printf for Trusted Firmware
parents
a1a44177
b79af934
Changes
11
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
705bf680
...
...
@@ -75,6 +75,7 @@ endif
BL_COMMON_SOURCES
:=
common/bl_common.c
\
common/debug.c
\
common/tf_printf.c
\
lib/aarch64/cache_helpers.S
\
lib/aarch64/misc_helpers.S
\
lib/aarch64/xlat_helpers.c
\
...
...
bl1/bl1_main.c
View file @
705bf680
...
...
@@ -35,7 +35,6 @@
#include <debug.h>
#include <platform.h>
#include <platform_def.h>
#include <stdio.h>
#include "bl1_private.h"
/*******************************************************************************
...
...
@@ -130,8 +129,8 @@ void bl1_main(void)
bl1_platform_setup
();
/* Announce our arrival */
printf
(
FIRMWARE_WELCOME_STR
);
printf
(
"%s
\n\r
"
,
build_message
);
tf_
printf
(
FIRMWARE_WELCOME_STR
);
tf_
printf
(
"%s
\n\r
"
,
build_message
);
SET_PARAM_HEAD
(
&
bl2_image_info
,
PARAM_IMAGE_BINARY
,
VERSION_1
,
0
);
SET_PARAM_HEAD
(
&
bl2_ep
,
PARAM_EP
,
VERSION_1
,
0
);
...
...
@@ -150,7 +149,7 @@ void bl1_main(void)
* TODO: print failure to load BL2 but also add a tzwdog timer
* which will reset the system eventually.
*/
printf
(
"Failed to load boot loader stage 2 (BL2) firmware.
\n
"
);
tf_
printf
(
"Failed to load boot loader stage 2 (BL2) firmware.
\n
"
);
panic
();
}
/*
...
...
@@ -165,12 +164,12 @@ void bl1_main(void)
bl1_plat_set_bl2_ep_info
(
&
bl2_image_info
,
&
bl2_ep
);
bl2_ep
.
args
.
arg1
=
(
unsigned
long
)
bl2_tzram_layout
;
printf
(
"Booting trusted firmware boot loader stage 2
\n
"
);
tf_
printf
(
"Booting trusted firmware boot loader stage 2
\n
"
);
#if DEBUG
printf
(
"BL2 address = 0x%llx
\n
"
,
tf_
printf
(
"BL2 address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl2_ep
.
pc
);
printf
(
"BL2 cpsr = 0x%x
\n
"
,
bl2_ep
.
spsr
);
printf
(
"BL2 memory layout address = 0x%llx
\n
"
,
tf_
printf
(
"BL2 cpsr = 0x%x
\n
"
,
bl2_ep
.
spsr
);
tf_
printf
(
"BL2 memory layout address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl2_tzram_layout
);
#endif
bl1_run_bl2
(
&
bl2_ep
);
...
...
@@ -184,13 +183,13 @@ void bl1_main(void)
******************************************************************************/
void
display_boot_progress
(
entry_point_info_t
*
bl31_ep_info
)
{
printf
(
"Booting trusted firmware boot loader stage 3
\n\r
"
);
tf_
printf
(
"Booting trusted firmware boot loader stage 3
\n\r
"
);
#if DEBUG
printf
(
"BL31 address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
pc
);
printf
(
"BL31 cpsr = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
spsr
);
printf
(
"BL31 params address = 0x%llx
\n
"
,
tf_
printf
(
"BL31 address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
pc
);
tf_
printf
(
"BL31 cpsr = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
spsr
);
tf_
printf
(
"BL31 params address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
args
.
arg0
);
printf
(
"BL31 plat params address = 0x%llx
\n
"
,
tf_
printf
(
"BL31 plat params address = 0x%llx
\n
"
,
(
unsigned
long
long
)
bl31_ep_info
->
args
.
arg1
);
#endif
return
;
...
...
bl2/bl2_main.c
View file @
705bf680
...
...
@@ -35,7 +35,6 @@
#include <debug.h>
#include <platform.h>
#include <platform_def.h>
#include <stdio.h>
#include "bl2_private.h"
/*******************************************************************************
...
...
@@ -196,7 +195,7 @@ void bl2_main(void)
/* Perform platform setup in BL2 */
bl2_platform_setup
();
printf
(
"BL2 %s
\n\r
"
,
build_message
);
tf_
printf
(
"BL2 %s
\n\r
"
,
build_message
);
/*
* Load the subsequent bootloader images
...
...
bl31/bl31_main.c
View file @
705bf680
...
...
@@ -34,9 +34,9 @@
#include <bl_common.h>
#include <bl31.h>
#include <context_mgmt.h>
#include <debug.h>
#include <platform.h>
#include <runtime_svc.h>
#include <stdio.h>
#include <string.h>
/*******************************************************************************
...
...
@@ -77,7 +77,7 @@ void bl31_main(void)
/* Perform platform setup in BL1 */
bl31_platform_setup
();
printf
(
"BL31 %s
\n\r
"
,
build_message
);
tf_
printf
(
"BL31 %s
\n\r
"
,
build_message
);
/* Initialise helper libraries */
bl31_lib_init
();
...
...
bl32/tsp/tsp_interrupt.c
View file @
705bf680
...
...
@@ -56,7 +56,7 @@ void tsp_update_sync_fiq_stats(uint32_t type, uint64_t elr_el3)
tsp_stats
[
linear_id
].
sync_fiq_ret_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"TSP: cpu 0x%x sync fiq request from 0x%llx
\n\r
"
,
tf_
printf
(
"TSP: cpu 0x%x sync fiq request from 0x%llx
\n\r
"
,
mpidr
,
elr_el3
);
INFO
(
"cpu 0x%x: %d sync fiq requests, %d sync fiq returns
\n
"
,
mpidr
,
...
...
@@ -100,7 +100,7 @@ int32_t tsp_fiq_handler(void)
/* Update the statistics and print some messages */
tsp_stats
[
linear_id
].
fiq_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"TSP: cpu 0x%x handled fiq %d
\n\r
"
,
tf_
printf
(
"TSP: cpu 0x%x handled fiq %d
\n\r
"
,
mpidr
,
id
);
INFO
(
"cpu 0x%x: %d fiq requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
fiq_count
);
...
...
@@ -116,7 +116,7 @@ int32_t tsp_irq_received(void)
tsp_stats
[
linear_id
].
irq_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"TSP: cpu 0x%x received irq
\n\r
"
,
mpidr
);
tf_
printf
(
"TSP: cpu 0x%x received irq
\n\r
"
,
mpidr
);
INFO
(
"cpu 0x%x: %d irq requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
irq_count
);
spin_unlock
(
&
console_lock
);
...
...
bl32/tsp/tsp_main.c
View file @
705bf680
...
...
@@ -34,7 +34,6 @@
#include <platform.h>
#include <platform_def.h>
#include <spinlock.h>
#include <stdio.h>
#include <tsp.h>
/*******************************************************************************
...
...
@@ -121,7 +120,7 @@ uint64_t tsp_main(void)
tsp_stats
[
linear_id
].
cpu_on_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"TSP %s
\n\r
"
,
build_message
);
tf_
printf
(
"TSP %s
\n\r
"
,
build_message
);
INFO
(
"Total memory base : 0x%x
\n
"
,
(
unsigned
long
)
BL32_TOTAL_BASE
);
INFO
(
"Total memory size : 0x%x bytes
\n
"
,
(
unsigned
long
)(
BL32_TOTAL_LIMIT
-
BL32_TOTAL_BASE
));
...
...
@@ -153,7 +152,7 @@ tsp_args_t *tsp_cpu_on_main(void)
tsp_stats
[
linear_id
].
cpu_on_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"SP: cpu 0x%x turned on
\n\r
"
,
mpidr
);
tf_
printf
(
"SP: cpu 0x%x turned on
\n\r
"
,
mpidr
);
INFO
(
"cpu 0x%x: %d smcs, %d erets %d cpu on requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
smc_count
,
tsp_stats
[
linear_id
].
eret_count
,
...
...
@@ -193,7 +192,7 @@ tsp_args_t *tsp_cpu_off_main(uint64_t arg0,
tsp_stats
[
linear_id
].
cpu_off_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"SP: cpu 0x%x off request
\n\r
"
,
mpidr
);
tf_
printf
(
"SP: cpu 0x%x off request
\n\r
"
,
mpidr
);
INFO
(
"cpu 0x%x: %d smcs, %d erets %d cpu off requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
smc_count
,
tsp_stats
[
linear_id
].
eret_count
,
...
...
@@ -235,7 +234,7 @@ tsp_args_t *tsp_cpu_suspend_main(uint64_t power_state,
tsp_stats
[
linear_id
].
cpu_suspend_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"SP: cpu 0x%x suspend request. power state: 0x%x
\n\r
"
,
tf_
printf
(
"SP: cpu 0x%x suspend request. power state: 0x%x
\n\r
"
,
mpidr
,
power_state
);
INFO
(
"cpu 0x%x: %d smcs, %d erets %d cpu suspend requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
smc_count
,
...
...
@@ -273,7 +272,7 @@ tsp_args_t *tsp_cpu_resume_main(uint64_t suspend_level,
tsp_stats
[
linear_id
].
cpu_resume_count
++
;
spin_lock
(
&
console_lock
);
printf
(
"SP: cpu 0x%x resumed. suspend level %d
\n\r
"
,
tf_
printf
(
"SP: cpu 0x%x resumed. suspend level %d
\n\r
"
,
mpidr
,
suspend_level
);
INFO
(
"cpu 0x%x: %d smcs, %d erets %d cpu suspend requests
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
smc_count
,
...
...
@@ -312,7 +311,7 @@ tsp_args_t *tsp_smc_handler(uint64_t func,
smc_type
=
((
func
>>
31
)
&
1
)
==
1
?
"fast"
:
"standard"
;
printf
(
"SP: cpu 0x%x received %s smc 0x%x
\n
"
,
read_mpidr
(),
smc_type
,
func
);
tf_
printf
(
"SP: cpu 0x%x received %s smc 0x%x
\n
"
,
read_mpidr
(),
smc_type
,
func
);
INFO
(
"cpu 0x%x: %d smcs, %d erets
\n
"
,
mpidr
,
tsp_stats
[
linear_id
].
smc_count
,
tsp_stats
[
linear_id
].
eret_count
);
...
...
common/bl_common.c
View file @
705bf680
...
...
@@ -148,12 +148,12 @@ static void dump_load_info(unsigned long image_load_addr,
const
meminfo_t
*
mem_layout
)
{
#if DEBUG
printf
(
"Trying to load image at address 0x%lx, size = 0x%lx
\r\n
"
,
tf_
printf
(
"Trying to load image at address 0x%lx, size = 0x%lx
\r\n
"
,
image_load_addr
,
image_size
);
printf
(
"Current memory layout:
\r\n
"
);
printf
(
" total region = [0x%lx, 0x%lx]
\r\n
"
,
mem_layout
->
total_base
,
tf_
printf
(
"Current memory layout:
\r\n
"
);
tf_
printf
(
" total region = [0x%lx, 0x%lx]
\r\n
"
,
mem_layout
->
total_base
,
mem_layout
->
total_base
+
mem_layout
->
total_size
);
printf
(
" free region = [0x%lx, 0x%lx]
\r\n
"
,
mem_layout
->
free_base
,
tf_
printf
(
" free region = [0x%lx, 0x%lx]
\r\n
"
,
mem_layout
->
free_base
,
mem_layout
->
free_base
+
mem_layout
->
free_size
);
#endif
}
...
...
common/debug.c
View file @
705bf680
...
...
@@ -29,6 +29,7 @@
*/
#include <console.h>
#include <debug.h>
#include <stdarg.h>
#include <stdio.h>
/******************************************************************
...
...
@@ -73,7 +74,7 @@ void print_string_value(char *s, unsigned long *mem)
#if DEBUG
void
__dead2
do_panic
(
const
char
*
file
,
int
line
)
{
printf
(
"PANIC in file: %s line: %d
\n
"
,
file
,
line
);
tf_
printf
(
"PANIC in file: %s line: %d
\n
"
,
file
,
line
);
while
(
1
)
;
}
...
...
@@ -87,7 +88,7 @@ void __dead2 do_panic(void)
/* x30 reports the next eligible instruction whereas we want the
* place where panic() is invoked. Hence decrement by 4.
*/
printf
(
"PANIC in PC location 0x%016X
\n
"
,
pc_reg
-
0x4
);
tf_
printf
(
"PANIC in PC location 0x%016X
\n
"
,
pc_reg
-
0x4
);
while
(
1
)
;
...
...
common/tf_printf.c
0 → 100644
View file @
705bf680
/*
* Copyright (c) 2014, ARM Limited and Contributors. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of ARM nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <debug.h>
#include <stdarg.h>
#include <stdint.h>
/***********************************************************
* The tf_printf implementation for all BL stages
***********************************************************/
static
void
unsigned_num_print
(
unsigned
long
int
unum
,
unsigned
int
radix
)
{
/* Just need enough space to store 64 bit decimal integer */
unsigned
char
num_buf
[
20
];
int
i
=
0
,
rem
;
do
{
rem
=
unum
%
radix
;
if
(
rem
<
0xa
)
num_buf
[
i
++
]
=
'0'
+
rem
;
else
num_buf
[
i
++
]
=
'a'
+
(
rem
-
0xa
);
}
while
(
unum
/=
radix
);
while
(
--
i
>=
0
)
putchar
(
num_buf
[
i
]);
}
static
void
string_print
(
const
char
*
str
)
{
while
(
*
str
)
putchar
(
*
str
++
);
}
/*******************************************************************
* Reduced format print for Trusted firmware.
* The following formats are supported by this print
* %x - 32 bit hexadecimal format
* %llx and %lx -64 bit hexadecimal format
* %s - string format
* %d or %i - signed 32 bit decimal format
* %u - unsigned 32 bit decimal format
* %ld and %lld - signed 64 bit decimal format
* %lu and %llu - unsigned 64 bit decimal format
* Exits on all other formats.
*******************************************************************/
void
tf_printf
(
const
char
*
fmt
,
...)
{
va_list
args
;
int
bit64
;
int64_t
num
;
uint64_t
unum
;
char
*
str
;
va_start
(
args
,
fmt
);
while
(
*
fmt
)
{
bit64
=
0
;
if
(
*
fmt
==
'%'
)
{
fmt
++
;
/* Check the format specifier */
loop:
switch
(
*
fmt
)
{
case
'i'
:
/* Fall through to next one */
case
'd'
:
if
(
bit64
)
num
=
va_arg
(
args
,
int64_t
);
else
num
=
va_arg
(
args
,
int32_t
);
if
(
num
<
0
)
{
putchar
(
'-'
);
unum
=
(
unsigned
long
int
)
-
num
;
}
else
unum
=
(
unsigned
long
int
)
num
;
unsigned_num_print
(
unum
,
10
);
break
;
case
's'
:
str
=
va_arg
(
args
,
char
*
);
string_print
(
str
);
break
;
case
'x'
:
if
(
bit64
)
unum
=
va_arg
(
args
,
uint64_t
);
else
unum
=
va_arg
(
args
,
uint32_t
);
unsigned_num_print
(
unum
,
16
);
break
;
case
'l'
:
bit64
=
1
;
fmt
++
;
goto
loop
;
case
'u'
:
if
(
bit64
)
unum
=
va_arg
(
args
,
uint64_t
);
else
unum
=
va_arg
(
args
,
uint32_t
);
unsigned_num_print
(
unum
,
10
);
break
;
default:
/* Exit on any other format specifier */
goto
exit
;
}
fmt
++
;
continue
;
}
putchar
(
*
fmt
++
);
}
exit:
va_end
(
args
);
}
include/common/debug.h
View file @
705bf680
...
...
@@ -43,14 +43,14 @@
* TODO : add debug levels.
*/
#if DEBUG
#define INFO(...) printf("INFO: " __VA_ARGS__)
#define WARN(...) printf("WARN: " __VA_ARGS__)
#define INFO(...)
tf_
printf("INFO: " __VA_ARGS__)
#define WARN(...)
tf_
printf("WARN: " __VA_ARGS__)
#else
#define INFO(...)
#define WARN(...)
#endif
#define ERROR(...) printf("ERROR: " __VA_ARGS__)
#define ERROR(...)
tf_
printf("ERROR: " __VA_ARGS__)
/* For the moment this Panic function is very basic, Report an error and
...
...
@@ -67,5 +67,7 @@ void __dead2 do_panic(void);
#endif
void
print_string_value
(
char
*
s
,
unsigned
long
*
mem
);
void
tf_printf
(
const
char
*
fmt
,
...);
#endif
/* __DEBUG_H__ */
lib/stdlib/assert.c
View file @
705bf680
...
...
@@ -28,7 +28,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <
stdio
.h>
#include <
debug
.h>
/*
* This is a basic implementation. This could be improved.
...
...
@@ -36,6 +36,6 @@
void
__assert
(
const
char
*
function
,
const
char
*
file
,
unsigned
int
line
,
const
char
*
assertion
)
{
printf
(
"ASSERT: %s <%d> : %s
\n\r
"
,
function
,
line
,
assertion
);
tf_
printf
(
"ASSERT: %s <%d> : %s
\n\r
"
,
function
,
line
,
assertion
);
while
(
1
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment