[U-Boot-Users] IVT on 405GP

Wolfgang Denk wd at denx.de
Wed Apr 16 21:16:53 CEST 2003


in message <EGEGIJHKDKJGAJMGIDPNMEPACKAA.jwalden at digitalatlantic.com> you wrote:
> 	Just reading some uboot install stuff and it appear to say what I am
> doing is ok but it does not seem to do everything. It say that it copies
> itself to upper memory then it should copy 8k of vector stuff to zero. So
> it looks like somehow I am missing the vector copy code, or it is not
> working.
> Again it appears as though "trap init" initializes some vectors in the IVT,
> however it does not copy the code prologue and exception code.
> Can you see in the code where the contents of the first 8k of memory
> is copied?

I really don't understand what this discussion is all about.

Please look at the code yourself.  It  is  not  that  complicated  to
understand. See "cpu/ppc4xx/start.S":

   1366         /*
   1367          * Copy exception vector code to low memory
   1368          *
   1369          * r3: dest_addr
   1370          * r7: source address, r8: end address, r9: target address
   1371          */
   1372         .globl  trap_init
   1373 trap_init:
   1374         lwz     r7, GOT(_start)
   1375         lwz     r8, GOT(_end_of_vectors)
   1377         rlwinm  r9, r7, 0, 18, 31       /* _start & 0x3FFF      */
   1379         cmplw   0, r7, r8
   1380         bgelr                           /* return if r7>=r8 - just in case */
   1382         mflr    r4                      /* save link register           */
   1383 1:
   1384         lwz     r0, 0(r7)
   1385         stw     r0, 0(r9)
   1386         addi    r7, r7, 4
   1387         addi    r9, r9, 4
   1388         cmplw   0, r7, r8
   1389         bne     1b

Guess what this 1: ... "bne 1b" loop is doing?

The code is really simple, and I don't know why you  are  missing  it
when  reading  the  sources or when running under a debugger. And the
function name "trap_init()"  is  IMHO  well  chosen  and  descriptive
enough, too. And there is even a comment which explains what it does.

The only thing I can see  that  could  go  wrong  here  is  that  the
computation  of  the end address (r9 = _start & 0x3FFF) might fail if
you pass bogus values for _start to that code. Please note  that  the
code  assumes that it has been started from the reset entry point, i.
e. _start is at a well  known  address,  and  "_start  &  0x3FFF"  is
equivalent  to  0x100  ;-) But then, this should be trivial to check,
and I assume you already checked it under a debugger, didn't you?

Wolfgang Denk

Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-4596-87  Fax: (+49)-8142-4596-88  Email: wd at denx.de
If it has syntax, it isn't user friendly.

More information about the U-Boot mailing list