Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Norton <grompf@sublimeintervention.com>2007-11-01 22:02:09 +0300
committerGeoff Norton <grompf@sublimeintervention.com>2007-11-01 22:02:09 +0300
commita233db44c6a5c88de9ce15bf804b52279bd65100 (patch)
tree51fc31deb76bb285a4785e74b5bb1fd5219cb859 /libgc/darwin_stop_world.c
parent62849ba88958ea97328595705f213e86a73448db (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.c106
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