diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index eaeeab38fa1..d5dfc13504b 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -48,11 +48,13 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64") set(CMAKE_SYSTEM_PROCESSOR aarch64) if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl) set(TOOLCHAIN "aarch64-alpine-linux-musl") - else() + elseif(LINUX) set(TOOLCHAIN "aarch64-linux-gnu") - endif() - if(TIZEN) - set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0") + if(TIZEN) + set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0") + endif() + elseif(FREEBSD) + set(triple "aarch64-unknown-freebsd12") endif() elseif(TARGET_ARCH_NAME STREQUAL "ppc64le") set(CMAKE_SYSTEM_PROCESSOR ppc64le) @@ -66,12 +68,18 @@ elseif(TARGET_ARCH_NAME STREQUAL "x86") if(TIZEN) set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0") endif() -elseif (FREEBSD) - set(CMAKE_SYSTEM_PROCESSOR "x86_64") - set(triple "x86_64-unknown-freebsd12") -elseif (ILLUMOS) - set(CMAKE_SYSTEM_PROCESSOR "x86_64") - set(TOOLCHAIN "x86_64-illumos") +elseif(TARGET_ARCH_NAME STREQUAL "x64") + set(CMAKE_SYSTEM_PROCESSOR x86_64) + if(LINUX) + set(TOOLCHAIN "x86_64-linux-gnu") + if(TIZEN) + set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu/9.2.0") + endif() + elseif(FREEBSD) + set(triple "x86_64-unknown-freebsd12") + elseif(ILLUMOS) + set(TOOLCHAIN "x86_64-illumos") + endif() else() message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, armv6, arm64, ppc64le, s390x and x86 are supported!") endif() @@ -218,7 +226,7 @@ endif() # Specify compile options -if((TARGET_ARCH_NAME MATCHES "^(arm|armv6|armel|arm64|ppc64le|s390x)$" AND NOT ANDROID) OR ILLUMOS) +if((TARGET_ARCH_NAME MATCHES "^(arm|armv6|armel|arm64|ppc64le|s390x)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS) set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake index d21206f1f8b..5a6e65a4336 100644 --- a/eng/native/configureplatform.cmake +++ b/eng/native/configureplatform.cmake @@ -160,7 +160,8 @@ endif(CLR_CMAKE_HOST_OS STREQUAL Android) if(CLR_CMAKE_HOST_OS STREQUAL FreeBSD) set(CLR_CMAKE_HOST_UNIX 1) - set(CLR_CMAKE_HOST_UNIX_AMD64 1) + set(CLR_CMAKE_HOST_UNIX_ARM64 1) + set(CLR_CMAKE_HOST_AMD64 0) set(CLR_CMAKE_HOST_FREEBSD 1) endif(CLR_CMAKE_HOST_OS STREQUAL FreeBSD) diff --git a/eng/native/configuretools.cmake b/eng/native/configuretools.cmake index 6697524c659..4ab99a86db5 100644 --- a/eng/native/configuretools.cmake +++ b/eng/native/configuretools.cmake @@ -54,7 +54,7 @@ if(NOT WIN32 AND NOT CLR_CMAKE_TARGET_BROWSER) set(TOOLSET_PREFIX ${ANDROID_TOOLCHAIN_PREFIX}) elseif(CMAKE_CROSSCOMPILING AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv8l|armv7l|armv6l|aarch64|arm|s390x|ppc64le)$") - set(TOOLSET_PREFIX "${TOOLCHAIN}-") + set(TOOLSET_PREFIX "llvm-") else() set(TOOLSET_PREFIX "") endif() diff --git a/src/coreclr/inc/crosscomp.h b/src/coreclr/inc/crosscomp.h index 9a78c69a342..3262391c856 100644 --- a/src/coreclr/inc/crosscomp.h +++ b/src/coreclr/inc/crosscomp.h @@ -551,6 +551,8 @@ typedef struct _T_KNONVOLATILE_CONTEXT_POINTERS { #define DAC_CS_NATIVE_DATA_SIZE 12 #elif defined(TARGET_FREEBSD) && defined(TARGET_AMD64) #define DAC_CS_NATIVE_DATA_SIZE 24 +#elif defined(TARGET_FREEBSD) && defined(TARGET_ARM64) +#define DAC_CS_NATIVE_DATA_SIZE 24 #elif defined(TARGET_LINUX) && defined(TARGET_ARM) #define DAC_CS_NATIVE_DATA_SIZE 80 #elif defined(TARGET_LINUX) && defined(TARGET_ARM64) diff --git a/src/coreclr/pal/inc/pal.h b/src/coreclr/pal/inc/pal.h index dd7e99c665b..444b4768727 100644 --- a/src/coreclr/pal/inc/pal.h +++ b/src/coreclr/pal/inc/pal.h @@ -2677,6 +2677,8 @@ PALIMPORT BOOL PALAPI PAL_VirtualUnwindOutOfProc(CONTEXT *context, KNONVOLATILE_ #define PAL_CS_NATIVE_DATA_SIZE 12 #elif defined(__FreeBSD__) && defined(__x86_64__) #define PAL_CS_NATIVE_DATA_SIZE 24 +#elif defined(__FreeBSD__) && defined(HOST_ARM64) +#define PAL_CS_NATIVE_DATA_SIZE 24 #elif defined(__linux__) && defined(HOST_ARM) #define PAL_CS_NATIVE_DATA_SIZE 80 #elif defined(__linux__) && defined(HOST_ARM64) diff --git a/src/coreclr/pal/src/configure.cmake b/src/coreclr/pal/src/configure.cmake index 4f900a5555e..ba9a068c92e 100644 --- a/src/coreclr/pal/src/configure.cmake +++ b/src/coreclr/pal/src/configure.cmake @@ -1342,6 +1342,13 @@ elseif(CLR_CMAKE_TARGET_FREEBSD) set(HAS_FTRUNCATE_LENGTH_ISSUE 0) set(BSD_REGS_STYLE "((reg).r_##rr)") set(HAVE_SCHED_OTHER_ASSIGNABLE 1) +if (CLR_CMAKE_HOST_ARCH_AMD64) + set(BSD_REGS_STYLE "((reg).r_##rr)") +elseif(CLR_CMAKE_HOST_ARCH_ARM64) + set(BSD_REGS_STYLE "((reg).rr)") +else() + message(FATAL_ERROR "Unknown FreeBSD architecture") +endif() elseif(CLR_CMAKE_TARGET_NETBSD) set(DEADLOCK_WHEN_THREAD_IS_SUSPENDED_WHILE_BLOCKED_ON_MUTEX 0) set(PAL_PTRACE "ptrace((cmd), (pid), (void*)(addr), (data))") diff --git a/src/coreclr/pal/src/exception/seh-unwind.cpp b/src/coreclr/pal/src/exception/seh-unwind.cpp index 9fe6c61d0f8..343c1ae1048 100644 --- a/src/coreclr/pal/src/exception/seh-unwind.cpp +++ b/src/coreclr/pal/src/exception/seh-unwind.cpp @@ -173,6 +173,42 @@ enum ASSIGN_REG(R29) \ ASSIGN_REG(R30) \ ASSIGN_REG(R31) +#elif (defined(HOST_ARM64) && defined(TARGET_FREEBSD)) +#define ASSIGN_UNWIND_REGS \ + ASSIGN_REG(X0) \ + ASSIGN_REG(X1) \ + ASSIGN_REG(X2) \ + ASSIGN_REG(X3) \ + ASSIGN_REG(X4) \ + ASSIGN_REG(X5) \ + ASSIGN_REG(X6) \ + ASSIGN_REG(X7) \ + ASSIGN_REG(X8) \ + ASSIGN_REG(X9) \ + ASSIGN_REG(X10) \ + ASSIGN_REG(X11) \ + ASSIGN_REG(X12) \ + ASSIGN_REG(X13) \ + ASSIGN_REG(X14) \ + ASSIGN_REG(X15) \ + ASSIGN_REG(X16) \ + ASSIGN_REG(X17) \ + ASSIGN_REG(X18) \ + ASSIGN_REG(X19) \ + ASSIGN_REG(X20) \ + ASSIGN_REG(X21) \ + ASSIGN_REG(X22) \ + ASSIGN_REG(X23) \ + ASSIGN_REG(X24) \ + ASSIGN_REG(X25) \ + ASSIGN_REG(X26) \ + ASSIGN_REG(X27) \ + ASSIGN_REG(X28) \ + ASSIGN_REG(Lr) \ + ASSIGN_REG(Sp) \ + ASSIGN_REG(Pc) \ + ASSIGN_REG(Fp) \ + ASSIGN_REG(Cpsr) #else #error unsupported architecture #endif diff --git a/src/coreclr/pal/src/include/pal/context.h b/src/coreclr/pal/src/include/pal/context.h index fec5139fd5e..60507af185a 100644 --- a/src/coreclr/pal/src/include/pal/context.h +++ b/src/coreclr/pal/src/include/pal/context.h @@ -407,7 +407,59 @@ inline void *FPREG_Xstate_Ymmh(const ucontext_t *uc) #if defined(HOST_ARM64) -#ifndef TARGET_OSX +#if defined(TARGET_FREEBSD) + +#define MCREG_X0(mc) (mc.mc_gpregs.gp_x[0]) +#define MCREG_X1(mc) (mc.mc_gpregs.gp_x[1]) +#define MCREG_X2(mc) (mc.mc_gpregs.gp_x[2]) +#define MCREG_X3(mc) (mc.mc_gpregs.gp_x[3]) +#define MCREG_X4(mc) (mc.mc_gpregs.gp_x[4]) +#define MCREG_X5(mc) (mc.mc_gpregs.gp_x[5]) +#define MCREG_X6(mc) (mc.mc_gpregs.gp_x[6]) +#define MCREG_X7(mc) (mc.mc_gpregs.gp_x[7]) +#define MCREG_X8(mc) (mc.mc_gpregs.gp_x[8]) +#define MCREG_X9(mc) (mc.mc_gpregs.gp_x[9]) +#define MCREG_X10(mc) (mc.mc_gpregs.gp_x[10]) +#define MCREG_X11(mc) (mc.mc_gpregs.gp_x[11]) +#define MCREG_X12(mc) (mc.mc_gpregs.gp_x[12]) +#define MCREG_X13(mc) (mc.mc_gpregs.gp_x[13]) +#define MCREG_X14(mc) (mc.mc_gpregs.gp_x[14]) +#define MCREG_X15(mc) (mc.mc_gpregs.gp_x[15]) +#define MCREG_X16(mc) (mc.mc_gpregs.gp_x[16]) +#define MCREG_X17(mc) (mc.mc_gpregs.gp_x[17]) +#define MCREG_X18(mc) (mc.mc_gpregs.gp_x[18]) +#define MCREG_X19(mc) (mc.mc_gpregs.gp_x[19]) +#define MCREG_X20(mc) (mc.mc_gpregs.gp_x[20]) +#define MCREG_X21(mc) (mc.mc_gpregs.gp_x[21]) +#define MCREG_X22(mc) (mc.mc_gpregs.gp_x[22]) +#define MCREG_X23(mc) (mc.mc_gpregs.gp_x[23]) +#define MCREG_X24(mc) (mc.mc_gpregs.gp_x[24]) +#define MCREG_X25(mc) (mc.mc_gpregs.gp_x[25]) +#define MCREG_X26(mc) (mc.mc_gpregs.gp_x[26]) +#define MCREG_X27(mc) (mc.mc_gpregs.gp_x[27]) +#define MCREG_X28(mc) (mc.mc_gpregs.gp_x[28]) +#define MCREG_Fp(mc) (mc.mc_gpregs.gp_x[29]) +#define MCREG_Cpsr(mc) (mc.mc_fpregs.fp_sr) + +#define MCREG_Lr(mc) (mc.mc_gpregs.gp_lr) +#define MCREG_Sp(mc) (mc.mc_gpregs.gp_sp) + +//TODO: missing those on FreeBSD ? +#define MCREG_Pc(mc) (mc.mc_gpregs.gp_sp) + +inline +struct fpregs* GetNativeSigSimdContext(native_context_t *mc) +{ + return &(mc->uc_mcontext.mc_fpregs); +} + +inline +const struct fpregs* GetConstNativeSigSimdContext(const native_context_t *mc) +{ + return GetNativeSigSimdContext(const_cast(mc)); +} + +#elif !defined(TARGET_OSX) // TARGET_FREEBSD #define MCREG_X0(mc) ((mc).regs[0]) #define MCREG_X1(mc) ((mc).regs[1]) @@ -911,7 +963,7 @@ const VfpSigFrame* GetConstNativeSigSimdContext(const native_context_t *mc) #endif #ifdef HOST_64BIT - +#ifdef HOST_AMD64 #define BSDREG_Rbx(reg) BSD_REGS_STYLE(reg,RBX,rbx) #define BSDREG_Rcx(reg) BSD_REGS_STYLE(reg,RCX,rcx) #define BSDREG_Rdx(reg) BSD_REGS_STYLE(reg,RDX,rdx) @@ -933,6 +985,42 @@ const VfpSigFrame* GetConstNativeSigSimdContext(const native_context_t *mc) #define BSDREG_R15(reg) BSD_REGS_STYLE(reg,R15,r15) #define BSDREG_EFlags(reg) BSD_REGS_STYLE(reg,RFLAGS,rflags) +#elif defined(HOST_ARM64) +#define BSDREG_X0(reg) BSD_REGS_STYLE(reg,X[0],x[0]) +#define BSDREG_X1(reg) BSD_REGS_STYLE(reg,X[1],x[1]) +#define BSDREG_X2(reg) BSD_REGS_STYLE(reg,X[2],x[2]) +#define BSDREG_X3(reg) BSD_REGS_STYLE(reg,X[3],x[3]) +#define BSDREG_X4(reg) BSD_REGS_STYLE(reg,X[4],x[4]) +#define BSDREG_X5(reg) BSD_REGS_STYLE(reg,X[5],x[5]) +#define BSDREG_X6(reg) BSD_REGS_STYLE(reg,X[6],x[6]) +#define BSDREG_X7(reg) BSD_REGS_STYLE(reg,X[7],x[7]) +#define BSDREG_X8(reg) BSD_REGS_STYLE(reg,X[8],x[8]) +#define BSDREG_X9(reg) BSD_REGS_STYLE(reg,X[9],x[9]) +#define BSDREG_X10(reg) BSD_REGS_STYLE(reg,X[10],x[10]) +#define BSDREG_X11(reg) BSD_REGS_STYLE(reg,X[11],x[11]) +#define BSDREG_X12(reg) BSD_REGS_STYLE(reg,X[12],x[12]) +#define BSDREG_X13(reg) BSD_REGS_STYLE(reg,X[13],x[13]) +#define BSDREG_X14(reg) BSD_REGS_STYLE(reg,X[14],x[14]) +#define BSDREG_X15(reg) BSD_REGS_STYLE(reg,X[15],x[15]) +#define BSDREG_X16(reg) BSD_REGS_STYLE(reg,X[16],x[16]) +#define BSDREG_X17(reg) BSD_REGS_STYLE(reg,X[17],x[17]) +#define BSDREG_X18(reg) BSD_REGS_STYLE(reg,X[18],x[18]) +#define BSDREG_X19(reg) BSD_REGS_STYLE(reg,X[19],x[19]) +#define BSDREG_X20(reg) BSD_REGS_STYLE(reg,X[20],x[20]) +#define BSDREG_X21(reg) BSD_REGS_STYLE(reg,X[21],x[21]) +#define BSDREG_X22(reg) BSD_REGS_STYLE(reg,X[22],x[22]) +#define BSDREG_X23(reg) BSD_REGS_STYLE(reg,X[23],x[23]) +#define BSDREG_X24(reg) BSD_REGS_STYLE(reg,X[24],x[24]) +#define BSDREG_X25(reg) BSD_REGS_STYLE(reg,X[25],x[25]) +#define BSDREG_X26(reg) BSD_REGS_STYLE(reg,X[26],x[26]) +#define BSDREG_X27(reg) BSD_REGS_STYLE(reg,X[27],x[27]) +#define BSDREG_X28(reg) BSD_REGS_STYLE(reg,X[28],x[28]) +#define BSDREG_Fp(reg) BSD_REGS_STYLE(reg,X[29],x[29]) +#define BSDREG_Sp(reg) BSD_REGS_STYLE(reg,Sp,sp) +#define BSDREG_Pc(reg) BSD_REGS_STYLE(reg,Pc,pc) +#define BSDREG_Lr(reg) BSD_REGS_STYLE(reg,Lr,lr) +#define BSDREG_Cpsr(reg) BSD_REGS_STYLE(reg,Spsr,spsr) + #else // HOST_64BIT #define BSDREG_Ebx(reg) BSD_REGS_STYLE(reg,EBX,ebx) @@ -948,6 +1036,7 @@ const VfpSigFrame* GetConstNativeSigSimdContext(const native_context_t *mc) #define BSDREG_Esp(reg) BSD_REGS_STYLE(reg,ESP,esp) #define BSDREG_SegSs(reg) BSD_REGS_STYLE(reg,SS,ss) +#endif // HOST_AMD64 #endif // HOST_64BIT #endif // HAVE_BSD_REGS_T diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json index 15c8c0a7477..b2f53649fc7 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json +++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json @@ -3468,6 +3468,14 @@ "any", "base" ], + "freebsd-arm64": [ + "freebsd-arm64", + "freebsd", + "unix-arm64", + "unix", + "any", + "base" + ], "freebsd.12": [ "freebsd.12", "freebsd", @@ -3485,6 +3493,16 @@ "any", "base" ], + "freebsd.12-arm64": [ + "freebsd.12-arm64", + "freebsd.12", + "freebsd-arm64", + "freebsd", + "unix-arm64", + "unix", + "any", + "base" + ], "freebsd.13": [ "freebsd.13", "freebsd.12", @@ -3505,6 +3523,18 @@ "any", "base" ], + "freebsd.13-arm64": [ + "freebsd.13-arm64", + "freebsd.13", + "freebsd.12-arm64", + "freebsd.12", + "freebsd-arm64", + "freebsd", + "unix-arm64", + "unix", + "any", + "base" + ], "gentoo": [ "gentoo", "linux", diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json index 050ce1e4e8c..105e8f41e52 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json +++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.json @@ -1226,6 +1226,12 @@ "unix-x64" ] }, + "freebsd-arm64": { + "#import": [ + "freebsd", + "unix-arm64" + ] + }, "freebsd.12": { "#import": [ "freebsd" @@ -1237,6 +1243,12 @@ "freebsd-x64" ] }, + "freebsd.12-arm64": { + "#import": [ + "freebsd.12", + "freebsd-arm64" + ] + }, "freebsd.13": { "#import": [ "freebsd.12" @@ -1248,6 +1260,12 @@ "freebsd.12-x64" ] }, + "freebsd.13-arm64": { + "#import": [ + "freebsd.13", + "freebsd.12-arm64" + ] + }, "gentoo": { "#import": [ "linux" diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props index 1b10a2604af..db6580cab7b 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props +++ b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props @@ -178,7 +178,7 @@ unix - x64 + x64;arm64 12;13