[U-Boot-Users] U-Boot hang

Leon KUKOVEC leon.kukovec at ultra.si
Wed Nov 12 11:44:30 CET 2003


Hi everybody,

On Wed, 29 Oct 2003, Wolfgang Denk wrote:

> > Is there any limits with regards to U-Boot's size and by me putting too much
> > inside U-boot's .text section and hitting some marker/border ?
>
> There is no real limit on the size of the image's segments,  but  due
> to  the  broken memory layout of the ARM you have to be careful where
> you place your image in RAM, and for  other  memory  mapping  details
> like stack size.

memory map for this board:

0x0000 0000 - 0x01FF FFFF (32 MiB) Synchronous FLASH-ROM
	    - 0x03FF FFFF (64 MiB)
0x0400 0000 - 0x0400 0FFF 8051 type interface
0x2000 0000 - 0x2FFF FFFF CF card, slot 0
0x4000 0000 - 0x4BFF FFFF Registers of the processor
0xA000 0000 - 0xA1FF FFFF (32 MiB) SD-RAM
	    - 0xA3FF FFFF (64 MiB)

[ - snip - ]

> Well - attach a debugger and check  where  it's  hanging.  And  check
> where your stack pointer is pointing to.

After the hang, I interrupted the debugger and did some stepping. Here's
the debugger output:

Program received signal SIGTRAP, Trace/breakpoint trap.
_start () at /home/leonk/cvs-remote/u-boot/cpu/pxa/start.S:40
40              ldr     pc, _not_used
(gdb) list
35      _start: b       reset
36              ldr     pc, _undefined_instruction
37              ldr     pc, _software_interrupt
38              ldr     pc, _prefetch_abort
39              ldr     pc, _data_abort
40              ldr     pc, _not_used
41              ldr     pc, _irq
42              ldr     pc, _fiq
43
44      _undefined_instruction: .word undefined_instruction
(gdb) si
41              ldr     pc, _irq
(gdb)
42              ldr     pc, _fiq
(gdb)
0xa1fe0020      42              ldr     pc, _fiq
(gdb)
0xa1fe0024      42              ldr     pc, _fiq
(gdb)
0xa1fe0028      42              ldr     pc, _fiq
(gdb)
0xa1fe002c      42              ldr     pc, _fiq
(gdb)
0xa1fe0030      42              ldr     pc, _fiq
(gdb)
0xa1fe0034      42              ldr     pc, _fiq
(gdb)
0xa1fe0038      42              ldr     pc, _fiq
(gdb)
0xa1fe003c      42              ldr     pc, _fiq
(gdb)
0x00000004 in ?? ()

That tells me it's in _undefined_instruction, if I'm not mistaken. But
0xa1fe003c is making me confused since it's _fiq. Does that mean that
the interrupt has been raised ?

I did some investigations and here's the backtrace:

[ ---- paste ---- ]
(gdb) where
#0  run_command (cmd=0xa1ff6091 "help", flag=0) at main.c:849
#1  0xa1fe0cfc in main_loop () at main.c:489
#2  0xa1fe0b48 in start_armboot () at board.c:347
#3  0x00000074 in ?? ()
(gdb) list
844             printf ("[RUN_COMMAND] cmd[%p]=\"", cmd);
845             puts (cmd ? cmd : "NULL");      /* use puts - string may be loooong */
846             puts ("\"\n");
847     #endif
848
849             clear_ctrlc();          /* forget any previous Control C */
850
851             if (!cmd || !*cmd) {
852                     return -1;      /* empty command */
853             }
(gdb) info frame
Stack level 0, frame at 0xa1fbdf2c:
 pc = 0xa1fe12ac in run_command (main.c:849); saved pc 0xa1fe0cfc
 called by frame at 0xa1fbdf48
 source language c.
 Arglist at 0xa1fbdf2c, args: cmd=0xa1ff6091 "help", flag=0
 Locals at 0xa1fbdf2c, Previous frame's sp is 0x0
 Saved registers:
  r4 at 0xa1fbdf08, r5 at 0xa1fbdf0c, r6 at 0xa1fbdf10, r7 at 0xa1fbdf14,
  r9 at 0xa1fbdf18, r10 at 0xa1fbdf1c, r11 at 0xa1fbdf20, r12 at 0xa1fbdf24,
  lr at 0xa1fbdf28, pc at 0xa1fbdf2c
(gdb) si
clear_ctrlc () at console.c:287
287             ctrlc_was_pressed = 0;
(gdb) where
#0  clear_ctrlc () at console.c:287
(gdb) info frame
Stack level 0, frame at 0x0:
 pc = 0xa1fe7284 in clear_ctrlc (console.c:287); saved pc 0x0
 (FRAMELESS), source language c.
 Arglist at unknown address.
 Locals at unknown address, Previous frame's sp is 0x0
(gdb)
Stack level 0, frame at 0x0:
 pc = 0xa1fe7284 in clear_ctrlc (console.c:287); saved pc 0x0
 (FRAMELESS), source language c.
 Arglist at unknown address.
 Locals at unknown address, Previous frame's sp is 0x0
(gdb)
[ ---- end of paste ---- ]

I set a breakpoint at run_command, restarted and U-boot stopped correctly.
$sp was 0x0 and info frame showed that local variables were located at
0xa1fbdf2c. The question here is: is $sp supposed to point to some location or
is it OK if it's 0x0 ?

Next thing, after going into clear_ctrlc() and executing 'where', there was
a single stack frame.

I'm used to debug regular programs and if I enter a function, backtrace
will always show all the stack frames. Am I missing something here or
is that saying that the stack is corrupt ?

Thanks,
-- 

Best Regards,
	Leon.




More information about the U-Boot mailing list