All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot-Users] reading ethaddr from env
@ 2005-02-23 10:01 Juan Antonio Garcia Redondo
  2005-02-24 22:49 ` Wolfgang Denk
  0 siblings, 1 reply; 3+ messages in thread
From: Juan Antonio Garcia Redondo @ 2005-02-23 10:01 UTC (permalink / raw)
  To: u-boot

Hello all,

I'm porting u-boot to a custom board with pxa255. I have a problem that I'm
not be able to solve.

When u-boot starts and try to read the ethaddr, (lib_arm/board.c at 296),
the parameter tmp used in the function getenv_r is pointing to the gd->bd
structure, so the execution of this function corrupts the data stored in
it.

I've found a "dirty" workaround of this problem rising the size of tmp
buffer:
The code in lib_arm/board.c

        /* IP Address */
        gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

        /* MAC Address */
        {
                int i;
                ulong reg;
                char *s, *e;
                /* uchar tmp[64]; */
                uchar tmp[128];

                i = getenv_r ("ethaddr", tmp, sizeof (tmp));
                printf("ethaddr %s[%d]\n", tmp, i);
                s = (i > 0) ? tmp : NULL;

                for (reg = 0; reg < 6; ++reg) {
                        gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s,
                        &e, 16) : 0;
                        if (s)
                                s = (*e) ? e + 1 : e;
                }
        }

The output of gdb before execute the getenv_r(with tmp[64]):

(gdb) print *gd
$2 = {bd = 0xa00bffa0, flags = 0, baudrate = 115200, have_console = 1,
reloc_off = 0, env_addr = 2685141004, env_valid = 1,
  fb_base = 0, jt = 0x0}
(gdb) n
(gdb) print &tmp[0]
$3 = (uchar *) 0xa00bffa4 ""
(gdb) s
getenv_r (name=0xa0114bb0 "ethaddr", buf=0xa00bffa4 "??\002?", len=64) at
cmd_nvedit.c:512


As you can see the tmp buffer is pointing to the gd->bd plus 4.

My compiler:

arm-linux-gcc -v
Reading specs from
/home/jgarcia/PXA2XX/ELDK/eldk_work/usr/bin/../lib/gcc-lib/arm-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit --with-newlib
--enable-languages=c,c++ --disable-libgcj --host=i386-redhat-linux
--target=arm-linux
Thread model: posix
gcc version 3.3.3 (DENX ELDK 3.1 3.3.3-8)


Any hints ?

Regards,
        Juan Antonio

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot-Users] reading ethaddr from env
  2005-02-23 10:01 [U-Boot-Users] reading ethaddr from env Juan Antonio Garcia Redondo
@ 2005-02-24 22:49 ` Wolfgang Denk
  2005-02-25 10:44   ` Juan Antonio Garcia Redondo
  0 siblings, 1 reply; 3+ messages in thread
From: Wolfgang Denk @ 2005-02-24 22:49 UTC (permalink / raw)
  To: u-boot

In message <20050223100142.GA3003@nabla101> you wrote:
> 
> When u-boot starts and try to read the ethaddr, (lib_arm/board.c at 296),
> the parameter tmp used in the function getenv_r is pointing to the gd->bd
> structure, so the execution of this function corrupts the data stored in
> it.

You are wrong. "tmp" is a local array, declared in line 294:

    294                 uchar tmp[64];
    295
    296                 i = getenv_r ("ethaddr", tmp, sizeof (tmp));

> I've found a "dirty" workaround of this problem rising the size of tmp
> buffer:

What exactly is your problem?

>                 /* uchar tmp[64]; */
>                 uchar tmp[128];
> 
>                 i = getenv_r ("ethaddr", tmp, sizeof (tmp));

Why do you think that 64 bytes should be insufficient  to  store  the
MAC address?

> As you can see the tmp buffer is pointing to the gd->bd plus 4.

At least this is what the debugger claims.

> Any hints ?

I cannot reproduce this problem here. WHat do you get  when  you  use
printf() to display the addresses _before_ calling getenv_r()?

Best regards,

Wolfgang Denk

-- 
See us @ Embedded World, Nuremberg, Feb 22 - 24,  Hall 10.0 Booth 310
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
As a general rule, the freedom of any people can  be  judged  by  the
volume of their laughter.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot-Users] reading ethaddr from env
  2005-02-24 22:49 ` Wolfgang Denk
@ 2005-02-25 10:44   ` Juan Antonio Garcia Redondo
  0 siblings, 0 replies; 3+ messages in thread
From: Juan Antonio Garcia Redondo @ 2005-02-25 10:44 UTC (permalink / raw)
  To: u-boot

On 24/02/05 23:49, Wolfgang Denk wrote:
> In message <20050223100142.GA3003@nabla101> you wrote:

> I cannot reproduce this problem here. WHat do you get  when  you  use
> printf() to display the addresses _before_ calling getenv_r()?
> 

I've found the problem. I'd forgotten to assign the CFG_GBL_DATA_SIZE
constant, so sp was pointing to a wrong place.

Thanks for your answer.

Regards,
        Juan Antonio

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-02-25 10:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-23 10:01 [U-Boot-Users] reading ethaddr from env Juan Antonio Garcia Redondo
2005-02-24 22:49 ` Wolfgang Denk
2005-02-25 10:44   ` Juan Antonio Garcia Redondo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.