summaryrefslogtreecommitdiff
path: root/darwin_stop_world.c
diff options
context:
space:
mode:
authorhboehm <hboehm>2009-06-09 06:06:40 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-26 21:06:45 +0400
commite68f38cbcb4fdf46412738205e5316e27cfe6c7d (patch)
treeb9d85b8c9a8309ede5f01a56f3f0dd2a1b815b21 /darwin_stop_world.c
parentd52c112e09817469c2734b8554672003dc11ed7b (diff)
downloadbdwgc-e68f38cbcb4fdf46412738205e5316e27cfe6c7d.tar.gz
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).
Diffstat (limited to 'darwin_stop_world.c')
-rw-r--r--darwin_stop_world.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/darwin_stop_world.c b/darwin_stop_world.c
index 36cd8248..b935146a 100644
--- a/darwin_stop_world.c
+++ b/darwin_stop_world.c
@@ -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