2005-03-28 14:58:12

by Ara Avanesyan

[permalink] [raw]
Subject: Strange memory problem with Linux booted from U-Boot

Hi,

I need some help on solving this strange problem.
Here is what I have,
I have a loadable module (linux.2.4.20) which contains a 2 mb static gloabal
array.
When I load it from linux booted via U-Boot the system crashes.
Everything works ok if I do the same thing with the same linux booted with
RedBoot.
Before loading the module I check the current meminfo and get the same
result both times.

Additional information:
The same error occurs if I just run depmod -a.

system: Avila board 64 MB RAM, ixdp425 architecture, U-Boot: 1.1.2.
Linux is MontaVista(R) Linux(R) Professional Edition 3.1.

Ok, now an amazing reproduction of the same problem from user mode:
the code below works for val = (~0), but not for 0, or even (~ff).
Again, it works fine for linux booted from RedBoot.

Some glue or something where and what to look?
Any ideas of what potentially could cause this problem?

Please CC me on reply.

Thanks!
Ara

Several days ago I posted this question to U-boot mailing list but got not
much help there:)

____
error message:
Unable to handle kernel paging request at virtual address e59f30f8
mm = c000a320 pgd = c3e60000
*pgd = 00000000, *pmd = 00000000
Internal error: Oops: 0
CPU: 0
pc 2 [<c0054f64>] lr : [<00000000>] Tainted: GF
sp : c3e45e94 ip : c3e45eb4 fp : c3e45eb0
r10: 00000000 r9 : c3e45f04 r8 : 00000004
r7 : 00000004 r6 : c016a000 r5 : c3e44000 r4 : e59f3054
r3 : e91ba870 r2 : c019cc70 r1 : 00000000 r0 : 00000000
Flags: nzCv IRQs on FIQs on Mode SVC_32 Control: 39FF Table: 03E60000
DAC: 00000015
Process klogd (pid: 89, stack limit = 0xc3e443a0)
Stack: (0xc3e45e94 to 0xc3e46000)

___
Now the (user level) code:

#include <iostream>

using namespace std;

const int pass = 64;
const int size = 2 * 1024 * 1024;
const int val = 0xffffff00;
int main()
{
cout << "starting val == " << hex << val << endl;
char *buf = new char[size];
cout << "allocated memory of " << size << " bytes. buf == " << (int)buf
<< endl;

for (int j = 0; j < pass; j++)
{
cout << "passing " << j << endl;
for (int i = 0; i < size; i++)
{
buf[i] = val;
}
cout << "passed" << endl;
}

cout << "freeing" << endl;
delete []buf;
cout << "finished!" << endl;
return 0;
}


2005-03-28 15:06:34

by Jan Engelhardt

[permalink] [raw]
Subject: Re: Strange memory problem with Linux booted from U-Boot

>Hi,
>
>I need some help on solving this strange problem.
>Here is what I have,
>I have a loadable module (linux.2.4.20) which contains a 2 mb static gloabal
>array.
>
>Additional information:
>The same error occurs if I just run depmod -a.

I'd be more interested in the kernel space code...



Jan Engelhardt
--
No TOFU for me, please.

2005-03-28 16:18:30

by linux-os (Dick Johnson)

[permalink] [raw]
Subject: Re: Strange memory problem with Linux booted from U-Boot


I tried your program with several 'val' values including ~0 and
0. The results were the same. In spite of using character pointers
on large negative integers, everything worked. What was the observed
kernel problem?? Perhaps, the kernel's printk() was not as kind
as g++ and you got some strange printed results??

On Mon, 28 Mar 2005, Ara Avanesyan wrote:

> Hi,
>
> I need some help on solving this strange problem.
> Here is what I have,
> I have a loadable module (linux.2.4.20) which contains a 2 mb static gloabal
> array.
> When I load it from linux booted via U-Boot the system crashes.
> Everything works ok if I do the same thing with the same linux booted with
> RedBoot.
> Before loading the module I check the current meminfo and get the same
> result both times.
>
> Additional information:
> The same error occurs if I just run depmod -a.
>
> system: Avila board 64 MB RAM, ixdp425 architecture, U-Boot: 1.1.2.
> Linux is MontaVista(R) Linux(R) Professional Edition 3.1.
>
> Ok, now an amazing reproduction of the same problem from user mode:
> the code below works for val = (~0), but not for 0, or even (~ff).
> Again, it works fine for linux booted from RedBoot.
>
> Some glue or something where and what to look?
> Any ideas of what potentially could cause this problem?
>
> Please CC me on reply.
>
> Thanks!
> Ara
>
> Several days ago I posted this question to U-boot mailing list but got not
> much help there:)
>
> ____
> error message:
> Unable to handle kernel paging request at virtual address e59f30f8
> mm = c000a320 pgd = c3e60000
> *pgd = 00000000, *pmd = 00000000
> Internal error: Oops: 0
> CPU: 0
> pc 2 [<c0054f64>] lr : [<00000000>] Tainted: GF
> sp : c3e45e94 ip : c3e45eb4 fp : c3e45eb0
> r10: 00000000 r9 : c3e45f04 r8 : 00000004
> r7 : 00000004 r6 : c016a000 r5 : c3e44000 r4 : e59f3054
> r3 : e91ba870 r2 : c019cc70 r1 : 00000000 r0 : 00000000
> Flags: nzCv IRQs on FIQs on Mode SVC_32 Control: 39FF Table: 03E60000
> DAC: 00000015
> Process klogd (pid: 89, stack limit = 0xc3e443a0)
> Stack: (0xc3e45e94 to 0xc3e46000)
>
> ___
> Now the (user level) code:
>
> #include <iostream>
>
> using namespace std;
>
> const int pass = 64;
> const int size = 2 * 1024 * 1024;
> const int val = 0xffffff00;
> int main()
> {
> cout << "starting val == " << hex << val << endl;
> char *buf = new char[size];
> cout << "allocated memory of " << size << " bytes. buf == " << (int)buf
> << endl;
>
> for (int j = 0; j < pass; j++)
> {
> cout << "passing " << j << endl;
> for (int i = 0; i < size; i++)
> {
> buf[i] = val;
> }
> cout << "passed" << endl;
> }
>
> cout << "freeing" << endl;
> delete []buf;
> cout << "finished!" << endl;
> return 0;
> }
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

Cheers,
Dick Johnson
Penguin : Linux version 2.6.11 on an i686 machine (5537.79 BogoMips).
Notice : All mail here is now cached for review by Dictator Bush.
98.36% of all statistics are fiction.


Attachments:
typescript (1.62 kB)

2005-03-29 07:23:45

by Ara Avanesyan

[permalink] [raw]
Subject: Re: Strange memory problem with Linux booted from U-Boot

----- Original Message -----
From: "Jan Engelhardt" <[email protected]>
To: "Ara Avanesyan" <[email protected]>
Cc: <[email protected]>; <[email protected]>
Sent: Monday, March 28, 2005 8:06 PM
Subject: Re: Strange memory problem with Linux booted from U-Boot


> >Hi,
> >
> >I need some help on solving this strange problem.
> >Here is what I have,
> >I have a loadable module (linux.2.4.20) which contains a 2 mb static
gloabal
> >array.
> >
> >Additional information:
> >The same error occurs if I just run depmod -a.
>
> I'd be more interested in the kernel space code...
>
>
>
> Jan Engelhardt
> --
> No TOFU for me, please.
>

Oh, the code for kernel space is exactly the same code translated to C:
That is:

___________
#include <linux/vmalloc.h>

void mtestit(char val)
{
char *buf;
int i, j;
int size = 64;
int pass = 2 * 1024 * 1024;
printk("starting val == %x\n", val);
buf = vmalloc(size);
printk("allocated memory of %d bytes. buf == %x\n", size, (int)buf);

for (j = 0; j < pass; j++)
{
printk("passing %d", j);
for (i = 0; i < size; i++)
{
buf[i] = val;
}
printk("passed\n");
}

printk("freeing\n");
vfree(buf);
printk("finished!\n");
}
___________

I call this in a module's entry point and insmod that module.
now, mtestit(0xff) works, but mtestit(0x00) crashes:(
Works fine with RedBoot. Very strange to me:)
Moreover, works fine if I do the very same thing from
within U-Boot (mw.b 100000 0 100000).

I'm interested in ideas of what could potentially be the
cause of this strange behaviour.

__
Thanks,
Ara

2005-03-30 07:21:13

by Eugene Surovegin

[permalink] [raw]
Subject: Re: Strange memory problem with Linux booted from U-Boot

On Mon, Mar 28, 2005 at 07:57:52PM +0500, Ara Avanesyan wrote:
> Hi,
>
> I need some help on solving this strange problem.
> Here is what I have,
> I have a loadable module (linux.2.4.20) which contains a 2 mb static gloabal
> array.
> When I load it from linux booted via U-Boot the system crashes.
> Everything works ok if I do the same thing with the same linux booted with
> RedBoot.

As usual for such problems, check how different firmware configure
memory controller, etc. Get dump of relevant chip registers under
U-Boot and RedBoot and compare them.

Other possible problem area can be firmware -> kernel interface. I'm
not familiar with that particular chip and RedBoot, but it's not
uncommon for different firmware to have different conventions for the
environment in which kernel starts execution.

I'd recommend posting to the specific mail-lists, lkml doesn't seem
a good place for embedded and firmware related questions :)

--
Eugene

2005-03-31 13:40:12

by Ara Avanesyan

[permalink] [raw]
Subject: Re: Strange memory problem with Linux booted from U-Boot

> On Mon, Mar 28, 2005 at 07:57:52PM +0500, Ara Avanesyan wrote:
> > Hi,
> >
> > I need some help on solving this strange problem.
> > Here is what I have,
> > I have a loadable module (linux.2.4.20) which contains a 2 mb static
gloabal
> > array.
> > When I load it from linux booted via U-Boot the system crashes.
> > Everything works ok if I do the same thing with the same linux booted
with
> > RedBoot.
>
> As usual for such problems, check how different firmware configure
> memory controller, etc. Get dump of relevant chip registers under
> U-Boot and RedBoot and compare them.
>
> Other possible problem area can be firmware -> kernel interface. I'm
> not familiar with that particular chip and RedBoot, but it's not
> uncommon for different firmware to have different conventions for the
> environment in which kernel starts execution.
>
> I'd recommend posting to the specific mail-lists, lkml doesn't seem
> a good place for embedded and firmware related questions :)
>
> --
> Eugene
>

Eugene,

Thanks for your response and ideas.
Actually the problem is concerning to linux part as the same code works fine
within U-Boot as I posted before. This is why I asked lkml for help what
might
cause this behaviour.

__
Thanks,
Ara