X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=boehm-gc%2Fdarwin_stop_world.c;h=719b1b02d35ee474f7e4b0d9242c410fa59dc559;hb=7cad077c4e9c6726fbefeae8f3a4ff7db515a758;hp=c2a033d3cc44d2c9e547d39558676bcbc8ff37d2;hpb=fe4f79ce65058a931452cde4aa16635f7cfacfa3;p=pf3gnuchains%2Fgcc-fork.git diff --git a/boehm-gc/darwin_stop_world.c b/boehm-gc/darwin_stop_world.c index c2a033d3cc4..719b1b02d35 100644 --- a/boehm-gc/darwin_stop_world.c +++ b/boehm-gc/darwin_stop_world.c @@ -10,16 +10,14 @@ be allocated, is called the red zone. This area as shown in Figure 3-2 may be used for any purpose as long as a new stack frame does not need to be added to the stack." - + Page 50: "If a leaf procedure's red zone usage would exceed 224 bytes, then it must set up a stack frame just like routines that call other routines." */ -#ifdef POWERPC -# if CPP_WORDSZ == 32 -# define PPC_RED_ZONE_SIZE 224 -# elif CPP_WORDSZ == 64 -# define PPC_RED_ZONE_SIZE 320 -# endif +#if defined(__ppc__) +# define PPC_RED_ZONE_SIZE 224 +#elif defined(__ppc64__) +# define PPC_RED_ZONE_SIZE 320 #endif typedef struct StackFrame { @@ -30,7 +28,7 @@ typedef struct StackFrame { unsigned long savedRTOC; } StackFrame; -unsigned long FindTopOfStack(unsigned int stack_start) { +unsigned long FindTopOfStack(unsigned long stack_start) { StackFrame *frame; if (stack_start == 0) { @@ -75,8 +73,8 @@ void GC_push_all_stacks() { GC_thread p; pthread_t me; ptr_t lo, hi; - ppc_thread_state_t state; - mach_msg_type_number_t thread_state_count = MACHINE_THREAD_STATE_COUNT; + GC_THREAD_STATE_T state; + mach_msg_type_number_t thread_state_count = GC_MACH_THREAD_STATE_COUNT; me = pthread_self(); if (!GC_thr_initialized) GC_thr_init(); @@ -88,46 +86,83 @@ void GC_push_all_stacks() { lo = GC_approx_sp(); } else { /* Get the thread state (registers, etc) */ - r = thread_get_state( - p->stop_info.mach_thread, - MACHINE_THREAD_STATE, - (natural_t*)&state, - &thread_state_count); + r = thread_get_state(p->stop_info.mach_thread, GC_MACH_THREAD_STATE, + (natural_t*)&state, &thread_state_count); if(r != KERN_SUCCESS) ABORT("thread_get_state failed"); - - lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE); + +#if defined(I386) + lo = (void*)state . THREAD_FLD (esp); + + GC_push_one(state . THREAD_FLD (eax)); + GC_push_one(state . THREAD_FLD (ebx)); + GC_push_one(state . THREAD_FLD (ecx)); + GC_push_one(state . THREAD_FLD (edx)); + GC_push_one(state . THREAD_FLD (edi)); + GC_push_one(state . THREAD_FLD (esi)); + GC_push_one(state . THREAD_FLD (ebp)); + +#elif defined(X86_64) + lo = (void*)state . THREAD_FLD (rsp); + + GC_push_one(state . THREAD_FLD (rax)); + GC_push_one(state . THREAD_FLD (rbx)); + GC_push_one(state . THREAD_FLD (rcx)); + GC_push_one(state . THREAD_FLD (rdx)); + GC_push_one(state . THREAD_FLD (rdi)); + GC_push_one(state . THREAD_FLD (rsi)); + GC_push_one(state . THREAD_FLD (rbp)); + GC_push_one(state . THREAD_FLD (rsp)); + GC_push_one(state . THREAD_FLD (r8)); + GC_push_one(state . THREAD_FLD (r9)); + GC_push_one(state . THREAD_FLD (r10)); + GC_push_one(state . THREAD_FLD (r11)); + GC_push_one(state . THREAD_FLD (r12)); + GC_push_one(state . THREAD_FLD (r13)); + GC_push_one(state . THREAD_FLD (r14)); + GC_push_one(state . THREAD_FLD (r15)); + GC_push_one(state . THREAD_FLD (rip)); + GC_push_one(state . THREAD_FLD (rflags)); + GC_push_one(state . THREAD_FLD (cs)); + GC_push_one(state . THREAD_FLD (fs)); + GC_push_one(state . THREAD_FLD (gs)); + +#elif defined(POWERPC) + lo = (void*)(state . THREAD_FLD (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); + GC_push_one(state . THREAD_FLD (r0)); + GC_push_one(state . THREAD_FLD (r2)); + GC_push_one(state . THREAD_FLD (r3)); + GC_push_one(state . THREAD_FLD (r4)); + GC_push_one(state . THREAD_FLD (r5)); + GC_push_one(state . THREAD_FLD (r6)); + GC_push_one(state . THREAD_FLD (r7)); + GC_push_one(state . THREAD_FLD (r8)); + GC_push_one(state . THREAD_FLD (r9)); + GC_push_one(state . THREAD_FLD (r10)); + GC_push_one(state . THREAD_FLD (r11)); + GC_push_one(state . THREAD_FLD (r12)); + GC_push_one(state . THREAD_FLD (r13)); + GC_push_one(state . THREAD_FLD (r14)); + GC_push_one(state . THREAD_FLD (r15)); + GC_push_one(state . THREAD_FLD (r16)); + GC_push_one(state . THREAD_FLD (r17)); + GC_push_one(state . THREAD_FLD (r18)); + GC_push_one(state . THREAD_FLD (r19)); + GC_push_one(state . THREAD_FLD (r20)); + GC_push_one(state . THREAD_FLD (r21)); + GC_push_one(state . THREAD_FLD (r22)); + GC_push_one(state . THREAD_FLD (r23)); + GC_push_one(state . THREAD_FLD (r24)); + GC_push_one(state . THREAD_FLD (r25)); + GC_push_one(state . THREAD_FLD (r26)); + GC_push_one(state . THREAD_FLD (r27)); + GC_push_one(state . THREAD_FLD (r28)); + GC_push_one(state . THREAD_FLD (r29)); + GC_push_one(state . THREAD_FLD (r30)); + GC_push_one(state . THREAD_FLD (r31)); +#else +# error FIXME for non-x86 || ppc architectures +#endif } /* p != me */ if(p->flags & MAIN_THREAD) hi = GC_stackbottom; @@ -166,78 +201,74 @@ void GC_push_all_stacks() { lo = GC_approx_sp(); hi = (ptr_t)FindTopOfStack(0); } else { -# if defined(POWERPC) -# if CPP_WORDSZ == 32 - ppc_thread_state_t info; -# else - ppc_thread_state64_t info; -# endif +# if defined(__ppc__) || defined(__ppc64__) + GC_THREAD_STATE_T info; mach_msg_type_number_t outCount = THREAD_STATE_MAX; - r = thread_get_state(thread, MACHINE_THREAD_STATE, + r = thread_get_state(thread, GC_MACH_THREAD_STATE, (natural_t *)&info, &outCount); if(r != KERN_SUCCESS) ABORT("task_get_state failed"); - 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); + lo = (void*)(info . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE); + hi = (ptr_t)FindTopOfStack(info . THREAD_FLD (r1)); + + GC_push_one(info . THREAD_FLD (r0)); + GC_push_one(info . THREAD_FLD (r2)); + GC_push_one(info . THREAD_FLD (r3)); + GC_push_one(info . THREAD_FLD (r4)); + GC_push_one(info . THREAD_FLD (r5)); + GC_push_one(info . THREAD_FLD (r6)); + GC_push_one(info . THREAD_FLD (r7)); + GC_push_one(info . THREAD_FLD (r8)); + GC_push_one(info . THREAD_FLD (r9)); + GC_push_one(info . THREAD_FLD (r10)); + GC_push_one(info . THREAD_FLD (r11)); + GC_push_one(info . THREAD_FLD (r12)); + GC_push_one(info . THREAD_FLD (r13)); + GC_push_one(info . THREAD_FLD (r14)); + GC_push_one(info . THREAD_FLD (r15)); + GC_push_one(info . THREAD_FLD (r16)); + GC_push_one(info . THREAD_FLD (r17)); + GC_push_one(info . THREAD_FLD (r18)); + GC_push_one(info . THREAD_FLD (r19)); + GC_push_one(info . THREAD_FLD (r20)); + GC_push_one(info . THREAD_FLD (r21)); + GC_push_one(info . THREAD_FLD (r22)); + GC_push_one(info . THREAD_FLD (r23)); + GC_push_one(info . THREAD_FLD (r24)); + GC_push_one(info . THREAD_FLD (r25)); + GC_push_one(info . THREAD_FLD (r26)); + GC_push_one(info . THREAD_FLD (r27)); + GC_push_one(info . THREAD_FLD (r28)); + GC_push_one(info . THREAD_FLD (r29)); + GC_push_one(info . THREAD_FLD (r30)); + GC_push_one(info . THREAD_FLD (r31)); # else /* FIXME: Remove after testing: */ WARN("This is completely untested and likely will not work\n", 0); - i386_thread_state_t info; + GC_THREAD_STATE_T info; mach_msg_type_number_t outCount = THREAD_STATE_MAX; - r = thread_get_state(thread, MACHINE_THREAD_STATE, - (natural_t *)&info, &outCount); + r = thread_get_state(thread, GC_MACH_THREAD_STATE, (natural_t *)&info, + &outCount); if(r != KERN_SUCCESS) ABORT("task_get_state failed"); - 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); + lo = (void*)info . THREAD_FLD (esp); + hi = (ptr_t)FindTopOfStack(info . THREAD_FLD (esp)); + + GC_push_one(info . THREAD_FLD (eax)); + GC_push_one(info . THREAD_FLD (ebx)); + GC_push_one(info . THREAD_FLD (ecx)); + GC_push_one(info . THREAD_FLD (edx)); + GC_push_one(info . THREAD_FLD (edi)); + GC_push_one(info . THREAD_FLD (esi)); + /* GC_push_one(info . THREAD_FLD (ebp)); */ + /* GC_push_one(info . THREAD_FLD (esp)); */ + GC_push_one(info . THREAD_FLD (ss)); + GC_push_one(info . THREAD_FLD (eip)); + GC_push_one(info . THREAD_FLD (cs)); + GC_push_one(info . THREAD_FLD (ds)); + GC_push_one(info . THREAD_FLD (es)); + GC_push_one(info . THREAD_FLD (fs)); + GC_push_one(info . THREAD_FLD (gs)); # endif /* !POWERPC */ } # if DEBUG_THREADS