]> granicus.if.org Git - gc/commitdiff
Thu Feb 9 16:20:55 CET 2006 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Thu, 9 Feb 2006 15:22:31 +0000 (15:22 +0000)
committerguest <ivmai@mail.ru>
Fri, 29 Jul 2011 11:28:02 +0000 (15:28 +0400)
* os_dep.c, include/private/gcconfig.h, darwin_stop_world.c:
OSX/x86 support, mostly from Geoff Norton <gnorton@customerdna.com>.

svn path=/trunk/mono/; revision=56707

ChangeLog
darwin_stop_world.c
include/private/gcconfig.h
os_dep.c

index 9e8995ccf8d7e090508e5474c2c512e067adb356..b5b5d300846d9dd2072e5be001a3ef07fc6d444a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
 
+Thu Feb 9 16:20:55 CET 2006 Paolo Molaro <lupus@ximian.com>
+
+       * os_dep.c, include/private/gcconfig.h, darwin_stop_world.c:
+       OSX/x86 support, mostly from Geoff Norton <gnorton@customerdna.com>.
+
 Wed Feb 1 18:23:55 CET 2006 Paolo Molaro <lupus@ximian.com>
 
        * pthread_support.c, *: back out Zoltan's patch since it's
index 692b18db4db89f9563fc61caba62741c16ef1924..53604450328647f25bcdc9b4679d891dd2a38baf 100644 (file)
@@ -73,7 +73,13 @@ void GC_push_all_stacks() {
   GC_thread p;
   pthread_t me;
   ptr_t lo, hi;
+#if defined(POWERPC)
   ppc_thread_state_t state;
+#elif defined(I386)
+  i386_thread_state_t state;
+#else
+# error FIXME for non-x86 || ppc architectures
+#endif
   mach_msg_type_number_t thread_state_count = MACHINE_THREAD_STATE_COUNT;
   
   me = pthread_self();
@@ -93,6 +99,17 @@ void GC_push_all_stacks() {
                             &thread_state_count);
        if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
        
+#if defined(I386)
+       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); 
+#elif defined(POWERPC)
        lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE);
         
        GC_push_one(state.r0); 
@@ -126,6 +143,9 @@ void GC_push_all_stacks() {
        GC_push_one(state.r29); 
        GC_push_one(state.r30); 
        GC_push_one(state.r31);
+#else
+# error FIXME for non-x86 || ppc architectures
+#endif
       } /* p != me */
       if(p->flags & MAIN_THREAD)
        hi = GC_stackbottom;
index 4aeb31d8c1b4ac2ede6161513521f2a418f05608..0175a3b2c0afe1cec53ceaf446f0dea37d3fe7d9 100644 (file)
 #    define mach_type_known
 #   elif defined(__i386__)
 #    define I386
-     --> Not really supported, but at least we recognize it.
+#    define mach_type_known
+#    define DARWIN_DONT_PARSE_STACK
+#    define OS_TYPE "DARWIN"
+#    define DYNAMIC_LOADING
+     /* XXX: see get_end(3), get_etext() and get_end() should not be used.
+        These aren't used when dyld support is enabled (it is by default) */
+#    define DATASTART ((ptr_t) get_etext())
+#    define DATAEND    ((ptr_t) get_end())
+#    define STACKBOTTOM ((ptr_t) 0xc0000000)
+#    define USE_MMAP
+#    define USE_MMAP_ANON
+#    define USE_ASM_PUSH_REGS
+     /* This is potentially buggy. It needs more testing. See the comments in
+        os_dep.c.  It relies on threads to track writes. */
+#    ifdef GC_DARWIN_THREADS
+/* #       define MPROTECT_VDB -- diabled for now.  May work for some apps. */
+#    endif
+#    include <unistd.h>
+#    define GETPAGESIZE() getpagesize()
+      /* There seems to be some issues with trylock hanging on darwin. This
+         should be looked into some more */
+#     define NO_PTHREAD_TRYLOCK
 #   endif
 # endif
 # if defined(NeXT) && defined(mc68000)
index d7beb58dd9bc196a1e4cd23d2ce652e551d17ebb..ef80a9d093ec2dfd0965a28965177628804ac8ba 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -3819,6 +3819,10 @@ catch_exception_raise(
         mach_msg_type_number_t exc_state_count = PPC_EXCEPTION_STATE64_COUNT;
         ppc_exception_state64_t exc_state;
 #     endif
+#   elif defined(I386)
+        thread_state_flavor_t flavor = i386_EXCEPTION_STATE;
+        mach_msg_type_number_t exc_state_count = i386_EXCEPTION_STATE_COUNT;
+        i386_exception_state_t exc_state;
 #   else
 #      error FIXME for non-ppc darwin
 #   endif
@@ -3850,7 +3854,13 @@ catch_exception_raise(
     }
     
     /* This is the address that caused the fault */
+#if defined(POWERPC)
     addr = (char*) exc_state.dar;
+#elif defined (I386)
+    addr = (char*) exc_state.faultvaddr;
+#else
+#   error FIXME for non POWERPC/I386
+#endif
         
     if((HDR(addr)) == 0) {
         /* Ugh... just like the SIGBUS problem above, it seems we get a bogus