From: John Wolfe Date: Mon, 22 Feb 2021 17:37:00 +0000 (-0800) Subject: Adding FreeBSD on ARM64 support to open-vm-tools. X-Git-Tag: stable-11.3.0~136 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c27a31bbe54cdff6f53825a163d65e1c559a884;p=thirdparty%2Fopen-vm-tools.git Adding FreeBSD on ARM64 support to open-vm-tools. Updating the FreeBSD specific sections of open-vm-tools to adjust where necessary for ARM64. The FreeBSD vmballoon driver (vmmemctl.ko) will use the backdoorGcc64_arm64.c when built for ARM64. Pull request: https://github.com/vmware/open-vm-tools/pull/474 --- diff --git a/open-vm-tools/AUTHORS b/open-vm-tools/AUTHORS index c1c70c361..57b06a124 100644 --- a/open-vm-tools/AUTHORS +++ b/open-vm-tools/AUTHORS @@ -70,3 +70,6 @@ Alexey Shabalin Adding vmtools library dependency to deploypkg library. Christian Ehrhardt Build: fix propagation of libtirpc flags - https://github.com/vmware/open-vm-tools/pull/469 + +Vincent Milum Jr Adding FreeBSD on ARM64 support to open-vm-tools. + - https://github.com/vmware/open-vm-tools/pull/474 diff --git a/open-vm-tools/hgfsclient/hgfsclient.c b/open-vm-tools/hgfsclient/hgfsclient.c index 12b668253..c31183334 100644 --- a/open-vm-tools/hgfsclient/hgfsclient.c +++ b/open-vm-tools/hgfsclient/hgfsclient.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2006-2019 VMware, Inc. All rights reserved. + * Copyright (C) 2006-2019,2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -28,7 +28,6 @@ #include "vmware.h" #include "guestApp.h" #include "vmcheck.h" -#include "escBitvector.h" #include "hgfsEscape.h" #include "hgfs.h" #include "hgfsBd.h" diff --git a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c index 84acc3ad2..63c4e65f0 100644 --- a/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c +++ b/open-vm-tools/lib/hgfsServer/hgfsServerLinux.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 1998-2020 VMware, Inc. All rights reserved. + * Copyright (C) 1998-2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -2565,7 +2565,7 @@ HgfsStatToFileAttr(struct stat *stats, // IN: stat information attr->specialPerms, attr->ownerPerms, attr->groupPerms, attr->otherPerms, attr->size); #ifdef __FreeBSD__ -# if !defined(VM_X86_64) && __FreeBSD_version >= 500043 +# if !defined(VM_X86_64) && !defined(VM_ARM_64) && __FreeBSD_version >= 500043 # define FMTTIMET "" # else # define FMTTIMET "l" diff --git a/open-vm-tools/lib/include/escBitvector.h b/open-vm-tools/lib/include/escBitvector.h deleted file mode 100644 index 7f41e2088..000000000 --- a/open-vm-tools/lib/include/escBitvector.h +++ /dev/null @@ -1,156 +0,0 @@ -/********************************************************* - * Copyright (C) 1998-2016 VMware, Inc. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation version 2.1 and no later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public - * License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - *********************************************************/ - -/********************************************************* - * The contents of this file are subject to the terms of the Common - * Development and Distribution License (the "License") version 1.0 - * and no later version. You may not use this file except in - * compliance with the License. - * - * You can obtain a copy of the License at - * http://www.opensource.org/licenses/cddl1.php - * - * See the License for the specific language governing permissions - * and limitations under the License. - * - *********************************************************/ - - - -#ifndef _ESC_BITVECTOR_H_ -#define _ESC_BITVECTOR_H_ - -#define INCLUDE_ALLOW_USERLEVEL -#define INCLUDE_ALLOW_MODULE -#define INCLUDE_ALLOW_DISTRIBUTE // XXX is this true? -#include "includeCheck.h" - - -#ifdef __KERNEL__ -#include "driver-config.h" -#include -/* Don't include these if compiling for the Solaris or Apple kernels. */ -#elif !defined _KERNEL && !defined KERNEL -#include -#include -#endif - -#if defined _KERNEL && defined __FreeBSD__ -# include -#elif defined KERNEL && defined __APPLE__ -# include -#endif - -#include "vm_assert.h" - - - -#define ESC_BITVECTOR_INDEX(_x) ((_x)>>5) -#define ESC_BITVECTOR_MASK(_x) (1<<((_x)&31)) - -#define ESC_BITVECTOR_SIZE 256 // hardwired size of the bitvector - -/* - *---------------------------------------------------------------------- - * - * EscBitVector -- - * - * Taken from bitvector.h, but hard wired for use with the Escape - * routines, which always need a bitvector of 256 bits, are never - * used in the monitor, and need to work in the linux kernel. [bac] - * - * - *---------------------------------------------------------------------- - */ -typedef struct EscBitVector { - uint32 vector[ESC_BITVECTOR_SIZE/32]; -} EscBitVector; - - -/* - *---------------------------------------------------------------------- - * - * EscBitVector_Init -- - * - * Clear all the bits in this vector. - * - * Results: - * All bits are cleared - * - *---------------------------------------------------------------------- - */ -static INLINE void EscBitVector_Init(EscBitVector *bv) -{ - memset(bv, 0, sizeof(EscBitVector)); -} - -/* - *---------------------------------------------------------------------- - * - * EscBitVector_Set, EscBitVector_Clear, EscBitVector_Test -- - * - * basic operations - * - * Results: - * insertion/deletion/presence to/from/in the set - * - * EscBitVector_Test returns non-zero if present, 0 otherwise - * - * - *---------------------------------------------------------------------- - */ -static INLINE void EscBitVector_Set(EscBitVector *bv,int n) -{ - ASSERT(n>=0 && nvector[0]) :"Ir" (n)); -#else - bv->vector[ESC_BITVECTOR_INDEX(n)] |= ESC_BITVECTOR_MASK(n); -#endif -} - -static INLINE void EscBitVector_Clear(EscBitVector *bv,int n) -{ - ASSERT(n>=0 && nvector[0]) :"Ir" (n)); -#else - bv->vector[ESC_BITVECTOR_INDEX(n)] &= ~ESC_BITVECTOR_MASK(n); -#endif -} - -static INLINE int EscBitVector_Test(EscBitVector const *bv, int n) -{ - ASSERT(n>=0 && nvector[0]),"Ir" (n)); - return tmp; - } -#else - return ((bv->vector[ESC_BITVECTOR_INDEX(n)] & ESC_BITVECTOR_MASK(n)) != 0); -#endif -} - - - - -#endif /* _ESC_BITVECTOR_H_ */ - - diff --git a/open-vm-tools/lib/include/sigPosixRegs.h b/open-vm-tools/lib/include/sigPosixRegs.h index fe884a2bb..4ad6df28f 100644 --- a/open-vm-tools/lib/include/sigPosixRegs.h +++ b/open-vm-tools/lib/include/sigPosixRegs.h @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2009-2017,2020 VMware, Inc. All rights reserved. + * Copyright (C) 2009-2017,2020-2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -189,6 +189,8 @@ extern "C" { #define SC_R13(uc) ((unsigned long) (uc)->uc_mcontext.mc_r13) #define SC_R14(uc) ((unsigned long) (uc)->uc_mcontext.mc_r14) #define SC_R15(uc) ((unsigned long) (uc)->uc_mcontext.mc_r15) +#elif defined(__aarch64__) +#define SC_X(uc,n) ((unsigned long) (uc)->uc_mcontext.mc_gpregs.gp_x[n]) #else #define SC_EAX(uc) ((unsigned long) (uc)->uc_mcontext.mc_eax) #define SC_EBX(uc) ((unsigned long) (uc)->uc_mcontext.mc_ebx) diff --git a/open-vm-tools/lib/include/vm_basic_asm.h b/open-vm-tools/lib/include/vm_basic_asm.h index 97c170c0c..635c9c16a 100644 --- a/open-vm-tools/lib/include/vm_basic_asm.h +++ b/open-vm-tools/lib/include/vm_basic_asm.h @@ -205,7 +205,7 @@ mssb64_0(const uint64 value) } #endif -#ifdef __GNUC__ +#if defined __GNUC__ || defined __clang__ #ifdef VM_X86_ANY #define USE_ARCH_X86_CUSTOM diff --git a/open-vm-tools/lib/misc/hostinfoPosix.c b/open-vm-tools/lib/misc/hostinfoPosix.c index cf9d95b49..fd1a0fd70 100644 --- a/open-vm-tools/lib/misc/hostinfoPosix.c +++ b/open-vm-tools/lib/misc/hostinfoPosix.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 1998-2020 VMware, Inc. All rights reserved. + * Copyright (C) 1998-2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -140,11 +140,13 @@ #define SYSTEM_BITNESS_64_SUN "amd64" #define SYSTEM_BITNESS_64_LINUX "x86_64" #define SYSTEM_BITNESS_64_ARM_LINUX "aarch64" +#define SYSTEM_BITNESS_64_ARM_FREEBSD "arm64" #define SYSTEM_BITNESS_MAXLEN \ MAX(sizeof SYSTEM_BITNESS_32, \ MAX(sizeof SYSTEM_BITNESS_64_SUN, \ MAX(sizeof SYSTEM_BITNESS_64_LINUX, \ - sizeof SYSTEM_BITNESS_64_ARM_LINUX))) + MAX(sizeof SYSTEM_BITNESS_64_ARM_LINUX, \ + sizeof SYSTEM_BITNESS_64_ARM_FREEBSD)))) struct hostinfoOSVersion { int hostinfoOSVersion[4]; @@ -496,7 +498,9 @@ Hostinfo_GetSystemBitness(void) if (strcmp(buf, SYSTEM_BITNESS_32) == 0) { return 32; } else if (strcmp(buf, SYSTEM_BITNESS_64_SUN) == 0 || - strcmp(buf, SYSTEM_BITNESS_64_LINUX) == 0) { + strcmp(buf, SYSTEM_BITNESS_64_LINUX) == 0 || + strcmp(buf, SYSTEM_BITNESS_64_ARM_LINUX) == 0 || + strcmp(buf, SYSTEM_BITNESS_64_ARM_FREEBSD) == 0) { return 64; } diff --git a/open-vm-tools/modules/freebsd/vmmemctl/Makefile b/open-vm-tools/modules/freebsd/vmmemctl/Makefile index ba3fd142c..18308928b 100644 --- a/open-vm-tools/modules/freebsd/vmmemctl/Makefile +++ b/open-vm-tools/modules/freebsd/vmmemctl/Makefile @@ -1,6 +1,6 @@ #!/usr/bin/make -f ########################################################## -# Copyright (C) 2007-2018 VMware, Inc. All rights reserved. +# Copyright (C) 2007-2018, 2021 VMware, Inc. All rights reserved. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -28,6 +28,8 @@ SRCS += kernelStubsBSD.c .if $(MACHINE_ARCH) == "amd64" SRCS += backdoorGcc64.c +.elif $(MACHINE_ARCH) == "aarch64" +SRCS += backdoorGcc64_arm64.c .else SRCS += backdoorGcc32.c .endif diff --git a/open-vm-tools/modules/freebsd/vmmemctl/os.c b/open-vm-tools/modules/freebsd/vmmemctl/os.c index 20ec9d005..b5c16c470 100644 --- a/open-vm-tools/modules/freebsd/vmmemctl/os.c +++ b/open-vm-tools/modules/freebsd/vmmemctl/os.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2000,2014,2018-2020 VMware, Inc. All rights reserved. + * Copyright (C) 2000,2014,2018-2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -256,6 +256,10 @@ static __inline__ unsigned long os_ffz(unsigned long word) __asm__("bsfq %1,%0" :"=r" (word) :"r" (~word)); +#elif defined(__aarch64__) + __asm__("rbit %0, %1; clz %0,%0" + :"=r" (word) + :"r" (~word)); #else __asm__("bsfl %1,%0" :"=r" (word) diff --git a/open-vm-tools/vmblockmounter/vmblockmounter.c b/open-vm-tools/vmblockmounter/vmblockmounter.c index 382800c12..2735fd334 100644 --- a/open-vm-tools/vmblockmounter/vmblockmounter.c +++ b/open-vm-tools/vmblockmounter/vmblockmounter.c @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2011-2016 VMware, Inc. All rights reserved. + * Copyright (C) 2011-2016, 2021 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -129,7 +129,7 @@ int main(int argc, // IN char *argv[]) // IN { - char c; + int c; int i; int result = EXIT_FAILURE; int mntRes = -1;