Hello Andrii, On Thu, 6 Nov 2014 17:06:36 +0200 Andrii <[email protected]> wrote:
> What I actually did - disabled CONFIG_MPU in kernel and it started to > work. After that I found that my u-boot is custom fork and probably > doesn't setup MPU well. > Without CONFIG_MPU everything started to work great. > So I could say linuxthreads.old work on M3 with 3 patches provided by > Sergei over 0.9.33.2 release > Sounds good. BTW you can see Emcraft LPC17xx port of U-Boot and Linux on GitHub https://github.com/EmcraftSystems Regards, Sergei > On Mon, Nov 3, 2014 at 5:58 PM, Andrii <[email protected]> wrote: > > > uClibc was built with: make ARCH_CFLAGS= 'CPU_CFLAGS=-mthumb > > -march=armv7 -mfix-cortex-m3-ldrd' > > App was built with: arm-uclinuxeabi-gcc -c -g -mthumb -march=armv7 > > -mfix-cortex-m3-ldrd -O0 -Wl,-elf2flt,--static main.c > > arm-uclinuxeabi-gcc -Wl,-elf2flt,--static main.o > > -L../arm-2010q1/arm-uclinuxeabi/libc/thumb2/usr/lib -lpthread -o > > zpm_thread where all original uclibc libraries from toolchain were > > replaced with newly built ones: > > /mnt/repos/repos/github/uclibc$ ls -la > > /mnt/repos/repos/github/nocturn_tools/arm-2010q1/arm-uclinuxeabi/libc/thumb2/usr/lib > > total 1412 > > drwxrwxr-x 2 repu1sion repu1sion 4096 Nov 3 17:32 . > > drwxrwxr-x 5 repu1sion repu1sion 4096 Aug 25 22:50 .. > > -rw-rw-r-- 1 repu1sion repu1sion 992 Nov 3 17:32 crt1.o > > -rw-rw-r-- 1 repu1sion repu1sion 959 Nov 3 17:32 crti.o > > -rw-rw-r-- 1 repu1sion repu1sion 959 Nov 3 17:32 crtn.o > > -rw-rw-r-- 1 repu1sion repu1sion 1130956 Nov 3 17:32 libc.a > > -rw-rw-r-- 1 repu1sion repu1sion 175768 Nov 3 17:32 libm.a > > -rw-rw-r-- 1 repu1sion repu1sion 90352 Nov 3 17:32 libpthread.a > > -rw-rw-r-- 1 repu1sion repu1sion 1082 Nov 3 17:32 libresolv.a > > -rw-rw-r-- 1 repu1sion repu1sion 14084 Nov 3 17:32 librt.a > > > > > > > > On Mon, Nov 3, 2014 at 5:53 PM, Andrii <[email protected]> > > wrote: > > > >> I've tried to apply Sergei' 3 patches to the original 0.9.33.2 and > >> run test app on it. > >> Still got a crash: > >> > >> / # /opt/zpm_thread > >> 00032 : pthread_initialize: initial thread stack bounds: bos=0x1, > >> tos=0xffffffff > >> 00032 : __pthread_initialize_manager: manager stack: size=8160, > >> bos=0xa00a2008, tos=0xa00a3fe8 > >> 00032 : __pthread_initialize_manager: send REQ_DEBUG to manager > >> thread 00032 : pthread_create: write REQ_CREATE to manager thread > >> 00032 : pthread_create: before suspend(self) > >> 00033 : __pthread_manager: before poll > >> 00033 : __pthread_manager: after poll > >> 00033 : __pthread_manager: before read > >> 00033 : __pthread_manager: after read, n=28 > >> 00033 : __pthread_manager: got REQ_CREATE > >> 00033 : pthread_allocate_stack: malloced chunk: base=0xa00a8008, > >> size=0x4000 > >> 00033 : pthread_allocate_stack: thread stack: bos=0xa00a8008, > >> tos=0xa00abea8 > >> 00033 : pthread_allocate_stack: initial stack: bos=0x1, > >> tos=0xa00a2008 00033 : pthread_handle_create: cloning new_thread = > >> 0xa00abea8 00033 : pthread_handle_create: new thread pid = 34 > >> 00033 : __pthread_manager: restarting 0xa008e8d0 > >> 00032 : pthread_create: after suspend(self) > >> thread #0 created > >> 00033 : __pthread_manager: before poll > >> 00034 : pthread_start_thread: > >> new thread 1 executed. > >> 00032 : pthread_create: write REQ_CREATE to manager thread > >> 00032 : pthread_create: before suspend(self) > >> 00033 : __pthread_manager: after poll > >> 00033 : __pthread_manager: before read > >> 00033 : __pthread_manager: after read, n=28 > >> 00033 : __pthread_manager: got REQ_CREATE > >> 00033 : pthread_allocate_stack: malloced chunk: base=0xa03d8008, > >> size=0x4000 > >> 00033 : pthread_allocate_stack: thread stack: bos=0xa03d8008, > >> tos=0xa03dbea8 > >> 00033 : pthread_allocate_stack: initial stack: bos=0x1, > >> tos=0xa00a2008 00033 : pthread_handle_create: cloning new_thread = > >> 0xa03dbea8 00033 : pthread_handle_create: new thread pid = 35 > >> 00033 : __pthread_manager: restarting 0xa008e8d0 > >> 00033 : __pthread_manager: before poll > >> 00035 : pthread_start_thread: > >> new thread 1 executed. > >> 00032 : pthread_create: after suspend(self) > >> thread #1 created > >> 00032 : pthread_create: write REQ_CREATE to manager thread > >> 00033 : __pthread_manager: after poll > >> 00033 : __pthread_manager: before read > >> 00033 : __pthread_manager: after read, n=28 > >> 00033 : __pthread_manager: got REQ_CREATE > >> 00032 : pthread_create: before suspend(self) > >> > >> [ 12.390000] > >> [ 12.390000] zpm_thread: unhandled MPU fault (0x08) at 0x00000000 > >> [pc=0xa0084c74,sp=0xa00a3f20] > >> [ 12.390000] > >> [ 12.390000] Pid: 33, comm: zpm_thread > >> [ 12.390000] CPU: 0 Not tainted (2.6.33-arm1 #2) > >> [ 12.390000] pc : [<a0084c74>] lr : [<a008478f>] psr: > >> 21000000 [ 12.390000] sp : a00a3f20 ip : 5220746f fp : 00000803 > >> [ 12.390000] Code dump at pc [a0084c74]: > >> [ 12.390000] a003f848 463b4621 ff98f7ff 681b4b04 > >> [ 12.390000] r10: 00005000 r9 : 00000003 r8 : a0020000 > >> [ 12.390000] r7 : a0092f04 r6 : 00000100 r5 : a0092e0c r4 : > >> a0024ff4 [ 12.390000] r3 : 00004ff4 r2 : 00000000 r1 : > >> a0092e10 r0 : a0092e0c [ 12.390000] Flags: nzCv IRQs on FIQs > >> on Mode USER_26 ISA unknown Segment user > >> [ 12.390000] Backtrace: invalid frame pointer 0x00000803 > >> > >> From my observations it crashes in malloc() during allocation of > >> 16Kb stack for a new thread while trying to find and link a new > >> free area. > >> > >> Here is the app code. It's trivial: > >> > >> #include <stdio.h> > >> #include <stdlib.h> > >> #include <unistd.h> > >> #include <string.h> > >> #include <pthread.h> > >> > >> #define NUM_THREADS 10 > >> > >> pthread_t thread[NUM_THREADS] = {0}; > >> int thread_cnt = 0; > >> > >> void* start_routine(void *arg) > >> { > >> printf("new thread %d executed.\n", thread_cnt); > >> while(1) > >> { > >> sleep(1); > >> } > >> } > >> > >> void main() > >> { > >> int i; > >> int rv; > >> > >> for (i = 0; i < NUM_THREADS; i++) > >> { > >> rv = pthread_create(&thread[thread_cnt], NULL, > >> start_routine, NULL); > >> if (rv) > >> printf("<error> thread was not created! > >> Error num is : %d\n", rv); > >> printf("thread #%d created \n", thread_cnt); > >> thread_cnt++; > >> sleep(1); > >> } > >> while(1) > >> { > >> static int loop_cnt = 0; > >> printf("app loop: %d\n", loop_cnt); > >> sleep(1); > >> loop_cnt++; > >> if (loop_cnt == 10) > >> break; > >> } > >> } > >> > >> uClibc config is attached. > >> > >> Could someone please try it on M3 and tell me the results? > >> > >> Regards. > >> > >> > >> > >> > >> On Sat, Nov 1, 2014 at 10:52 AM, Sergei Poselenov > >> <[email protected] > >> > wrote: > >> > >>> Hello, > >>> > >>> On Thu, 2014-10-23 at 17:25 +0200, Bernhard Reutner-Fischer wrote: > >>> > On 22 October 2014 12:11:26 CEST, Sergei Poselenov < > >>> [email protected]> wrote: > >>> > >Hello, > >>> > > > >>> > > >>> > >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. > >>> > > >>> > Can you please send the two patches with appropriate > >>> > signed-off-by > >>> lines? > >>> > >>> I'm sending the patches made against the pristine 0.9.33.2 in the > >>> next emails. Note that the changes may be not quite portable, > >>> feel free to modify them. > >>> > >>> Regards, > >>> > >>> Sergei > >>> > TIA, > >>> > > >>> > >>> > >>> > >> > > _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
