2010-04-24 Marek Habersack <mhabersack@novell.com>
[mono.git] / libgc / os_dep.c
index e92a9ef636c4ec2dbdb32a3109696df383c6d5f2..3a4b8a006338990cd3c02700d29314bf61e423f5 100644 (file)
@@ -54,7 +54,7 @@
 # endif
 
 # include <stdio.h>
-# if defined(MSWINCE)
+# if defined(MSWINCE) || defined (SN_TARGET_PS3)
 #   define SIGSEGV 0 /* value is irrelevant */
 # else
 #   include <signal.h>
@@ -336,6 +336,13 @@ char *GC_parse_map_entry(char *buf_ptr, word *start, word *end,
   {
     extern ptr_t GC_find_limit();
 
+       if (GC_no_dls)
+               /* 
+                * Not needed, avoids the SIGSEGV caused by GC_find_limit which
+                * complicates debugging.
+                */
+               return;
+
 #   ifdef LINUX
       /* Try the easy approaches first:        */
       if ((ptr_t)__data_start != 0) {
@@ -504,7 +511,7 @@ void GC_enable_signals(void)
 #  if !defined(PCR) && !defined(AMIGA) && !defined(MSWIN32) \
       && !defined(MSWINCE) \
       && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW) \
-      && !defined(NOSYS) && !defined(ECOS)
+      && !defined(NOSYS) && !defined(ECOS) && !defined(SN_TARGET_PS3)
 
 #   if defined(sigmask) && !defined(UTS4) && !defined(HURD)
        /* Use the traditional BSD interface */
@@ -1396,7 +1403,7 @@ int * etext_addr;
 }
 # endif
 
-# if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__)) && !defined(PCR)
+# if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__) ||  defined(__x86_64__)) && !defined(PCR)
 /* Its unclear whether this should be identical to the above, or       */
 /* whether it should apply to non-X86 architectures.                   */
 /* For now we don't assume that there is always an empty page after    */
@@ -1449,8 +1456,10 @@ void GC_register_data_segments()
        /* hanging from it.  We're on thin ice here ...                 */
         extern caddr_t sbrk();
 
+       GC_ASSERT(DATASTART);
        GC_add_roots_inner(DATASTART, (char *)sbrk(0), FALSE);
 #     else
+       GC_ASSERT(DATASTART);
        GC_add_roots_inner(DATASTART, (char *)(DATAEND), FALSE);
 #       if defined(DATASTART2)
          GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), FALSE);
@@ -1505,7 +1514,7 @@ void GC_register_data_segments()
 
 # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \
        && !defined(MSWIN32) && !defined(MSWINCE) \
-       && !defined(MACOS) && !defined(DOS4GW)
+       && !defined(MACOS) && !defined(DOS4GW) && !defined(SN_TARGET_PS3)
 
 # ifdef SUNOS4
     extern caddr_t sbrk();
@@ -2079,6 +2088,16 @@ void GC_default_push_other_roots GC_PROTO((void))
 }
 
 # endif /* GC_SOLARIS_THREADS || GC_PTHREADS */
+#ifdef SN_TARGET_PS3
+void GC_default_push_other_roots GC_PROTO((void))
+{
+       printf ("WARNING WARNING WARNING\nGC_default_push_other_roots is not implemented\n");
+}
+void GC_push_thread_structures GC_PROTO((void))
+{
+       printf ("WARNING WARNING WARNING\nGC_default_push_thread_structures is not implemented\n");
+}
+#endif
 
 void (*GC_push_other_roots) GC_PROTO((void)) = GC_default_push_other_roots;
 
@@ -3702,7 +3721,7 @@ void GC_dirty_init() {
         mask,
         GC_ports.exception,
         EXCEPTION_DEFAULT,
-        MACHINE_THREAD_STATE
+        GC_MACH_THREAD_STATE_FLAVOR
     );
     if(r != KERN_SUCCESS) ABORT("task_set_exception_ports failed");