Hi,

to do some release tests with iked we wanted to play^Wtest games/openra
over IPsec.  Turns out that arm64 does not support lang/mono, but I have
gotten it to run.  With the following diff, games/openra builds and I
can even play it.

This doesn't need to make release, so no worries.  Would be nice for
others, but I myself run -current anyway.

The arch-defines.mk enables all mono-related packages.  In gcconfig.h
OPENBSD needs to be checked so make sure in case it's AArch64, it
doesn't define NOSYS.  Additionally apparently one has to check for
OPENBSD and __aarch64__ to define the mach type.  Then there's another
AARCH64 block where OS-related stuff has to be defined.  I simply used
the AMD64 block, but skipping ELFCLASS.  In boringssl we need to have
the 'find aarch64 crypto accel' code as well.  We don't have a nice API
yet to extract info, so let's for now only use NEON, which we require
on AArch64.  As far as I can see, ucontext is sigcontext, so I provide
the same defines as FreeBSD but with sigcontext context.

I can try to get the diffs upstreamed.

Patrick

diff --git a/infrastructure/mk/arch-defines.mk 
b/infrastructure/mk/arch-defines.mk
index 228c3991f50..965949a964b 100644
--- a/infrastructure/mk/arch-defines.mk
+++ b/infrastructure/mk/arch-defines.mk
@@ -21,7 +21,7 @@ LP64_ARCHS = aarch64 alpha amd64 mips64 mips64el powerpc64 
sparc64
 GCC4_ARCHS = alpha hppa sh sparc64
 GCC3_ARCHS = m88k
 # XXX easier for ports that depend on mono
-MONO_ARCHS = amd64 i386
+MONO_ARCHS = amd64 i386 aarch64
 OCAML_NATIVE_ARCHS = i386 amd64
 OCAML_NATIVE_DYNLINK_ARCHS = i386 amd64
 GO_ARCHS = aarch64 amd64 arm arm64 armv7 i386
diff --git a/lang/mono/patches/patch-external_bdwgc_include_private_gcconfig_h 
b/lang/mono/patches/patch-external_bdwgc_include_private_gcconfig_h
new file mode 100644
index 00000000000..e2d766861a7
--- /dev/null
+++ b/lang/mono/patches/patch-external_bdwgc_include_private_gcconfig_h
@@ -0,0 +1,51 @@
+$OpenBSD$
+
+Index: external/bdwgc/include/private/gcconfig.h
+--- external/bdwgc/include/private/gcconfig.h.orig
++++ external/bdwgc/include/private/gcconfig.h
+@@ -155,7 +155,7 @@ EXTERN_C_BEGIN
+ # if defined(__aarch64__)
+ #    define AARCH64
+ #    if !defined(LINUX) && !defined(DARWIN) && !defined(FREEBSD) \
+-        && !defined(NN_BUILD_TARGET_PLATFORM_NX)
++        && !defined(OPENBSD) && !defined(NN_BUILD_TARGET_PLATFORM_NX)
+ #      define NOSYS
+ #      define mach_type_known
+ #    endif
+@@ -348,6 +348,10 @@ EXTERN_C_BEGIN
+ #    define X86_64
+ #    define mach_type_known
+ # endif
++# if defined(OPENBSD) && defined(__aarch64__)
++#   define AARCH64
++#   define mach_type_known
++# endif
+ # if defined(LINUX) && (defined(i386) || defined(__i386__))
+ #    define I386
+ #    define mach_type_known
+@@ -2298,6 +2302,25 @@ EXTERN_C_BEGIN
+       extern char etext[];
+ #     define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
+ #     define DATASTART_USES_BSDGETDATASTART
++#   endif
++#   ifdef OPENBSD
++#     define OS_TYPE "OPENBSD"
++#     ifndef GC_OPENBSD_THREADS
++        EXTERN_C_END
++#       include <sys/param.h>
++#       include <uvm/uvm_extern.h>
++        EXTERN_C_BEGIN
++#       ifdef USRSTACK
++#         define STACKBOTTOM ((ptr_t)USRSTACK)
++#       else
++#         define HEURISTIC2
++#       endif
++#     endif
++      extern int __data_start[];
++      extern int _end[];
++#     define DATASTART ((ptr_t)__data_start)
++#     define DATAEND ((ptr_t)(&_end))
++#     define DYNAMIC_LOADING
+ #   endif
+ #   ifdef NINTENDO_SWITCH
+       static int zero_fd = -1;
diff --git 
a/lang/mono/patches/patch-external_boringssl_crypto_cpu-aarch64-linux_c 
b/lang/mono/patches/patch-external_boringssl_crypto_cpu-aarch64-linux_c
new file mode 100644
index 00000000000..472cc8637e0
--- /dev/null
+++ b/lang/mono/patches/patch-external_boringssl_crypto_cpu-aarch64-linux_c
@@ -0,0 +1,31 @@
+$OpenBSD$
+
+Index: external/boringssl/crypto/cpu-aarch64-linux.c
+--- external/boringssl/crypto/cpu-aarch64-linux.c.orig
++++ external/boringssl/crypto/cpu-aarch64-linux.c
+@@ -16,7 +16,9 @@
+ 
+ #if defined(OPENSSL_AARCH64) && !defined(OPENSSL_STATIC_ARMCAP)
+ 
++#if !defined(__OpenBSD__)
+ #include <sys/auxv.h>
++#endif
+ 
+ #include <openssl/arm_arch.h>
+ 
+@@ -63,6 +65,15 @@ void OPENSSL_cpuid_setup(void) {
+   if (ID_AA64ISAR0_SHA2_VAL(isar0_val) >= ID_AA64ISAR0_SHA2_BASE) {
+     OPENSSL_armcap_P |= ARMV8_SHA256;
+   }
++}
++
++#elif defined(__OpenBSD__)
++
++#include <stdlib.h>
++#include <sys/types.h>
++
++void OPENSSL_cpuid_setup(void) {
++  OPENSSL_armcap_P |= ARMV7_NEON;
+ }
+ 
+ #else // linux
diff --git a/lang/mono/patches/patch-mono_utils_mono-sigcontext_h 
b/lang/mono/patches/patch-mono_utils_mono-sigcontext_h
new file mode 100644
index 00000000000..0d036cac533
--- /dev/null
+++ b/lang/mono/patches/patch-mono_utils_mono-sigcontext_h
@@ -0,0 +1,18 @@
+$OpenBSD$
+
+Index: mono/utils/mono-sigcontext.h
+--- mono/utils/mono-sigcontext.h.orig
++++ mono/utils/mono-sigcontext.h
+@@ -472,6 +472,12 @@ typedef struct ucontext {
+       #define UCONTEXT_REG_SP(ctx) 
(((ucontext_t*)(ctx))->uc_mcontext.mc_gpregs.gp_sp)
+       #define UCONTEXT_REG_R0(ctx) 
(((ucontext_t*)(ctx))->uc_mcontext.mc_gpregs.gp_x [ARMREG_R0])
+       #define UCONTEXT_GREGS(ctx) 
(&(((ucontext_t*)(ctx))->uc_mcontext.mc_gpregs.gp_x))
++#elif defined(__OpenBSD__)
++      /* ucontext_t == sigcontext */
++      #define UCONTEXT_REG_PC(ctx) (((ucontext_t*)(ctx))->sc_elr)
++      #define UCONTEXT_REG_SP(ctx) (((ucontext_t*)(ctx))->sc_sp)
++      #define UCONTEXT_REG_R0(ctx) (((ucontext_t*)(ctx))->sc_x [ARMREG_R0])
++      #define UCONTEXT_GREGS(ctx) (&(((ucontext_t*)(ctx))->sc_x))
+ #else
+ #include <ucontext.h>
+       #define UCONTEXT_REG_PC(ctx) (((ucontext_t*)(ctx))->uc_mcontext.pc)

Reply via email to