Browse Source

Robin Getz from blackfin.uclinux.org writes:
Bernd Schmidt found/fixed this problem in uClibc:

http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=882&group_id=17&atid=141

Basically, the uClinux dist includes a few thread demos - thdm and bcdm -
running them simultaneously sometimes causes bus errors.

Bernd wrote:
>They occur in pthread_handle_sigrestart; thread_self returns a bogus value.
>I managed to capture a debugging log, it's attached as bad-log. If you
>look at it you'll notice that the initial stack bounds are bogus: bottom
>of stack is higher than top of stack. This appears to be because of a bug
>in NOMMU_INITIAL_THREAD_BOUNDS(tos,bos): if a new thread has a BOS equal
>to the initial thread's current TOS, it'll munge the initial thread's
>stack bounds. Fixed with the attached patch, which I've committed.
>This should fix the crashes people have seen, but since the bug was always
>hard to reproduce, I can't be 100% certain they are gone. Please retest,
>everyone...

This patch was made against our cvs, which has an older version of uClibc
in it - this code was recently moved from internals.h to descr.h in the
uclibc svn, but it still has the same problem

Mike Frysinger 18 năm trước cách đây
mục cha
commit
021fb898d3
1 tập tin đã thay đổi với 4 bổ sung1 xóa
  1. 4 1
      libpthread/linuxthreads/descr.h

+ 4 - 1
libpthread/linuxthreads/descr.h

@@ -214,7 +214,10 @@ struct _pthread_descr_struct
 extern char *__pthread_initial_thread_bos;
 #ifndef __ARCH_HAS_MMU__
 extern char *__pthread_initial_thread_tos;
-#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) if ((tos)>=__pthread_initial_thread_bos && (bos)<=__pthread_initial_thread_tos) __pthread_initial_thread_bos = (tos)+1
+#define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) \
+    if ((tos)>=__pthread_initial_thread_bos \
+	&& (bos)<__pthread_initial_thread_tos) \
+	__pthread_initial_thread_bos = (tos)+1
 #else
 #define NOMMU_INITIAL_THREAD_BOUNDS(tos,bos) /* empty */
 #endif /* __ARCH_HAS_MMU__ */