X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=libgc%2Fos_dep.c;h=39cb513f68f9e55410940d7d80f7a4388c95a810;hb=4909667ef8407cde06fe11372ed364bc74bc6512;hp=d7beb58dd9bc196a1e4cd23d2ce652e551d17ebb;hpb=d58dfa185af1d48fb93efdef1d046762f214f0a7;p=mono.git diff --git a/libgc/os_dep.c b/libgc/os_dep.c index d7beb58dd9b..39cb513f68f 100644 --- a/libgc/os_dep.c +++ b/libgc/os_dep.c @@ -1396,7 +1396,7 @@ int * etext_addr; } # endif -# if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__)) && !defined(PCR) +# if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__) || defined(__x86_64__)) && !defined(PCR) /* Its unclear whether this should be identical to the above, or */ /* whether it should apply to non-X86 architectures. */ /* For now we don't assume that there is always an empty page after */ @@ -1617,6 +1617,8 @@ word bytes; # else GC_ASSERT(last_addr != 0); # endif + if (((word)result % HBLKSIZE) != 0) + ABORT ("GC_unix_get_mem: Memory returned by mmap is not aligned to HBLKSIZE."); return((ptr_t)result); } @@ -3700,7 +3702,7 @@ void GC_dirty_init() { mask, GC_ports.exception, EXCEPTION_DEFAULT, - MACHINE_THREAD_STATE + GC_MACH_THREAD_STATE_FLAVOR ); if(r != KERN_SUCCESS) ABORT("task_set_exception_ports failed"); @@ -3819,6 +3821,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 +3856,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