$NetBSD: patch-third-party_pjproject_patches_0150-netbsd.patch,v 1.1 2024/04/08 03:20:10 jnemeth Exp $ --- third-party/pjproject/patches/0150-netbsd.patch.orig 2024-03-18 06:27:11.302585019 +0000 +++ third-party/pjproject/patches/0150-netbsd.patch @@ -0,0 +1,99 @@ +--- a/third_party/webrtc_aec3/src/system_wrappers/source/cpu_features_netbsd.cc 2024-03-17 23:19:24.937833522 -0700 ++++ b/third_party/webrtc_aec3/src/system_wrappers/source/cpu_features_netbsd.cc 2024-03-17 22:50:07.930587033 -0700 +@@ -0,0 +1,96 @@ ++/* ++ * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. ++ * ++ * Use of this source code is governed by a BSD-style license ++ * that can be found in the LICENSE file in the root of the source ++ * tree. An additional intellectual property rights grant can be found ++ * in the file PATENTS. All contributing project authors may ++ * be found in the AUTHORS file in the root of the source tree. ++ */ ++ ++#include ++#include ++#include ++ ++#ifdef __GLIBC_PREREQ ++#define WEBRTC_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b) ++#else ++#define WEBRTC_GLIBC_PREREQ(a, b) 0 ++#endif ++ ++#if WEBRTC_GLIBC_PREREQ(2, 16) ++#include ++#else ++#include ++#include ++#include ++#include ++#endif ++ ++#include "rtc_base/system/arch.h" ++#include "system_wrappers/include/cpu_features_wrapper.h" ++ ++#if defined(WEBRTC_ARCH_ARM_FAMILY) ++#include ++ ++namespace webrtc { ++ ++uint64_t GetCPUFeaturesARM(void) { ++ uint64_t result = 0; ++ int architecture = 0; ++ uint64_t hwcap = 0; ++ const char* platform = NULL; ++#if WEBRTC_GLIBC_PREREQ(2, 16) ++ hwcap = getauxval(AT_HWCAP); ++ platform = (const char*)getauxval(AT_PLATFORM); ++#else ++ ElfW(auxv_t) auxv; ++ int fd = open("/proc/self/auxv", O_RDONLY); ++ if (fd >= 0) { ++ while (hwcap == 0 || platform == NULL) { ++ if (read(fd, &auxv, sizeof(auxv)) < (ssize_t)sizeof(auxv)) { ++ if (errno == EINTR) ++ continue; ++ break; ++ } ++ switch (auxv.a_type) { ++ case AT_HWCAP: ++ hwcap = auxv.a_un.a_val; ++ break; ++ case AT_PLATFORM: ++ platform = (const char*)auxv.a_un.a_val; ++ break; ++ } ++ } ++ close(fd); ++ } ++#endif // WEBRTC_GLIBC_PREREQ(2, 16) ++#if defined(__aarch64__) ++ architecture = 8; ++ if ((hwcap & HWCAP_FP) != 0) ++ result |= kCPUFeatureVFPv3; ++ if ((hwcap & HWCAP_ASIMD) != 0) ++ result |= kCPUFeatureNEON; ++#else ++ if (platform != NULL) { ++ /* expect a string in the form "v6l" or "v7l", etc. ++ */ ++ if (platform[0] == 'v' && '0' <= platform[1] && platform[1] <= '9' && ++ (platform[2] == 'l' || platform[2] == 'b')) { ++ architecture = platform[1] - '0'; ++ } ++ } ++ if ((hwcap & HWCAP_VFPv3) != 0) ++ result |= kCPUFeatureVFPv3; ++ if ((hwcap & HWCAP_NEON) != 0) ++ result |= kCPUFeatureNEON; ++#endif ++ if (architecture >= 7) ++ result |= kCPUFeatureARMv7; ++ if (architecture >= 6) ++ result |= kCPUFeatureLDREXSTREX; ++ return result; ++} ++ ++} // namespace webrtc ++#endif // WEBRTC_ARCH_ARM_FAMILY