-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi again,
With my little patch, valgrind/NTPL wine works like a charm (even with unreal2 and after too many errors) :) Now going to sleep Regards, Raphael Le Monday 03 November 2003 23:14, Raphaël Junqueira a écrit : > Le Monday 03 November 2003 23:06, Lionel Ulmer a écrit : > > > Trying to run valgrind on wine directx (running Unreal2 with nvidia > > > openGL drivers) > > > > I think it's best to use software GL when using Valgrind... It is > > reported to make the DRI crash and not support all syscalls needed by the > > NVIDIA GL drivers. > > well it seems NTPL-related (only one real reference of > pthread_attr_setstack, in ntdll): > > int SYSDEPS_SpawnThread( void (*func)(TEB *), TEB *teb ) > { > #ifdef HAVE_NPTL > pthread_t id; > pthread_attr_t attr; > > pthread_attr_init( &attr ); > pthread_attr_setstack( &attr, teb->DeallocationStack, > (char *)teb->Tib.StackBase - (char > *)teb->DeallocationStack ); > if (pthread_create( &id, &attr, (void * (*)(void *))func, teb )) return > -1; > return 0; > #elif defined(HAVE_CLONE) > <snip> > > Implementing it into valgrind is difficult ? > > > Anyway, I have a different issue : > > > > valgrind: vg_ldt.c:167 (vgPlain_do_useseg): Assertion (seg_selector & 7) > > == 7' failed. > > strange, valgrind love wine :p > > > Lionel > > Regards, > Raphael -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQE/puqlp7NA3AmQTU4RApWdAJ9GaAVd/YSxLtvKJzvvjRZi53GVzQCeKNCC KX7p0QikmBaAOqWwKsKWQjs= =+iec -----END PGP SIGNATURE-----
Seulement dans ./addrcheck: .deps Seulement dans ./addrcheck/docs: Makefile Seulement dans ./addrcheck: Makefile Seulement dans ./addrcheck/tests: Makefile Seulement dans ./auxprogs: .deps Seulement dans ./auxprogs: Makefile Seulement dans ./auxprogs: valgrind-listener Seulement dans ./cachegrind: cg_annotate Seulement dans ./cachegrind: .deps Seulement dans ./cachegrind/docs: Makefile Seulement dans ./cachegrind: Makefile Seulement dans ./cachegrind/tests: .deps Seulement dans ./cachegrind/tests: Makefile Seulement dans .: config.h Seulement dans .: config.log Seulement dans .: config.status Seulement dans ./corecheck: .deps Seulement dans ./corecheck/docs: Makefile Seulement dans ./corecheck: Makefile Seulement dans ./corecheck/tests: .deps Seulement dans ./corecheck/tests: Makefile Seulement dans ./coregrind/demangle: .deps Seulement dans ./coregrind/demangle: libdemangle.a Seulement dans ./coregrind/demangle: Makefile Seulement dans ./coregrind: .deps Seulement dans ./coregrind/docs: Makefile Seulement dans ./coregrind: .in_place Seulement dans ./coregrind: lib_replace_malloc.a Seulement dans ./coregrind: Makefile Seulement dans ./coregrind: valgrind Seulement dans ./coregrind: vg_include.h~ diff --exclude='*.*o' -r -u ../valgrind-20031012-wine/coregrind/vg_libpthread.c ./coregrind/vg_libpthread.c --- ../valgrind-20031012-wine/coregrind/vg_libpthread.c 2003-10-17 13:46:50.000000000 +0200 +++ ./coregrind/vg_libpthread.c 2003-11-04 00:44:12.000000000 +0100 @@ -377,6 +377,33 @@ barf(buf); } +WEAK +int pthread_attr_setstack (pthread_attr_t *__attr, + void* __stackaddr, + size_t __stacksize) +{ + size_t limit; + char buf[1024]; + ensure_valgrind("pthread_attr_setstack"); + limit = VG_PTHREAD_STACK_SIZE - VG_AR_CLIENT_STACKBASE_REDZONE_SZB; + if (__stacksize >= limit && NULL != __stackaddr) { + __attr->__stackaddr = __stackaddr; + __attr->__stacksize = __stacksize; + return 0; + } + if (__stacksize < limit) { + snprintf(buf, sizeof(buf), "pthread_attr_setstack: " + "requested size %d < VG_PTHREAD_STACK_SIZE - VG_AR_CLIENT_STACKBASE_REDZONE_SZ\n " + "edit vg_include.h and rebuild.", __stacksize); + } else if (NULL == __stackaddr) { + snprintf(buf, sizeof(buf), "pthread_attr_setstack: " + "requested with a null stack pointer."); + } + buf[sizeof(buf)-1] = '\0'; /* Make sure it is zero terminated */ + barf(buf); +} + + /* This is completely bogus. */ int pthread_attr_getschedparam(const pthread_attr_t *attr, @@ -721,6 +748,11 @@ int tid_child; NewThreadInfo* info; int (*clone_fn)( void* (*)(void *), void *, int, void * ); + struct { + int clone_flags; + void* user_stackaddr; + size_t user_stacksize; + } thread_create_info; ensure_valgrind("pthread_create"); @@ -733,10 +765,17 @@ info = my_malloc(sizeof(NewThreadInfo)); my_assert(info != NULL); - if (__attr) + if (__attr) { info->attr__detachstate = __attr->__detachstate; - else + thread_create_info.user_stackaddr = __attr->__stackaddr; + thread_create_info.user_stacksize = __attr->__stacksize; + } else { info->attr__detachstate = PTHREAD_CREATE_JOINABLE; + thread_create_info.user_stackaddr = NULL; + thread_create_info.user_stacksize = 0; + } + + thread_create_info.clone_flags = flags; info->root_fn = __start_routine; info->arg = __arg; @@ -746,7 +785,7 @@ VALGRIND_MAGIC_SEQUENCE(tid_child, VG_INVALID_THREADID /* default */, VG_USERREQ__APPLY_IN_NEW_THREAD, - &thread_wrapper, info, clone_fn, flags); + &thread_wrapper, info, clone_fn, &thread_create_info); my_assert(tid_child != VG_INVALID_THREADID); if (__thredd) Seulement dans ./coregrind: vg_libpthread.c~ diff --exclude='*.*o' -r -u ../valgrind-20031012-wine/coregrind/vg_libpthread_unimp.c ./coregrind/vg_libpthread_unimp.c --- ../valgrind-20031012-wine/coregrind/vg_libpthread_unimp.c 2003-10-17 13:46:50.000000000 +0200 +++ ./coregrind/vg_libpthread_unimp.c 2003-11-04 00:32:12.000000000 +0100 @@ -233,8 +233,8 @@ { vgPlain_unimp("pthread_attr_getstacksize"); } //__attribute__((weak)) void pthread_attr_setguardsize ( void ) // { vgPlain_unimp("pthread_attr_setguardsize"); } -__attribute__((weak)) void pthread_attr_setstack ( void ) - { vgPlain_unimp("pthread_attr_setstack"); } +//__attribute__((weak)) void pthread_attr_setstack ( void ) +// { vgPlain_unimp("pthread_attr_setstack"); } __attribute__((weak)) void pthread_attr_setstackaddr ( void ) { vgPlain_unimp("pthread_attr_setstackaddr"); } //__attribute__((weak)) void pthread_attr_setstacksize ( void ) Seulement dans ./coregrind: vg_libpthread_unimp.c~ diff --exclude='*.*o' -r -u ../valgrind-20031012-wine/coregrind/vg_scheduler.c ./coregrind/vg_scheduler.c --- ../valgrind-20031012-wine/coregrind/vg_scheduler.c 2003-10-17 13:46:50.000000000 +0200 +++ ./coregrind/vg_scheduler.c 2003-11-04 00:36:20.000000000 +0100 @@ -2148,8 +2148,8 @@ static -void do_pthread_join ( ThreadId tid, - ThreadId jee, void** thread_return ) +void do__pthread_join ( ThreadId tid, + ThreadId jee, void** thread_return ) { Char msg_buf[100]; ThreadId i; @@ -2291,17 +2291,25 @@ /* (Fn, Arg): Create a new thread and run Fn applied to Arg in it. Fn MUST NOT return -- ever. Eventually it will do either __QUIT or __WAIT_JOINER. Return the child tid to the parent. */ +typedef struct { + int clone_flags; + void* user_stackaddr; + size_t user_stacksize; +} thread_create_info; + static void do__apply_in_new_thread ( ThreadId parent_tid, void* (*fn)(void *), void* arg, int (*clone_fn)( void* (*)(void *), void *, int, void * ), - int clone_flags ) + void* info ) { Addr new_stack; UInt new_stk_szb; ThreadId tid; Char msg_buf[100]; + thread_create_info* t_info = (thread_create_info*) info; + int clone_flags = t_info->clone_flags; /* Paranoia ... */ vg_assert(sizeof(pthread_t) == sizeof(UInt)); @@ -2345,18 +2353,22 @@ is inadequate. */ new_stk_szb = VG_PTHREAD_STACK_MIN; + VG_(threads)[tid].stack_size = t_info->user_stacksize; + if (new_stk_szb > VG_(threads)[tid].stack_size) { /* Again, for good measure :) We definitely don't want to be allocating a stack for the main thread. */ vg_assert(tid != 1); /* for now, we don't handle the case of anything other than assigning it for the first time. */ - vg_assert(VG_(threads)[tid].stack_size == 0); + /*vg_assert(VG_(threads)[tid].stack_size == 0); * setstack support now */ vg_assert(VG_(threads)[tid].stack_base == (Addr)NULL); new_stack = (Addr)VG_(get_memory_from_mmap)( new_stk_szb, "new thread stack" ); VG_(threads)[tid].stack_base = new_stack; VG_(threads)[tid].stack_size = new_stk_szb; + } else { + VG_(threads)[tid].stack_base = (Addr)t_info->user_stackaddr; /* user allocated stack seems correct so use it */ } /* always recalculate this in case someone switched stack on the @@ -2441,7 +2453,6 @@ SET_PTHREQ_RETVAL(parent_tid, tid); /* success */ } - /* ----------------------------------------------------------- MUTEXes -------------------------------------------------------- */ @@ -3532,7 +3543,7 @@ break; case VG_USERREQ__PTHREAD_JOIN: - do_pthread_join( tid, arg[1], (void**)(arg[2]) ); + do__pthread_join( tid, arg[1], (void**)(arg[2]) ); break; case VG_USERREQ__PTHREAD_COND_WAIT: @@ -3629,7 +3640,7 @@ case VG_USERREQ__APPLY_IN_NEW_THREAD: do__apply_in_new_thread ( tid, (void*(*)(void*))arg[1], - (void*)arg[2], (void*)arg[3], (int)arg[4] ); + (void*)arg[2], (void*)arg[3], (void*)arg[4] ); break; case VG_USERREQ__GET_KEY_D_AND_S: Seulement dans ./coregrind: vg_scheduler.c~ Seulement dans .: default.supp Seulement dans ./docs: Makefile Seulement dans ./helgrind: .deps Seulement dans ./helgrind/docs: Makefile Seulement dans ./helgrind: Makefile Seulement dans ./helgrind/tests: Makefile Seulement dans ./include: Makefile Seulement dans ./lackey: .deps Seulement dans ./lackey/docs: Makefile Seulement dans ./lackey: Makefile Seulement dans ./lackey/tests: Makefile Seulement dans .: Makefile Seulement dans ./memcheck: .deps Seulement dans ./memcheck/docs: Makefile Seulement dans ./memcheck: Makefile Seulement dans ./memcheck/tests: .deps Seulement dans ./memcheck/tests: Makefile Seulement dans ./none: .deps Seulement dans ./none/docs: Makefile Seulement dans ./none: Makefile Seulement dans ./none/tests: .deps Seulement dans ./none/tests: Makefile Seulement dans .: stamp-h1 Seulement dans ./tests: .deps Seulement dans ./tests: Makefile Seulement dans ./tests/unused: Makefile Seulement dans ./tests: vg_regtest Seulement dans .: valgrind.spec