#endif
#if defined(FREEBSD) && (defined(I386) || defined(X86_64) \
- || defined(powerpc) || defined(__powerpc__))
+ || defined(AARCH64) || defined(POWERPC))
# include <machine/trap.h>
# if !defined(PCR)
# define NEED_FIND_LIMIT
# define I386
# define mach_type_known
# endif
-# if defined(FREEBSD) && defined(__aarch64__)
-# define AARCH64
-# define mach_type_known
-# endif
# if defined(FREEBSD) && (defined(__amd64__) || defined(__x86_64__))
# define X86_64
# define mach_type_known
# define ARM32
# define mach_type_known
# endif
+# if defined(FREEBSD) && defined(__aarch64__)
+# define AARCH64
+# define mach_type_known
+# endif
# if defined(bsdi) && (defined(i386) || defined(__i386__))
# define I386
# define BSDI
# endif
# endif
# ifdef FREEBSD
-# define ALIGNMENT 8
# define OS_TYPE "FREEBSD"
+# ifndef GC_FREEBSD_THREADS
+# define MPROTECT_VDB
+# endif
+# define FREEBSD_STACKBOTTOM
# ifdef __ELF__
# define DYNAMIC_LOADING
# endif
-# define HEURISTIC2
extern char etext[];
-# define SEARCH_FOR_DATA_START
+ ptr_t GC_FreeBSDGetDataStart(size_t, ptr_t);
+# define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
+# define DATASTART_IS_FUNC
# endif
# ifdef NOSYS
/* __data_start is usually defined in the target linker script. */
# endif
# if defined(FREEBSD) && !defined(PCR) && (defined(I386) || defined(X86_64) \
- || defined(powerpc) || defined(__powerpc__))
+ || defined(AARCH64) \
+ || defined(POWERPC))
/* Its unclear whether this should be identical to the above, or */
/* whether it should apply to non-X86 architectures. */
# ifndef SEGV_ACCERR
# define SEGV_ACCERR 2
# endif
-# if defined(POWERPC)
+# if defined(AARCH64)
+# define CODE_OK (si -> si_code == SEGV_ACCERR)
+# elif defined(POWERPC)
# define AIM /* Pretend that we're AIM. */
# include <machine/trap.h>
# define CODE_OK (si -> si_code == EXC_DSI \