[U-Boot] How does u-boot know where to put its start code?

Rogan Dawes rogan at dawes.za.net
Wed Apr 20 12:17:16 CEST 2011


On 2011/04/20 10:29 AM, Albert ARIBAUD wrote:
> Hi Rogan,
> 
> Le 20/04/2011 09:46, Rogan Dawes a écrit :
>> On 2011/04/20 7:42 AM, Albert ARIBAUD wrote:
>>> Le 20/04/2011 04:23, Hebbar, Gururaja a écrit :
>>>> Hi,
>>>>
>>>> On Wed, Apr 20, 2011 at 02:43:23, Rogan Dawes wrote:
>>>>> Hi folks,
>>>>>
>>>>> I'm trying to understand a bit more about how u-boot creates the
>>>>> image, such that the CPU reset vector is pointing to the right piece
>>>>> of code when it is reset.
>>>>>
>>>>> i.e. my DNS323 (Orion5x) has a reset vector of 0xffff0000. But for
>>>>> the life of me, I can't find anywhere that actually references that
>>>>> value to place the start code at that point.
>>>>>
>>>>
>>>> Placing the final boot image is left to user who flashes/burns it
>>>> board. But it should be same as _TEXT_BASE (this is being removed now.
>>>> Orion5x is arm based). Also look
>>>> at<u-boot-src>\arch\arm\cpu\arm926ejs\start.S&
>>>> <u-boot-src>\arch\arm\cpu\arm926ejs\u-boot.lds for more info on how
>>>> linker is instructed to place the starting code at predefined address.
>>>>
>>>>> I'm basically trying to make sure that my CONFIG_SYS_TEXT_BASE is
>>>>> correct (the address in the flash to which I write the whole
>>>>> u-boot.bin file, right?.
>>>>>
>>>> This is passed to linker as the entry point.
>>>
>>> There is another point re: orion5x based boards: often, their designers
>>> preferred generating a linear image for U-Boot, but the fact that the
>>> vector address is at FFFF0000 makes it impossible to directly the image
>>> there because it is always greater than 64K. So the designers put some
>>> "pseudo-rom boot code" at FFFF0000 that will finally jump to an address
>>> lower in FLASH; for ED Mini V2 it is FFF90000, and that's where the
>>> U-Boot image is supposed to be flashed.
>>
>> So, is that the address that you would use for CONFIG_SYS_TEXT_BASE ?
> 
> Yes, exactly.
> 
>>> Rogan, I bet in the DNS323 case, the same applies modulo your Flash
>>> size. Try tracing through the FFFF0000 code, it should not last more
>>> than a few tens of instructions before it jumps to some absolute
>>> address.
>>
>> Do you think it would be possible to figure it out from the original
>> vendor u-boot?
> 
> Sort of: if you look up the vendor U-Boot source code and find nothing
> about 0xFFFF0000, that's a sign that it expects something else than
> U-Boot to kick in at that address.
> 
> You can also disassemble what lies at 0xFFFF0000 on your board, either
> live through JTAG or offline by running a binary extract of FFFF0000
> through objdump.

Ok, so this is what I get at 0xffff0000:

0000000: 5c10 9fe5 0060 91e5 5810 9fe5 0160 06e0  \....`..X....`..
0000010: 5410 9fe5 0100 56e1 0f00 001a 4c10 9fe5  T.....V.....L...
0000020: 0060 91e5 ff10 a0e3 0160 06e0 0100 56e3  .`.......`....V.
0000030: 0800 001a 3810 9fe5 0060 91e5 3410 9fe5  ....8....`..4...
0000040: 0160 06e0 3010 9fe5 0160 86e1 2010 9fe5  .`..0....`.. ...
0000050: 0060 81e5 0100 00ea 0000 00ea ffff ffea  .`..............
0000060: 18f0 9fe5 0000 04d0 0000 ffff 0000 8152  ...............R
0000070: 0800 04d0 2001 02d0 8080 ffff 1b82 0000  .... ...........
0000080: 0000 fdff ffff ffff ffff ffff ffff ffff  ................

Which disassembles to:

$ arm-linux-gnueabi-objdump -m arm -b binary -D mtdblock4-3

       0:       e59f105c        ldr     r1, [pc, #92]   ; 0x64
       4:       e5916000        ldr     r6, [r1]
       8:       e59f1058        ldr     r1, [pc, #88]   ; 0x68
       c:       e0066001        and     r6, r6, r1
      10:       e59f1054        ldr     r1, [pc, #84]   ; 0x6c
      14:       e1560001        cmp     r6, r1
      18:       1a00000f        bne     0x5c
      1c:       e59f104c        ldr     r1, [pc, #76]   ; 0x70
      20:       e5916000        ldr     r6, [r1]
      24:       e3a010ff        mov     r1, #255        ; 0xff
      28:       e0066001        and     r6, r6, r1
      2c:       e3560001        cmp     r6, #1
      30:       1a000008        bne     0x58
      34:       e59f1038        ldr     r1, [pc, #56]   ; 0x74
      38:       e5916000        ldr     r6, [r1]
      3c:       e59f1034        ldr     r1, [pc, #52]   ; 0x78
      40:       e0066001        and     r6, r6, r1
      44:       e59f1030        ldr     r1, [pc, #48]   ; 0x7c
      48:       e1866001        orr     r6, r6, r1
      4c:       e59f1020        ldr     r1, [pc, #32]   ; 0x74
      50:       e5816000        str     r6, [r1]
      54:       ea000001        b       0x60
      58:       ea000000        b       0x60
      5c:       eaffffff        b       0x60
      60:       e59ff018        ldr     pc, [pc, #24]   ; 0x80
      64:       d0040000        andle   r0, r4, r0
      68:       ffff0000                        ; <UNDEFINED>
instruction: 0xffff0000
      6c:       52810000        addpl   r0, r1, #0
      70:       d0040008        andle   r0, r4, r8
      74:       d0020120        andle   r0, r2, r0, lsr #2
      78:       ffff8080                        ; <UNDEFINED>
instruction: 0xffff8080
      7c:       0000821b        andeq   r8, r0, fp, lsl r2
      80:       fffd0000                        ; <UNDEFINED>
instruction: 0xfffd0000

And of course, the image that I wrote to the flash did not have this,
which explains perfectly why nothing works anymore.

Doh!

Now if I can just figure out how to write to my flash using OpenOCD, I
can hopefully recover.

Regards,

Rogan


More information about the U-Boot mailing list