diff options
author | hboehm <hboehm> | 2009-06-09 06:06:40 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-26 21:06:45 +0400 |
commit | e68f38cbcb4fdf46412738205e5316e27cfe6c7d (patch) | |
tree | b9d85b8c9a8309ede5f01a56f3f0dd2a1b815b21 /darwin_stop_world.c | |
parent | d52c112e09817469c2734b8554672003dc11ed7b (diff) | |
download | bdwgc-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.c | 56 |
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 |