From 9c4eef77db849a379ce5c0b218b5bd6238427daf Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Tue, 14 Feb 2023 00:11:30 +0100 Subject: [PATCH 1/5] inputstream.adaptive: add nss dependency for all archs Signed-off-by: Matthias Reichl --- .../kodi-binary-addons/inputstream.adaptive/package.mk | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk index 5d85130c4e..e051b35e7f 100644 --- a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk +++ b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk @@ -9,17 +9,13 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.adaptive" PKG_URL="https://github.com/xbmc/inputstream.adaptive/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain kodi-platform bento4 expat" +PKG_DEPENDS_TARGET="toolchain kodi-platform bento4 expat nss" PKG_SECTION="" PKG_SHORTDESC="inputstream.adaptive" PKG_LONGDESC="inputstream.adaptive" PKG_IS_ADDON="yes" -if [ "${TARGET_ARCH}" = "x86_64" ] || [ "${TARGET_ARCH}" = "arm" ]; then - PKG_DEPENDS_TARGET+=" nss" -fi - addon() { install_binary_addon ${PKG_ADDON_ID} From 7e809528e98b0b74b253275bcd67e08f2a21edc4 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Fri, 24 Feb 2023 15:20:07 +0100 Subject: [PATCH 2/5] virtual/network: include nss in image for all archs Signed-off-by: Matthias Reichl --- packages/virtual/network/package.mk | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/virtual/network/package.mk b/packages/virtual/network/package.mk index 3f33bad478..eda28147d4 100644 --- a/packages/virtual/network/package.mk +++ b/packages/virtual/network/package.mk @@ -6,7 +6,7 @@ PKG_VERSION="" PKG_LICENSE="various" PKG_SITE="https://libreelec.tv" PKG_URL="" -PKG_DEPENDS_TARGET="toolchain connman netbase ethtool openssh iw wireless-regdb" +PKG_DEPENDS_TARGET="toolchain connman netbase ethtool openssh iw wireless-regdb nss" PKG_SECTION="virtual" PKG_LONGDESC="Metapackage for various packages to install network support" @@ -29,8 +29,3 @@ fi if [ "${ISCSI_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" open-iscsi" fi - -# nss needed by inputstream.adaptive, chromium etc. -if [ "${TARGET_ARCH}" = "x86_64" ] || [ "${TARGET_ARCH}" = "arm" ]; then - PKG_DEPENDS_TARGET+=" nss" -fi From ca01cd88b875183b33bf5eb9b1883a13ec4a96d8 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Fri, 24 Feb 2023 16:10:32 +0100 Subject: [PATCH 3/5] glibc: use widevine patches also on aarch64 Signed-off-by: Matthias Reichl --- packages/devel/glibc/package.mk | 4 ++++ ...HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch | 0 ...tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch | 0 3 files changed, 4 insertions(+) rename packages/devel/glibc/patches/{arm => widevine-arm}/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch (100%) rename packages/devel/glibc/patches/{arm => widevine-arm}/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch (100%) diff --git a/packages/devel/glibc/package.mk b/packages/devel/glibc/package.mk index 35e25f2bc2..914523f4f5 100644 --- a/packages/devel/glibc/package.mk +++ b/packages/devel/glibc/package.mk @@ -13,6 +13,10 @@ PKG_DEPENDS_INIT="glibc" PKG_LONGDESC="The Glibc package contains the main C library." PKG_BUILD_FLAGS="+bfd" +if [ "${TARGET_ARCH}" = "arm" ] || [ "${TARGET_ARCH}" = "aarch64" ]; then + PKG_PATCH_DIRS="widevine-arm" +fi + PKG_CONFIGURE_OPTS_TARGET="BASH_SHELL=/bin/sh \ ac_cv_path_PERL=no \ ac_cv_prog_MAKEINFO= \ diff --git a/packages/devel/glibc/patches/arm/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch b/packages/devel/glibc/patches/widevine-arm/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch similarity index 100% rename from packages/devel/glibc/patches/arm/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch rename to packages/devel/glibc/patches/widevine-arm/glibc-HACK-Don-t-check-GLIBC_ABI_DT_RELR-support-for-Chrom.patch diff --git a/packages/devel/glibc/patches/arm/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch b/packages/devel/glibc/patches/widevine-arm/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch similarity index 100% rename from packages/devel/glibc/patches/arm/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch rename to packages/devel/glibc/patches/widevine-arm/glibc-tls-libwidevinecdm.so-since-4.10.2252.0-has-TLS-with.patch From 8923a27a5e8602d3616d622b44de0f5bee6f1b87 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Tue, 7 Mar 2023 12:45:10 +0100 Subject: [PATCH 4/5] inputstream.adaptive: add support for aarch64 widevine The changes are already in the i.a Omeaga branch and can be dropped with the next update. Signed-off-by: Matthias Reichl --- .../001-add-aarch64-widevine-support.patch | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 packages/mediacenter/kodi-binary-addons/inputstream.adaptive/patches/001-add-aarch64-widevine-support.patch diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/patches/001-add-aarch64-widevine-support.patch b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/patches/001-add-aarch64-widevine-support.patch new file mode 100644 index 0000000000..b92355141e --- /dev/null +++ b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/patches/001-add-aarch64-widevine-support.patch @@ -0,0 +1,215 @@ +From 582ae9559c74288f488313c2b3a737e9fc1c6715 Mon Sep 17 00:00:00 2001 +From: Aman Karmani +Date: Thu, 9 Feb 2023 17:04:28 -0800 +Subject: [PATCH 1/2] [widevine] add support for linux arm64 + +without these changes, the following error is observed: + + Initialize: Failed to load library: libwidevinecdm.so: undefined symbol: __aarch64_ldadd4_acq_rel + Unable to load widevine shared library (libwidevinecdm.so) +--- + src/Session.cpp | 13 ++++++++ + wvdecrypter/wvdecrypter.cpp | 66 +++++++++++++++++++++++++++++++++++++ + 2 files changed, 79 insertions(+) + +diff --git a/src/Session.cpp b/src/Session.cpp +index db16866c..21988b7e 100644 +--- a/src/Session.cpp ++++ b/src/Session.cpp +@@ -140,6 +140,19 @@ void CSession::SetSupportedDecrypterURN(std::string& key_system) + m_dllHelper = std::make_unique(); + if (m_dllHelper->LoadDll(item.Path())) + { ++#if defined(__linux__) && defined(__aarch64__) && !defined(ANDROID) ++ // On linux arm64, libwidevinecdm.so depends on two dynamic symbols: ++ // __aarch64_ldadd4_acq_rel ++ // __aarch64_swp4_acq_rel ++ // These are defined in libssd_wv.so, but to make them available in the main binary's PLT, ++ // we need RTLD_GLOBAL. LoadDll() above uses RTLD_LOCAL, so we use RTLD_NOLOAD here to ++ // switch the flags from LOCAL to GLOBAL. ++ void *hdl = dlopen(item.Path().c_str(), RTLD_NOLOAD | RTLD_GLOBAL | RTLD_LAZY); ++ if (!hdl) ++ { ++ LOG::Log(LOGERROR, "Failed to reload dll in global mode: %s", dlerror()); ++ } ++#endif + CreateDecryptorInstanceFunc startup; + if (m_dllHelper->RegisterSymbol(startup, "CreateDecryptorInstance")) + { +diff --git a/wvdecrypter/wvdecrypter.cpp b/wvdecrypter/wvdecrypter.cpp +index 927b3715..68ce8959 100644 +--- a/wvdecrypter/wvdecrypter.cpp ++++ b/wvdecrypter/wvdecrypter.cpp +@@ -23,6 +23,9 @@ + #include + #include + ++#if defined(__linux__) && defined(__aarch64__) && !defined(ANDROID) ++#include ++#endif + #include + + #ifndef WIDEVINECDMFILENAME +@@ -1671,6 +1674,69 @@ class WVDecrypter : public SSD_DECRYPTER + + extern "C" { + ++// Linux arm64 version of libwidevinecdm.so depends on two ++// dynamic symbols. See https://github.com/xbmc/inputstream.adaptive/issues/1128 ++// These implementations are based on libgcc.a lse.S ++#if defined(__linux__) && defined(__aarch64__) && !defined(ANDROID) ++static int have_lse_atomics; ++ ++static void __attribute__((constructor (101))) init_have_lse_atomics() ++{ ++ unsigned long hwcap = getauxval (AT_HWCAP); ++ have_lse_atomics = (hwcap & HWCAP_ATOMICS) != 0; ++} ++ ++int32_t __aarch64_ldadd4_acq_rel(int32_t value, int32_t *ptr) ++{ ++ int32_t ret; ++ if (have_lse_atomics) { ++ __asm__ __volatile__ ( ++ ".inst 0x38200020 + 0x0000 + 0x80000000 + 0xc00000\r\n" ++ : "=&r" (ret) ++ : ++ ); ++ } else { ++ __asm__ __volatile__ ( ++ "0:\r\n" ++ "ldaxr w16, [%[ptr]]\r\n" ++ "add w17, w16, %w[value]\r\n" ++ "stlxr w15, w17, [%[ptr]]\r\n" ++ "cbnz w15, 0b\r\n" ++ "mov %w[result], w16\r\n" ++ : [result] "=&r" (ret) ++ : [ptr] "r" (ptr), ++ [value] "r" (value) ++ : "w15", "w16", "w17", "memory" ++ ); ++ } ++ return ret; ++} ++ ++int32_t __aarch64_swp4_acq_rel(int32_t value, int32_t *ptr) ++{ ++ int32_t ret; ++ if (have_lse_atomics) { ++ __asm__ __volatile__ ( ++ ".inst 0x38208020 + 0x80000000 + 0xc00000\r\n" ++ : "=&r" (ret) ++ : ++ ); ++ } else { ++ __asm__ __volatile__ ( ++ "0:\r\n" ++ "ldaxr %w[result], [%[ptr]]\r\n" ++ "stlxr w15, %w[value], [%[ptr]]\r\n" ++ "cbnz w15, 0b\r\n" ++ : [result] "=&r" (ret) ++ : [ptr] "r" (ptr), ++ [value] "r" (value) ++ : "w15", "memory" ++ ); ++ } ++ return ret; ++} ++#endif ++ + #ifdef _WIN32 + #define MODULE_API __declspec(dllexport) + #else + +From 620e8eed7b662c7b125c2b96397d88e0572ed750 Mon Sep 17 00:00:00 2001 +From: Aman Karmani +Date: Fri, 10 Feb 2023 08:06:28 -0800 +Subject: [PATCH 2/2] [widevine] reimplement linux arm64 helpers without ASM + +--- + wvdecrypter/wvdecrypter.cpp | 58 +++---------------------------------- + 1 file changed, 4 insertions(+), 54 deletions(-) + +diff --git a/wvdecrypter/wvdecrypter.cpp b/wvdecrypter/wvdecrypter.cpp +index 68ce8959..ccb4936d 100644 +--- a/wvdecrypter/wvdecrypter.cpp ++++ b/wvdecrypter/wvdecrypter.cpp +@@ -23,9 +23,6 @@ + #include + #include + +-#if defined(__linux__) && defined(__aarch64__) && !defined(ANDROID) +-#include +-#endif + #include + + #ifndef WIDEVINECDMFILENAME +@@ -1676,64 +1673,17 @@ extern "C" { + + // Linux arm64 version of libwidevinecdm.so depends on two + // dynamic symbols. See https://github.com/xbmc/inputstream.adaptive/issues/1128 +-// These implementations are based on libgcc.a lse.S + #if defined(__linux__) && defined(__aarch64__) && !defined(ANDROID) +-static int have_lse_atomics; +- +-static void __attribute__((constructor (101))) init_have_lse_atomics() +-{ +- unsigned long hwcap = getauxval (AT_HWCAP); +- have_lse_atomics = (hwcap & HWCAP_ATOMICS) != 0; +-} +- ++__attribute__((target("no-outline-atomics"))) + int32_t __aarch64_ldadd4_acq_rel(int32_t value, int32_t *ptr) + { +- int32_t ret; +- if (have_lse_atomics) { +- __asm__ __volatile__ ( +- ".inst 0x38200020 + 0x0000 + 0x80000000 + 0xc00000\r\n" +- : "=&r" (ret) +- : +- ); +- } else { +- __asm__ __volatile__ ( +- "0:\r\n" +- "ldaxr w16, [%[ptr]]\r\n" +- "add w17, w16, %w[value]\r\n" +- "stlxr w15, w17, [%[ptr]]\r\n" +- "cbnz w15, 0b\r\n" +- "mov %w[result], w16\r\n" +- : [result] "=&r" (ret) +- : [ptr] "r" (ptr), +- [value] "r" (value) +- : "w15", "w16", "w17", "memory" +- ); +- } +- return ret; ++ return __atomic_fetch_add(ptr, value, __ATOMIC_ACQ_REL); + } + ++__attribute__((target("no-outline-atomics"))) + int32_t __aarch64_swp4_acq_rel(int32_t value, int32_t *ptr) + { +- int32_t ret; +- if (have_lse_atomics) { +- __asm__ __volatile__ ( +- ".inst 0x38208020 + 0x80000000 + 0xc00000\r\n" +- : "=&r" (ret) +- : +- ); +- } else { +- __asm__ __volatile__ ( +- "0:\r\n" +- "ldaxr %w[result], [%[ptr]]\r\n" +- "stlxr w15, %w[value], [%[ptr]]\r\n" +- "cbnz w15, 0b\r\n" +- : [result] "=&r" (ret) +- : [ptr] "r" (ptr), +- [value] "r" (value) +- : "w15", "memory" +- ); +- } +- return ret; ++ return __atomic_exchange_n(ptr, value, __ATOMIC_ACQ_REL); + } + #endif + From d2c9bd665e6b30bc26ce259711970b27eba07955 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Thu, 9 Mar 2023 20:46:33 +0100 Subject: [PATCH 5/5] inputstream.adaptive: bump PKG_REV Signed-off-by: Matthias Reichl --- .../kodi-binary-addons/inputstream.adaptive/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk index e051b35e7f..6ba6b67e8c 100644 --- a/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk +++ b/packages/mediacenter/kodi-binary-addons/inputstream.adaptive/package.mk @@ -4,7 +4,7 @@ PKG_NAME="inputstream.adaptive" PKG_VERSION="21.0.1-Omega" PKG_SHA256="d3e9a2e9964342fc56424b5f5eca6540fb2e524be830ab4927d96ef6590b1388" -PKG_REV="1" +PKG_REV="2" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="https://github.com/xbmc/inputstream.adaptive"