diff options
author | Geoff Norton <grompf@sublimeintervention.com> | 2007-11-01 22:02:09 +0300 |
---|---|---|
committer | Geoff Norton <grompf@sublimeintervention.com> | 2007-11-01 22:02:09 +0300 |
commit | a233db44c6a5c88de9ce15bf804b52279bd65100 (patch) | |
tree | 51fc31deb76bb285a4785e74b5bb1fd5219cb859 /libgc/darwin_stop_world.c | |
parent | 62849ba88958ea97328595705f213e86a73448db (diff) |
2007-11-01 Geoff Norton <gnorton@novell.com>
* darwin_stop_world.c: Handle Leopards renaming of some structure
members.
svn path=/trunk/mono/; revision=88671
Diffstat (limited to 'libgc/darwin_stop_world.c')
-rw-r--r-- | libgc/darwin_stop_world.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/libgc/darwin_stop_world.c b/libgc/darwin_stop_world.c index 6dcc0680831..242c9495cbd 100644 --- a/libgc/darwin_stop_world.c +++ b/libgc/darwin_stop_world.c @@ -102,6 +102,17 @@ void GC_push_all_stacks() { if(r != KERN_SUCCESS) ABORT("thread_get_state failed"); #if defined(I386) +#if defined(_STRUCT_X86_EXCEPTION_STATE) + lo = state.__esp; + + GC_push_one(state.__eax); + GC_push_one(state.__ebx); + GC_push_one(state.__ecx); + GC_push_one(state.__edx); + GC_push_one(state.__edi); + GC_push_one(state.__esi); + GC_push_one(state.__ebp); +#else lo = state.esp; GC_push_one(state.eax); @@ -111,7 +122,43 @@ void GC_push_all_stacks() { GC_push_one(state.edi); GC_push_one(state.esi); GC_push_one(state.ebp); +#endif #elif defined(POWERPC) +#if defined(_STRUCT_PPC_EXCEPTION_STATE) + lo = (void*)(state.__r1 - PPC_RED_ZONE_SIZE); + + GC_push_one(state.__r0); + GC_push_one(state.__r2); + GC_push_one(state.__r3); + GC_push_one(state.__r4); + GC_push_one(state.__r5); + GC_push_one(state.__r6); + GC_push_one(state.__r7); + GC_push_one(state.__r8); + GC_push_one(state.__r9); + GC_push_one(state.__r10); + GC_push_one(state.__r11); + GC_push_one(state.__r12); + GC_push_one(state.__r13); + GC_push_one(state.__r14); + GC_push_one(state.__r15); + GC_push_one(state.__r16); + GC_push_one(state.__r17); + GC_push_one(state.__r18); + GC_push_one(state.__r19); + GC_push_one(state.__r20); + GC_push_one(state.__r21); + GC_push_one(state.__r22); + GC_push_one(state.__r23); + GC_push_one(state.__r24); + GC_push_one(state.__r25); + GC_push_one(state.__r26); + GC_push_one(state.__r27); + GC_push_one(state.__r28); + GC_push_one(state.__r29); + GC_push_one(state.__r30); + GC_push_one(state.__r31); +#else lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE); GC_push_one(state.r0); @@ -145,6 +192,7 @@ void GC_push_all_stacks() { GC_push_one(state.r29); GC_push_one(state.r30); GC_push_one(state.r31); +#endif #else # error FIXME for non-x86 || ppc architectures #endif @@ -199,6 +247,42 @@ void GC_push_all_stacks() { (natural_t *)&info, &outCount); if(r != KERN_SUCCESS) continue; +#if defined(_STRUCT_PPC_EXCEPTION_STATE) + lo = (void*)(info.__r1 - PPC_RED_ZONE_SIZE); + hi = (ptr_t)FindTopOfStack(info.__r1); + + GC_push_one(info.__r0); + GC_push_one(info.__r2); + GC_push_one(info.__r3); + GC_push_one(info.__r4); + GC_push_one(info.__r5); + GC_push_one(info.__r6); + GC_push_one(info.__r7); + GC_push_one(info.__r8); + GC_push_one(info.__r9); + GC_push_one(info.__r10); + GC_push_one(info.__r11); + GC_push_one(info.__r12); + GC_push_one(info.__r13); + GC_push_one(info.__r14); + GC_push_one(info.__r15); + GC_push_one(info.__r16); + GC_push_one(info.__r17); + GC_push_one(info.__r18); + GC_push_one(info.__r19); + GC_push_one(info.__r20); + GC_push_one(info.__r21); + GC_push_one(info.__r22); + GC_push_one(info.__r23); + GC_push_one(info.__r24); + GC_push_one(info.__r25); + GC_push_one(info.__r26); + GC_push_one(info.__r27); + GC_push_one(info.__r28); + GC_push_one(info.__r29); + GC_push_one(info.__r30); + GC_push_one(info.__r31); +#else lo = (void*)(info.r1 - PPC_RED_ZONE_SIZE); hi = (ptr_t)FindTopOfStack(info.r1); @@ -233,6 +317,7 @@ void GC_push_all_stacks() { GC_push_one(info.r29); GC_push_one(info.r30); GC_push_one(info.r31); +#endif # else /* FIXME: Remove after testing: */ WARN("This is completely untested and likely will not work\n", 0); @@ -242,6 +327,26 @@ void GC_push_all_stacks() { (natural_t *)&info, &outCount); if(r != KERN_SUCCESS) continue; +#if defined(_STRUCT_X86_EXCEPTION_STATE) + lo = (void*)info.__esp; + hi = (ptr_t)FindTopOfStack(info.__esp); + + GC_push_one(info.__eax); + GC_push_one(info.__ebx); + GC_push_one(info.__ecx); + GC_push_one(info.__edx); + GC_push_one(info.__edi); + GC_push_one(info.__esi); + /* GC_push_one(info.__ebp); */ + /* GC_push_one(info.__esp); */ + GC_push_one(info.__ss); + GC_push_one(info.__eip); + GC_push_one(info.__cs); + GC_push_one(info.__ds); + GC_push_one(info.__es); + GC_push_one(info.__fs); + GC_push_one(info.__gs); +#else lo = (void*)info.esp; hi = (ptr_t)FindTopOfStack(info.esp); @@ -260,6 +365,7 @@ void GC_push_all_stacks() { GC_push_one(info.es); GC_push_one(info.fs); GC_push_one(info.gs); +#endif # endif /* !POWERPC */ } # if DEBUG_THREADS |