[U-Boot-Users] IVT on 405GP
Jerry Walden
jwalden at digitalatlantic.com
Wed Apr 16 22:32:01 CEST 2003
>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":
Sorry if I am upsetting the members of the list, I was just trying to
develop some understanding of what the code in trap_init does. I KNOW
that there must be code to copy the IVT, and I studied the section that
you pointed out in trap_init, I simply am weak at PPC assembly and
mistundestood some of the instructions - I suppose I should have posted it
to
the PPC-assembly users list if there is one.
>Guess what this 1: ... "bne 1b" loop is doing?
I figured that out all by myself...
>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 code is simple to you - not to me - however now that I have gone
through this learning process - it looks simple to me.
>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?
Yes - of course I checked it under the debugger
Thanks for the response. I think my problem may be the base uboot address.
The
address is 0x3fcf000. The mask is 3fff. If my uboot started on a nice 16 bit
address then the result would be 0(3fc0000 & 3fff) but I was getting
0xf000(3fcf000 & 3fff). So I think that the fix is to move uboot down to
0x3fc0000 or 0x3fc8000.
Jerry Walden
-----Original Message-----
From: wd at denx.de [mailto:wd at denx.de]
Sent: Wednesday, April 16, 2003 3:17 PM
To: jwalden at digitalatlantic.com
Cc: u-boot-users at lists.sourceforge.net
Subject: Re: [U-Boot-Users] IVT on 405GP
Jerry,
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)
1376
1377 rlwinm r9, r7, 0, 18, 31 /* _start & 0x3FFF */
1378
1379 cmplw 0, r7, r8
1380 bgelr /* return if r7>=r8 - just
in case */
1381
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