git: 8489b7372bc1 - main - www/qt6-webengine: add powerpc64le support

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Thu, 15 Oct 2026 10:45:40 UTC
The branch main has been updated by pkubaj:

URL: https://cgit.FreeBSD.org/ports/commit/?id=8489b7372bc1c2731e81d0f65225bd3949d29204

commit 8489b7372bc1c2731e81d0f65225bd3949d29204
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2026-10-14 18:51:25 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2026-10-15 10:45:20 +0000

    www/qt6-webengine: add powerpc64le support
    
    The architecture layer is derived from Chimera Linux's qt6-qtwebengine
    ppc64le patchset, reduced to the files FreeBSD actually compiles and
    adapted to FreeBSD:
    - gn: map uname -m "powerpc" to ppc64 in host arch detection
    - cmake/QtToolchainHelpers: map power64 to the ppc64 GN arch
    - build/config/compiler: don't force a Linux target triple on BSD
    - PartitionAlloc: ppc64 GN wiring, dynamic-page-size ASLR variant on BSD
      (as for arm64), pin kAlignment to 16 (alignof(max_align_t) is 8 while
      long double is 64-bit)
    - v8: POWER8 baseline with AltiVec/VSX; make
      Assembler::kMaximalBufferSize public, as the 6.11.2 baseline compiler
      needs it
    - base: define kThreadPriorityToNiceValueMapForTest on BSD; on ppc64 the
      TOC reference survives --gc-sections
    - blink/webaudio: fix the stale scalar ProcessARateVector fallback
      signature in delay.cc
    - devtools: don't create a zero-sized @rollup/plugin-terser worker pool
      when os.cpus() is empty (libuv lacks hw.clockrate on powerpc)
    - boringssl, dav1d (HAVE_ELF_AUX_INFO), dawn, highway, libaom, libvpx,
      pffft, webrtc, ui/gl, abseil cycleclock, MUSTTAIL: ppc64 support
    
    No functional change for the other architectures.
    
    Approved by:    kde (maintainer timeout)
    Differential Revision:  https://reviews.freebsd.org/D59520
---
 www/qt6-webengine/Makefile                         |  2 +-
 .../files/patch-cmake_QtToolchainHelpers.cmake     | 15 +++++--
 ...cator_partition__allocator_partition__alloc.gni | 15 +++++--
 ...artition__alloc_address__space__randomization.h | 11 ++++-
 ...c_partition__alloc_page__allocator__constants.h | 11 ++++-
 ..._partition__alloc_partition__alloc__constants.h | 18 ++++++--
 ...rc_partition__alloc_partition__alloc__forward.h |  6 ++-
 ...src_3rdparty_chromium_base_compiler__specific.h | 11 ++++-
 ...hromium_base_threading_platform__thread__bsd.cc | 14 +++++-
 ...rdparty_chromium_build_config_compiler_BUILD.gn |  9 ++++
 ...il-cpp_absl_base_internal_unscaledcycleclock.cc | 18 ++++++++
 ...d__party_blink_renderer_platform_audio_delay.cc | 13 ++++++
 ...dparty_chromium_third__party_boringssl_BUILD.gn | 18 ++++++++
 ...d__party_boringssl_src_include_openssl_target.h | 12 +++++
 ..._third__party_dav1d_config_linux_ppc64_config.h | 51 ++++++++++++++++++++++
 ...rd__party_dav1d_libdav1d_src_ppc_dav1d__types.h | 22 ++++++++++
 ...um_third__party_dawn_src_dawn_common_Platform.h | 24 +++++++++-
 ...modules__rollup_plugin-terser_dist_cjs_index.js | 11 +++++
 ..._modules__rollup_plugin-terser_dist_es_index.js | 11 +++++
 ...hromium_third__party_highway_src_hwy_targets.cc | 14 ++++++
 ..._3rdparty_chromium_third__party_libaom_BUILD.gn | 11 +++++
 ..._3rdparty_chromium_third__party_libvpx_BUILD.gn | 33 ++++++++++++++
 ...y_chromium_third__party_libvpx_generate__gni.sh | 20 +++++++++
 ...rdparty_chromium_third__party_pffft_src_pffft.c | 10 +++++
 ...ium_third__party_webrtc_rtc__base_system_arch.h | 21 +++++++++
 .../patch-src_3rdparty_chromium_ui_gl_features.gni |  9 ++++
 .../files/patch-src_3rdparty_chromium_v8_BUILD.gn  | 23 ++++++++--
 ...rty_chromium_v8_src_codegen_ppc_assembler-ppc.h | 16 +++++++
 .../patch-src_3rdparty_chromium_v8_test_BUILD.gn   | 29 ++++++++++++
 .../patch-src_3rdparty_gn_src_util_sys__info.cc    | 11 +++++
 30 files changed, 467 insertions(+), 22 deletions(-)

diff --git a/www/qt6-webengine/Makefile b/www/qt6-webengine/Makefile
index 8dd8990c33b2..03277d20cfe0 100644
--- a/www/qt6-webengine/Makefile
+++ b/www/qt6-webengine/Makefile
@@ -22,7 +22,7 @@ MAINTAINER=	kde@FreeBSD.org
 COMMENT?=	Qt 6 library to render web content
 
 # 32-bit platforms are not supported by upstream, but we're limping them along.
-ONLY_FOR_ARCHS=	aarch64 amd64 armv7 i386
+ONLY_FOR_ARCHS=	aarch64 amd64 armv7 i386 powerpc64le
 
 BUILD_DEPENDS=	${LOCALBASE}/include/vulkan/vulkan.h:graphics/vulkan-headers \
 		${PYTHON_PKGNAMEPREFIX}cyclonedx-python-lib>0:textproc/py-cyclonedx-python-lib@${PY_FLAVOR} \
diff --git a/www/qt6-webengine/files/patch-cmake_QtToolchainHelpers.cmake b/www/qt6-webengine/files/patch-cmake_QtToolchainHelpers.cmake
index dea62fe440b1..27d3991021a9 100644
--- a/www/qt6-webengine/files/patch-cmake_QtToolchainHelpers.cmake
+++ b/www/qt6-webengine/files/patch-cmake_QtToolchainHelpers.cmake
@@ -1,6 +1,15 @@
 --- cmake/QtToolchainHelpers.cmake.orig	2026-08-11 12:42:19 UTC
 +++ cmake/QtToolchainHelpers.cmake
-@@ -95,6 +95,8 @@ function(get_gn_os result)
+@@ -55,6 +55,8 @@ function(get_gn_arch result arch)
+         set(${result} "mips64el" PARENT_SCOPE)
+     elseif(arch STREQUAL "riscv64")
+         set(${result} "riscv64" PARENT_SCOPE)
++    elseif(arch STREQUAL "power64")
++        set(${result} "ppc64" PARENT_SCOPE)
+     else()
+         message(FATAL_ERROR "Unknown architecture: ${arch}")
+     endif()
+@@ -95,6 +97,8 @@ function(get_gn_os result)
          set(${result} "mac" PARENT_SCOPE)
      elseif(IOS)
          set(${result} "ios" PARENT_SCOPE)
@@ -9,7 +18,7 @@
      else()
          message(DEBUG "Unrecognized OS")
      endif()
-@@ -492,7 +494,7 @@ macro(append_compiler_linker_sdk_setup)
+@@ -492,7 +496,7 @@ macro(append_compiler_linker_sdk_setup)
          )
      endif()
      get_gn_arch(cpu ${TEST_architecture_arch})
@@ -18,7 +27,7 @@
  
          extend_gn_list_cflag(gnArgArg
              ARG arm_tune
-@@ -601,7 +603,7 @@ macro(append_toolchain_setup)
+@@ -601,7 +605,7 @@ macro(append_toolchain_setup)
          endif()
          unset(host_cpu)
          unset(target_cpu)
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_partition__alloc.gni b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_partition__alloc.gni
index 707912e65ac1..0735dc5378bf 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_partition__alloc.gni
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_partition__alloc.gni
@@ -1,6 +1,15 @@
---- src/3rdparty/chromium/base/allocator/partition_allocator/partition_alloc.gni.orig	2025-09-06 10:01:20 UTC
+--- src/3rdparty/chromium/base/allocator/partition_allocator/partition_alloc.gni.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/allocator/partition_allocator/partition_alloc.gni
-@@ -87,7 +87,7 @@ if (current_cpu == "x64" || current_cpu == "arm64" || 
+@@ -66,7 +66,7 @@ if (current_cpu == "x64" || current_cpu == "arm64" || 
+ # Whether 64-bit pointers are used.
+ # A static_assert in partition_alloc_config.h verifies that.
+ if (current_cpu == "x64" || current_cpu == "arm64" || current_cpu == "arm64e" ||
+-    current_cpu == "loong64" || current_cpu == "riscv64") {
++    current_cpu == "loong64" || current_cpu == "riscv64" || current_cpu == "ppc64") {
+   assert(current_cpu != "arm64e" || (is_ios && target_environment == "device"))
+   has_64_bit_pointers = true
+ } else if (current_cpu == "x86" || current_cpu == "arm" ||
+@@ -87,7 +87,7 @@ use_large_empty_slot_span_ring = true
  # TODO(crbug.com/329199197): Clean this up when experiments are complete.
  use_large_empty_slot_span_ring = true
  
@@ -9,7 +18,7 @@
                       !is_hwasan && (is_linux || is_android)
  
  declare_args() {
-@@ -493,7 +493,7 @@ assert(!use_asan_backup_ref_ptr || use_raw_ptr_hookabl
+@@ -493,7 +493,7 @@ is_pkeys_available =
  # dependencies that use partition_allocator are compiled in AOSP against a
  # version of glibc that does not include pkeys syscall numbers.
  is_pkeys_available =
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h
index 317e43d0705e..124d8cc534e9 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_address__space__randomization.h
@@ -1,4 +1,4 @@
---- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h.orig	2025-09-06 10:01:20 UTC
+--- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/address_space_randomization.h
 @@ -43,7 +43,7 @@ AslrMask(uintptr_t bits) {
  
@@ -18,3 +18,12 @@
  
        // Linux on arm64 can use 39, 42, 48, or 52-bit user space, depending on
        // page size and number of levels of translation pages used. We use
+@@ -183,7 +183,7 @@ AslrMask(uintptr_t bits) {
+         }
+ 
+       #else  // !PA_BUILDFLAG(IS_AIX) && !PA_BUILDFLAG(PA_ARCH_CPU_BIG_ENDIAN)
+-        #if PA_BUILDFLAG(IS_LINUX)
++        #if PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_BSD)
+ 
+         // Little-endian Linux PPC has 48 bits of virtual addressing. Use 46.
+         PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR uintptr_t ASLRMask() {
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h
index 055727b03e3d..fb7ea9c0dc2e 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_page__allocator__constants.h
@@ -1,4 +1,4 @@
---- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h.orig	2025-09-06 10:01:20 UTC
+--- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/page_allocator_constants.h
 @@ -31,8 +31,8 @@
  #define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const))
@@ -11,3 +11,12 @@
  // This should work for all POSIX (if needed), but currently all other
  // supported OS/architecture combinations use either hard-coded values
  // (such as x86) or have means to determine these values without needing
+@@ -124,7 +124,7 @@ PageAllocationGranularityShift() {
+     page_characteristics.shift.store(shift, std::memory_order_relaxed);
+   }
+   return shift;
+-#elif PA_BUILDFLAG(IS_WIN) || PA_BUILDFLAG(PA_ARCH_CPU_PPC64)
++#elif PA_BUILDFLAG(IS_WIN)
+   // Modern ppc64 systems support 4kB (shift = 12) and 64kB (shift = 16) page
+   // sizes.  Since 64kB is the de facto standard on the platform and binaries
+   // compiled for 64kB are likely to work on 4kB systems, 64kB is a good choice
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h
index ffdff88e780a..1848045152a3 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__constants.h
@@ -1,6 +1,18 @@
---- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h.orig	2026-02-26 14:39:03 UTC
+--- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h
-@@ -315,7 +315,7 @@ constexpr size_t kPoolMaxSize = 1 * kGiB;
+@@ -115,11 +115,6 @@ PartitionPageShift() {
+ PartitionPageShift() {
+   return 16;  // 64 KiB
+ }
+-#elif PA_BUILDFLAG(PA_ARCH_CPU_PPC64)
+-PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t
+-PartitionPageShift() {
+-  return 18;  // 256 KiB
+-}
+ #else
+ PA_ALWAYS_INLINE PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR size_t
+ PartitionPageShift() {
+@@ -315,7 +310,7 @@ constexpr size_t kPoolMaxSize = 1 * kGiB;
  #if PA_BUILDFLAG(IS_IOS)
  constexpr size_t kPoolMaxSize = 1 * kGiB;
  #elif PA_BUILDFLAG(IS_ANDROID) || \
@@ -9,7 +21,7 @@
  constexpr size_t kPoolMaxSize = 8 * kGiB;
  #else
  constexpr size_t kPoolMaxSize = 16 * kGiB;
-@@ -399,7 +399,7 @@ PA_ALWAYS_INLINE constexpr size_t MaxDirectMapped() {
+@@ -399,7 +394,7 @@ PA_ALWAYS_INLINE constexpr size_t MaxDirectMapped() {
  // TODO(casey.smalley@arm.com): under 64k pages we can end up in a situation
  // where a normal slot span will be large enough to contain multiple items,
  // but the address will go over the final partition page after being aligned.
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h
index 15f29e41ba14..ac6d885d01ab 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_allocator_partition__allocator_src_partition__alloc_partition__alloc__forward.h
@@ -1,11 +1,13 @@
---- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h.orig	2025-09-06 10:01:20 UTC
+--- src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_forward.h
-@@ -34,9 +34,13 @@ namespace internal {
+@@ -34,9 +34,15 @@ namespace internal {
  // the second one 16. We could technically return something different for
  // malloc() and operator new(), but this would complicate things, and most of
  // our allocations are presumably coming from operator new() anyway.
 +#if defined(__i386__) && PA_BUILDFLAG(IS_FREEBSD)
 +constexpr size_t kAlignment = 8;
++#elif defined(__powerpc64__)
++constexpr size_t kAlignment = 16;
 +#else
  constexpr inline size_t kAlignment =
      std::max(alignof(max_align_t),
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_compiler__specific.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_compiler__specific.h
index 26df4fd2761c..ca34cf955da3 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_compiler__specific.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_compiler__specific.h
@@ -1,5 +1,14 @@
---- src/3rdparty/chromium/base/compiler_specific.h.orig	2025-07-02 06:08:04 UTC
+--- src/3rdparty/chromium/base/compiler_specific.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/base/compiler_specific.h
+@@ -198,7 +198,7 @@
+ //     MUSTTAIL return Func1(d + 1);  // `Func1()` will be tail-called.
+ //   }
+ // ```
+-#if __has_cpp_attribute(clang::musttail)
++#if __has_cpp_attribute(clang::musttail) && !defined(__powerpc__)
+ #define MUSTTAIL [[clang::musttail]]
+ #else
+ #define MUSTTAIL
 @@ -733,6 +733,7 @@ inline constexpr bool AnalyzerAssumeTrue(bool arg) {
  #if __has_cpp_attribute(clang::preserve_most) &&             \
      (defined(ARCH_CPU_ARM64) || defined(ARCH_CPU_X86_64)) && \
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_threading_platform__thread__bsd.cc b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_threading_platform__thread__bsd.cc
index c3f93d6fc250..3e1e53766953 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_threading_platform__thread__bsd.cc
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_base_threading_platform__thread__bsd.cc
@@ -1,16 +1,26 @@
---- src/3rdparty/chromium/base/threading/platform_thread_bsd.cc.orig	2024-04-19 13:02:56 UTC
+--- src/3rdparty/chromium/base/threading/platform_thread_bsd.cc.orig	2026-09-07 11:51:09 UTC
 +++ src/3rdparty/chromium/base/threading/platform_thread_bsd.cc
-@@ -0,0 +1,31 @@
+@@ -0,0 +1,41 @@
 +// Copyright 2023 The Chromium Authors
 +// Use of this source code is governed by a BSD-style license that can be
 +// found in the LICENSE file.
 +// Description: These are stubs for *BSD.
 +
 +#include "base/threading/platform_thread.h"
++#include "base/threading/platform_thread_internal_posix.h"
 +
 +namespace base {
 +namespace internal {
 +
++const ThreadPriorityToNiceValuePairForTest
++    kThreadPriorityToNiceValueMapForTest[7] = {
++        {ThreadPriorityForTest::kRealtimeAudio, -10},
++        {ThreadPriorityForTest::kDisplay, -8},
++        {ThreadPriorityForTest::kNormal, 0},
++        {ThreadPriorityForTest::kUtility, 2},
++        {ThreadPriorityForTest::kBackground, 10},
++};
++
 +bool CanSetThreadTypeToRealtimeAudio() {
 +  return false;
 +}
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_build_config_compiler_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_build_config_compiler_BUILD.gn
index 48626060c541..8839e0c7e5fa 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_build_config_compiler_BUILD.gn
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_build_config_compiler_BUILD.gn
@@ -74,6 +74,15 @@
          cflags += [ "--target=aarch64-linux-gnu" ]
          ldflags += [ "--target=aarch64-linux-gnu" ]
        }
+@@ -1658,7 +1665,7 @@ config("compiler_cpu_abi") {
+           cflags += [ "-maix64" ]
+           ldflags += [ "-maix64" ]
+         }
+-      } else if (is_clang) {
++      } else if (is_clang && !is_bsd) {
+         cflags += [ "--target=powerpc64le-unknown-linux-gnu" ]
+         ldflags += [ "--target=powerpc64le-unknown-linux-gnu" ]
+       } else {
 @@ -1812,7 +1819,7 @@ config("clang_revision") {
  }
  
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_abseil-cpp_absl_base_internal_unscaledcycleclock.cc b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_abseil-cpp_absl_base_internal_unscaledcycleclock.cc
new file mode 100644
index 000000000000..c0d888ab6e77
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_abseil-cpp_absl_base_internal_unscaledcycleclock.cc
@@ -0,0 +1,18 @@
+--- src/3rdparty/chromium/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc
+@@ -93,9 +93,12 @@ double UnscaledCycleClock::Frequency() {
+   static once_flag init_timebase_frequency_once;
+   static double timebase_frequency = 0.0;
+   base_internal::LowLevelCallOnce(&init_timebase_frequency_once, [&]() {
+-    size_t length = sizeof(timebase_frequency);
+-    sysctlbyname("kern.timecounter.tc.timebase.frequency", &timebase_frequency,
+-                 &length, nullptr, 0);
++    uint64_t freq = 0;
++    size_t length = sizeof(freq);
++    if (sysctlbyname("kern.timecounter.tc.timebase.frequency", &freq, &length,
++                     nullptr, 0) == 0) {
++      timebase_frequency = static_cast<double>(freq);
++    }
+   });
+   return timebase_frequency;
+ #else
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_blink_renderer_platform_audio_delay.cc b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_blink_renderer_platform_audio_delay.cc
new file mode 100644
index 000000000000..f7bd13b4ab26
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_blink_renderer_platform_audio_delay.cc
@@ -0,0 +1,13 @@
+--- src/3rdparty/chromium/third_party/blink/renderer/platform/audio/delay.cc.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/blink/renderer/platform/audio/delay.cc
+@@ -107,8 +107,8 @@ std::tuple<size_t, size_t> Delay::ProcessARateVector(
+ #if !(defined(ARCH_CPU_X86_FAMILY) || defined(CPU_ARM_NEON))
+ // Default scalar versions if simd/neon are not available.
+ std::tuple<size_t, size_t> Delay::ProcessARateVector(
+-    float* destination,
+-    uint32_t frames_to_process) const {
++    base::span<float> destination,
++    size_t frames_to_process) const {
+   // We don't have a vectorized version, so just do nothing and return the 0 to
+   // indicate no frames processed and return the current write_index_.
+   return std::make_tuple(0, write_index_);
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_BUILD.gn
new file mode 100644
index 000000000000..5b91ad69e7ce
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_BUILD.gn
@@ -0,0 +1,18 @@
+--- src/3rdparty/chromium/third_party/boringssl/BUILD.gn.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/boringssl/BUILD.gn
+@@ -122,6 +122,15 @@ if (is_msan || (is_msvc && current_cpu == "arm64" && !
+     visibility = [ ":*" ]
+     sources = rebase_path(test_support_sources_nasm, ".", "src")
+   }
++} else if (current_cpu == "ppc64") {
++  source_set("boringssl_asm") {
++    visibility = [ ":*" ]  # Only targets in this file can depend on this.
++    public_configs = [ ":no_asm_config" ]
++  }
++  source_set("test_support_asm") {
++    visibility = [ ":*" ]
++    testonly = true
++  }
+ } else {
+   # All other targets use GAS-compatible assembler. BoringSSL's assembly files
+   # are all wrapped in processor checks for the corresponding target, so there
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_src_include_openssl_target.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_src_include_openssl_target.h
new file mode 100644
index 000000000000..41e087b32954
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_boringssl_src_include_openssl_target.h
@@ -0,0 +1,12 @@
+--- src/3rdparty/chromium/third_party/boringssl/src/include/openssl/target.h.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/boringssl/src/include/openssl/target.h
+@@ -54,6 +54,9 @@
+ #define OPENSSL_32_BIT
+ #elif defined(__myriad2__)
+ #define OPENSSL_32_BIT
++#elif defined(__powerpc64__)
++#define OPENSSL_64_BIT
++#define OPENSSL_PPC64
+ #else
+ // The list above enumerates the platforms that BoringSSL supports. For these
+ // platforms we keep a reasonable bar of not breaking them: automated test
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_config_linux_ppc64_config.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_config_linux_ppc64_config.h
new file mode 100644
index 000000000000..e60d64ae479e
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_config_linux_ppc64_config.h
@@ -0,0 +1,51 @@
+--- /dev/null	2026-09-07 11:58:21 UTC
++++ src/3rdparty/chromium/third_party/dav1d/config/linux/ppc64/config.h
+@@ -0,0 +1,48 @@
++/*
++ * Autogenerated by the Meson build system.
++ * Do not edit, your changes will be lost.
++ */
++
++#pragma once
++
++#define ARCH_AARCH64 0
++
++#define ARCH_ARM 0
++
++#define ARCH_PPC64LE 1
++
++#define ARCH_X86 0
++
++#define ARCH_X86_32 0
++
++#define ARCH_X86_64 0
++
++#define CONFIG_16BPC 1
++
++#define CONFIG_8BPC 1
++
++// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
++
++#define ENDIANNESS_BIG 0
++
++#define HAVE_ASM 1
++
++#define HAVE_AS_FUNC 0
++
++#define HAVE_C11_GENERIC 1
++
++#define HAVE_CLOCK_GETTIME 1
++
++#define HAVE_DLSYM 1
++
++#define HAVE_ELF_AUX_INFO 1
++
++#define HAVE_POSIX_MEMALIGN 1
++
++// #define HAVE_PTHREAD_GETAFFINITY_NP 1 -- Controlled by Chomium
++
++// #define HAVE_PTHREAD_SETAFFINITY_NP 1 -- Controlled by Chomium
++
++#define HAVE_UNISTD_H 1
++
++#define TRIM_DSP_FUNCTIONS 1
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_libdav1d_src_ppc_dav1d__types.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_libdav1d_src_ppc_dav1d__types.h
new file mode 100644
index 000000000000..49a2f626ba4d
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dav1d_libdav1d_src_ppc_dav1d__types.h
@@ -0,0 +1,22 @@
+--- src/3rdparty/chromium/third_party/dav1d/libdav1d/src/ppc/dav1d_types.h.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/dav1d/libdav1d/src/ppc/dav1d_types.h
+@@ -55,4 +55,19 @@
+ #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
+ #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
+ 
++#if defined(__clang__)
++#undef vec_splats
++#define vec_splats(N)                     \
++    _Generic((N),                         \
++        unsigned char:      ((u8x16)(N)), \
++        signed char:        ((i8x16)(N)), \
++        unsigned short:     ((u16x8)(N)), \
++        signed short:       ((i16x8)(N)), \
++        unsigned int:       ((u32x4)(N)), \
++        signed int:         ((i32x4)(N)), \
++        unsigned long long: ((u64x2)(N)), \
++        signed long long:   ((i64x2)(N))  \
++    )
++#endif
++
+ #endif /* DAV1D_SRC_PPC_TYPES_H */
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dawn_src_dawn_common_Platform.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dawn_src_dawn_common_Platform.h
index c7210d7140b3..bdd1a79860d1 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dawn_src_dawn_common_Platform.h
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_dawn_src_dawn_common_Platform.h
@@ -1,4 +1,4 @@
---- src/3rdparty/chromium/third_party/dawn/src/dawn/common/Platform.h.orig	2025-04-04 08:52:13 UTC
+--- src/3rdparty/chromium/third_party/dawn/src/dawn/common/Platform.h.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/third_party/dawn/src/dawn/common/Platform.h
 @@ -60,6 +60,11 @@
  #error "Unsupported Windows platform."
@@ -12,3 +12,25 @@
  #elif defined(__linux__)
  #define DAWN_PLATFORM_IS_LINUX 1
  #define DAWN_PLATFORM_IS_POSIX 1
+@@ -163,10 +168,10 @@
+ #elif defined(__s390x__)
+ #define DAWN_PLATFORM_IS_S390X 1
+ 
+-#elif defined(__PPC__)
+-#define DAWN_PLATFORM_IS_PPC 1
+ #elif defined(__PPC64__)
+ #define DAWN_PLATFORM_IS_PPC64 1
++#elif defined(__PPC__)
++#define DAWN_PLATFORM_IS_PPC 1
+ 
+ #elif defined(__wasm32__)
+ #define DAWN_PLATFORM_IS_WASM32 1
+@@ -189,7 +194,7 @@ static_assert(sizeof(sizeof(char)) == 8, "Expect sizeo
+ static_assert(sizeof(sizeof(char)) == 8, "Expect sizeof(size_t) == 8");
+ #elif defined(DAWN_PLATFORM_IS_I386) || defined(DAWN_PLATFORM_IS_ARM32) ||   \
+     defined(DAWN_PLATFORM_IS_RISCV32) || defined(DAWN_PLATFORM_IS_MIPS32) || \
+-    defined(DAWN_PLATFORM_IS_S390) || defined(DAWN_PLATFORM_IS_PPC32) ||     \
++    defined(DAWN_PLATFORM_IS_S390) || defined(DAWN_PLATFORM_IS_PPC) ||       \
+     defined(DAWN_PLATFORM_IS_LOONGARCH32) || defined(DAWN_PLATFORM_IS_WASM32)
+ #define DAWN_PLATFORM_IS_32_BIT 1
+ static_assert(sizeof(sizeof(char)) == 4, "Expect sizeof(size_t) == 4");
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_cjs_index.js b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_cjs_index.js
new file mode 100644
index 000000000000..a2ed6b701120
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_cjs_index.js
@@ -0,0 +1,11 @@
+--- src/3rdparty/chromium/third_party/devtools-frontend/src/node_modules/@rollup/plugin-terser/dist/cjs/index.js.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/devtools-frontend/src/node_modules/@rollup/plugin-terser/dist/cjs/index.js
+@@ -70,7 +70,7 @@ class WorkerPool extends events.EventEmitter {
+         this.tasks = [];
+         this.workers = [];
+         this.freeWorkers = [];
+-        this.maxInstances = options.maxWorkers || os.cpus().length;
++        this.maxInstances = options.maxWorkers || os.cpus().length || 4;
+         this.filePath = options.filePath;
+         this.on(freeWorker, () => {
+             if (this.tasks.length > 0) {
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_es_index.js b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_es_index.js
new file mode 100644
index 000000000000..52c1ca33ddf2
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_devtools-frontend_src_node__modules__rollup_plugin-terser_dist_es_index.js
@@ -0,0 +1,11 @@
+--- src/3rdparty/chromium/third_party/devtools-frontend/src/node_modules/@rollup/plugin-terser/dist/es/index.js.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/devtools-frontend/src/node_modules/@rollup/plugin-terser/dist/es/index.js
+@@ -65,7 +65,7 @@ class WorkerPool extends EventEmitter {
+         this.tasks = [];
+         this.workers = [];
+         this.freeWorkers = [];
+-        this.maxInstances = options.maxWorkers || cpus().length;
++        this.maxInstances = options.maxWorkers || cpus().length || 4;
+         this.filePath = options.filePath;
+         this.on(freeWorker, () => {
+             if (this.tasks.length > 0) {
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_highway_src_hwy_targets.cc b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_highway_src_hwy_targets.cc
new file mode 100644
index 000000000000..d959bc1df139
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_highway_src_hwy_targets.cc
@@ -0,0 +1,14 @@
+--- src/3rdparty/chromium/third_party/highway/src/hwy/targets.cc.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/highway/src/hwy/targets.cc
+@@ -36,7 +36,11 @@
+ // sys/auxv.h does not always include asm/hwcap.h, or define HWCAP*, hence we
+ // still include this directly. See #1199.
+ #ifndef TOOLCHAIN_MISS_ASM_HWCAP_H
++#ifdef __powerpc64__
++#include <asm/cputable.h>
++#else
+ #include <asm/hwcap.h>
++#endif
+ #endif
+ #if HWY_HAVE_AUXV
+ #include <sys/auxv.h>
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libaom_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libaom_BUILD.gn
new file mode 100644
index 000000000000..647a46c322c9
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libaom_BUILD.gn
@@ -0,0 +1,11 @@
+--- src/3rdparty/chromium/third_party/libaom/BUILD.gn.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/libaom/BUILD.gn
+@@ -37,6 +37,8 @@ if (current_cpu == "x86") {
+   cpu_arch_full = "generic"
+ } else if (current_cpu == "loong64") {
+   cpu_arch_full = "generic"
++} else if (current_cpu == "ppc64") {
++  cpu_arch_full = "generic"
+ } else {
+   cpu_arch_full = current_cpu
+ }
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_BUILD.gn
new file mode 100644
index 000000000000..7e3e1d3ff999
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_BUILD.gn
@@ -0,0 +1,33 @@
+--- src/3rdparty/chromium/third_party/libvpx/BUILD.gn.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/libvpx/BUILD.gn
+@@ -47,6 +47,8 @@ if (current_cpu == "x86") {
+   }
+ } else if (current_cpu == "riscv64") {
+   cpu_arch_full = "generic"
++} else if (current_cpu == "ppc64") {
++  cpu_arch_full = "generic"
+ } else if (current_cpu == "loong64") {
+   cpu_arch_full = "loongarch"
+ } else {
+@@ -512,10 +514,6 @@ source_set("libvpx_loongarch_headers") {
+   sources = libvpx_srcs_loongarch_headers
+ }
+ 
+-source_set("libvpx_ppc64_headers") {
+-  sources = libvpx_srcs_ppc64_headers
+-}
+-
+ source_set("libvpx_generic_headers") {
+   sources = libvpx_srcs_generic_headers
+ }
+@@ -563,8 +561,8 @@ static_library("bundled_libvpx") {
+       public_deps = [ ":libvpx_arm64_headers" ]
+     }
+   } else if (current_cpu == "ppc64") {
+-    sources = libvpx_srcs_ppc64
+-    public_deps = [ ":libvpx_ppc64_headers" ]
++    sources = libvpx_srcs_generic
++    public_deps = [ ":libvpx_generic_headers" ]
+   } else if (current_cpu == "riscv64") {
+     sources = libvpx_srcs_generic
+     public_deps = [ ":libvpx_generic_headers" ]
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_generate__gni.sh b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_generate__gni.sh
new file mode 100644
index 000000000000..6c0bdf6bb757
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_libvpx_generate__gni.sh
@@ -0,0 +1,20 @@
+--- src/3rdparty/chromium/third_party/libvpx/generate_gni.sh.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/libvpx/generate_gni.sh
+@@ -429,7 +429,7 @@ gen_config_files linux/loongarch \
+ gen_config_files linux/mips64el "--target=mips64-linux-gcc ${all_platforms}"
+ gen_config_files linux/loongarch \
+   "--target=loongarch64-linux-gcc ${all_platforms}"
+-gen_config_files linux/ppc64 "--target=ppc64le-linux-gcc ${all_platforms}"
++gen_config_files linux/ppc64 "--target=generic-gnu ${all_platforms}"
+ gen_config_files linux/generic "--target=generic-gnu $HIGHBD ${all_platforms}"
+ gen_config_files win/arm64-highbd \
+   "--target=arm64-win64-vs15 ${all_platforms} ${HIGHBD} ${disable_sve}"
+@@ -493,7 +493,7 @@ gen_rtcd_header linux/loongarch loongarch
+ gen_rtcd_header linux/mipsel mipsel
+ gen_rtcd_header linux/mips64el mips64el
+ gen_rtcd_header linux/loongarch loongarch
+-gen_rtcd_header linux/ppc64 ppc
++gen_rtcd_header linux/ppc64 generic
+ gen_rtcd_header linux/generic generic
+ gen_rtcd_header win/arm64-highbd armv8 "${require_neon} ${disable_sve}"
+ gen_rtcd_header win/ia32 x86 "${require_sse3}"
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_pffft_src_pffft.c b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_pffft_src_pffft.c
new file mode 100644
index 000000000000..9ccef9bef87e
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_pffft_src_pffft.c
@@ -0,0 +1,10 @@
+--- src/3rdparty/chromium/third_party/pffft/src/pffft.c.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/pffft/src/pffft.c
+@@ -100,6 +100,7 @@
+    Altivec support macros 
+ */
+ #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
++#include <altivec.h>
+ typedef vector float v4sf;
+ #  define SIMD_SZ 4
+ #  define VZERO() ((vector float) vec_splat_u8(0))
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_webrtc_rtc__base_system_arch.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_webrtc_rtc__base_system_arch.h
new file mode 100644
index 000000000000..67572f78bb75
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_third__party_webrtc_rtc__base_system_arch.h
@@ -0,0 +1,21 @@
+--- src/3rdparty/chromium/third_party/webrtc/rtc_base/system/arch.h.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/third_party/webrtc/rtc_base/system/arch.h
+@@ -89,6 +89,18 @@
+ #elif defined(__EMSCRIPTEN__)
+ #define WEBRTC_ARCH_32_BITS
+ #define WEBRTC_ARCH_LITTLE_ENDIAN
++#elif defined(__PPC__)
++#define WEBRTC_ARCH_PPC_FAMILY
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++#define WEBRTC_ARCH_LITTLE_ENDIAN
++#else
++#define WEBRTC_ARCH_BIG_ENDIAN
++#endif
++#if defined(__LP64__)
++#define WEBRTC_ARCH_64_BITS
++#else
++#define WEBRTC_ARCH_32_BITS
++#endif
+ #else
+ #error Please add support for your architecture in rtc_base/system/arch.h
+ #endif
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_ui_gl_features.gni b/www/qt6-webengine/files/patch-src_3rdparty_chromium_ui_gl_features.gni
new file mode 100644
index 000000000000..100751b5b6ec
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_ui_gl_features.gni
@@ -0,0 +1,9 @@
+--- src/3rdparty/chromium/ui/gl/features.gni.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/ui/gl/features.gni
+@@ -29,5 +29,5 @@ declare_args() {
+       (is_win || is_linux || is_chromeos || is_mac || is_fuchsia) &&
+       (target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" ||
+        target_cpu == "arm64" || target_cpu == "mipsel" ||
+-       target_cpu == "mips64el" || target_cpu == "riscv64")
++       target_cpu == "mips64el" || target_cpu == "riscv64" || target_cpu == "ppc64")
+ }
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_BUILD.gn
index 3cb0e96238ae..26884fa0a11a 100644
--- a/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_BUILD.gn
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_BUILD.gn
@@ -1,4 +1,4 @@
---- src/3rdparty/chromium/v8/BUILD.gn.orig	2026-02-26 14:39:03 UTC
+--- src/3rdparty/chromium/v8/BUILD.gn.orig	2026-05-08 07:54:08 UTC
 +++ src/3rdparty/chromium/v8/BUILD.gn
 @@ -977,6 +977,8 @@ external_v8_defines = [
    "V8_TARGET_OS_MACOS",
@@ -22,7 +22,22 @@
  }
  
  disabled_external_v8_defines = external_v8_defines - enabled_external_v8_defines
-@@ -2588,6 +2596,12 @@ template("run_mksnapshot") {
+@@ -1559,6 +1567,14 @@ config("toolchain") {
+   if (v8_current_cpu == "ppc64") {
+     defines += [ "V8_TARGET_ARCH_PPC64" ]
+     cflags += [ "-ffp-contract=off" ]
++    if (host_byteorder == "little") {
++      defines += [ "V8_TARGET_ARCH_PPC_LE" ]
++      cflags += [
++        "-mcpu=power8",
++        "-maltivec",
++        "-mvsx",
++      ]
++    }
+     if (current_os == "aix") {
+       cflags += [
+         # Work around AIX ceil, trunc and round oddities.
+@@ -2588,6 +2604,12 @@ template("run_mksnapshot") {
        if (!v8_enable_builtins_profiling && v8_enable_builtins_reordering) {
          args += [ "--reorder-builtins" ]
        }
@@ -35,7 +50,7 @@
      }
  
      # This is needed to distinguish between generating code for the simulator
-@@ -6862,7 +6876,7 @@ v8_component("v8_libbase") {
+@@ -6862,7 +6884,7 @@ v8_component("v8_libbase") {
      }
    }
  
@@ -44,7 +59,7 @@
      sources += [
        "src/base/debug/stack_trace_posix.cc",
        "src/base/platform/platform-linux.cc",
-@@ -6873,6 +6887,18 @@ v8_component("v8_libbase") {
+@@ -6873,6 +6895,18 @@ v8_component("v8_libbase") {
        "dl",
        "rt",
      ]
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_src_codegen_ppc_assembler-ppc.h b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_src_codegen_ppc_assembler-ppc.h
new file mode 100644
index 000000000000..f1b4bad38ac1
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_src_codegen_ppc_assembler-ppc.h
@@ -0,0 +1,16 @@
+--- src/3rdparty/chromium/v8/src/codegen/ppc/assembler-ppc.h.orig	2026-09-18 00:00:00 UTC
++++ src/3rdparty/chromium/v8/src/codegen/ppc/assembler-ppc.h
+@@ -1413,10 +1413,12 @@
+ 
+   RelocInfoWriter reloc_info_writer;
+ 
+- private:
++ public:
+   // Avoid overflows for displacements etc.
+   static const int kMaximalBufferSize = 512 * MB;
+ 
++ private:
++
+   // Repeated checking whether the trampoline pool should be emitted is rather
+   // expensive. By default we only check again once a number of instructions
+   // has been generated.
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_test_BUILD.gn b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_test_BUILD.gn
new file mode 100644
index 000000000000..9df1730012bf
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_chromium_v8_test_BUILD.gn
@@ -0,0 +1,29 @@
+--- src/3rdparty/chromium/v8/test/BUILD.gn.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/chromium/v8/test/BUILD.gn
+@@ -43,7 +43,7 @@ group("gn_all") {
+       "benchmarks/cpp:gn_all",
+       "cctest:cctest",
+       "unittests:generate-bytecode-expectations",
+-      "unittests:v8_unittests",
++      #"unittests:v8_unittests",
+     ]
+   }
+ }
+@@ -101,7 +101,7 @@ group("v8_bot_default") {
+     "message:v8_message",
+     "mjsunit:v8_mjsunit",
+     "mkgrokdump:mkgrokdump",
+-    "unittests:v8_unittests",
++    #"unittests:v8_unittests",
+     "webkit:v8_webkit",
+   ]
+ 
+@@ -127,7 +127,7 @@ group("v8_default") {
+     "message:v8_message",
+     "mjsunit:v8_mjsunit",
+     "mkgrokdump:mkgrokdump",
+-    "unittests:v8_unittests",
++    #"unittests:v8_unittests",
+   ]
+ 
+   if (v8_enable_webassembly) {
diff --git a/www/qt6-webengine/files/patch-src_3rdparty_gn_src_util_sys__info.cc b/www/qt6-webengine/files/patch-src_3rdparty_gn_src_util_sys__info.cc
new file mode 100644
index 000000000000..928f8c856bfc
--- /dev/null
+++ b/www/qt6-webengine/files/patch-src_3rdparty_gn_src_util_sys__info.cc
@@ -0,0 +1,11 @@
+--- src/3rdparty/gn/src/util/sys_info.cc.orig	2026-05-08 07:54:08 UTC
++++ src/3rdparty/gn/src/util/sys_info.cc
+@@ -74,6 +74,8 @@ std::string OperatingSystemArchitecture() {
+     arch = "x86_64";
+   } else if (arch == "amd64") {
+     arch = "x86_64";
++  } else if (arch == "powerpc") {
++    arch = "ppc64";
+   } else if (os == "AIX" || os == "OS400") {
+     arch = "ppc64";
+   } else if (std::string(info.sysname) == "OS/390") {