Skip to content

Commit

Permalink
Add qt6-webengine with chromium page size fix
Browse files Browse the repository at this point in the history
Signed-off-by: Yichao Yu <[email protected]>
  • Loading branch information
yuyichao committed Jul 22, 2022
1 parent 5101259 commit a8b1501
Show file tree
Hide file tree
Showing 4 changed files with 329 additions and 0 deletions.
58 changes: 58 additions & 0 deletions qt6-webengine/0001-ARM-toolchain-fixes.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
From 46dc6b6a276e974341328f78451678d756c382f9 Mon Sep 17 00:00:00 2001
From: Kevin Mihelich <[email protected]>
Date: Tue, 4 Jul 2017 11:54:39 -0600
Subject: [PATCH 1/2] ARM toolchain fixes

---
chromium/build/toolchain/linux/BUILD.gn | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/chromium/build/toolchain/linux/BUILD.gn b/chromium/build/toolchain/linux/BUILD.gn
index 0c0b0a3321e..fa147fa5667 100644
--- a/chromium/build/toolchain/linux/BUILD.gn
+++ b/chromium/build/toolchain/linux/BUILD.gn
@@ -31,15 +31,13 @@ clang_toolchain("clang_arm64") {
}

gcc_toolchain("arm64") {
- toolprefix = "aarch64-linux-gnu-"
-
- cc = "${toolprefix}gcc"
- cxx = "${toolprefix}g++"
+ cc = "gcc"
+ cxx = "g++"

- ar = "${toolprefix}ar"
+ ar = "ar"
ld = cxx
- readelf = "${toolprefix}readelf"
- nm = "${toolprefix}nm"
+ readelf = "readelf"
+ nm = "nm"

toolchain_args = {
current_cpu = "arm64"
@@ -52,15 +50,13 @@ gcc_toolchain("arm64") {
}

gcc_toolchain("arm") {
- toolprefix = "arm-linux-gnueabihf-"
-
- cc = "${toolprefix}gcc"
- cxx = "${toolprefix}g++"
+ cc = "gcc"
+ cxx = "g++"

- ar = "${toolprefix}ar"
+ ar = "ar"
ld = cxx
- readelf = "${toolprefix}readelf"
- nm = "${toolprefix}nm"
+ readelf = "readelf"
+ nm = "nm"

toolchain_args = {
current_cpu = "arm"
--
2.35.1

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
From 8b1d4ec4b3f5c569eef9d8e5d40cb0e961d6ba31 Mon Sep 17 00:00:00 2001
From: Kevin Mihelich <[email protected]>
Date: Tue, 2 Feb 2021 13:58:59 -0700
Subject: [PATCH 2/2] Run blink bindings generation single threaded

When not single threaded this process will eat all the RAM.
---
chromium/third_party/blink/renderer/bindings/BUILD.gn | 1 +
1 file changed, 1 insertion(+)

diff --git a/chromium/third_party/blink/renderer/bindings/BUILD.gn b/chromium/third_party/blink/renderer/bindings/BUILD.gn
index 30017570a13..f88e5906f23 100644
--- a/chromium/third_party/blink/renderer/bindings/BUILD.gn
+++ b/chromium/third_party/blink/renderer/bindings/BUILD.gn
@@ -148,6 +148,7 @@ template("generate_bindings") {
outputs = invoker.outputs

args = [
+ "--single_process",
"--web_idl_database",
rebase_path(web_idl_database, root_build_dir),
"--root_src_dir",
--
2.35.1

67 changes: 67 additions & 0 deletions qt6-webengine/PKGBUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Maintainer: Antonio Rojas <[email protected]>
# Maintainer: Felix Yan <[email protected]>

# ALARM: Kevin Mihelich <[email protected]>
# - patch for chromium GN
# - patch for chromium skia
# - patch for chromium to run blink bindings generation single threaded
# - patch for chromium aw snap on ARM
# - restrict job count on v7 - RAM constraints

highmem=1

pkgname=qt6-webengine
_qtver=6.3.1
pkgver=${_qtver/-/}
pkgrel=2
arch=(x86_64)
url='https://www.qt.io'
license=(GPL3 LGPL3 FDL custom)
pkgdesc='Provides support for web applications using the Chromium browser project'
depends=(qt6-webchannel qt6-positioning libxcomposite libxrandr libxkbfile
libevent snappy nss libxslt minizip ffmpeg re2 libvpx libxtst ttf-font pciutils)
makedepends=(cmake ninja python-html5lib gperf jsoncpp qt6-tools pipewire nodejs qt6-websockets)
optdepends=('pipewire: WebRTC desktop sharing under Wayland')
groups=(qt6)
options=(debug)
_pkgfn=${pkgname/6-/}-everywhere-src-$_qtver
source=(https://download.qt.io/official_releases/qt/${pkgver%.*}/$_qtver/submodules/$_pkgfn.tar.xz
0001-ARM-toolchain-fixes.patch
0002-Run-blink-bindings-generation-single-threaded.patch
qt6-webengine-16kpage.patch)
sha256sums=('ad7a33b21a956deda37c587d50f821ca3816403ae31ba9b5d59d01561ad66e47'
'c5d8fc6b3b832a2b4b14c926c36051d7245d5fc37a1c3a54657afd5b5c4ed623'
'1a5858dd198dd0db649c55357941c9bfa9ad678b5d4b93121f87fa9f314d4e6e'
'807c511d83f7cb6093430c93f97a7edaae00851970774abb97425f786afd798f')

prepare() {
cd $_pkgfn

if [[ $CARCH == "armv7h" ]]; then
export MAKEFLAGS="-j4"
export ALARM_NINJA_JOBS="2"
fi
cd "$srcdir/$_pkgfn/src/3rdparty"
patch -p1 -i ${srcdir}/0001-ARM-toolchain-fixes.patch
patch -p1 -i ${srcdir}/0002-Run-blink-bindings-generation-single-threaded.patch
}

build() {
cmake -B build -S $_pkgfn -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=/usr/lib/cmake/Qt6/qt.toolchain.cmake \
-DQT_FEATURE_webengine_system_ffmpeg=ON \
-DQT_FEATURE_webengine_system_icu=ON \
-DQT_FEATURE_webengine_system_libevent=ON \
-DQT_FEATURE_webengine_system_libxslt=ON \
-DQT_FEATURE_webengine_proprietary_codecs=ON \
-DQT_FEATURE_webengine_kerberos=ON \
-DQT_FEATURE_webengine_webrtc_pipewire=ON \
-DQT_FEATURE_webengine_full_debug_info=ON
cmake --build build
}

package() {
DESTDIR="$pkgdir" cmake --install build

install -Dm644 "$srcdir"/${_pkgfn}/src/3rdparty/chromium/LICENSE "$pkgdir"/usr/share/licenses/${pkgname}/LICENSE.chromium
}
179 changes: 179 additions & 0 deletions qt6-webengine/qt6-webengine-16kpage.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
From 1afe0ce75004e49e35e8781ea6b8c3134db5511f Mon Sep 17 00:00:00 2001
From: Yichao Yu <[email protected]>
Date: Thu, 21 Jul 2022 06:42:07 -0400
Subject: [PATCH] Backport of 16k page support on aarch64

---
.../address_space_randomization.h | 15 ++++++
.../page_allocator_constants.h | 50 ++++++++++++++++++-
.../partition_address_space.cc | 6 +++
.../partition_alloc_constants.h | 5 +-
.../partition_allocator/partition_root.cc | 2 +-
5 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/chromium/base/allocator/partition_allocator/address_space_randomization.h b/chromium/base/allocator/partition_allocator/address_space_randomization.h
index e77003eab25..31ac05b86f5 100644
--- a/chromium/base/allocator/partition_allocator/address_space_randomization.h
+++ b/chromium/base/allocator/partition_allocator/address_space_randomization.h
@@ -119,6 +119,21 @@ AslrMask(uintptr_t bits) {
return AslrAddress(0x20000000ULL);
}

+ #elif defined(OS_LINUX)
+
+ // 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
+ // 39-bit as base as all setups should support this, lowered to 38-bit
+ // as ASLROffset() could cause a carry.
+ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE uintptr_t
+ ASLRMask() {
+ return AslrMask(38);
+ }
+ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE uintptr_t
+ ASLROffset() {
+ return AslrAddress(0x1000000000ULL);
+ }
+
#else

// ARM64 on Linux has 39-bit user space. Use 38 bits since ASLROffset()
diff --git a/chromium/base/allocator/partition_allocator/page_allocator_constants.h b/chromium/base/allocator/partition_allocator/page_allocator_constants.h
index f6f19e41611..200903d3342 100644
--- a/chromium/base/allocator/partition_allocator/page_allocator_constants.h
+++ b/chromium/base/allocator/partition_allocator/page_allocator_constants.h
@@ -24,6 +24,31 @@
// elimination.
#define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const))

+#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64)
+// 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
+// atomics (such as macOS on arm64).
+
+// Page allocator constants are run-time constant
+#define PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR __attribute__((const))
+
+#include <unistd.h>
+#include <atomic>
+
+namespace base::internal {
+
+// Holds the current page size and shift, where size = 1 << shift
+// Use PageAllocationGranularity(), PageAllocationGranularityShift()
+// to initialize and retrieve these values safely.
+struct PageCharacteristics {
+ std::atomic<int> size;
+ std::atomic<int> shift;
+};
+extern PageCharacteristics page_characteristics;
+
+} // namespace partition_alloc::internal
+
#else

// When defined, page size constants are fixed at compile time. When not
@@ -38,6 +63,10 @@

namespace base {

+// Forward declaration, implementation below
+PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
+PageAllocationGranularity();
+
PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
PageAllocationGranularityShift() {
#if defined(OS_WIN) || defined(ARCH_CPU_PPC64)
@@ -50,6 +79,15 @@ PageAllocationGranularityShift() {
return 14; // 16kB
#elif defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)
return vm_page_shift;
+#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64)
+ // arm64 supports 4kb (shift = 12), 16kb (shift = 14), and 64kb (shift = 16)
+ // page sizes. Retrieve from or initialize cache.
+ int shift = internal::page_characteristics.shift.load(std::memory_order_relaxed);
+ if (UNLIKELY(shift == 0)) {
+ shift = __builtin_ctz((int)PageAllocationGranularity());
+ internal::page_characteristics.shift.store(shift, std::memory_order_relaxed);
+ }
+ return shift;
#else
return 12; // 4kB
#endif
@@ -61,6 +99,15 @@ PageAllocationGranularity() {
// This is literally equivalent to |1 << PageAllocationGranularityShift()|
// below, but was separated out for OS_APPLE to avoid << on a non-constexpr.
return vm_page_size;
+#elif defined(OS_LINUX) && defined(ARCH_CPU_ARM64)
+ // arm64 supports 4kb, 16kb, and 64kb page sizes. Retrieve from or
+ // initialize cache.
+ int size = internal::page_characteristics.size.load(std::memory_order_relaxed);
+ if (UNLIKELY(size == 0)) {
+ size = getpagesize();
+ internal::page_characteristics.size.store(size, std::memory_order_relaxed);
+ }
+ return size;
#else
return 1ULL << PageAllocationGranularityShift();
#endif
@@ -90,7 +137,8 @@ SystemPageShift() {

PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
SystemPageSize() {
-#if defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)
+#if (defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)) || \
+ (defined(OS_LINUX) && defined(ARCH_CPU_ARM64))
// This is literally equivalent to |1 << SystemPageShift()| below, but was
// separated out for 64-bit OS_APPLE to avoid << on a non-constexpr.
return PageAllocationGranularity();
diff --git a/chromium/base/allocator/partition_allocator/partition_address_space.cc b/chromium/base/allocator/partition_allocator/partition_address_space.cc
index ee6294d8f55..3c9e4f47d4c 100644
--- a/chromium/base/allocator/partition_allocator/partition_address_space.cc
+++ b/chromium/base/allocator/partition_allocator/partition_address_space.cc
@@ -97,6 +97,12 @@ void PartitionAddressSpace::UninitForTesting() {
internal::AddressPoolManager::GetInstance()->ResetForTesting();
}

+#if defined(OS_LINUX) && defined(ARCH_CPU_ARM64)
+
+PageCharacteristics page_characteristics;
+
+#endif // defined(OS_LINUX) && defined(ARCH_CPU_ARM64)
+
#endif // defined(PA_HAS_64_BITS_POINTERS)

} // namespace internal
diff --git a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h
index 1eeac4993a5..61bfc4f4b95 100644
--- a/chromium/base/allocator/partition_allocator/partition_alloc_constants.h
+++ b/chromium/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -47,10 +47,11 @@ PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
PartitionPageShift() {
return 18; // 256 KiB
}
-#elif defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)
+#elif (defined(OS_APPLE) && defined(ARCH_CPU_64_BITS)) || \
+ (defined(OS_LINUX) && defined(ARCH_CPU_ARM64))
PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
PartitionPageShift() {
- return vm_page_shift + 2;
+ return PageAllocationGranularityShift() + 2;
}
#else
PAGE_ALLOCATOR_CONSTANTS_DECLARE_CONSTEXPR ALWAYS_INLINE size_t
diff --git a/chromium/base/allocator/partition_allocator/partition_root.cc b/chromium/base/allocator/partition_allocator/partition_root.cc
index 37a190f371d..a268c74f62d 100644
--- a/chromium/base/allocator/partition_allocator/partition_root.cc
+++ b/chromium/base/allocator/partition_allocator/partition_root.cc
@@ -182,7 +182,7 @@ static size_t PartitionPurgeSlotSpan(
constexpr size_t kMaxSlotCount =
(PartitionPageSize() * kMaxPartitionPagesPerRegularSlotSpan) /
SystemPageSize();
-#elif defined(OS_APPLE)
+#elif defined(OS_APPLE) || (defined(OS_LINUX) && defined(ARCH_CPU_ARM64))
// It's better for slot_usage to be stack-allocated and fixed-size, which
// demands that its size be constexpr. On OS_APPLE, PartitionPageSize() is
// always SystemPageSize() << 2, so regardless of what the run time page size
--
2.37.1

0 comments on commit a8b1501

Please sign in to comment.