[Mono-dev] NetBSD patches

kangaroo grompf at sublimeintervention.com
Mon Jan 29 10:36:33 EST 2007


Bah,

  My apologies for that.  I just did a svn diff of my tree and autogen 
makes those changes to tests-config on bsd.  I wouldn't have committed it :)

Here's an updated patch that fixes that; as well as moves the 
MONO_ARCH_USE_SIGACTION to the right place.

-g

Zoltan Varga wrote:
> Hi,
>
> The non libgc changes seem ok to check in, except the mono/tests/tests-config
> change, which seems to break other archs.
>
>             Zoltan
>
> On 1/29/07, kangaroo <grompf at sublimeintervention.com> wrote:
>   
>> I spent some time this weekend forward porting the patches from the
>> netbsd pkgsrc repository (created by recht, drochner, rillig of NetBSD).
>>
>> Mono trunk with these patches compiles on netbsd and runs.
>>
>> The changes are primarly to the gc; however there are some in mono to
>> deal with differences in the ucontext structure.
>>
>> -g
>>
>>
>>
>> Index: libgc/include/gc_pthread_redirects.h
>> ===================================================================
>> --- libgc/include/gc_pthread_redirects.h        (revision 71775)
>> +++ libgc/include/gc_pthread_redirects.h        (working copy)
>> @@ -74,7 +74,10 @@
>>  # define pthread_join GC_pthread_join
>>  # define pthread_detach GC_pthread_detach
>>
>> -#ifndef GC_DARWIN_THREADS
>> +#ifndef GC_DARWIN_THREADS
>> +# ifdef GC_NETBSD_THREADS
>> +#  undef pthread_sigmask
>> +# endif
>>  # define pthread_sigmask GC_pthread_sigmask
>>  # define dlopen GC_dlopen
>>  #endif
>> Index: libgc/include/gc_config_macros.h
>> ===================================================================
>> --- libgc/include/gc_config_macros.h    (revision 71775)
>> +++ libgc/include/gc_config_macros.h    (working copy)
>> @@ -56,7 +56,7 @@
>>         defined(GC_IRIX_THREADS) || defined(GC_LINUX_THREADS) || \
>>         defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) || \
>>         defined(GC_DGUX386_THREADS) || defined(GC_DARWIN_THREADS) || \
>> -       defined(GC_AIX_THREADS) || \
>> +       defined(GC_AIX_THREADS) || defined(GC_NETBSD_THREADS) || \
>>          (defined(GC_WIN32_THREADS) && defined(__CYGWIN32__))
>>  #   define GC_PTHREADS
>>  # endif
>> Index: libgc/include/private/gc_priv.h
>> ===================================================================
>> --- libgc/include/private/gc_priv.h     (revision 71775)
>> +++ libgc/include/private/gc_priv.h     (working copy)
>> @@ -1956,7 +1956,7 @@
>>    /* in Linux glibc, but it's not exported.)  Thus we continue to use  */
>>    /* the same hard-coded signals we've always used.                    */
>>  #  if !defined(SIG_SUSPEND)
>> -#   if defined(GC_LINUX_THREADS) || defined(GC_DGUX386_THREADS)
>> +#   if defined(GC_LINUX_THREADS) || defined(GC_DGUX386_THREADS) || defined(GC_NETBSD_THREADS)
>>  #    if defined(SPARC) && !defined(SIGPWR)
>>         /* SPARC/Linux doesn't properly define SIGPWR in <signal.h>.
>>          * It is aliased to SIGLOST in asm/signal.h, though.            */
>> Index: libgc/configure.in
>> ===================================================================
>> --- libgc/configure.in  (revision 71775)
>> +++ libgc/configure.in  (working copy)
>> @@ -151,6 +151,14 @@
>>           AC_DEFINE(PARALLEL_MARK)
>>         fi
>>         ;;
>> +     *-*-netbsd*)
>> +       AC_DEFINE(GC_NETBSD_THREADS)
>> +       AC_DEFINE(THREAD_LOCAL_ALLOC)
>> +       if test "${enable_parallel_mark}" = yes; then
>> +         AC_DEFINE(PARALLEL_MARK)
>> +       fi
>> +       AC_DEFINE(THREAD_LOCAL_ALLOC)
>> +       ;;
>>       *-*-osf*)
>>         AC_DEFINE(GC_OSF1_THREADS)
>>          if test "${enable_parallel_mark}" = yes; then
>> Index: libgc/pthread_stop_world.c
>> ===================================================================
>> --- libgc/pthread_stop_world.c  (revision 71775)
>> +++ libgc/pthread_stop_world.c  (working copy)
>> @@ -111,6 +111,7 @@
>>  #  endif
>>  #endif
>>
>> +#if !defined(GC_NETBSD_THREADS)
>>  sem_t GC_suspend_ack_sem;
>>
>>  static void _GC_suspend_handler(int sig)
>> @@ -220,6 +221,7 @@
>>      GC_printf1("In GC_restart_handler for 0x%lx\n", pthread_self());
>>  #endif
>>  }
>> +#endif /* !GC_NETBSD_THREADS */
>>
>>  # ifdef IA64
>>  #   define IF_IA64(x) x
>> @@ -295,12 +297,14 @@
>>        ABORT("Collecting from unknown thread.");
>>  }
>>
>> +#if !defined(GC_NETBSD_THREADS)
>>  void GC_restart_handler(int sig)
>>  {
>>         int old_errno = errno;
>>         _GC_restart_handler (sig);
>>         errno = old_errno;
>>  }
>> +#endif
>>
>>  /* We hold allocation lock.  Should do exactly the right thing if the  */
>>  /* world is stopped.  Should not fail if it isn't.                     */
>> @@ -309,6 +313,28 @@
>>      pthread_push_all_stacks();
>>  }
>>
>> +#if defined(GC_NETBSD_THREADS)
>> +/*
>> + * Get the stack start address for the specified address.
>> + */
>> +int
>> +np_stackinfo(pthread_t p, void **addr)
>> +{
>> +       pthread_attr_t attr;
>> +       int ret = -1;
>> +
>> +       if (pthread_attr_init(&attr))
>> +               return -1;
>> +
>> +       if (!pthread_attr_get_np(p, &attr))
>> +               if (!pthread_attr_getstackaddr(&attr, addr))
>> +                       ret = 0;
>> +
>> +       pthread_attr_destroy(&attr);
>> +       return ret;
>> +}
>> +#endif
>> +
>>  /* There seems to be a very rare thread stopping problem.  To help us  */
>>  /* debug that, we save the ids of the stopping thread. */
>>  pthread_t GC_stopping_thread;
>> @@ -334,6 +360,7 @@
>>              if (p -> stop_info.last_stop_count == GC_stop_count) continue;
>>             if (p -> thread_blocked) /* Will wait */ continue;
>>              n_live_threads++;
>> +#if !defined(GC_NETBSD_THREADS)
>>             #if DEBUG_THREADS
>>               GC_printf1("Sending suspend signal to 0x%lx\n", p -> id);
>>             #endif
>> @@ -349,6 +376,23 @@
>>                  default:
>>                      ABORT("pthread_kill failed");
>>              }
>> +#else
>> +           #if DEBUG_THREADS
>> +             GC_printf1("Suspending 0x%lx ...\n", p -> id);
>> +           #endif
>> +
>> +               if(pthread_suspend_np(p -> id) != 0)
>> +                       GC_printf1("Could not susend thread... 0x%lx\n", p -> id);
>> +
>> +               /* Right now, this is not enough. Retreiving the stack base address is not the correct */
>> +               /* info to give to the GC, but since there is no way to get the current stack pointer  */
>> +               /* for the suspended thread, base pointer will have to be enough. Mono seems to be     */
>> +               /* happy with it so... */
>> +               if(np_stackinfo(p -> id, &(p -> stop_info.stack_ptr)) != 0)
>> +                       GC_err_printf1("Could not get thread stack address... 0x%lx\n", p -> id);
>> +
>> +        n_live_threads--;
>> +#endif /* !GC_NETBSD_THREADS */
>>          }
>>        }
>>      }
>> @@ -368,6 +412,7 @@
>>
>>      n_live_threads = GC_suspend_all();
>>
>> +#if !defined(GC_NETBSD_THREADS)
>>        if (GC_retry_signals) {
>>           unsigned long wait_usecs = 0;  /* Total wait since retry.     */
>>  #        define WAIT_UNIT 3000
>> @@ -405,6 +450,8 @@
>>               }
>>           }
>>      }
>> +#endif /* !GC_NETBSD_THREADS */
>> +
>>      #if DEBUG_THREADS
>>        GC_printf1("World stopped from 0x%lx\n", pthread_self());
>>      #endif
>> @@ -456,6 +503,7 @@
>>              if (p -> flags & FINISHED) continue;
>>             if (p -> thread_blocked) continue;
>>              n_live_threads++;
>> +#if !defined(GC_NETBSD_THREADS)
>>             #if DEBUG_THREADS
>>               GC_printf1("Sending restart signal to 0x%lx\n", p -> id);
>>             #endif
>> @@ -471,10 +519,18 @@
>>                  default:
>>                      ABORT("pthread_kill failed");
>>              }
>> +#else
>> +           #if DEBUG_THREADS
>> +             GC_printf1("Resuming Thread 0x%lx\n", p -> id);
>> +           #endif
>> +               pthread_resume_np(p -> id);
>> +               n_live_threads--;
>> +#endif /* !GC_NETBSD_THREADS */
>>          }
>>        }
>>      }
>>
>> +#if !defined(GC_NETBSD_THREADS)
>>      #if DEBUG_THREADS
>>      GC_printf0 ("All threads signaled");
>>      #endif
>> @@ -487,6 +543,7 @@
>>             }
>>         }
>>      }
>> +#endif /* !GC_NETBSD_THREADS */
>>
>>      #if DEBUG_THREADS
>>        GC_printf0("World started\n");
>> @@ -504,6 +561,8 @@
>>  }
>>
>>  static void pthread_stop_init() {
>> +
>> +#if !defined(GC_NETBSD_THREADS)
>>      struct sigaction act;
>>
>>      if (sem_init(&GC_suspend_ack_sem, 0, 0) != 0)
>> @@ -544,6 +603,16 @@
>>                GC_printf0("Will retry suspend signal if necessary.\n");
>>           }
>>  #     endif
>> +#else
>> +    struct sigaction act;
>> +
>> +    act.sa_flags = SA_RESTART;
>> +    if (sigfillset(&act.sa_mask) != 0) {
>> +       ABORT("sigfillset() failed");
>> +    }
>> +    GC_remove_allowed_signals(&act.sa_mask);
>> +
>> +#endif /* !GC_NETBSD_THREADS */
>>  }
>>
>>  /* We hold the allocation lock.        */
>> Index: libgc/pthread_support.c
>> ===================================================================
>> --- libgc/pthread_support.c     (revision 71775)
>> +++ libgc/pthread_support.c     (working copy)
>> @@ -67,8 +67,8 @@
>>  # endif
>>
>>  # if (defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) || \
>> -      defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) \
>> -      && !defined(USE_PTHREAD_SPECIFIC)
>> +      defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) || \
>> +      defined(GC_NETBSD_THREADS) && !defined(USE_PTHREAD_SPECIFIC)
>>  #   define USE_PTHREAD_SPECIFIC
>>  # endif
>>
>> @@ -126,8 +126,13 @@
>>  # include <sys/sysctl.h>
>>  #endif /* GC_DARWIN_THREADS */
>>
>> +#if defined(GC_NETBSD_THREADS)
>> +# include <sys/param.h>
>> +# include <sys/sysctl.h>
>> +#endif
>>
>>
>> +
>>  #if defined(GC_DGUX386_THREADS)
>>  # include <sys/dg_sys_info.h>
>>  # include <sys/_int_psem.h>
>> @@ -1013,7 +1018,7 @@
>>           GC_nprocs = sysconf(_SC_NPROC_ONLN);
>>           if (GC_nprocs <= 0) GC_nprocs = 1;
>>  #       endif
>> -#       if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
>> +#       if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS) || defined(GC_NETBSD_THREADS)
>>           int ncpus = 1;
>>           size_t len = sizeof(ncpus);
>>           sysctl((int[2]) {CTL_HW, HW_NCPU}, 2, &ncpus, &len, NULL, 0);
>> Index: libgc/specific.c
>> ===================================================================
>> --- libgc/specific.c    (revision 71775)
>> +++ libgc/specific.c    (working copy)
>> @@ -13,7 +13,7 @@
>>
>>  #include "private/gc_priv.h" /* For GC_compare_and_exchange, GC_memory_barrier */
>>
>> -#if defined(GC_LINUX_THREADS)
>> +#if defined(GC_LINUX_THREADS) || defined(GC_NETBSD_THREADS)
>>
>>  #include "private/specific.h"
>>
>> Index: libgc/dyn_load.c
>> ===================================================================
>> --- libgc/dyn_load.c    (revision 71775)
>> +++ libgc/dyn_load.c    (working copy)
>> @@ -75,6 +75,11 @@
>>  #   include <dlfcn.h>
>>  #   include <link.h>
>>  #endif
>> +
>> +#ifdef NETBSD
>> +#include <dlfcn.h>
>> +#endif
>> +
>>  #ifdef SUNOS4
>>  #   include <dlfcn.h>
>>  #   include <link.h>
>> @@ -519,6 +524,31 @@
>>                  break;
>>              }
>>          }
>> +
>> +#if defined(NETBSD)
>> +#undef dlopen
>> +#undef dlsym
>> +#undef dlclose
>> +               /* This is a hack. For now, it seems that NetBSD 2.0 does not provide
>> +                  a _DYNAMIC with the neccessary DT_DEBUG information. A simple dlopen(0, RTLD_LAZY)
>> +                  does the job. Maybe a NetBSD guru could explain this...
>> +            */
>> +               if(cachedResult == 0) {
>> +                       void* startupSyms = dlopen(0, RTLD_LAZY);
>> +                       dp = (ElfW(Dyn)*)dlsym(startupSyms, "_DYNAMIC");
>> +
>> +                       for(; (tag = dp->d_tag) != 0; dp++ ) {
>> +                               if( tag == DT_DEBUG ) {
>> +                                       struct link_map *lm
>> +                                                       = ((struct r_debug *)(dp->d_un.d_ptr))->r_map;
>> +                                       if( lm != 0 ) cachedResult = lm->l_next; /* might be NIL */
>> +                                       break;
>> +                               }
>> +                       }
>> +
>> +                       dlclose(startupSyms);
>> +               }
>> +#endif
>>      }
>>      return cachedResult;
>>  }
>> Index: mono/io-layer/collection.c
>> ===================================================================
>> --- mono/io-layer/collection.c  (revision 71775)
>> +++ mono/io-layer/collection.c  (working copy)
>> @@ -60,7 +60,7 @@
>>         g_assert (ret == 0);
>>
>>  #ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE
>> -#ifdef __FreeBSD__
>> +#if defined(__FreeBSD__) || defined(__NetBSD__)
>>         ret = pthread_attr_setstacksize (&attr, 65536);
>>  #else
>>         ret = pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
>> Index: mono/mini/mini-x86.h
>> ===================================================================
>> --- mono/mini/mini-x86.h        (revision 71775)
>> +++ mono/mini/mini-x86.h        (working copy)
>> @@ -53,6 +53,10 @@
>>  #define MONO_ARCH_SIGSEGV_ON_ALTSTACK
>>  #define MONO_ARCH_USE_SIGACTION
>>
>> +#else
>> +#ifdef __NetBSD__
>> +#define MONO_ARCH_USE_SIGACTION
>> +#endif
>>  #endif /* HAVE_WORKING_SIGALTSTACK */
>>  #endif /* !PLATFORM_WIN32 */
>>
>> @@ -153,6 +157,16 @@
>>         #define UCONTEXT_REG_ESI(ctx) ((ctx)->uc_mcontext->ss.esi)
>>         #define UCONTEXT_REG_EDI(ctx) ((ctx)->uc_mcontext->ss.edi)
>>         #define UCONTEXT_REG_EIP(ctx) ((ctx)->uc_mcontext->ss.eip)
>> +#elif defined(__NetBSD__)
>> +       #define UCONTEXT_REG_EAX(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EAX])
>> +       #define UCONTEXT_REG_EBX(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EBX])
>> +       #define UCONTEXT_REG_ECX(ctx) ((ctx)->uc_mcontext.__gregs [_REG_ECX])
>> +       #define UCONTEXT_REG_EDX(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EDX])
>> +       #define UCONTEXT_REG_EBP(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EBP])
>> +       #define UCONTEXT_REG_ESP(ctx) ((ctx)->uc_mcontext.__gregs [_REG_ESP])
>> +       #define UCONTEXT_REG_ESI(ctx) ((ctx)->uc_mcontext.__gregs [_REG_ESI])
>> +       #define UCONTEXT_REG_EDI(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EDI])
>> +       #define UCONTEXT_REG_EIP(ctx) ((ctx)->uc_mcontext.__gregs [_REG_EIP])
>>  #else
>>         #define UCONTEXT_REG_EAX(ctx) ((ctx)->uc_mcontext.gregs [REG_EAX])
>>         #define UCONTEXT_REG_EBX(ctx) ((ctx)->uc_mcontext.gregs [REG_EBX])
>> Index: mono/tests/tests-config
>> ===================================================================
>> --- mono/tests/tests-config     (revision 71775)
>> +++ mono/tests/tests-config     (working copy)
>> @@ -1,5 +1,5 @@
>>  <configuration>
>> -       <dllmap dll="cygwin1.dll" target="libc.so.6" />
>> -       <dllmap dll="libc" target="libc.so.6" />
>> +       <dllmap dll="cygwin1.dll" target="libc.so.12" />
>> +       <dllmap dll="libc" target="libc.so.12" />
>>  </configuration>
>>
>> Index: configure.in
>> ===================================================================
>> --- configure.in        (revision 71775)
>> +++ configure.in        (working copy)
>> @@ -82,14 +82,16 @@
>>                 ;;
>>         *-*-*netbsd*)
>>                 platform_win32=no
>> -               CPPFLAGS="$CPPFLAGS -D_REENTRANT"
>> +               CPPFLAGS="$CPPFLAGS -D_REENTRANT -DGC_NETBSD_THREADS -D_GNU_SOURCE"
>>                 libmono_cflags="-D_REENTRANT"
>>                 LDFLAGS="$LDFLAGS -pthread"
>>                 CPPFLAGS="$CPPFLAGS -DPLATFORM_BSD"
>>                 libmono_ldflags="-pthread"
>>                 need_link_unlink=yes
>> -               libdl=
>> -               libgc_threads=no
>> +               libdl="-ldl /libexec/ld.elf_so"
>> +               libgc_threads=pthreads
>> +               with_tls=__thread
>> +               with_sigaltstack=no
>>                 ;;
>>  # these flags will work for all versions of -STABLE
>>  #
>>
>>
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>
>>
>>
>>     
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>   




More information about the Mono-devel-list mailing list