-
Notifications
You must be signed in to change notification settings - Fork 37
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add qt6-webengine with chromium page size fix
Signed-off-by: Yichao Yu <[email protected]>
- Loading branch information
Showing
4 changed files
with
329 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
25 changes: 25 additions & 0 deletions
25
qt6-webengine/0002-Run-blink-bindings-generation-single-threaded.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|