--- include/private/gcconfig.h~ Mon Mar 10 22:44:17 2003 +++ include/private/gcconfig.h Sun May 25 01:33:31 2003 @@ -294,6 +294,10 @@ # define I386 # define mach_type_known # endif +# if defined(FREEBSD) && (defined(__sparc64__)) +# define SPARC +# define mach_type_known +# endif # if defined(__NetBSD__) && (defined(i386) || defined(__i386__)) # define I386 # define mach_type_known @@ -896,6 +900,15 @@ extern char etext[]; # define DATASTART ((ptr_t)(etext)) # endif +# endif +# ifdef FREEBSD +# define OS_TYPE "FREEBSD" +# define DATASTART GC_data_start +# define SEARCH_FOR_DATA_START +# define FREEBSD_STACKBOTTOM +# define MPROTECT_VDB +# define CPP_WORDSZ 64 +# define DYNAMIC_LOADING # endif # endif --- os_dep.c~ Wed Feb 26 19:29:18 2003 +++ os_dep.c Sun May 25 01:37:53 2003 @@ -91,6 +91,10 @@ # include #endif +#if defined(FREEBSD) && defined(SPARC) +# include +#endif + #ifdef AMIGA # define GC_AMIGA_DEF # include "AmigaOS.c" @@ -2229,7 +2233,12 @@ # endif # ifdef FREEBSD # define SIG_OK (sig == SIGBUS) -# define CODE_OK (code == BUS_PAGE_FAULT) +# ifdef I386 +# define CODE_OK (code == BUS_PAGE_FAULT) +# endif +# ifdef SPARC +# define CODE_OK (code == UT_DATA_PROTECTION) +# endif # endif # endif # if defined(IRIX5) || defined(OSF1) || defined(HURD) @@ -3245,7 +3254,7 @@ long fr_argx[0]; }; # else -# if defined(SUNOS4) +# if defined(SUNOS4) || defined(FREEBSD) # include # else # if defined (DRSNX) @@ -3298,7 +3307,7 @@ #else /* No builtin backtrace; do it ourselves */ -#if (defined(OPENBSD) || defined(NETBSD)) && defined(SPARC) +#if (defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD)) && defined(SPARC) # define FR_SAVFP fr_fp # define FR_SAVPC fr_pc #else @@ -3306,10 +3315,12 @@ # define FR_SAVPC fr_savpc #endif +#ifndef FREEBSD #if defined(SPARC) && (defined(__arch64__) || defined(__sparcv9)) # define BIAS 2047 #else # define BIAS 0 +#endif #endif void GC_save_callers (info) --- /dev/null Sun May 25 01:44:00 2003 +++ sparc_freebsd_mach_dep.S Sun May 25 01:47:48 2003 @@ -0,0 +1,28 @@ +#include "machine/asm.h" + + .text + .globl GC_save_regs_in_stack + .globl GC_push_regs +ENTRY(GC_save_regs_in_stack) +ENTRY(GC_push_regs) + ! No ST_FLUSH_WINDOWS yet. + save %sp,-CCFSZ,%sp + flushw + mov %fp,%i0 + ret + restore +END(GC_save_regs_in_stack) +END(GC_push_regs) + + .globl GC_clear_stack_inner +ENTRY(GC_clear_stack_inner) + mov %sp,%o2 ! Save sp + add %sp,-8,%o3 ! p = sp-8 +.Lloop: + stx %g0,[%o3+SPOFF] ! *(long long *)p = 0 + cmp %o3,%o1 + bgu %xcc,.Lloop ! if (p > limit) goto loop + add %o3,-8,%o3 ! p -= 8 (delay slot) + retl + mov %o2,%sp ! Restore sp., delay slot +END(GC_clear_stack_inner)