Skip to contentSkip to conversation

2.6.19 rc6 rt3 on embedded ARM system

DISCUSSION Dirk Behme 2 participants 4 messages Nov 19, 2006

lore
Share & tools
lore

Dirk Behme

author
#0 lore raw

Hi,

playing with patch-2.6.19-rc6-rt3 on an embedded TI OMAP based ARM926 system I encountered two issues.

First, I got the system booting and even playing MP3 via NFS using madplay on ALSA works :)

But after madplay stops, I got an Oops:

kernel BUG at kernel/rtmutex.c:672!

Unable to handle kernel NULL pointer dereference at virtual
address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 817 [#1]
PC is at __bug+0x44/0x58
LR is at rt_up+0x4c/0x6c

...

Any ideas what's wrong here? Note that I used recent OMAP git and not OMAP mainline so I manually had to convert some spinlock_t to raw_spinlock_t.

Second, I tried to compile cyclictest 0.11. Seems that for me it isn't so easy as described on [1] "Get the latest source tarball, untar into a directory of your choice and run make in the source directory.":

~/cyclictest> make
arm-linux-gcc -Wall -O2 -lpthread -lrt cyclictest.c -o cyclictest cyclictest.c: In function 'timerthread':
cyclictest.c:153: error: 'SIGEV_THREAD_ID' undeclared (first use in this function) cyclictest.c:153: error: (Each undeclared identifier is reported only once cyclictest.c:153: error: for each function it appears in.) cyclictest.c:155: error: 'union <anonymous>' has no member named '_tid' cyclictest.c: At top level:
cyclictest.c:318: error: 'CLOCK_MONOTONIC' undeclared here (not in a function)

Looking into kernel headers, SIGEV_THREAD_ID and CLOCK_MONOTONIC are defined by kernels include files, but seems that they are not included here correctly. Defining them manually in cyclictest.c then results in

cyclictest.c:158: error: 'union <anonymous>' has no member named '_tid'

And here, I stopped because my _sigev_un in include/bits/siginfo.h really contains no _tid:

struct

	  {
	    void (*_function) (sigval_t);	/* Function to start.  */
	    void *_attribute;			/* Really pthread_attr_t.  */
	  } _sigev_thread;
      } _sigev_un;

I use a gcc 4.1.0 toolchain built with crosstool with glibc-2.3.2:

~/cyclictest> arm-linux-gcc -v
Using built-in specs.
Target: arm-linux
Configured with: /crossgcc/arm/arm_gcc_4_1_0/crosstool-0.42/build/arm-linux/gcc-4.1.0-glibc-2.3.2/gcc-4.1.0/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/usr/arm/arm-linux --with-headers=/usr/arm-linux/arm-linux/include --with-local-prefix=/usr/arm-linux/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix
gcc version 4.1.0

Any ideas here as well?

[1] http://rt.wiki.kernel.org/index.php/Cyclictest

#1 lore raw
Quoted 16 lines · Dirk Behme

playing with patch-2.6.19-rc6-rt3 on an embedded TI OMAP based ARM926 system I encountered two issues.

First, I got the system booting and even playing MP3 via NFS using madplay on ALSA works :)

But after madplay stops, I got an Oops:

kernel BUG at kernel/rtmutex.c:672!

Unable to handle kernel NULL pointer dereference at virtual
address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 817 [#1]
PC is at __bug+0x44/0x58
LR is at rt_up+0x4c/0x6c
Quoted 3 lines

...

Any ideas what's wrong here?

You snipped the stack trace here, which could offer some information about the call path. Could you post it?

Quoted 7 lines

Second, I tried to compile cyclictest 0.11. Seems that for me it isn't so easy as described on [1] "Get the latest source tarball, untar into a directory of your choice and run make in the source directory.":

~/cyclictest> make
arm-linux-gcc -Wall -O2 -lpthread -lrt cyclictest.c -o

Sidenote: these days it doesn't really make sense any more to have something like an arm-linux-gcc, as you can decide between different cores (v4, v4t, v5, ...), different floating/fixed point models (hard fpa, hard vfp, soft vfp, maverick crunch, iwmmxt, ...) etc.

Quoted 4 lines

cyclictest
cyclictest.c: In function 'timerthread':
cyclictest.c:153: error: 'SIGEV_THREAD_ID' undeclared (first use in this function)

Hmm, it looks like SIGEV_THREAD_ID is not defined in the POSIX standard. Maybe tglx can comment on where this comes from.

Nevertheless, for me it is defined in bits/siginfo.h, both on debian unstable (x86) and in our self built gccs; checked with

	arm-v4t-linux-gnueabi/gcc-4.2-20061031-glibc-2.5
	arm-v4t-linux-gnueabi/gcc-4.1.1-glibc-2.5

The include file comes in correctly by including signals.h and is a glibc header file.

Quoted 2 lines

cyclictest.c:318: error: 'CLOCK_MONOTONIC' undeclared here (not in a function)

The POSIX manpage for timer_create() says that you have to define signal.h and time.h, the latter one pulls in bits/time.h, which contains CLOCK_MONOTONIC. This is also a glibc header file.

Maybe your glibc is too old?

Quoted 11 lines

Looking into kernel headers, SIGEV_THREAD_ID and CLOCK_MONOTONIC are defined by kernels include files, but seems that they are not included here correctly. Defining them manually in cyclictest.c then results in

cyclictest.c:158: error: 'union <anonymous>' has no member named '_tid'

And here, I stopped because my _sigev_un in
include/bits/siginfo.h really contains no _tid:

Quoted 6 lines

struct

	  {
	    void (*_function) (sigval_t);	/* Function to start.  */
	    void *_attribute;			/* Really pthread_attr_t.  */
	  } _sigev_thread;
      } _sigev_un;

It contains _tid in later glibcs.

Quoted 1 line

I use a gcc 4.1.0 toolchain built with crosstool with glibc-2.3.2:

I assume glibc-2.3.2 is too old.

Robert

Signature · 5 lines
 Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de
 Pengutronix - Linux Solutions for Science and Industry
   Handelsregister:  Amtsgericht Hildesheim, HRA 2686
     Hannoversche Str. 2, 31134 Hildesheim, Germany
   Phone: +49-5121-206917-0 |  Fax: +49-5121-206917-9
author
#2 lore raw
Quoted 19 lines · Robert Schwebel
Quoted 14 lines · Dirk Behme

playing with patch-2.6.19-rc6-rt3 on an embedded TI OMAP based ARM926 system I encountered two issues.

First, I got the system booting and even playing MP3 via NFS using madplay on ALSA works :)

But after madplay stops, I got an Oops:

kernel BUG at kernel/rtmutex.c:672!

Unable to handle kernel NULL pointer dereference at virtual
address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 817 [#1]
PC is at __bug+0x44/0x58
LR is at rt_up+0x4c/0x6c
Quoted 2 lines

...
Any ideas what's wrong here?

Quoted 2 lines

You snipped the stack trace here, which could offer some information about the call path. Could you post it?

Thought for whoever coded this explicit bug statement info above would be sufficient ;)

Ah! Thanks for directing me to the details. Looks like I missed one spinlock -> raw_spinlock conversion...

Quoted 2 lines
	arm-v4t-linux-gnueabi/gcc-4.2-20061031-glibc-2.5
	arm-v4t-linux-gnueabi/gcc-4.1.1-glibc-2.5

...

Quoted 3 lines
Quoted 1 line

I use a gcc 4.1.0 toolchain built with crosstool with glibc-2.3.2:

I assume glibc-2.3.2 is too old.

Yeah, thanks. A toolchain with glibc 2.3.6 seem to make the job. Maybe this is worth a hint in wiki?

Cheers

Dirk

#3 lore raw
Quoted 5 lines · Dirk Behme
Quoted 2 lines

I use a gcc 4.1.0 toolchain built with crosstool with glibc-2.3.2:
I assume glibc-2.3.2 is too old.

Yeah, thanks. A toolchain with glibc 2.3.6 seem to make the job. Maybe this is worth a hint in wiki?

We could add a section to the HOWTO, so the question is which are the toolchain versions we minimally need? It's probably architecture dependend as well.

Any knowldgable folks around who might have an idea?

Robert

Signature · 5 lines
 Dipl.-Ing. Robert Schwebel | http://www.pengutronix.de
 Pengutronix - Linux Solutions for Science and Industry
   Handelsregister:  Amtsgericht Hildesheim, HRA 2686
     Hannoversche Str. 2, 31134 Hildesheim, Germany
   Phone: +49-5121-206917-0 |  Fax: +49-5121-206917-9