os_dep.c: Port to Darwin/i386

2006-09-21  Sandro Tolaini  <tolaini@libero.it>

	* os_dep.c: Port to Darwin/i386
	* darwin_stop_world.c: Likewise
	* include/private/gcconfig.h: Likewise

From-SVN: r117126
This commit is contained in:
Sandro Tolaini 2006-09-22 01:47:30 +02:00 committed by Tom Tromey
parent b76d34e959
commit de7a014db3
4 changed files with 55 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2006-09-21 Sandro Tolaini <tolaini@libero.it>
* os_dep.c: Port to Darwin/i386
* darwin_stop_world.c: Likewise
* include/private/gcconfig.h: Likewise
2006-06-07 Petr Salinger <Petr.Salinger@seznam.cz>
* configure.ac: add support for GNU/kFreeBSD, accepted by upstream

View File

@ -125,7 +125,18 @@ void GC_push_all_stacks() {
(natural_t*)&state,
&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 . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE);
GC_push_one(state . THREAD_FLD (r0));
@ -159,6 +170,9 @@ void GC_push_all_stacks() {
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;

View File

@ -304,7 +304,7 @@
# define mach_type_known
# elif defined(__i386__)
# define I386
--> Not really supported, but at least we recognize it.
# define mach_type_known
# endif
# endif
# if defined(NeXT) && defined(mc68000)
@ -1308,6 +1308,29 @@
/* # define MPROTECT_VDB Not quite working yet? */
# define DYNAMIC_LOADING
# endif
# ifdef DARWIN
# define OS_TYPE "DARWIN"
# define DARWIN_DONT_PARSE_STACK
# 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 -- disabled 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 /* DARWIN */
# endif
# ifdef NS32K

View File

@ -3802,6 +3802,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
@ -3833,7 +3837,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