2009-06-08 Hans Boehm <Hans.Boehm@hp.com> (Really Ivan Maidanski
authorhboehm <hboehm>
Tue, 9 Jun 2009 06:06:40 +0000 (06:06 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:45 +0000 (21:06 +0400)
and Zoltan Varga)
        * darwin_stop_world.c (GC_push_all_stacks): Recognize ARM32.
        * include/private/gc_priv.h (GC_THREAD_STATE_T): Define for ARM32
        (Darwin only).
        * include/private/gcconfig.h: Add machine-specific part for DARWIN.
        * include/private/gcconfig.h (ARM32): Define config parameters for
        DARWIN (iPhone).

ChangeLog
darwin_stop_world.c
include/private/gc_priv.h
include/private/gcconfig.h

index 8d4e215..df389db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-06-08  Hans Boehm <Hans.Boehm@hp.com> (Really Ivan Maidanski
+       and Zoltan Varga)
+        * darwin_stop_world.c (GC_push_all_stacks): Recognize ARM32.
+        * include/private/gc_priv.h (GC_THREAD_STATE_T): Define for ARM32
+        (Darwin only).
+        * include/private/gcconfig.h: Add machine-specific part for DARWIN.
+        * include/private/gcconfig.h (ARM32): Define config parameters for
+        DARWIN (iPhone).
+
 2009-06-08  Hans Boehm <Hans.Boehm@hp.com> (Really Ivan Maidanski)
        (diff91_cvs: resembling diff3, diff27, diff33, diff45, diff47, diff49,
        diff60, diff67, diff68 partly)
index 36cd824..b935146 100644 (file)
@@ -177,8 +177,30 @@ void GC_push_all_stacks(void)
          GC_push_one(state . THREAD_FLD (r29));
          GC_push_one(state . THREAD_FLD (r30));
          GC_push_one(state . THREAD_FLD (r31));
+
+#      elif defined(ARM32)
+         lo = (void*)state.__sp;
+
+         GC_push_one(state.__r[0]);
+         GC_push_one(state.__r[1]);
+         GC_push_one(state.__r[2]);
+         GC_push_one(state.__r[3]);
+         GC_push_one(state.__r[4]);
+         GC_push_one(state.__r[5]);
+         GC_push_one(state.__r[6]);
+         GC_push_one(state.__r[7]);
+         GC_push_one(state.__r[8]);
+         GC_push_one(state.__r[9]);
+         GC_push_one(state.__r[10]);
+         GC_push_one(state.__r[11]);
+         GC_push_one(state.__r[12]);
+         /* GC_push_one(state.__sp); */
+         GC_push_one(state.__lr);
+         GC_push_one(state.__pc);
+         GC_push_one(state.__cpsr);
+
 #      else
-#        error FIXME for non-x86 || ppc architectures
+#        error FIXME for non-x86 || ppc || arm architectures
 #      endif
       } /* p != me */
       if(p->flags & MAIN_THREAD)
@@ -326,8 +348,38 @@ void GC_push_all_stacks(void)
        GC_push_one(info . THREAD_FLD (fs));
        GC_push_one(info . THREAD_FLD (gs));
 
+#      elif defined(ARM32)
+       GC_THREAD_STATE_T info;
+       mach_msg_type_number_t outCount = THREAD_STATE_MAX;
+       r = thread_get_state(thread, GC_MACH_THREAD_STATE, (natural_t *)&info,
+                            &outCount);
+       if(r != KERN_SUCCESS)
+         ABORT("task_get_state failed");
+
+       hi = (ptr_t)FindTopOfStack(info . __sp);
+
+       lo = (void*)info.__sp;
+
+       GC_push_one(info.__r[0]);
+       GC_push_one(info.__r[1]);
+       GC_push_one(info.__r[2]);
+       GC_push_one(info.__r[3]);
+       GC_push_one(info.__r[4]);
+       GC_push_one(info.__r[5]);
+       GC_push_one(info.__r[6]);
+       GC_push_one(info.__r[7]);
+       GC_push_one(info.__r[8]);
+       GC_push_one(info.__r[9]);
+       GC_push_one(info.__r[10]);
+       GC_push_one(info.__r[11]);
+       GC_push_one(info.__r[12]);
+       /* GC_push_one(info.__sp); */
+       GC_push_one(info.__lr);
+       GC_push_one(info.__pc);
+       GC_push_one(info.__cpsr);
+
 #     else
-#      error FIXME for non-x86 || ppc architectures
+#      error FIXME for non-x86 || ppc || arm architectures
 #     endif
       }
 #     if DEBUG_THREADS
index 4036394..616173f 100644 (file)
@@ -406,7 +406,11 @@ extern GC_warn_proc GC_current_warn_proc;
 #                 define GC_GETSECTBYNAME getsectbynamefromheader_64
 #               endif
 #      else
-#              error define GC_THREAD_STATE_T
+#              if defined(ARM32)
+#                define GC_THREAD_STATE_T arm_thread_state_t
+#              else
+#                error define GC_THREAD_STATE_T
+#              endif
 #              define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE
 #              define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
 #      endif
index 0aea9a6..98d61f9 100644 (file)
 #    define FREEBSD
 # endif
 
+/* And one for Darwin: */
+# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__))
+#   define DARWIN
+# endif
+
 /* Determine the machine type: */
 # if defined(__arm__) || defined(__thumb__)
 #    define ARM32
-#    if !defined(LINUX) && !defined(NETBSD)
+#    if !defined(LINUX) && !defined(NETBSD) && !defined(DARWIN)
 #      define NOSYS
 #      define mach_type_known
 #    endif
 #   define MACOS
 #   define mach_type_known
 # endif
-# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__))
-#   define DARWIN
+# if defined(DARWIN)
 #   if defined(__ppc__)  || defined(__ppc64__)
 #    define POWERPC
 #    define mach_type_known
 #   elif defined(__i386__)
 #    define I386
 #    define mach_type_known
+#   elif defined(__arm__)
+#    define ARM32
+#    define mach_type_known
+#    define DARWIN_DONT_PARSE_STACK
 #   endif
 # endif
 # if defined(NeXT) && defined(mc68000)
 #     define OS_TYPE "MSWINCE"
 #     define DATAEND /* not needed */
 #   endif
+#   ifdef DARWIN
+      /* iPhone */
+#     define OS_TYPE "DARWIN"
+#     define DATASTART ((ptr_t) get_etext())
+#     define DATAEND   ((ptr_t) get_end())
+/* #define STACKBOTTOM ((ptr_t) 0x30000000) */ /* FIXME: Is this needed? */
+#     define HEURISTIC1
+#     define USE_MMAP
+#     define USE_MMAP_ANON
+#   endif
 #   ifdef NOSYS
       /* __data_start is usually defined in the target linker script.  */
       extern int __data_start[];