diff mbox

[U-Boot] Provide more useful debugging when an initcall fails

Message ID 1365863234-22906-1-git-send-email-sjg@chromium.org
State Rejected
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass April 13, 2013, 2:27 p.m. UTC
The debug() which prints out the current call is not very useful, since if
it is called early enough (such as before the console is ready in the
pre-relocation board_init_f() sequence) it can hang the board.

It is more useful to print a message when a call fails, and in this case
the non-relocated symbol address provides a way for the offending function
to be located in System.map.

Adjust the initcall to provide this.

Signed-off-by: Simon Glass <sjg@chromium.org>
---
 lib/initcall.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Wolfgang Denk April 14, 2013, 8:34 a.m. UTC | #1
Dear Simon Glass,

In message <1365863234-22906-1-git-send-email-sjg@chromium.org> you wrote:
> The debug() which prints out the current call is not very useful, since if
> it is called early enough (such as before the console is ready in the
> pre-relocation board_init_f() sequence) it can hang the board.

This should not happen (and if it does, that wouldbe a bug that needs
fixing).

> It is more useful to print a message when a call fails, and in this case
> the non-relocated symbol address provides a way for the offending function
> to be located in System.map.

No.  it is a long styanding rule that for this tyoe of actions the
begin of the message gets printed before even attempting to call the
respective function, so if the systemn hangs you can see the last
operation which was about to be run.  I think we should follow this
principle here, too.

Best regards,

Wolfgang Denk
Simon Glass April 16, 2013, 5:10 a.m. UTC | #2
Hi Wolfgang,

On Sun, Apr 14, 2013 at 1:34 AM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Simon Glass,
>
> In message <1365863234-22906-1-git-send-email-sjg@chromium.org> you wrote:
>> The debug() which prints out the current call is not very useful, since if
>> it is called early enough (such as before the console is ready in the
>> pre-relocation board_init_f() sequence) it can hang the board.
>
> This should not happen (and if it does, that wouldbe a bug that needs
> fixing).

Yes.

>
>> It is more useful to print a message when a call fails, and in this case
>> the non-relocated symbol address provides a way for the offending function
>> to be located in System.map.
>
> No.  it is a long styanding rule that for this tyoe of actions the
> begin of the message gets printed before even attempting to call the
> respective function, so if the systemn hangs you can see the last
> operation which was about to be run.  I think we should follow this
> principle here, too.

OK fair enough, makes sense. I think. It is certainly true that any of
these calls could hang the board.

Let's drop this patch.

>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
> "Love is an ideal thing, marriage a real thing; a  confusion  of  the
> real with the ideal never goes unpunished."                  - Goethe

Regards,
Simon
diff mbox

Patch

diff --git a/lib/initcall.c b/lib/initcall.c
index fc91bf6..ace285d 100644
--- a/lib/initcall.c
+++ b/lib/initcall.c
@@ -23,15 +23,20 @@ 
 #include <common.h>
 #include <initcall.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 int initcall_run_list(init_fnc_t init_sequence[])
 {
 	init_fnc_t *init_fnc_ptr;
 
 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
-		debug("initcall: %p\n", *init_fnc_ptr);
 		if ((*init_fnc_ptr)()) {
+			unsigned long reloc_ofs = 0;
+
+			if (gd->flags & GD_FLG_RELOC)
+				reloc_ofs = gd->reloc_off;
 			debug("initcall sequence %p failed at call %p\n",
-			      init_sequence, *init_fnc_ptr);
+			      init_sequence, (char *)*init_fnc_ptr - reloc_ofs);
 			return -1;
 		}
 	}