Can't build libpthread for M3

Andrii bearrailgun at gmail.com
Wed Oct 22 17:53:52 UTC 2014


Thanks for the patches!

I've tried to apply both on uClibc-0.9.33.2 (latest official release).
uclibc-cm3-clone.patch was applied just well.
But I was not able to apply uclibc-cm3-testandset.patch correctly:
In libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h
I don't have next lines:
-  int unused = 0;
-  return INTERNAL_SYSCALL_ARM (atomicops, , 4, SYS_ARM_ATOMIC_SET,
-                         spinlock, 1, unused);
But rest seems the same.
So I fixed it manually by copying ldrex/strex and testandset functions.
This patch also creates dot_config_pthreads-no-ldrex which I used to build
uclibc (also I enabled the USE_LDREXSTREX=y)

The result is next (In app just usual pthread_create() used without any
other pthread calls) :
# ./the_app
00026 : pthread_initialize: initial thread stack bounds: bos=0x1,
tos=0xffffffff
the_app started. version 6.76_threads
Starting sensor simulation thread
00026 : __pthread_initialize_manager: manager stack: size=8160,
bos=0xa0696008, tos=0xa0697fe8
00026 : __pthread_initialize_manager: send REQ_DEBUG to manager thread
00026 : pthread_create: write REQ_CREATE to manager thread
00026 : pthread_create: before suspend(self)
[   18.810000]
[   18.810000]
[   18.810000] the_app: unhandled MPU fault (0x08) at 0x00000000
[pc=0xa0583ea8,sp=0xa0697fc0]
[   18.810000]

Actually I have same results on latest uclibc git without fixing clone
patch but with ldrex/strex fix.

Any suggestions are welcome.

Regards.



On Wed, Oct 22, 2014 at 1:11 PM, Sergei Poselenov <sposelenov at emcraft.com>
wrote:

> Hello,
>
> On Thu, 9 Oct 2014 23:29:01 +0300
> Andrii <bearrailgun at gmail.com> wrote:
>
> > I'm trying to build uClibc for Cortex-M3 LPC17XX with codesourcery
> > g++ lite arm2010q1(189) toolchain.
> > I've tried 0.9.30.3, 0.9.33.2 and latest git a9bdc5d2 with almost same
> > results.
> > Here is the output from latest git:
> >
> > When trying to build with old linuxthreads:
> >   CC libpthread/linuxthreads.old/mutex.os
> > /tmp/ccB7JHC6.s: Assembler messages:
> > /tmp/ccB7JHC6.s:29: Error: selected processor does not support ARM
> > opcodes /tmp/ccB7JHC6.s:30: Error: attempt to use an ARM instruction
> > on a Thumb-only processor -- `swp r3,r3,[r0]'
> > /tmp/ccB7JHC6.s:31: Error: attempt to use an ARM instruction on a
> > Thumb-only processor -- `orr r0,pc,#1'
> > /tmp/ccB7JHC6.s:32: Error: attempt to use an ARM instruction on a
> > Thumb-only processor -- `bx r0'
> > /tmp/ccB7JHC6.s:58: Error: selected processor does not support ARM
> > opcodes /tmp/ccB7JHC6.s:59: Error: attempt to use an ARM instruction
> > on a Thumb-only processor -- `swp r2,r2,[r0]'
> > /tmp/ccB7JHC6.s:60: Error: attempt to use an ARM instruction on a
> > Thumb-only processor -- `orr r0,pc,#1'
> > /tmp/ccB7JHC6.s:61: Error: attempt to use an ARM instruction on a
> > Thumb-only processor -- `bx r0'
> > make: *** [libpthread/linuxthreads.old/mutex.os] Error 1
> >
> > New linux threads:
> >   CC libpthread/linuxthreads/sysdeps/arm/pspinlock.os
> > In file included from ./libpthread/linuxthreads/descr.h:46,
> >                  from ./libpthread/linuxthreads/internals.h:36,
> >                  from
> > libpthread/linuxthreads/sysdeps/arm/pspinlock.c:21:
> ./libpthread/linuxthreads/sysdeps/arm/pt-machine.h:36:
> > warning: no previous prototype for 'testandset'
> > /tmp/cczGDaGC.s: Assembler messages:
> > /tmp/cczGDaGC.s:27: Error: selected processor does not support Thumb
> > mode `swp r3,r3,[r0]'
> > /tmp/cczGDaGC.s:46: Error: selected processor does not support Thumb
> > mode `swp r3,r3,[r0]'
> > make: *** [libpthread/linuxthreads/sysdeps/arm/pspinlock.os] Error 1
> >
> > NPTL:
> > -----
> >   CC libpthread/nptl/pthread_atfork.os
> >   AS libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.os
> >
> libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:
> > Assembler messages:
> >
> libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:72:
> > Error: only SUBS PC, LR, #const allowed -- `sub pc,r0,#31'
> >
> libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:74:
> > Error: thumb conditional instruction should be in IT block -- `strne
> > r3,[r2,#-1044]'
> > make: *** [libpthread/nptl/sysdeps/unix/sysv/linux/arm/pt-vfork.os]
> > Error 1
> >
> > Extra CFLAGS :
> > march=armv7-m -mthumb -Wl, -elf2flt -Wa, -march=armv7-m -Wa, -mthumb
> >
> > As I undestand thumb2 doesn't support swp instruction. But is there a
> > way to avoid hardcoded swp instructions in threads code (spinlock
> > implementation)?
> >
> Uclibc (still) lacks pthreads support on Cortex-M3.
>
> I'm attaching two patches:
>  - implement testandset() for Cortex-M3.
>  - Fix a bug in implementation of clone() for Cortex-M3.
>
> That should make pthreads work. Note also that we are building the
> "linuxthreads.old" pthreads configuration.
>
>
> Regards,
>
> Sergei Poselenov,
> Emcraft Systems
> > Regards.
> > _______________________________________________
> > uClibc mailing list
> > uClibc at uclibc.org
> > http://lists.busybox.net/mailman/listinfo/uclibc
>
>


More information about the uClibc mailing list