From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Mon, 27 Mar 2023 20:03:03 +1100 Subject: [PATCH] Teach os_dep and gcconfig.h about serenity --- include/private/gcconfig.h | 32 +++++++++++++++++++++++++++++--- os_dep.c | 32 ++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/include/private/gcconfig.h b/include/private/gcconfig.h index 2de01af..8e9fb29 100644 --- a/include/private/gcconfig.h +++ b/include/private/gcconfig.h @@ -337,6 +337,15 @@ EXTERN_C_BEGIN # endif # define mach_type_known # endif +# if defined(__serenity__) +# define SERENITY +# define mach_type_known +# if defined(_X86_) || defined (__i386__) +# define I386 +# elif defined(__x86_64__) +# define X86_64 +# endif +#endif # if (defined(__BEOS__) || defined(__HAIKU__)) && defined(_X86_) # define I386 # define HAIKU @@ -1058,6 +1067,23 @@ EXTERN_C_BEGIN # endif # endif /* OPENBSD */ +# ifdef SERENITY +# define OS_TYPE "SERENITY" + EXTERN_C_END +# include + EXTERN_C_BEGIN +# define GETPAGESIZE() (unsigned)sysconf(_SC_PAGESIZE) + extern int etext[], _end[]; +# define DATASTART ((ptr_t)((((word)(etext)) + 0xfff) & ~0xfff)) +# define DATAEND ((ptr_t)(_end)) +# define DYNAMIC_LOADING +# define MPROTECT_VDB +# define USE_MMAP_ANON +# ifndef USE_MMAP +# define USE_MMAP 1 +# endif +# endif + # ifdef SOLARIS # define OS_TYPE "SOLARIS" extern int _etext[], _end[]; @@ -2703,7 +2729,7 @@ EXTERN_C_BEGIN #if defined(SVR4) || defined(LINUX) || defined(IRIX5) || defined(HPUX) \ || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \ || defined(DGUX) || defined(BSD) || defined(HAIKU) || defined(HURD) \ - || defined(AIX) || defined(DARWIN) || defined(OSF1) + || defined(AIX) || defined(DARWIN) || defined(OSF1) || defined(SERENITY) # define UNIX_LIKE /* Basic Unix-like system calls work. */ #endif @@ -2753,7 +2779,7 @@ EXTERN_C_BEGIN #if defined(DARWIN) || defined(FREEBSD) || defined(HAIKU) \ || defined(IRIX5) || defined(LINUX) || defined(NETBSD) \ - || defined(OPENBSD) || defined(SOLARIS) \ + || defined(OPENBSD) || defined(SOLARIS) || defined(SERENITY) \ || ((defined(CYGWIN32) || defined(USE_MMAP) || defined(USE_MUNMAP)) \ && !defined(USE_WINALLOC)) /* Try both sbrk and mmap, in that order. */ @@ -2880,7 +2906,7 @@ EXTERN_C_BEGIN #if ((defined(UNIX_LIKE) && (defined(DARWIN) || defined(HAIKU) \ || defined(HURD) || defined(OPENBSD) \ - || defined(ARM32) \ + || defined(ARM32) || defined(SERENITY) \ || defined(AVR32) || defined(MIPS) \ || defined(NIOS2) || defined(OR1K))) \ || (defined(LINUX) && !defined(__gnu_linux__)) \ diff --git a/os_dep.c b/os_dep.c index eaf5bb0..afd73f7 100644 --- a/os_dep.c +++ b/os_dep.c @@ -854,6 +854,22 @@ GC_INNER size_t GC_page_size = 0; # define HAVE_GET_STACK_BASE #endif /* HAIKU */ +#ifdef SERENITY +# include + GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb) + { + uintptr_t base; + size_t size; + if (get_stack_bounds(&base, &size) < 0) { + WARN("get_stack_bounds failed\n", 0); + return GC_UNIMPLEMENTED; + } + sb->mem_base = base + size; + return GC_SUCCESS; + } +# define HAVE_GET_STACK_BASE +#endif /* SERENITY */ + #ifdef OS2 GC_API int GC_CALL GC_get_stack_base(struct GC_stack_base *sb) { @@ -882,7 +898,7 @@ GC_INNER size_t GC_page_size = 0; # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \ - || defined(NETBSD) + || defined(NETBSD) || defined(SERENITY) static struct sigaction old_segv_act; # if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) \ || defined(HURD) || defined(NETBSD) || defined(FREEBSD) @@ -899,7 +915,7 @@ GC_INNER size_t GC_page_size = 0; { # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \ - || defined(NETBSD) || defined(OPENBSD) + || defined(NETBSD) || defined(OPENBSD) || defined(SERENITY) struct sigaction act; act.sa_handler = h; @@ -965,7 +981,7 @@ GC_INNER size_t GC_page_size = 0; { # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \ || defined(HAIKU) || defined(HURD) || defined(FREEBSD) \ - || defined(NETBSD) || defined(OPENBSD) + || defined(NETBSD) || defined(OPENBSD) || defined(SERENITY) (void) sigaction(SIGSEGV, &old_segv_act, 0); # if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \ || defined(HPUX) || defined(HURD) || defined(NETBSD) \ @@ -1253,7 +1269,7 @@ GC_INNER size_t GC_page_size = 0; # define GET_MAIN_STACKBASE_SPECIAL #elif !defined(AMIGA) && !defined(HAIKU) && !defined(OS2) \ && !defined(MSWIN32) && !defined(MSWINCE) && !defined(CYGWIN32) \ - && !defined(GC_OPENBSD_THREADS) \ + && !defined(GC_OPENBSD_THREADS) && !defined(SERENITY) \ && (!defined(GC_SOLARIS_THREADS) || defined(_STRICT_STDC)) # if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \ @@ -1356,7 +1372,7 @@ GC_INNER size_t GC_page_size = 0; return(result); } # define GET_MAIN_STACKBASE_SPECIAL -#endif /* !AMIGA, !HAIKU, !OPENBSD, !OS2, !Windows */ +#endif /* !AMIGA, !HAIKU, !OPENBSD, !SERENITY, !OS2, !Windows */ #if (defined(HAVE_PTHREAD_ATTR_GET_NP) || defined(HAVE_PTHREAD_GETATTR_NP)) \ && defined(THREADS) && !defined(HAVE_GET_STACK_BASE) @@ -2647,7 +2663,7 @@ static void block_unmap_inner(ptr_t start_addr, size_t len) ps3_free_mem(start_addr, len); # elif defined(AIX) || defined(CYGWIN32) || defined(HAIKU) \ || (defined(LINUX) && !defined(PREFER_MMAP_PROT_NONE)) \ - || defined(HPUX) + || defined(HPUX) || defined(SERENITY) /* On AIX, mmap(PROT_NONE) fails with ENOMEM unless the */ /* environment variable XPG_SUS_ENV is set to ON. */ /* On Cygwin, calling mmap() with the new protection flags on */ @@ -3140,7 +3156,7 @@ GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void) # elif !defined(USE_WINALLOC) # include # include -# if !defined(CYGWIN32) && !defined(HAIKU) +# if !defined(CYGWIN32) && !defined(HAIKU) && !defined(SERENITY) # include # endif @@ -3255,7 +3271,7 @@ GC_API GC_push_other_roots_proc GC_CALL GC_get_push_other_roots(void) # define CODE_OK (si -> si_code == 2 /* experimentally determined */) # elif defined(IRIX5) # define CODE_OK (si -> si_code == EACCES) -# elif defined(CYGWIN32) || defined(HAIKU) || defined(HURD) +# elif defined(CYGWIN32) || defined(HAIKU) || defined(HURD) || defined(SERENITY) # define CODE_OK TRUE # elif defined(LINUX) # define CODE_OK TRUE