public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/chromium] epel9-next: update to 110.0.5481.61
@ 2026-08-07 16:04 Than Ngo
0 siblings, 0 replies; only message in thread
From: Than Ngo @ 2026-08-07 16:04 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/chromium
Branch : epel9-next
Commit : 2f9dd6729b774b7aad299680fa39715dcc4a9a9a
Author : Than Ngo <than@redhat.com>
Date : 2023-02-06T12:43:42+01:00
Stats : +3582/-985 in 24 file(s)
URL : https://src.fedoraproject.org/rpms/chromium/c/2f9dd6729b774b7aad299680fa39715dcc4a9a9a?branch=epel9-next
Log:
update to 110.0.5481.61
---
diff --git a/chromium-107.0.5304.110-remoting-extra-qualification.patch b/chromium-107.0.5304.110-remoting-extra-qualification.patch
deleted file mode 100644
index 9b9ce18..0000000
--- a/chromium-107.0.5304.110-remoting-extra-qualification.patch
+++ /dev/null
@@ -1,237 +0,0 @@
-diff -up chromium-107.0.5304.110/remoting/host/mojom/remoting_mojom_traits.h.remoting-extra-qualification chromium-107.0.5304.110/remoting/host/mojom/remoting_mojom_traits.h
---- chromium-107.0.5304.110/remoting/host/mojom/remoting_mojom_traits.h.remoting-extra-qualification 2022-11-20 19:56:00.897740616 +0100
-+++ chromium-107.0.5304.110/remoting/host/mojom/remoting_mojom_traits.h 2022-11-21 09:21:47.967180137 +0100
-@@ -42,7 +42,7 @@
- namespace mojo {
-
- template <>
--class mojo::StructTraits<remoting::mojom::BoolDataView, bool> {
-+class StructTraits<remoting::mojom::BoolDataView, bool> {
- public:
- static bool value(bool value) { return value; }
-
-@@ -53,7 +53,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::FloatDataView, float> {
-+class StructTraits<remoting::mojom::FloatDataView, float> {
- public:
- static float value(float value) { return value; }
-
-@@ -64,7 +64,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::Int32DataView, int32_t> {
-+class StructTraits<remoting::mojom::Int32DataView, int32_t> {
- public:
- static int32_t value(int32_t value) { return value; }
-
-@@ -76,7 +76,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::UInt32DataView, uint32_t> {
-+class StructTraits<remoting::mojom::UInt32DataView, uint32_t> {
- public:
- static uint32_t value(uint32_t value) { return value; }
-
-@@ -88,7 +88,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::DesktopCaptureOptionsDataView,
-+class StructTraits<remoting::mojom::DesktopCaptureOptionsDataView,
- ::webrtc::DesktopCaptureOptions> {
- public:
- static bool use_update_notifications(
-@@ -113,7 +113,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::DesktopEnvironmentOptionsDataView,
-+class StructTraits<remoting::mojom::DesktopEnvironmentOptionsDataView,
- ::remoting::DesktopEnvironmentOptions> {
- public:
- static bool enable_curtaining(
-@@ -210,7 +210,7 @@ struct EnumTraits<remoting::mojom::Deskt
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::DesktopRectDataView,
-+class StructTraits<remoting::mojom::DesktopRectDataView,
- ::webrtc::DesktopRect> {
- public:
- static int32_t left(const ::webrtc::DesktopRect& rect) { return rect.left(); }
-@@ -230,7 +230,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::DesktopSizeDataView,
-+class StructTraits<remoting::mojom::DesktopSizeDataView,
- ::webrtc::DesktopSize> {
- public:
- static int32_t width(const ::webrtc::DesktopSize& size) {
-@@ -246,7 +246,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::DesktopVectorDataView,
-+class StructTraits<remoting::mojom::DesktopVectorDataView,
- ::webrtc::DesktopVector> {
- public:
- static int32_t x(const ::webrtc::DesktopVector& vector) { return vector.x(); }
-@@ -258,7 +258,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::MouseCursorDataView,
-+class StructTraits<remoting::mojom::MouseCursorDataView,
- ::webrtc::MouseCursor> {
- public:
- static const webrtc::DesktopSize& image_size(
-@@ -511,7 +511,7 @@ struct EnumTraits<remoting::mojom::Audio
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::AudioPacketDataView,
-+class StructTraits<remoting::mojom::AudioPacketDataView,
- ::std::unique_ptr<::remoting::AudioPacket>> {
- public:
- static int32_t timestamp(
-@@ -549,7 +549,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::ClipboardEventDataView,
-+class StructTraits<remoting::mojom::ClipboardEventDataView,
- ::remoting::protocol::ClipboardEvent> {
- public:
- static const std::string& mime_type(
-@@ -567,7 +567,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::UnionTraits<
-+class UnionTraits<
- remoting::mojom::ReadChunkResultDataView,
- ::remoting::Result<std::vector<uint8_t>,
- ::remoting::protocol::FileTransfer_Error>> {
-@@ -606,7 +606,7 @@ class mojo::UnionTraits<
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::FileTransferErrorDataView,
-+class StructTraits<remoting::mojom::FileTransferErrorDataView,
- ::remoting::protocol::FileTransfer_Error> {
- public:
- static ::remoting::protocol::FileTransfer_Error_Type type(
-@@ -745,7 +745,7 @@ class mojo::UnionTraits<
- #endif // BUILDFLAG(IS_WIN)
-
- template <>
--class mojo::StructTraits<remoting::mojom::KeyboardLayoutDataView,
-+class StructTraits<remoting::mojom::KeyboardLayoutDataView,
- ::remoting::protocol::KeyboardLayout> {
- public:
- static const ::google::protobuf::
-@@ -759,7 +759,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::UnionTraits<remoting::mojom::KeyActionDataView,
-+class UnionTraits<remoting::mojom::KeyActionDataView,
- ::remoting::protocol::KeyboardLayout_KeyAction> {
- public:
- static remoting::mojom::KeyActionDataView::Tag GetTag(
-@@ -792,7 +792,7 @@ class mojo::UnionTraits<remoting::mojom:
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::KeyBehaviorDataView,
-+class StructTraits<remoting::mojom::KeyBehaviorDataView,
- ::remoting::protocol::KeyboardLayout_KeyBehavior> {
- public:
- static const ::google::protobuf::Map<
-@@ -1150,7 +1150,7 @@ struct EnumTraits<remoting::mojom::Layou
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::KeyEventDataView,
-+class StructTraits<remoting::mojom::KeyEventDataView,
- ::remoting::protocol::KeyEvent> {
- public:
- static bool pressed(const ::remoting::protocol::KeyEvent& event) {
-@@ -1186,7 +1186,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::MouseEventDataView,
-+class StructTraits<remoting::mojom::MouseEventDataView,
- ::remoting::protocol::MouseEvent> {
- public:
- static absl::optional<int32_t> x(
-@@ -1275,7 +1275,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::ScreenResolutionDataView,
-+class StructTraits<remoting::mojom::ScreenResolutionDataView,
- ::remoting::ScreenResolution> {
- public:
- static const ::webrtc::DesktopSize& dimensions(
-@@ -1293,7 +1293,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::TextEventDataView,
-+class StructTraits<remoting::mojom::TextEventDataView,
- ::remoting::protocol::TextEvent> {
- public:
- static const std::string& text(const ::remoting::protocol::TextEvent& event) {
-@@ -1305,7 +1305,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::TouchEventPointDataView,
-+class StructTraits<remoting::mojom::TouchEventPointDataView,
- ::remoting::protocol::TouchEventPoint> {
- public:
- static uint32_t id(const ::remoting::protocol::TouchEventPoint& event) {
-@@ -1382,7 +1382,7 @@ struct EnumTraits<remoting::mojom::Touch
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::TouchEventDataView,
-+class StructTraits<remoting::mojom::TouchEventDataView,
- ::remoting::protocol::TouchEvent> {
- public:
- static ::remoting::protocol::TouchEvent::TouchEventType event_type(
-@@ -1442,7 +1442,7 @@ struct EnumTraits<remoting::mojom::Trans
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::TransportRouteDataView,
-+class StructTraits<remoting::mojom::TransportRouteDataView,
- ::remoting::protocol::TransportRoute> {
- public:
- static ::remoting::protocol::TransportRoute::RouteType type(
-@@ -1589,7 +1589,7 @@ struct EnumTraits<remoting::mojom::Proto
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::VideoLayoutDataView,
-+class StructTraits<remoting::mojom::VideoLayoutDataView,
- ::remoting::protocol::VideoLayout> {
- public:
- static const ::google::protobuf::RepeatedPtrField<
-@@ -1608,7 +1608,7 @@ class mojo::StructTraits<remoting::mojom
- };
-
- template <>
--class mojo::StructTraits<remoting::mojom::VideoTrackLayoutDataView,
-+class StructTraits<remoting::mojom::VideoTrackLayoutDataView,
- ::remoting::protocol::VideoTrackLayout> {
- public:
- static int64_t screen_id(
diff --git a/chromium-108-enable-WebRTCPipeWireCapturer-byDefault.patch b/chromium-108-enable-WebRTCPipeWireCapturer-byDefault.patch
deleted file mode 100644
index a8bad1b..0000000
--- a/chromium-108-enable-WebRTCPipeWireCapturer-byDefault.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up chromium-108.0.5359.124/content/public/common/content_features.cc.me chromium-108.0.5359.124/content/public/common/content_features.cc
---- chromium-108.0.5359.124/content/public/common/content_features.cc.me 2022-12-24 11:02:56.417773922 +0100
-+++ chromium-108.0.5359.124/content/public/common/content_features.cc 2022-12-24 11:04:41.641696681 +0100
-@@ -1479,7 +1479,7 @@ BASE_FEATURE(kRetryGetVideoCaptureDevice
- // Wayland display server.
- BASE_FEATURE(kWebRtcPipeWireCapturer,
- "WebRTCPipeWireCapturer",
-- base::FEATURE_DISABLED_BY_DEFAULT);
-+ base::FEATURE_ENABLED_BY_DEFAULT);
- #endif // defined(WEBRTC_USE_PIPEWIRE)
-
- enum class VideoCaptureServiceConfiguration {
diff --git a/chromium-109-ozone-wayland-vaapi-support.patch b/chromium-109-ozone-wayland-vaapi-support.patch
deleted file mode 100644
index 6aa6131..0000000
--- a/chromium-109-ozone-wayland-vaapi-support.patch
+++ /dev/null
@@ -1,666 +0,0 @@
-author Jianhui Dai <jianhui.j.dai@intel.com> Tue Nov 15 06:18:04 2022
-committer Jianhui Dai <jianhui.j.dai@intel.com> Tue Nov 15 06:18:04 2022
-
-[Ozone/Linux] Support VA-API on Linux Ozone/Wayland
-
-VA-API supports different display backends [1]. VA/DRM and VA/X11 are
-used by Chromium at the moment. All Ozone platforms support VA/DRM by
-default. VA/X11 is supported only on Ozone/X11.
-
-This CL renames 'supports_vaapi' to 'supports_vaapi_x11'; it indicates
-if VA/X11 supported. Linux Ozone/X11 supports both VA/X11 and VA/DRM;
-Linux Ozone/Wayland supports only VA/DRM. `VaapiPictureFactory` also
-takes this flag to determine picture creation and downloading mechanism
-on Linux.
-
-[1] https://github.com/intel/libva/blob/master/va/va_backend.h
-
-Test: VDA video playback on Linux X11 and Linux Wayland
-Bug: 1326754,1116701
-Change-Id: I6d6bf781833a7752d23dafb2b63112c2fc81b17a
-diff -up chromium-109.0.5359.124/media/gpu/args.gni.wayland-vaapi chromium-109.0.5359.124/media/gpu/args.gni
---- chromium-109.0.5359.124/media/gpu/args.gni.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/args.gni 2023-01-05 10:13:08.291403261 +0100
-@@ -6,10 +6,14 @@ import("//build/config/chromeos/ui_mode.
- import("//build/config/ozone.gni")
-
- declare_args() {
-- # Indicates if X11 VA-API-based hardware acceleration is to be used.
-- # See also the comment near the |use_vaapi| arg.
-- use_vaapi_x11 = is_linux && ozone_platform_x11 &&
-- (target_cpu == "x86" || target_cpu == "x64") && !is_castos
-+ # Build Chrome support for using VA-API over X11. Note that setting this to true is
-+ # not a guarantee that Chrome will use (or even try to use) VA-API over X11. In
-+ # particular, it is possible to build Chrome with support for VA-API over X11 but
-+ # pick Wayland as the Ozone backend at runtime. In this case, Chrome will try to
-+ # use VA-API over DRM.
-+ support_vaapi_over_x11 =
-+ is_linux && ozone_platform_x11 &&
-+ (target_cpu == "x86" || target_cpu == "x64") && !is_castos
- }
-
- declare_args() {
-@@ -29,8 +33,9 @@ declare_args() {
- # is typically the case on x86-based ChromeOS devices.
- # VA-API should also be compiled by default on x11-using linux devices
- # using x86/x64.
-- use_vaapi = use_vaapi_x11 || (is_chromeos_lacros &&
-- (target_cpu == "x86" || target_cpu == "x64"))
-+ use_vaapi =
-+ support_vaapi_over_x11 ||
-+ (is_chromeos_lacros && (target_cpu == "x86" || target_cpu == "x64"))
-
- # Indicates if ChromeOS protected media support exists. This is used
- # to enable the CDM daemon in Chrome OS as well as support for
-diff -up chromium-109.0.5359.124/media/gpu/BUILD.gn.wayland-vaapi chromium-109.0.5359.124/media/gpu/BUILD.gn
---- chromium-109.0.5359.124/media/gpu/BUILD.gn.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/BUILD.gn 2023-01-05 10:13:08.291403261 +0100
-@@ -20,7 +20,7 @@ buildflag_header("buildflags") {
- "USE_VAAPI_IMAGE_CODECS=$use_vaapi_image_codecs",
- "USE_V4L2_CODEC=$use_v4l2_codec",
- "USE_LIBV4L2=$use_v4lplugin",
-- "USE_VAAPI_X11=$use_vaapi_x11",
-+ "SUPPORT_VAAPI_OVER_X11=$support_vaapi_over_x11",
- ]
- }
-
-diff -up chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn
---- chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn 2023-01-05 10:13:08.291403261 +0100
-@@ -17,7 +17,7 @@ assert(use_vaapi)
- generate_stubs("libva_stubs") {
- extra_header = "va_stub_header.fragment"
- sigs = [ "va.sigs" ]
-- if (use_vaapi_x11) {
-+ if (support_vaapi_over_x11) {
- sigs += [ "va_x11.sigs" ]
- }
- if (is_chromeos_ash) {
-@@ -138,7 +138,7 @@ source_set("vaapi") {
- ]
- }
-
-- if (use_vaapi_x11) {
-+ if (support_vaapi_over_x11) {
- deps += [ "//ui/gfx/x" ]
- sources += [
- "vaapi_picture_native_pixmap_angle.cc",
-@@ -214,7 +214,7 @@ source_set("common") {
- deps += [ "//ui/ozone" ]
- }
-
-- if (use_vaapi_x11) {
-+ if (support_vaapi_over_x11) {
- deps += [ "//ui/gfx/x" ]
- }
-
-diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h
---- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h.wayland-vaapi 2022-12-14 01:39:53.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h 2023-01-05 10:13:08.291403261 +0100
-@@ -36,7 +36,11 @@ class MEDIA_GPU_EXPORT VaapiPictureFacto
- kVaapiImplementationAngle,
- };
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ explicit VaapiPictureFactory(absl::optional<bool> may_use_vaapi_over_x11);
-+#else
- VaapiPictureFactory();
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- VaapiPictureFactory(const VaapiPictureFactory&) = delete;
- VaapiPictureFactory& operator=(const VaapiPictureFactory&) = delete;
-@@ -85,6 +89,11 @@ class MEDIA_GPU_EXPORT VaapiPictureFacto
-
- CreatePictureCB create_picture_cb_;
- bool needs_vpp_for_downloading_ = false;
-+
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ // See comment in `VaapiWrapper::MayUseVaapiOverX11()`.
-+ absl::optional<bool> may_use_vaapi_over_x11_;
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- };
-
- } // namespace media
-diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
---- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.wayland-vaapi 2023-01-05 10:13:08.290403251 +0100
-+++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc 2023-01-05 10:13:08.292403271 +0100
-@@ -184,7 +184,12 @@ bool VaapiVideoDecodeAccelerator::Initia
- Client* client) {
- DCHECK(task_runner_->BelongsToCurrentThread());
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ vaapi_picture_factory_ =
-+ std::make_unique<VaapiPictureFactory>(VaapiWrapper::MayUseVaapiOverX11());
-+#else
- vaapi_picture_factory_ = std::make_unique<VaapiPictureFactory>();
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- if (config.is_encrypted()) {
- NOTREACHED() << "Encrypted streams are not supported for this VDA";
-@@ -1210,7 +1215,7 @@ VaapiVideoDecodeAccelerator::GetSupporte
-
- VaapiVideoDecodeAccelerator::BufferAllocationMode
- VaapiVideoDecodeAccelerator::DecideBufferAllocationMode() {
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- // The IMPORT mode is used for Android on Chrome OS, so this doesn't apply
- // here.
- DCHECK_NE(output_mode_, VideoDecodeAccelerator::Config::OutputMode::IMPORT);
-diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h
---- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h.wayland-vaapi 2022-12-14 01:39:53.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h 2023-01-05 10:13:08.292403271 +0100
-@@ -36,9 +36,9 @@
- #include "third_party/abseil-cpp/absl/types/optional.h"
- #include "ui/gfx/geometry/size.h"
-
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- #include "ui/gfx/x/xproto.h" // nogncheck
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- namespace gfx {
- enum class BufferFormat;
-@@ -186,6 +186,16 @@ class MEDIA_GPU_EXPORT VaapiWrapper
- VaapiWrapper(const VaapiWrapper&) = delete;
- VaapiWrapper& operator=(const VaapiWrapper&) = delete;
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ // Returns true if VaapiWrapper instances may use VA-API over X11 and false
-+ // otherwise (VA-API over DRM will be used). If this returns absl::nullopt,
-+ // it's because it was not possible to determine how VA-API may be used. This
-+ // should only be called after PreSandboxInitialization() (which is assumed to
-+ // be called only once during the GPU process startup) and is safe to call
-+ // from any thread. Additionally, this should always return the same value.
-+ static absl::optional<bool> MayUseVaapiOverX11();
-+#endif
-+
- // Returns the supported SVC scalability modes for specified profile.
- static std::vector<SVCScalabilityMode> GetSupportedScalabilityModes(
- VideoCodecProfile media_profile,
-@@ -439,13 +449,13 @@ class MEDIA_GPU_EXPORT VaapiWrapper
- VASurfaceID va_surface_id,
- const std::vector<std::pair<VABufferID, VABufferDescriptor>>& va_buffers);
-
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- // Put data from |va_surface_id| into |x_pixmap| of size
- // |dest_size|, converting/scaling to it.
- [[nodiscard]] bool PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
- x11::Pixmap x_pixmap,
- gfx::Size dest_size);
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- // Creates a ScopedVAImage from a VASurface |va_surface_id| and map it into
- // memory with the given |format| and |size|. If |format| is not equal to the
-diff -up chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment
---- chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
-+++ chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment 2023-01-05 10:13:08.291403261 +0100
-@@ -7,8 +7,8 @@ extern "C" {
-
- #include <va/va_drm.h>
- #include <va/va.h>
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- #include <va/va_x11.h>
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- }
-diff -up chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc.wayland-vaapi chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc
---- chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc.wayland-vaapi 2022-12-14 01:40:14.000000000 +0100
-+++ chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc 2023-01-05 10:13:08.292403271 +0100
-@@ -196,7 +196,7 @@ class OzonePlatformX11 : public OzonePla
- properties->app_modal_dialogs_use_event_blocker = true;
- properties->fetch_buffer_formats_for_gmb_on_gpu = true;
- #if BUILDFLAG(IS_LINUX)
-- properties->supports_vaapi = true;
-+ properties->supports_vaapi_x11 = true;
- #endif
-
- initialised = true;
-diff -up chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h.wayland-vaapi chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h
---- chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h.wayland-vaapi 2022-12-14 01:40:14.000000000 +0100
-+++ chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h 2023-01-05 10:13:08.293403281 +0100
-@@ -145,12 +145,13 @@ class COMPONENT_EXPORT(OZONE) OzonePlatf
- bool fetch_buffer_formats_for_gmb_on_gpu = false;
-
- #if BUILDFLAG(IS_LINUX)
-- // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
-- // Linux. At the moment, VA-API Linux implementation supports only X11
-- // backend. This implementation must be refactored to support Ozone
-- // properly. As a temporary solution, VA-API on Linux checks if vaapi is
-- // supported (which implicitly means that it is Ozone/X11).
-- bool supports_vaapi = false;
-+ // VA-API supports different display backends.
-+ // See https://github.com/intel/libva/blob/master/va/va_backend.h
-+ //
-+ // VA/DRM and VA/X11 are used by Chromium at the moment. All Ozone platforms
-+ // support VA/DRM by default. `supports_vaapi_x11` indicates if VA/X11
-+ // supported; it is true only on Ozone/X11 platform.
-+ bool supports_vaapi_x11 = false;
- #endif
-
- // Indicates that the platform allows client applications to manipulate
-diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
---- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc.orig 2023-01-04 20:20:18.000000000 +0100
-+++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc 2023-01-11 14:31:01.033496121 +0100
-@@ -39,6 +39,11 @@ struct TestParams {
- bool decode_using_client_picture_buffers;
- };
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+// TODO: Add it in TestParams to cover Ozone/Wayland.
-+bool kMayUseVaapiOverX11 = true;
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+
- constexpr int32_t kBitstreamId = 123;
- constexpr size_t kInputSize = 256;
-
-@@ -131,7 +136,13 @@ class MockVaapiPicture : public VaapiPic
-
- class MockVaapiPictureFactory : public VaapiPictureFactory {
- public:
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ explicit MockVaapiPictureFactory(absl::optional<bool> may_use_vaapi_over_x11)
-+ : VaapiPictureFactory(may_use_vaapi_over_x11) {}
-+#else
- MockVaapiPictureFactory() = default;
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+
- ~MockVaapiPictureFactory() override = default;
-
- MOCK_METHOD3(MockCreateVaapiPicture,
-@@ -165,7 +176,12 @@ class VaapiVideoDecodeAcceleratorTest :
- bool can_bind_to_sampler) { return true; })),
- decoder_thread_("VaapiVideoDecodeAcceleratorTestThread"),
- mock_decoder_(new ::testing::StrictMock<MockAcceleratedVideoDecoder>),
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ mock_vaapi_picture_factory_(
-+ new MockVaapiPictureFactory(kMayUseVaapiOverX11)),
-+#else
- mock_vaapi_picture_factory_(new MockVaapiPictureFactory()),
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- mock_vaapi_wrapper_(new MockVaapiWrapper(VaapiWrapper::kDecode)),
- mock_vpp_vaapi_wrapper_(new MockVaapiWrapper(VaapiWrapper::kDecode)),
- weak_ptr_factory_(this) {
-@@ -421,14 +437,16 @@ TEST_P(VaapiVideoDecodeAcceleratorTest,
- mock_vaapi_picture_factory_->GetVaapiImplementation(
- gl::kGLImplementationEGLGLES2));
-
--#if BUILDFLAG(USE_VAAPI_X11)
-- EXPECT_EQ(VaapiPictureFactory::kVaapiImplementationAngle,
-- mock_vaapi_picture_factory_->GetVaapiImplementation(
-- gl::kGLImplementationEGLANGLE));
-- EXPECT_EQ(VaapiPictureFactory::kVaapiImplementationX11,
-- mock_vaapi_picture_factory_->GetVaapiImplementation(
-- gl::kGLImplementationDesktopGL));
--#elif BUILDFLAG(IS_OZONE)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ if (kMayUseVaapiOverX11) {
-+ EXPECT_EQ(VaapiPictureFactory::kVaapiImplementationAngle,
-+ mock_vaapi_picture_factory_->GetVaapiImplementation(
-+ gl::kGLImplementationEGLANGLE));
-+ EXPECT_EQ(VaapiPictureFactory::kVaapiImplementationX11,
-+ mock_vaapi_picture_factory_->GetVaapiImplementation(
-+ gl::kGLImplementationDesktopGL));
-+ }
-+#else
- EXPECT_EQ(VaapiPictureFactory::kVaapiImplementationDrm,
- mock_vaapi_picture_factory_->GetVaapiImplementation(
- gl::kGLImplementationEGLANGLE));
-diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_factory.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_factory.cc
---- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_factory.cc.orig 2023-01-04 20:20:18.000000000 +0100
-+++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_factory.cc 2023-01-11 14:45:36.405506479 +0100
-@@ -13,10 +13,10 @@
- #if BUILDFLAG(IS_OZONE)
- #include "media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h"
- #endif // BUILDFLAG(IS_OZONE)
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- #include "media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h"
- #include "media/gpu/vaapi/vaapi_picture_tfp.h"
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- #if defined(USE_EGL)
- #include "media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h"
- #endif
-@@ -42,22 +42,32 @@
-
- } // namespace
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+VaapiPictureFactory::VaapiPictureFactory(
-+ absl::optional<bool> may_use_vaapi_over_x11)
-+ : may_use_vaapi_over_x11_(may_use_vaapi_over_x11) {
-+#else
- VaapiPictureFactory::VaapiPictureFactory() {
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- vaapi_impl_pairs_.insert(
- std::make_pair(gl::kGLImplementationEGLGLES2,
- VaapiPictureFactory::kVaapiImplementationDrm));
--#if BUILDFLAG(USE_VAAPI_X11)
-- vaapi_impl_pairs_.insert(
-- std::make_pair(gl::kGLImplementationEGLANGLE,
-- VaapiPictureFactory::kVaapiImplementationAngle));
-- vaapi_impl_pairs_.insert(
-- std::make_pair(gl::kGLImplementationDesktopGL,
-- VaapiPictureFactory::kVaapiImplementationX11));
--#elif BUILDFLAG(IS_OZONE)
-+
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ CHECK(may_use_vaapi_over_x11_.has_value());
-+ if (may_use_vaapi_over_x11_.value()) {
-+ vaapi_impl_pairs_.insert(
-+ std::make_pair(gl::kGLImplementationEGLANGLE,
-+ VaapiPictureFactory::kVaapiImplementationAngle));
-+ vaapi_impl_pairs_.insert(
-+ std::make_pair(gl::kGLImplementationDesktopGL,
-+ VaapiPictureFactory::kVaapiImplementationX11));
-+ }
-+#else
- vaapi_impl_pairs_.insert(
- std::make_pair(gl::kGLImplementationEGLANGLE,
- VaapiPictureFactory::kVaapiImplementationDrm));
--#endif
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- DeterminePictureCreationAndDownloadingMechanism();
- }
-@@ -98,19 +108,19 @@
- }
-
- uint32_t VaapiPictureFactory::GetGLTextureTarget() {
--#if BUILDFLAG(USE_VAAPI_X11)
-- return GL_TEXTURE_2D;
--#else
-+#if BUILDFLAG(IS_CHROMEOS)
- return GL_TEXTURE_EXTERNAL_OES;
--#endif
-+#else
-+ return GL_TEXTURE_2D;
-+#endif // BUILDFLAG(IS_CHROMEOS)
- }
-
- gfx::BufferFormat VaapiPictureFactory::GetBufferFormat() {
--#if BUILDFLAG(USE_VAAPI_X11)
-- return gfx::BufferFormat::RGBX_8888;
--#else
-+#if BUILDFLAG(IS_CHROMEOS)
- return gfx::BufferFormat::YUV_420_BIPLANAR;
--#endif
-+#else
-+ return gfx::BufferFormat::RGBX_8888;
-+#endif // BUILDFLAG(IS_CHROMEOS)
- }
-
- void VaapiPictureFactory::DeterminePictureCreationAndDownloadingMechanism() {
-@@ -118,25 +128,30 @@
- #if BUILDFLAG(IS_OZONE)
- // We can be called without GL initialized, which is valid if we use Ozone.
- case kVaapiImplementationNone:
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ DCHECK(may_use_vaapi_over_x11_.value_or(false));
-+#endif
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl<VaapiPictureNativePixmapOzone>);
- needs_vpp_for_downloading_ = true;
- break;
- #endif // BUILDFLAG(IS_OZONE)
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- case kVaapiImplementationX11:
-+ DCHECK(may_use_vaapi_over_x11_.value_or(false));
- create_picture_cb_ =
- base::BindRepeating(&CreateVaapiPictureNativeImpl<VaapiTFPPicture>);
- // Neither VaapiTFPPicture or VaapiPictureNativePixmapAngle needs the VPP.
- needs_vpp_for_downloading_ = false;
- break;
- case kVaapiImplementationAngle:
-+ DCHECK(may_use_vaapi_over_x11_.value_or(false));
- create_picture_cb_ = base::BindRepeating(
- &CreateVaapiPictureNativeImpl<VaapiPictureNativePixmapAngle>);
- // Neither VaapiTFPPicture or VaapiPictureNativePixmapAngle needs the VPP.
- needs_vpp_for_downloading_ = false;
- break;
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- case kVaapiImplementationDrm:
- #if BUILDFLAG(IS_OZONE)
- create_picture_cb_ = base::BindRepeating(
-diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc
---- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc.orig 2023-01-04 20:20:18.000000000 +0100
-+++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc 2023-01-11 15:08:02.721768243 +0100
-@@ -62,7 +62,7 @@
- #include "ui/gl/gl_bindings.h"
- #include "ui/gl/gl_implementation.h"
-
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- typedef XID Drawable;
-
- extern "C" {
-@@ -70,7 +70,7 @@
- }
-
- #include "ui/gfx/x/connection.h" // nogncheck
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- #if BUILDFLAG(IS_OZONE)
- #include "ui/ozone/public/ozone_platform.h"
-@@ -84,14 +84,14 @@
-
- using media_gpu_vaapi::kModuleVa;
- using media_gpu_vaapi::kModuleVa_drm;
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- using media_gpu_vaapi::kModuleVa_x11;
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- using media_gpu_vaapi::InitializeStubs;
- using media_gpu_vaapi::IsVaInitialized;
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- using media_gpu_vaapi::IsVa_x11Initialized;
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- using media_gpu_vaapi::IsVa_drmInitialized;
- using media_gpu_vaapi::StubPathMap;
-
-@@ -668,6 +668,12 @@
-
- void SetDrmFd(base::PlatformFile fd) { drm_fd_.reset(HANDLE_EINTR(dup(fd))); }
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ absl::optional<bool> MayUseVaapiOverX11() const {
-+ return may_use_vaapi_over_x11_;
-+ }
-+#endif
-+
- private:
- friend class base::NoDestructor<VADisplayState>;
-
-@@ -690,6 +696,13 @@
- // Drm fd used to obtain access to the driver interface by VA.
- base::ScopedFD drm_fd_;
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ // Whether we'll be possibly using VA-API over Ozone/X11. This should only be
-+ // set (if at all) during the pre-sandbox initialization. If absl::nullopt,
-+ // all calls to Initialize() will return false immediately.
-+ absl::optional<bool> may_use_vaapi_over_x11_;
-+#endif
-+
- // The VADisplay handle. Valid between Initialize() and Deinitialize().
- VADisplay va_display_;
-
-@@ -708,6 +721,15 @@
-
- // static
- void VADisplayState::PreSandboxInitialization() {
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ if (ui::OzonePlatform::IsInitialized()) {
-+ VADisplayState::Get()->may_use_vaapi_over_x11_ =
-+ ui::OzonePlatform::GetInstance()
-+ ->GetPlatformProperties()
-+ .supports_vaapi_x11;
-+ }
-+#endif
-+
- constexpr char kRenderNodeFilePattern[] = "/dev/dri/renderD%d";
- // This loop ends on either the first card that does not exist or the first
- // render node that is not vgem.
-@@ -740,20 +762,18 @@
- bool VADisplayState::Initialize() {
- base::AutoLock auto_lock(va_lock_);
-
--#if BUILDFLAG(IS_OZONE) && BUILDFLAG(IS_LINUX)
-- // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
-- // Linux. See comment in OzonePlatform::PlatformProperties::supports_vaapi
-- // for more details. This will also require revisiting everything that's
-- // guarded by USE_VAAPI_X11. For example, if USE_VAAPI_X11 is true, but the
-- // user chooses the Wayland backend for Ozone at runtime, then many things (if
-- // not all) that we do for X11 won't apply.
-- if (!ui::OzonePlatform::GetInstance()->GetPlatformProperties().supports_vaapi)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ if (!may_use_vaapi_over_x11_.has_value())
- return false;
- #endif
-
- bool libraries_initialized = IsVaInitialized() && IsVa_drmInitialized();
--#if BUILDFLAG(USE_VAAPI_X11)
-- libraries_initialized = libraries_initialized && IsVa_x11Initialized();
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ // Initialize VA-API X11 display backend for Linux Ozone/X11.
-+ // See comment in OzonePlatform::PlatformProperties::supports_vaapi_x11 for
-+ // more details.
-+ if (may_use_vaapi_over_x11_.value())
-+ libraries_initialized = libraries_initialized && IsVa_x11Initialized();
- #endif
- if (!libraries_initialized)
- return false;
-@@ -768,7 +788,7 @@
- return success;
- }
-
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- absl::optional<VADisplay> GetVADisplayStateX11(const base::ScopedFD& drm_fd) {
- switch (gl::GetGLImplementation()) {
-@@ -796,13 +816,19 @@
- }
- }
-
--#else
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- absl::optional<VADisplay> GetVADisplayState(const base::ScopedFD& drm_fd) {
- switch (gl::GetGLImplementation()) {
- case gl::kGLImplementationEGLGLES2:
-+#if BUILDFLAG(IS_CHROMEOS)
-+ // GetVADisplayState() should not get called on Linux with Ozone/X11
-+ // (GetVADisplayStateX11() should get called instead), and we haven't tried
-+ // VA-API decoding on Linux with Ozone/Wayland and anything other than
-+ // native EGL/GLES2.
- case gl::kGLImplementationEGLANGLE:
- case gl::kGLImplementationNone:
-+#endif
- return vaGetDisplayDRM(drm_fd.get());
- default:
- LOG(WARNING) << "VAAPI video acceleration not available for "
-@@ -812,18 +838,23 @@
- }
- }
-
--#endif // BUILDFLAG(USE_VAAPI_X11)
--
- bool VADisplayState::InitializeVaDisplay_Locked() {
-- absl::optional<VADisplay> display =
--#if BUILDFLAG(USE_VAAPI_X11)
-- GetVADisplayStateX11(drm_fd_);
--#else
-- GetVADisplayState(drm_fd_);
--#endif
-+ absl::optional<VADisplay> display;
-
-- if (!display)
-- return false;
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+ DCHECK(may_use_vaapi_over_x11_.has_value());
-+ if (may_use_vaapi_over_x11_.value()) {
-+ display = GetVADisplayStateX11(drm_fd_);
-+ if (!display)
-+ return false;
-+ }
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+
-+ if (!display) {
-+ display = GetVADisplayState(drm_fd_);
-+ if (!display)
-+ return false;
-+ }
-
- va_display_ = *display;
- if (!vaDisplayIsValid(va_display_)) {
-@@ -1656,6 +1687,13 @@
- enforce_sequence_affinity);
- }
-
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-+// static
-+absl::optional<bool> VaapiWrapper::MayUseVaapiOverX11() {
-+ return VADisplayState::Get()->MayUseVaapiOverX11();
-+}
-+#endif
-+
- // static
- std::vector<SVCScalabilityMode> VaapiWrapper::GetSupportedScalabilityModes(
- VideoCodecProfile media_profile,
-@@ -2665,12 +2703,13 @@
- return Execute_Locked(va_surface_id, va_buffer_ids);
- }
-
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- bool VaapiWrapper::PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
- x11::Pixmap x_pixmap,
- gfx::Size dest_size) {
- CHECK(!enforce_sequence_affinity_ ||
- sequence_checker_.CalledOnValidSequence());
-+ CHECK(MayUseVaapiOverX11().value_or(false));
- base::AutoLockMaybe auto_lock(va_lock_.get());
-
- VAStatus va_res = vaSyncSurface(va_display_, va_surface_id);
-@@ -2684,7 +2723,7 @@
- VA_SUCCESS_OR_RETURN(va_res, VaapiFunctions::kVAPutSurface, false);
- return true;
- }
--#endif // BUILDFLAG(USE_VAAPI_X11)
-+#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
-
- std::unique_ptr<ScopedVAImage> VaapiWrapper::CreateVaImage(
- VASurfaceID va_surface_id,
-@@ -3086,7 +3125,7 @@
-
- paths[kModuleVa].push_back(std::string("libva.so.") + va_suffix);
- paths[kModuleVa_drm].push_back(std::string("libva-drm.so.") + va_suffix);
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- paths[kModuleVa_x11].push_back(std::string("libva-x11.so.") + va_suffix);
- #endif
- #if BUILDFLAG(IS_CHROMEOS_ASH)
-diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc
---- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc.orig 2023-01-11 20:45:17.347940426 +0100
-+++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc 2023-01-11 20:45:58.314670752 +0100
-@@ -109,7 +109,7 @@
- ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance();
- ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone();
- gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT_VDA_WRITE;
--#if BUILDFLAG(USE_VAAPI_X11)
-+#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
- // The 'VaapiVideoDecodeAccelerator' requires the VPP to download the decoded
- // frame from the internal surface to the allocated native pixmap.
- // 'SCANOUT_VDA_WRITE' is used for 'YUV_420_BIPLANAR' on ChromeOS; For Linux,
diff --git a/chromium-110-CanvasResourceProvider-pragma.patch b/chromium-110-CanvasResourceProvider-pragma.patch
new file mode 100644
index 0000000..5732e49
--- /dev/null
+++ b/chromium-110-CanvasResourceProvider-pragma.patch
@@ -0,0 +1,41 @@
+From 3e1e86ac882ae0ce4b9ec50834a4ff8becd912ab Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Mon, 19 Dec 2022 16:59:46 +0000
+Subject: [PATCH] GCC: move pragmas in blink::CanvasResourceProvider
+
+GCC does not allow using #pragma inside an enum.
+
+Bug: 819294
+Change-Id: I637b5a616b080d17bb719aae9ec8cf06d0f8c464
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4111848
+Reviewed-by: Stephen Chenney <schenney@chromium.org>
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Cr-Commit-Position: refs/heads/main@{#1084983}
+---
+
+diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
+index e898397f..214ab01 100644
+--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
++++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.h
+@@ -68,6 +68,8 @@
+ public:
+ // These values are persisted to logs. Entries should not be renumbered and
+ // numeric values should never be reused.
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ enum ResourceProviderType {
+ kTexture [[deprecated]] = 0,
+ kBitmap = 1,
+@@ -79,11 +81,9 @@
+ kPassThrough = 7,
+ kSwapChain = 8,
+ kSkiaDawnSharedImage [[deprecated]] = 9,
+-#pragma GCC diagnostic push
+-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+ kMaxValue = kSkiaDawnSharedImage,
+-#pragma GCC diagnostic pop
+ };
++#pragma GCC diagnostic pop
+
+ // The following parameters attempt to reach a compromise between not flushing
+ // too often, and not accumulating an unreasonable backlog. Flushing too
diff --git a/chromium-110-CredentialUIEntry-const.patch b/chromium-110-CredentialUIEntry-const.patch
new file mode 100644
index 0000000..eb68aa2
--- /dev/null
+++ b/chromium-110-CredentialUIEntry-const.patch
@@ -0,0 +1,41 @@
+From b4e56d22275cae5a910463a966a96345430a83ea Mon Sep 17 00:00:00 2001
+From: Ivan Murashov <ivan.murashov@lge.com>
+Date: Sat, 17 Dec 2022 12:06:01 +0000
+Subject: [PATCH] libstdc++: Don't use const members in std::vector in password_manager::CredentialUIEntry
+
+Otherwise build fails when building with use_custom_libcxx=false.
+The error example:
+std::vector must have a non-const, non-volatile value_type
+
+Implementation of std::vector in libstdc++ does not allow const.
+
+Bug: 957519
+Change-Id: I089de2d52df25138d74dbf01fdf61d6301b4d871
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4111037
+Reviewed-by: Mohamed Amir Yosef <mamir@chromium.org>
+Commit-Queue: Mohamed Amir Yosef <mamir@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#1084697}
+---
+
+diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.cc b/components/password_manager/core/browser/ui/credential_ui_entry.cc
+index 1e0766a..a9a34f7 100644
+--- a/components/password_manager/core/browser/ui/credential_ui_entry.cc
++++ b/components/password_manager/core/browser/ui/credential_ui_entry.cc
+@@ -97,7 +97,7 @@
+ // For cases when the notes differ within grouped passwords (e.g: a
+ // credential exists in both account and profile stores), respective notes
+ // should be concatenated and linebreak used as a delimiter.
+- std::vector<const std::u16string> notes_with_duplicates;
++ std::vector<std::u16string> notes_with_duplicates;
+ for (const auto& form : forms) {
+ // Only notes with an empty `unique_display_name` are supported in the
+ // settings UI.
+@@ -109,7 +109,7 @@
+ }
+ auto unique_notes =
+ base::MakeFlatSet<std::u16string>(std::move(notes_with_duplicates));
+- note = base::JoinString(std::vector<const std::u16string>(
++ note = base::JoinString(std::vector<std::u16string>(
+ unique_notes.begin(), unique_notes.end()),
+ u"\n");
+
diff --git a/chromium-110-DarkModeLABColorSpace-pow.patch b/chromium-110-DarkModeLABColorSpace-pow.patch
new file mode 100644
index 0000000..91f1aee
--- /dev/null
+++ b/chromium-110-DarkModeLABColorSpace-pow.patch
@@ -0,0 +1,37 @@
+From 795c311aae4b718585bc6194189f061000c823a1 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Fri, 23 Dec 2022 14:28:55 +0000
+Subject: [PATCH] libstdc++: fix narrowing in blink::DarkModeLABColorSpace
+
+Clang-14 errors out with narrowing from double to float. Use std::pow
+instead.
+---
+ .../renderer/platform/graphics/dark_mode_lab_color_space.h | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_lab_color_space.h b/third_party/blink/renderer/platform/graphics/dark_mode_lab_color_space.h
+index 999c3e5..c18ea7b 100644
+--- a/third_party/blink/renderer/platform/graphics/dark_mode_lab_color_space.h
++++ b/third_party/blink/renderer/platform/graphics/dark_mode_lab_color_space.h
+@@ -125,7 +125,7 @@ class DarkModeLABColorSpace {
+ // https://en.wikipedia.org/wiki/CIELAB_color_space#Reverse_transformation.
+ SkV3 FromXYZ(const SkV3& v) const {
+ auto f = [](float x) {
+- return x > kSigma3 ? pow(x, 1.0f / 3.0f)
++ return x > kSigma3 ? std::pow(x, 1.0f / 3.0f)
+ : x / (3 * kSigma2) + 4.0f / 29.0f;
+ };
+
+@@ -145,7 +145,8 @@ class DarkModeLABColorSpace {
+ // https://en.wikipedia.org/wiki/CIELAB_color_space#Forward_transformation.
+ SkV3 ToXYZ(const SkV3& lab) const {
+ auto invf = [](float x) {
+- return x > kSigma ? pow(x, 3.0f) : 3.0f * kSigma2 * (x - 4.0f / 29.0f);
++ return x > kSigma ? std::pow(x, 3.0f)
++ : 3.0f * kSigma2 * (x - 4.0f / 29.0f);
+ };
+
+ SkV3 v = {Clamp(lab.x, 0.0f, 100.0f), Clamp(lab.y, -128.0f, 128.0f),
+--
+2.38.2
+
diff --git a/chromium-110-InProgressDownloadManager-include.patch b/chromium-110-InProgressDownloadManager-include.patch
new file mode 100644
index 0000000..adc51db
--- /dev/null
+++ b/chromium-110-InProgressDownloadManager-include.patch
@@ -0,0 +1,30 @@
+From 63027c62eaa1b6c5b0d2762a511f1611b15d3728 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Mon, 19 Dec 2022 13:56:17 +0000
+Subject: [PATCH] libstdc++: fix incomplete type of download::InProgressDownloadManager
+
+Destructor of std::unique_ptr in libstdc++ uses sizeof() which
+requires full definition of download::InProgressDownloadManager
+for return type of content::BrowserContext::
+RetrieveInProgressDownloadManager().
+
+Bug: 957519
+Change-Id: If99aa8d52238bacb1cb559a300e14ed3a05b7297
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4111526
+Reviewed-by: Bo Liu <boliu@chromium.org>
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Cr-Commit-Position: refs/heads/main@{#1084924}
+---
+
+diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
+index 6180969..22e9dbb 100644
+--- a/content/browser/browser_context.cc
++++ b/content/browser/browser_context.cc
+@@ -30,6 +30,7 @@
+ #include "base/unguessable_token.h"
+ #include "build/build_config.h"
+ #include "build/chromeos_buildflags.h"
++#include "components/download/public/common/in_progress_download_manager.h"
+ #include "components/services/storage/privileged/mojom/indexed_db_control.mojom.h"
+ #include "content/browser/blob_storage/chrome_blob_storage_context.h"
+ #include "content/browser/browser_context_impl.h"
diff --git a/chromium-110-NativeThemeBase-fabs.patch b/chromium-110-NativeThemeBase-fabs.patch
new file mode 100644
index 0000000..c7d0e8b
--- /dev/null
+++ b/chromium-110-NativeThemeBase-fabs.patch
@@ -0,0 +1,29 @@
+From 07f0a87e4409f27854b3a1d17f270a3497f38947 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Mon, 19 Dec 2022 19:07:37 +0000
+Subject: [PATCH] GCC: use fabsf in ui::NativeThemeBase::OutlineColor
+
+Template deduction fails for base::clamp, because return type of
+fabs is double and all other parameters are float.
+
+Bug: 819294
+Change-Id: I34f1c9c99d13f69097d899bfcb0526cbdf4fe1c1
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4110869
+Reviewed-by: Peter Kasting <pkasting@chromium.org>
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Cr-Commit-Position: refs/heads/main@{#1085034}
+---
+
+diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc
+index 169c60c..36db49a 100644
+--- a/ui/native_theme/native_theme_base.cc
++++ b/ui/native_theme/native_theme_base.cc
+@@ -1336,7 +1336,7 @@
+ // The following code has been tested to look OK with all of the
+ // default GTK themes.
+ SkScalar min_diff = base::clamp((hsv1[1] + hsv2[1]) * 1.2f, 0.28f, 0.5f);
+- SkScalar diff = base::clamp(fabs(hsv1[2] - hsv2[2]) / 2, min_diff, 0.5f);
++ SkScalar diff = base::clamp(fabsf(hsv1[2] - hsv2[2]) / 2, min_diff, 0.5f);
+
+ if (hsv1[2] + hsv2[2] > 1.0)
+ diff = -diff;
diff --git a/chromium-110-Presenter-include.patch b/chromium-110-Presenter-include.patch
new file mode 100644
index 0000000..7cfb84b
--- /dev/null
+++ b/chromium-110-Presenter-include.patch
@@ -0,0 +1,26 @@
+From c69b818a9fce2bf0fb81b280d6f4cc15e6fdb8af Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Fri, 16 Dec 2022 17:13:43 +0000
+Subject: [PATCH] GCC: fix incomplete type of gl::Presenter
+
+GCC requires full definition of gl::Presenter for return type
+of gl::GLOzoneEGL::CreateGLContext() with base::scoped_refptr.
+---
+ ui/ozone/common/gl_ozone_egl.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/ui/ozone/common/gl_ozone_egl.cc b/ui/ozone/common/gl_ozone_egl.cc
+index 9b1d37e..e745dd7 100644
+--- a/ui/ozone/common/gl_ozone_egl.cc
++++ b/ui/ozone/common/gl_ozone_egl.cc
+@@ -13,6 +13,7 @@
+ #include "ui/gl/gl_share_group.h"
+ #include "ui/gl/gl_surface.h"
+ #include "ui/gl/gl_utils.h"
++#include "ui/gl/presenter.h"
+
+ namespace ui {
+
+--
+2.37.4
+
diff --git a/chromium-110-StorageQueue-decltype.patch b/chromium-110-StorageQueue-decltype.patch
new file mode 100644
index 0000000..cd0e66c
--- /dev/null
+++ b/chromium-110-StorageQueue-decltype.patch
@@ -0,0 +1,74 @@
+From 200fc7c3ec95bc86f6afb55ca3c691e923463104 Mon Sep 17 00:00:00 2001
+From: Leonid Baraz <lbaraz@chromium.org>
+Date: Mon, 19 Dec 2022 21:46:04 +0000
+Subject: [PATCH] GCC: fix usage of decltype in reporting::StorageQueue
+
+GCC does not allow to use decltype for the default value of
+a function parameter.
+
+Bug: 819294
+Change-Id: I7ebb255634375ce889933f8b67acb10f0e56ca8d
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4111548
+Reviewed-by: Leonid Baraz <lbaraz@chromium.org>
+Commit-Queue: Leonid Baraz <lbaraz@chromium.org>
+Reviewed-by: Hong Xu <xuhong@google.com>
+Cr-Commit-Position: refs/heads/main@{#1085129}
+---
+
+diff --git a/components/reporting/storage/storage_queue.cc b/components/reporting/storage/storage_queue.cc
+index c546d55a..49e0f2c 100644
+--- a/components/reporting/storage/storage_queue.cc
++++ b/components/reporting/storage/storage_queue.cc
+@@ -203,7 +203,6 @@
+ encryption_module_(encryption_module),
+ compression_module_(compression_module) {
+ DETACH_FROM_SEQUENCE(storage_queue_sequence_checker_);
+- DCHECK(write_contexts_queue_.empty());
+ }
+
+ StorageQueue::~StorageQueue() {
+@@ -2133,9 +2132,7 @@
+ }
+
+ void StorageQueue::TestInjectErrorsForOperation(
+- base::RepeatingCallback<
+- Status(test::StorageQueueOperationKind operation_kind, int64_t)>
+- handler) {
++ test::ErrorInjectionHandlerType handler) {
+ test_injection_handler_ = handler;
+ }
+
+diff --git a/components/reporting/storage/storage_queue.h b/components/reporting/storage/storage_queue.h
+index 39edd8b..04d5f9f 100644
+--- a/components/reporting/storage/storage_queue.h
++++ b/components/reporting/storage/storage_queue.h
+@@ -52,6 +52,9 @@
+ kWriteLowDiskSpace,
+ };
+
++using ErrorInjectionHandlerType =
++ base::RepeatingCallback<Status(test::StorageQueueOperationKind, int64_t)>;
++
+ } // namespace test
+
+ // Storage queue represents single queue of data to be collected and stored
+@@ -142,8 +145,7 @@
+ // can be returned as a resulting operation status too.
+ // If `handler` is null, error injections is disabled.
+ void TestInjectErrorsForOperation(
+- base::RepeatingCallback<Status(test::StorageQueueOperationKind, int64_t)>
+- handler = decltype(handler)());
++ test::ErrorInjectionHandlerType handler = base::NullCallback());
+
+ // Access queue options.
+ const QueueOptions& options() const { return options_; }
+@@ -492,8 +494,7 @@
+ // Test only: records callback to be invoked. It will be called with operation
+ // kind and seq id, and will return Status (non-OK status indicates the
+ // failure to be injected). In production code must be null.
+- base::RepeatingCallback<Status(test::StorageQueueOperationKind, int64_t)>
+- test_injection_handler_;
++ test::ErrorInjectionHandlerType test_injection_handler_{base::NullCallback()};
+
+ // Weak pointer factory (must be last member in class).
+ base::WeakPtrFactory<StorageQueue> weakptr_factory_{this};
diff --git a/chromium-110-SyncIterator-template.patch b/chromium-110-SyncIterator-template.patch
new file mode 100644
index 0000000..c65c7e2
--- /dev/null
+++ b/chromium-110-SyncIterator-template.patch
@@ -0,0 +1,28 @@
+From da8029438ea8f00a154cb6a1bbc8243de39690de Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Sun, 18 Dec 2022 22:11:58 +0000
+Subject: [PATCH] GCC: remove redundant template parameter from SyncIterator
+
+GCC 12 in C++20 mode does not allow this anymore.
+
+Bug: 819294
+Change-Id: I6b22d3919f08fb72a5b1d69eea59c6e95259c16f
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4111547
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Reviewed-by: Kentaro Hara <haraken@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#1084808}
+---
+
+diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/sync_iterator.py b/third_party/blink/renderer/bindings/scripts/bind_gen/sync_iterator.py
+index 1d67fa2..9cec5094 100644
+--- a/third_party/blink/renderer/bindings/scripts/bind_gen/sync_iterator.py
++++ b/third_party/blink/renderer/bindings/scripts/bind_gen/sync_iterator.py
+@@ -36,7 +36,7 @@
+ member_initializer_list=[
+ "${base_class_name}(source, kind)",
+ ]),
+- CxxFuncDeclNode(name="~${class_name}",
++ CxxFuncDeclNode(name="~SyncIterator",
+ arg_decls=[],
+ return_type="",
+ override=True,
diff --git a/chromium-110-dpf-arm64.patch b/chromium-110-dpf-arm64.patch
new file mode 100644
index 0000000..a4ba87b
--- /dev/null
+++ b/chromium-110-dpf-arm64.patch
@@ -0,0 +1,94 @@
+From df728d2e2fe8284316ed083c5a210bca1e50986e Mon Sep 17 00:00:00 2001
+From: Jose Dapena Paz <jdapena@igalia.com>
+Date: Mon, 16 Jan 2023 12:53:21 +0100
+Subject: [PATCH] GCC: fix distributed point functions build in ARM64 with SVE
+
+SVE build is broken in ARM64, because distributed_point_functions
+is trying to use operator& and operator|.
+
+Bug:819294
+Change-Id: I465efa475ed59031a2cfaf4172ef9fbd8bb05050
+---
+ dpf/internal/evaluate_prg_hwy.cc | 34 ++++++++++++++------------------
+ 1 file changed, 15 insertions(+), 19 deletions(-)
+
+diff --git a/dpf/internal/evaluate_prg_hwy.cc b/dpf/internal/evaluate_prg_hwy.cc
+index 3d743f4..a1dd8e0 100644
+--- a//third_party/distributed_point_functions/code/dpf/internal/evaluate_prg_hwy.cc
++++ b//third_party/distributed_point_functions/code/dpf/internal/evaluate_prg_hwy.cc
+@@ -124,14 +124,14 @@ auto IsBitSet(D d, const V input, int index) {
+
+ // Compute input AND index_64 on 64-bit integers.
+ auto input_64 = hn::BitCast(d64, input);
+- input_64 &= index_64;
++ input_64 = hn::And(input_64, index_64);
+
+ // Take the OR of every two adjacent 64-bit integers. This ensures that each
+ // half of an 128-bit block is nonzero iff at least one half was nonzero.
+- input_64 |= hn::Shuffle01(input_64);
++ input_64 = hn::Or(input_64, hn::Shuffle01(input_64));
+
+ // Compute a 64-bit mask that checks which integers are nonzero.
+- return input_64 != hn::Zero(d64);
++ return hn::Ne(input_64, hn::Zero(d64));
+ }
+
+ // Dummy struct to get HWY_ALIGN as a number, for testing if an array of
+@@ -236,24 +236,20 @@ absl::Status EvaluateSeedsHwy(
+ // Apply correction.
+ const auto correction_seed = hn::LoadDup128(
+ d64, reinterpret_cast<const uint64_t*>(correction_seeds + j));
+- vec_0 ^=
+- hn::BitCast(d8, hn::IfThenElseZero(control_mask_0, correction_seed));
+- vec_1 ^=
+- hn::BitCast(d8, hn::IfThenElseZero(control_mask_1, correction_seed));
+- vec_2 ^=
+- hn::BitCast(d8, hn::IfThenElseZero(control_mask_2, correction_seed));
+- vec_3 ^=
+- hn::BitCast(d8, hn::IfThenElseZero(control_mask_3, correction_seed));
++ vec_0 = hn::Xor(vec_0, hn::BitCast(d8, hn::IfThenElseZero(control_mask_0, correction_seed)));
++ vec_1 = hn::Xor(vec_1, hn::BitCast(d8, hn::IfThenElseZero(control_mask_1, correction_seed)));
++ vec_2 = hn::Xor(vec_2, hn::BitCast(d8, hn::IfThenElseZero(control_mask_2, correction_seed)));
++ vec_3 = hn::Xor(vec_3, hn::BitCast(d8, hn::IfThenElseZero(control_mask_3, correction_seed)));
+
+ // Extract control bit for next level.
+ const auto next_control_mask_0 = IsBitSet(d8, vec_0, 0);
+ const auto next_control_mask_1 = IsBitSet(d8, vec_1, 0);
+ const auto next_control_mask_2 = IsBitSet(d8, vec_2, 0);
+ const auto next_control_mask_3 = IsBitSet(d8, vec_3, 0);
+- vec_0 &= clear_lowest_bit;
+- vec_1 &= clear_lowest_bit;
+- vec_2 &= clear_lowest_bit;
+- vec_3 &= clear_lowest_bit;
++ vec_0 = hn::And(vec_0, clear_lowest_bit);
++ vec_1 = hn::And(vec_1, clear_lowest_bit);
++ vec_2 = hn::And(vec_2, clear_lowest_bit);
++ vec_3 = hn::And(vec_3, clear_lowest_bit);
+
+ // Perform control bit correction.
+ const auto correction_control_mask_left =
+@@ -321,10 +317,10 @@ absl::Status EvaluateSeedsHwy(
+ // Apply correction.
+ const auto correction_seed = hn::LoadDup128(
+ d64, reinterpret_cast<const uint64_t*>(correction_seeds + j));
+- vec ^= hn::BitCast(d8, hn::IfThenElseZero(control_mask, correction_seed));
++ vec = hn::Xor(vec, hn::BitCast(d8, hn::IfThenElseZero(control_mask, correction_seed)));
+ // Extract control bit for next level.
+ const auto next_control_mask = IsBitSet(d8, vec, 0);
+- vec &= clear_lowest_bit;
++ vec = hn::And(vec, clear_lowest_bit);
+
+ // Perform control bit correction.
+ const auto correction_control_mask_left =
+@@ -376,9 +372,9 @@ absl::Status EvaluateSeedsHwy(
+ // Perform seed correction.
+ const auto correction_seed = hn::LoadDup128(
+ d64, reinterpret_cast<const uint64_t*>(correction_seeds + j));
+- vec ^= hn::BitCast(d8, hn::IfThenElseZero(control_mask, correction_seed));
++ vec = hn::Xor(vec, hn::BitCast(d8, hn::IfThenElseZero(control_mask, correction_seed)));
+ const auto next_control_mask = IsBitSet(d8, vec, 0);
+- vec &= clear_lowest_bit;
++ vec = hn::And(vec, clear_lowest_bit);
+ const auto correction_control_mask_left =
+ correction_controls_left[j] ? mask_all_one : mask_all_zero;
+ const auto correction_control_mask_right =
diff --git a/chromium-110-kCustomizeChromeColors-type.patch b/chromium-110-kCustomizeChromeColors-type.patch
new file mode 100644
index 0000000..ac214da
--- /dev/null
+++ b/chromium-110-kCustomizeChromeColors-type.patch
@@ -0,0 +1,28 @@
+From 3084e834a211e85f6a17e6f8dceb6b44117211d2 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Wed, 21 Dec 2022 19:22:46 +0000
+Subject: [PATCH] GCC: fix conflicting type for kCustomizeChromeColors
+
+GCC cannot match auto with previous declaration.
+
+Bug: 819294
+Change-Id: Ie648daaf264fb2ea177ac46c8a510d481f6fa2f4
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4110870
+Reviewed-by: Tibor Goldschwendt <tiborg@chromium.org>
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Cr-Commit-Position: refs/heads/main@{#1086011}
+---
+
+diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_colors.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_colors.cc
+index 2fccadb..383c9e5 100644
+--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_colors.cc
++++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_colors.cc
+@@ -31,5 +31,6 @@
+
+ } // namespace
+
+-const auto kCustomizeChromeColors = MakeCustomizeChromeColors(
+- std::make_index_sequence<std::size(kCustomizeChromeColorIds)>{});
++const decltype(kCustomizeChromeColors) kCustomizeChromeColors =
++ MakeCustomizeChromeColors(
++ std::make_index_sequence<std::size(kCustomizeChromeColorIds)>{});
diff --git a/chromium-110-ozone-wayland-vaapi-support.patch b/chromium-110-ozone-wayland-vaapi-support.patch
new file mode 100644
index 0000000..fdcff26
--- /dev/null
+++ b/chromium-110-ozone-wayland-vaapi-support.patch
@@ -0,0 +1,584 @@
+author Jianhui Dai <jianhui.j.dai@intel.com> Tue Nov 15 06:18:04 2022
+committer Jianhui Dai <jianhui.j.dai@intel.com> Tue Nov 15 06:18:04 2022
+
+[Ozone/Linux] Support VA-API on Linux Ozone/Wayland
+
+VA-API supports different display backends [1]. VA/DRM and VA/X11 are
+used by Chromium at the moment. All Ozone platforms support VA/DRM by
+default. VA/X11 is supported only on Ozone/X11.
+
+This CL renames 'supports_vaapi' to 'supports_vaapi_x11'; it indicates
+if VA/X11 supported. Linux Ozone/X11 supports both VA/X11 and VA/DRM;
+Linux Ozone/Wayland supports only VA/DRM. `VaapiPictureFactory` also
+takes this flag to determine picture creation and downloading mechanism
+on Linux.
+
+[1] https://github.com/intel/libva/blob/master/va/va_backend.h
+
+Test: VDA video playback on Linux X11 and Linux Wayland
+Bug: 1326754,1116701
+Change-Id: I6d6bf781833a7752d23dafb2b63112c2fc81b17a
+diff -up chromium-109.0.5359.124/media/gpu/args.gni.wayland-vaapi chromium-109.0.5359.124/media/gpu/args.gni
+--- chromium-109.0.5359.124/media/gpu/args.gni.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/args.gni 2023-01-05 10:13:08.291403261 +0100
+@@ -6,10 +6,14 @@ import("//build/config/chromeos/ui_mode.
+ import("//build/config/ozone.gni")
+
+ declare_args() {
+- # Indicates if X11 VA-API-based hardware acceleration is to be used.
+- # See also the comment near the |use_vaapi| arg.
+- use_vaapi_x11 = is_linux && ozone_platform_x11 &&
+- (target_cpu == "x86" || target_cpu == "x64") && !is_castos
++ # Build Chrome support for using VA-API over X11. Note that setting this to true is
++ # not a guarantee that Chrome will use (or even try to use) VA-API over X11. In
++ # particular, it is possible to build Chrome with support for VA-API over X11 but
++ # pick Wayland as the Ozone backend at runtime. In this case, Chrome will try to
++ # use VA-API over DRM.
++ support_vaapi_over_x11 =
++ is_linux && ozone_platform_x11 &&
++ (target_cpu == "x86" || target_cpu == "x64") && !is_castos
+ }
+
+ declare_args() {
+@@ -29,8 +33,9 @@ declare_args() {
+ # is typically the case on x86-based ChromeOS devices.
+ # VA-API should also be compiled by default on x11-using linux devices
+ # using x86/x64.
+- use_vaapi = use_vaapi_x11 || (is_chromeos_lacros &&
+- (target_cpu == "x86" || target_cpu == "x64"))
++ use_vaapi =
++ support_vaapi_over_x11 ||
++ (is_chromeos_lacros && (target_cpu == "x86" || target_cpu == "x64"))
+
+ # Indicates if ChromeOS protected media support exists. This is used
+ # to enable the CDM daemon in Chrome OS as well as support for
+diff -up chromium-109.0.5359.124/media/gpu/BUILD.gn.wayland-vaapi chromium-109.0.5359.124/media/gpu/BUILD.gn
+--- chromium-109.0.5359.124/media/gpu/BUILD.gn.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/BUILD.gn 2023-01-05 10:13:08.291403261 +0100
+@@ -20,7 +20,7 @@ buildflag_header("buildflags") {
+ "USE_VAAPI_IMAGE_CODECS=$use_vaapi_image_codecs",
+ "USE_V4L2_CODEC=$use_v4l2_codec",
+ "USE_LIBV4L2=$use_v4lplugin",
+- "USE_VAAPI_X11=$use_vaapi_x11",
++ "SUPPORT_VAAPI_OVER_X11=$support_vaapi_over_x11",
+ ]
+ }
+
+diff -up chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn
+--- chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/vaapi/BUILD.gn 2023-01-05 10:13:08.291403261 +0100
+@@ -17,7 +17,7 @@ assert(use_vaapi)
+ generate_stubs("libva_stubs") {
+ extra_header = "va_stub_header.fragment"
+ sigs = [ "va.sigs" ]
+- if (use_vaapi_x11) {
++ if (support_vaapi_over_x11) {
+ sigs += [ "va_x11.sigs" ]
+ }
+ if (is_chromeos_ash) {
+@@ -138,7 +138,7 @@ source_set("vaapi") {
+ ]
+ }
+
+- if (use_vaapi_x11) {
++ if (support_vaapi_over_x11) {
+ deps += [ "//ui/gfx/x" ]
+ sources += [
+ "vaapi_picture_native_pixmap_angle.cc",
+@@ -214,7 +214,7 @@ source_set("common") {
+ deps += [ "//ui/ozone" ]
+ }
+
+- if (use_vaapi_x11) {
++ if (support_vaapi_over_x11) {
+ deps += [ "//ui/gfx/x" ]
+ }
+
+diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h
+--- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h.wayland-vaapi 2022-12-14 01:39:53.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_picture_factory.h 2023-01-05 10:13:08.291403261 +0100
+@@ -36,7 +36,11 @@ class MEDIA_GPU_EXPORT VaapiPictureFacto
+ kVaapiImplementationAngle,
+ };
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ explicit VaapiPictureFactory(absl::optional<bool> may_use_vaapi_over_x11);
++#else
+ VaapiPictureFactory();
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ VaapiPictureFactory(const VaapiPictureFactory&) = delete;
+ VaapiPictureFactory& operator=(const VaapiPictureFactory&) = delete;
+@@ -85,6 +89,11 @@ class MEDIA_GPU_EXPORT VaapiPictureFacto
+
+ CreatePictureCB create_picture_cb_;
+ bool needs_vpp_for_downloading_ = false;
++
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ // See comment in `VaapiWrapper::MayUseVaapiOverX11()`.
++ absl::optional<bool> may_use_vaapi_over_x11_;
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ };
+
+ } // namespace media
+diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+--- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.wayland-vaapi 2023-01-05 10:13:08.290403251 +0100
++++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_video_decode_accelerator.cc 2023-01-05 10:13:08.292403271 +0100
+@@ -184,7 +184,12 @@ bool VaapiVideoDecodeAccelerator::Initia
+ Client* client) {
+ DCHECK(task_runner_->BelongsToCurrentThread());
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ vaapi_picture_factory_ =
++ std::make_unique<VaapiPictureFactory>(VaapiWrapper::MayUseVaapiOverX11());
++#else
+ vaapi_picture_factory_ = std::make_unique<VaapiPictureFactory>();
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ if (config.is_encrypted()) {
+ NOTREACHED() << "Encrypted streams are not supported for this VDA";
+@@ -1210,7 +1215,7 @@ VaapiVideoDecodeAccelerator::GetSupporte
+
+ VaapiVideoDecodeAccelerator::BufferAllocationMode
+ VaapiVideoDecodeAccelerator::DecideBufferAllocationMode() {
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ // The IMPORT mode is used for Android on Chrome OS, so this doesn't apply
+ // here.
+ DCHECK_NE(output_mode_, VideoDecodeAccelerator::Config::OutputMode::IMPORT);
+diff -up chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h
+--- chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h.wayland-vaapi 2022-12-14 01:39:53.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/vaapi/vaapi_wrapper.h 2023-01-05 10:13:08.292403271 +0100
+@@ -36,9 +36,9 @@
+ #include "third_party/abseil-cpp/absl/types/optional.h"
+ #include "ui/gfx/geometry/size.h"
+
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ #include "ui/gfx/x/xproto.h" // nogncheck
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ namespace gfx {
+ enum class BufferFormat;
+@@ -186,6 +186,16 @@ class MEDIA_GPU_EXPORT VaapiWrapper
+ VaapiWrapper(const VaapiWrapper&) = delete;
+ VaapiWrapper& operator=(const VaapiWrapper&) = delete;
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ // Returns true if VaapiWrapper instances may use VA-API over X11 and false
++ // otherwise (VA-API over DRM will be used). If this returns absl::nullopt,
++ // it's because it was not possible to determine how VA-API may be used. This
++ // should only be called after PreSandboxInitialization() (which is assumed to
++ // be called only once during the GPU process startup) and is safe to call
++ // from any thread. Additionally, this should always return the same value.
++ static absl::optional<bool> MayUseVaapiOverX11();
++#endif
++
+ // Returns the supported SVC scalability modes for specified profile.
+ static std::vector<SVCScalabilityMode> GetSupportedScalabilityModes(
+ VideoCodecProfile media_profile,
+@@ -439,13 +449,13 @@ class MEDIA_GPU_EXPORT VaapiWrapper
+ VASurfaceID va_surface_id,
+ const std::vector<std::pair<VABufferID, VABufferDescriptor>>& va_buffers);
+
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ // Put data from |va_surface_id| into |x_pixmap| of size
+ // |dest_size|, converting/scaling to it.
+ [[nodiscard]] bool PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
+ x11::Pixmap x_pixmap,
+ gfx::Size dest_size);
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ // Creates a ScopedVAImage from a VASurface |va_surface_id| and map it into
+ // memory with the given |format| and |size|. If |format| is not equal to the
+diff -up chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment.wayland-vaapi chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment
+--- chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment.wayland-vaapi 2022-12-14 01:39:52.000000000 +0100
++++ chromium-109.0.5359.124/media/gpu/vaapi/va_stub_header.fragment 2023-01-05 10:13:08.291403261 +0100
+@@ -7,8 +7,8 @@ extern "C" {
+
+ #include <va/va_drm.h>
+ #include <va/va.h>
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ #include <va/va_x11.h>
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ }
+diff -up chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc.wayland-vaapi chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc
+--- chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc.wayland-vaapi 2022-12-14 01:40:14.000000000 +0100
++++ chromium-109.0.5359.124/ui/ozone/platform/x11/ozone_platform_x11.cc 2023-01-05 10:13:08.292403271 +0100
+@@ -196,7 +196,7 @@ class OzonePlatformX11 : public OzonePla
+ properties->app_modal_dialogs_use_event_blocker = true;
+ properties->fetch_buffer_formats_for_gmb_on_gpu = true;
+ #if BUILDFLAG(IS_LINUX)
+- properties->supports_vaapi = true;
++ properties->supports_vaapi_x11 = true;
+ #endif
+
+ initialised = true;
+diff -up chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h.wayland-vaapi chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h
+--- chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h.wayland-vaapi 2022-12-14 01:40:14.000000000 +0100
++++ chromium-109.0.5359.124/ui/ozone/public/ozone_platform.h 2023-01-05 10:13:08.293403281 +0100
+@@ -145,12 +145,13 @@ class COMPONENT_EXPORT(OZONE) OzonePlatf
+ bool fetch_buffer_formats_for_gmb_on_gpu = false;
+
+ #if BUILDFLAG(IS_LINUX)
+- // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
+- // Linux. At the moment, VA-API Linux implementation supports only X11
+- // backend. This implementation must be refactored to support Ozone
+- // properly. As a temporary solution, VA-API on Linux checks if vaapi is
+- // supported (which implicitly means that it is Ozone/X11).
+- bool supports_vaapi = false;
++ // VA-API supports different display backends.
++ // See https://github.com/intel/libva/blob/master/va/va_backend.h
++ //
++ // VA/DRM and VA/X11 are used by Chromium at the moment. All Ozone platforms
++ // support VA/DRM by default. `supports_vaapi_x11` indicates if VA/X11
++ // supported; it is true only on Ozone/X11 platform.
++ bool supports_vaapi_x11 = false;
+ #endif
+
+ // Indicates that the platform allows client applications to manipulate
+diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc
+--- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc.orig 2023-01-04 20:20:18.000000000 +0100
++++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_wrapper.cc 2023-01-11 15:08:02.721768243 +0100
+@@ -62,7 +62,7 @@
+ #include "ui/gl/gl_bindings.h"
+ #include "ui/gl/gl_implementation.h"
+
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ typedef XID Drawable;
+
+ extern "C" {
+@@ -70,7 +70,7 @@
+ }
+
+ #include "ui/gfx/x/connection.h" // nogncheck
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ #if BUILDFLAG(IS_OZONE)
+ #include "ui/ozone/public/ozone_platform.h"
+@@ -84,14 +84,14 @@
+
+ using media_gpu_vaapi::kModuleVa;
+ using media_gpu_vaapi::kModuleVa_drm;
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ using media_gpu_vaapi::kModuleVa_x11;
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ using media_gpu_vaapi::InitializeStubs;
+ using media_gpu_vaapi::IsVaInitialized;
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ using media_gpu_vaapi::IsVa_x11Initialized;
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ using media_gpu_vaapi::IsVa_drmInitialized;
+ using media_gpu_vaapi::StubPathMap;
+
+@@ -668,6 +668,12 @@
+
+ void SetDrmFd(base::PlatformFile fd) { drm_fd_.reset(HANDLE_EINTR(dup(fd))); }
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ absl::optional<bool> MayUseVaapiOverX11() const {
++ return may_use_vaapi_over_x11_;
++ }
++#endif
++
+ private:
+ friend class base::NoDestructor<VADisplayState>;
+
+@@ -690,6 +696,13 @@
+ // Drm fd used to obtain access to the driver interface by VA.
+ base::ScopedFD drm_fd_;
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ // Whether we'll be possibly using VA-API over Ozone/X11. This should only be
++ // set (if at all) during the pre-sandbox initialization. If absl::nullopt,
++ // all calls to Initialize() will return false immediately.
++ absl::optional<bool> may_use_vaapi_over_x11_;
++#endif
++
+ // The VADisplay handle. Valid between Initialize() and Deinitialize().
+ VADisplay va_display_;
+
+@@ -708,6 +721,15 @@
+
+ // static
+ void VADisplayState::PreSandboxInitialization() {
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ if (ui::OzonePlatform::IsInitialized()) {
++ VADisplayState::Get()->may_use_vaapi_over_x11_ =
++ ui::OzonePlatform::GetInstance()
++ ->GetPlatformProperties()
++ .supports_vaapi_x11;
++ }
++#endif
++
+ constexpr char kRenderNodeFilePattern[] = "/dev/dri/renderD%d";
+ // This loop ends on either the first card that does not exist or the first
+ // render node that is not vgem.
+@@ -740,20 +762,18 @@
+ bool VADisplayState::Initialize() {
+ base::AutoLock auto_lock(va_lock_);
+
+-#if BUILDFLAG(IS_OZONE) && BUILDFLAG(IS_LINUX)
+- // TODO(crbug.com/1116701): add vaapi support for other Ozone platforms on
+- // Linux. See comment in OzonePlatform::PlatformProperties::supports_vaapi
+- // for more details. This will also require revisiting everything that's
+- // guarded by USE_VAAPI_X11. For example, if USE_VAAPI_X11 is true, but the
+- // user chooses the Wayland backend for Ozone at runtime, then many things (if
+- // not all) that we do for X11 won't apply.
+- if (!ui::OzonePlatform::GetInstance()->GetPlatformProperties().supports_vaapi)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ if (!may_use_vaapi_over_x11_.has_value())
+ return false;
+ #endif
+
+ bool libraries_initialized = IsVaInitialized() && IsVa_drmInitialized();
+-#if BUILDFLAG(USE_VAAPI_X11)
+- libraries_initialized = libraries_initialized && IsVa_x11Initialized();
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ // Initialize VA-API X11 display backend for Linux Ozone/X11.
++ // See comment in OzonePlatform::PlatformProperties::supports_vaapi_x11 for
++ // more details.
++ if (may_use_vaapi_over_x11_.value())
++ libraries_initialized = libraries_initialized && IsVa_x11Initialized();
+ #endif
+ if (!libraries_initialized)
+ return false;
+@@ -768,7 +788,7 @@
+ return success;
+ }
+
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ absl::optional<VADisplay> GetVADisplayStateX11(const base::ScopedFD& drm_fd) {
+ switch (gl::GetGLImplementation()) {
+@@ -796,13 +816,19 @@
+ }
+ }
+
+-#else
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ absl::optional<VADisplay> GetVADisplayState(const base::ScopedFD& drm_fd) {
+ switch (gl::GetGLImplementation()) {
+ case gl::kGLImplementationEGLGLES2:
++#if BUILDFLAG(IS_CHROMEOS)
++ // GetVADisplayState() should not get called on Linux with Ozone/X11
++ // (GetVADisplayStateX11() should get called instead), and we haven't tried
++ // VA-API decoding on Linux with Ozone/Wayland and anything other than
++ // native EGL/GLES2.
+ case gl::kGLImplementationEGLANGLE:
+ case gl::kGLImplementationNone:
++#endif
+ return vaGetDisplayDRM(drm_fd.get());
+ default:
+ LOG(WARNING) << "VAAPI video acceleration not available for "
+@@ -812,18 +838,23 @@
+ }
+ }
+
+-#endif // BUILDFLAG(USE_VAAPI_X11)
+-
+ bool VADisplayState::InitializeVaDisplay_Locked() {
+- absl::optional<VADisplay> display =
+-#if BUILDFLAG(USE_VAAPI_X11)
+- GetVADisplayStateX11(drm_fd_);
+-#else
+- GetVADisplayState(drm_fd_);
+-#endif
++ absl::optional<VADisplay> display;
+
+- if (!display)
+- return false;
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ DCHECK(may_use_vaapi_over_x11_.has_value());
++ if (may_use_vaapi_over_x11_.value()) {
++ display = GetVADisplayStateX11(drm_fd_);
++ if (!display)
++ return false;
++ }
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++
++ if (!display) {
++ display = GetVADisplayState(drm_fd_);
++ if (!display)
++ return false;
++ }
+
+ va_display_ = *display;
+ if (!vaDisplayIsValid(va_display_)) {
+@@ -1656,6 +1687,13 @@
+ enforce_sequence_affinity);
+ }
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++// static
++absl::optional<bool> VaapiWrapper::MayUseVaapiOverX11() {
++ return VADisplayState::Get()->MayUseVaapiOverX11();
++}
++#endif
++
+ // static
+ std::vector<SVCScalabilityMode> VaapiWrapper::GetSupportedScalabilityModes(
+ VideoCodecProfile media_profile,
+@@ -2665,12 +2703,13 @@
+ return Execute_Locked(va_surface_id, va_buffer_ids);
+ }
+
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ bool VaapiWrapper::PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
+ x11::Pixmap x_pixmap,
+ gfx::Size dest_size) {
+ CHECK(!enforce_sequence_affinity_ ||
+ sequence_checker_.CalledOnValidSequence());
++ CHECK(MayUseVaapiOverX11().value_or(false));
+ base::AutoLockMaybe auto_lock(va_lock_.get());
+
+ VAStatus va_res = vaSyncSurface(va_display_, va_surface_id);
+@@ -2684,7 +2723,7 @@
+ VA_SUCCESS_OR_RETURN(va_res, VaapiFunctions::kVAPutSurface, false);
+ return true;
+ }
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ std::unique_ptr<ScopedVAImage> VaapiWrapper::CreateVaImage(
+ VASurfaceID va_surface_id,
+@@ -3086,7 +3125,7 @@
+
+ paths[kModuleVa].push_back(std::string("libva.so.") + va_suffix);
+ paths[kModuleVa_drm].push_back(std::string("libva-drm.so.") + va_suffix);
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ paths[kModuleVa_x11].push_back(std::string("libva-x11.so.") + va_suffix);
+ #endif
+ #if BUILDFLAG(IS_CHROMEOS_ASH)
+diff -up chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc.orig chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc
+--- chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc.orig 2023-01-11 20:45:17.347940426 +0100
++++ chromium-109.0.5414.74/media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.cc 2023-01-11 20:45:58.314670752 +0100
+@@ -109,7 +109,7 @@
+ ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance();
+ ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone();
+ gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT_VDA_WRITE;
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ // The 'VaapiVideoDecodeAccelerator' requires the VPP to download the decoded
+ // frame from the internal surface to the allocated native pixmap.
+ // 'SCANOUT_VDA_WRITE' is used for 'YUV_420_BIPLANAR' on ChromeOS; For Linux,
+diff -up chromium-110.0.5481.61/media/gpu/vaapi/vaapi_picture_factory.cc.me1 chromium-110.0.5481.61/media/gpu/vaapi/vaapi_picture_factory.cc
+--- chromium-110.0.5481.61/media/gpu/vaapi/vaapi_picture_factory.cc.me1 2023-02-01 16:42:01.000000000 +0100
++++ chromium-110.0.5481.61/media/gpu/vaapi/vaapi_picture_factory.cc 2023-02-04 16:45:27.769211581 +0100
+@@ -13,9 +13,9 @@
+ #if BUILDFLAG(IS_OZONE)
+ #include "media/gpu/vaapi/vaapi_picture_native_pixmap_ozone.h"
+ #endif // BUILDFLAG(IS_OZONE)
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ #include "media/gpu/vaapi/vaapi_picture_native_pixmap_angle.h"
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ #if defined(USE_EGL)
+ #include "media/gpu/vaapi/vaapi_picture_native_pixmap_egl.h"
+ #endif
+@@ -41,19 +41,28 @@ std::unique_ptr<VaapiPicture> CreateVaap
+
+ } // namespace
+
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++VaapiPictureFactory::VaapiPictureFactory(
++ absl::optional<bool> may_use_vaapi_over_x11)
++ : may_use_vaapi_over_x11_(may_use_vaapi_over_x11) {
++#else
+ VaapiPictureFactory::VaapiPictureFactory() {
++#endif
+ vaapi_impl_pairs_.insert(
+ std::make_pair(gl::kGLImplementationEGLGLES2,
+ VaapiPictureFactory::kVaapiImplementationDrm));
+-#if BUILDFLAG(USE_VAAPI_X11)
+- vaapi_impl_pairs_.insert(
+- std::make_pair(gl::kGLImplementationEGLANGLE,
+- VaapiPictureFactory::kVaapiImplementationAngle));
+-#elif BUILDFLAG(IS_OZONE)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ CHECK(may_use_vaapi_over_x11_.has_value());
++ if (may_use_vaapi_over_x11_.value()) {
++ vaapi_impl_pairs_.insert(
++ std::make_pair(gl::kGLImplementationEGLANGLE,
++ VaapiPictureFactory::kVaapiImplementationAngle));
++ }
++#else
+ vaapi_impl_pairs_.insert(
+ std::make_pair(gl::kGLImplementationEGLANGLE,
+ VaapiPictureFactory::kVaapiImplementationDrm));
+-#endif
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+
+ DeterminePictureCreationAndDownloadingMechanism();
+ }
+@@ -93,19 +102,19 @@ VaapiPictureFactory::GetVaapiImplementat
+ }
+
+ uint32_t VaapiPictureFactory::GetGLTextureTarget() {
+-#if BUILDFLAG(USE_VAAPI_X11)
+- return GL_TEXTURE_2D;
+-#else
++#if BUILDFLAG(IS_CHROMEOS)
+ return GL_TEXTURE_EXTERNAL_OES;
+-#endif
++#else
++ return GL_TEXTURE_2D;
++#endif // BUILDFLAG(IS_CHROMEOS)
+ }
+
+ gfx::BufferFormat VaapiPictureFactory::GetBufferFormat() {
+-#if BUILDFLAG(USE_VAAPI_X11)
+- return gfx::BufferFormat::RGBX_8888;
+-#else
++#if BUILDFLAG(IS_CHROMEOS)
+ return gfx::BufferFormat::YUV_420_BIPLANAR;
+-#endif
++#else
++ return gfx::BufferFormat::RGBX_8888;
++#endif // BUILDFLAG(IS_CHROMEOS)
+ }
+
+ void VaapiPictureFactory::DeterminePictureCreationAndDownloadingMechanism() {
+@@ -113,19 +122,23 @@ void VaapiPictureFactory::DeterminePictu
+ #if BUILDFLAG(IS_OZONE)
+ // We can be called without GL initialized, which is valid if we use Ozone.
+ case kVaapiImplementationNone:
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
++ DCHECK(may_use_vaapi_over_x11_.value_or(false));
++#endif
+ create_picture_cb_ = base::BindRepeating(
+ &CreateVaapiPictureNativeImpl<VaapiPictureNativePixmapOzone>);
+ needs_vpp_for_downloading_ = true;
+ break;
+ #endif // BUILDFLAG(IS_OZONE)
+-#if BUILDFLAG(USE_VAAPI_X11)
++#if BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ case kVaapiImplementationAngle:
++ CHECK(may_use_vaapi_over_x11_.value_or(false));
+ create_picture_cb_ = base::BindRepeating(
+ &CreateVaapiPictureNativeImpl<VaapiPictureNativePixmapAngle>);
+ // Neither VaapiTFPPicture or VaapiPictureNativePixmapAngle needs the VPP.
+ needs_vpp_for_downloading_ = false;
+ break;
+-#endif // BUILDFLAG(USE_VAAPI_X11)
++#endif // BUILDFLAG(SUPPORT_VAAPI_OVER_X11)
+ case kVaapiImplementationDrm:
+ #if BUILDFLAG(IS_OZONE)
+ create_picture_cb_ = base::BindRepeating(
diff --git a/chromium-110-raw_ptr-constexpr.patch b/chromium-110-raw_ptr-constexpr.patch
new file mode 100644
index 0000000..ded5855
--- /dev/null
+++ b/chromium-110-raw_ptr-constexpr.patch
@@ -0,0 +1,31 @@
+From bd3af998439424886c641279b6f9bb6e950c7142 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Sun, 18 Dec 2022 16:12:29 +0000
+Subject: [PATCH] GCC: make raw_ptr::operator bool constexpr
+
+Required because autofill::internal::FormForest uses it in
+a constexpr method.
+
+Bug: 819294
+Change-Id: Ib2258c9d98c2e7f88ad192b517b487f834a87481
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4110924
+Reviewed-by: Bartek Nowierski <bartekn@chromium.org>
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Cr-Commit-Position: refs/heads/main@{#1084785}
+---
+
+diff --git a/base/memory/raw_ptr.h b/base/memory/raw_ptr.h
+index 4191f0e..a22f64b7 100644
+--- a/base/memory/raw_ptr.h
++++ b/base/memory/raw_ptr.h
+@@ -1301,7 +1301,9 @@
+ // possible, so use it only if absolutely necessary (e.g. for const_cast).
+ PA_ALWAYS_INLINE T* get() const { return GetForExtraction(); }
+
+- explicit PA_ALWAYS_INLINE operator bool() const { return !!wrapped_ptr_; }
++ constexpr explicit PA_ALWAYS_INLINE operator bool() const {
++ return !!wrapped_ptr_;
++ }
+
+ template <typename U = T,
+ typename Unused = std::enable_if_t<
diff --git a/chromium-110-url_canon_internal-cast.patch b/chromium-110-url_canon_internal-cast.patch
new file mode 100644
index 0000000..41064a7
--- /dev/null
+++ b/chromium-110-url_canon_internal-cast.patch
@@ -0,0 +1,34 @@
+From 740d1102e3fdaaed5441b5656205df9d7e422c3a Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Tue, 20 Dec 2022 20:41:12 +0000
+Subject: [PATCH] GCC: add cast for vector types in url/url_canon_internal.cc
+
+GCC requires lax vector conversion for converting __vector(16) to
+SIMD types. Add explicit cast instead.
+
+Bug: 819294
+Change-Id: Icfc9d3586350af469bfd9d83b355d94806430c43
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4110786
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Reviewed-by: Daniel Cheng <dcheng@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#1085617}
+---
+
+diff --git a/url/url_canon_internal.cc b/url/url_canon_internal.cc
+index e4f7949..f621920 100644
+--- a/url/url_canon_internal.cc
++++ b/url/url_canon_internal.cc
+@@ -49,11 +49,11 @@
+ auto mask = b >= 0x24 && b <= 0x7e && b != 0x27 && b != 0x3c && b != 0x3e;
+
+ #ifdef __SSE2__
+- if (_mm_movemask_epi8(mask) != 0xffff) {
++ if (_mm_movemask_epi8(reinterpret_cast<__m128i>(mask)) != 0xffff) {
+ return i;
+ }
+ #else
+- if (vminvq_u8(mask) == 0) {
++ if (vminvq_u8(reinterpret_cast<uint8x16_t>(mask)) == 0) {
+ return i;
+ }
+ #endif
diff --git a/chromium-110-v8-gcc.patch b/chromium-110-v8-gcc.patch
new file mode 100644
index 0000000..4bca19a
--- /dev/null
+++ b/chromium-110-v8-gcc.patch
@@ -0,0 +1,33 @@
+From 15d123009b7e987e946309cd5724ae17f376bd16 Mon Sep 17 00:00:00 2001
+From: Stephan Hartmann <stha09@googlemail.com>
+Date: Sun, 18 Dec 2022 16:26:02 +0100
+Subject: [PATCH] GCC: fix selection of IMMEDIATE_CRASH
+
+immediate_crash.h still uses V8_CC_GCC define to determine which
+IMMEDIATE_CRASH macro is used. This should be V8_CC_GNU instead.
+Otherwise weird compile errors are happening with turboshaft.
+
+Bug: chromium:819294
+Change-Id: Id77fe7406ae16a804e1e466844f81d6c728ec008
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4111849
+Commit-Queue: Stephan Hartmann <stha09@googlemail.com>
+Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#84923}
+---
+
+diff --git a/src/base/immediate-crash.h b/src/base/immediate-crash.h
+index 770cb27..ce6240b 100644
+--- a/v8/src/base/immediate-crash.h
++++ b/v8/src/base/immediate-crash.h
+@@ -140,9 +140,9 @@
+ [] { TRAP_SEQUENCE_(); }(); \
+ } while (false)
+
+-#endif // !V8_CC_GCC
++#endif // !V8_CC_GNU
+
+-#if defined(__clang__) || V8_CC_GCC
++#if defined(__clang__) || V8_CC_GNU
+
+ // __builtin_unreachable() hints to the compiler that this is noreturn and can
+ // be packed in the function epilogue.
diff --git a/chromium-111-v8-std-layout1.patch b/chromium-111-v8-std-layout1.patch
new file mode 100644
index 0000000..95b2633
--- /dev/null
+++ b/chromium-111-v8-std-layout1.patch
@@ -0,0 +1,2229 @@
+From 472429e623cf48e864a7a2f10d589817a88289a1 Mon Sep 17 00:00:00 2001
+From: Nikolaos Papaspyrou <nikolaos@chromium.org>
+Date: Wed, 18 Jan 2023 21:11:59 +0100
+Subject: [PATCH] [heap] Fix saving the callee-saved registers on stack
+
+This CL reinstates the trampoline for pushing the values of
+callee-saved registers on the stack, which is used for stack scanning.
+It reintroduces the set of architecture-specific functions
+PushAllRegistersAndIterateStack, removed in crrev.com/c/3989143.
+The reason for this change is that the simpler architecture-specific
+functions SaveCalleeSavedRegisters failed to correctly save the
+values of the registers, in the presence of C++ compiler optimizations.
+
+It also removes the stack context, introduced in crrev.com/c/4017512,
+and uses again the trampoline for iterating through the stack.
+
+Bug: v8:13257
+Change-Id: I9e656a9b3ba6616168602300f2180b4f340593f3
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4171639
+Commit-Queue: Nikolaos Papaspyrou <nikolaos@chromium.org>
+Reviewed-by: Omer Katz <omerkatz@chromium.org>
+Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#85394}
+
+(stripped tests)
+---
+
+diff --git a/BUILD.bazel b/BUILD.bazel
+index 283eeff..e3269a4 100644
+--- a/v8/BUILD.bazel
++++ b/v8/BUILD.bazel
+@@ -3201,16 +3201,16 @@
+ # Note these cannot be v8_target_is_* selects because these contain
+ # inline assembly that runs inside the executable. Since these are
+ # linked directly into mksnapshot, they must use the actual target cpu.
+- "@v8//bazel/config:is_inline_asm_ia32": ["src/heap/base/asm/ia32/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_x64": ["src/heap/base/asm/x64/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_arm": ["src/heap/base/asm/arm/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_arm64": ["src/heap/base/asm/arm64/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_s390x": ["src/heap/base/asm/s390/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_riscv64": ["src/heap/base/asm/riscv64/save_registers_asm.cc"],
+- "@v8//bazel/config:is_inline_asm_ppc64le": ["src/heap/base/asm/ppc/save_registers_asm.cc"],
+- "@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/save_registers_masm.asm"],
+- "@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/save_registers_masm.asm"],
+- "@v8//bazel/config:is_msvc_asm_arm64": ["src/heap/base/asm/arm64/save_registers_masm.S"],
++ "@v8//bazel/config:is_inline_asm_ia32": ["src/heap/base/asm/ia32/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_x64": ["src/heap/base/asm/x64/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_arm": ["src/heap/base/asm/arm/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_arm64": ["src/heap/base/asm/arm64/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_s390x": ["src/heap/base/asm/s390/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_riscv64": ["src/heap/base/asm/riscv64/push_registers_asm.cc"],
++ "@v8//bazel/config:is_inline_asm_ppc64le": ["src/heap/base/asm/ppc/push_registers_asm.cc"],
++ "@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/push_registers_masm.asm"],
++ "@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/push_registers_masm.asm"],
++ "@v8//bazel/config:is_msvc_asm_arm64": ["src/heap/base/asm/arm64/push_registers_masm.S"],
+ }),
+ )
+
+diff --git a/BUILD.gn b/BUILD.gn
+index 80a7eb6..56798db 100644
+--- a/v8/BUILD.gn
++++ b/v8/BUILD.gn
+@@ -5989,31 +5989,31 @@
+
+ if (is_clang || !is_win) {
+ if (current_cpu == "x64") {
+- sources += [ "src/heap/base/asm/x64/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/x64/push_registers_asm.cc" ]
+ } else if (current_cpu == "x86") {
+- sources += [ "src/heap/base/asm/ia32/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/ia32/push_registers_asm.cc" ]
+ } else if (current_cpu == "arm") {
+- sources += [ "src/heap/base/asm/arm/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/arm/push_registers_asm.cc" ]
+ } else if (current_cpu == "arm64") {
+- sources += [ "src/heap/base/asm/arm64/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/arm64/push_registers_asm.cc" ]
+ } else if (current_cpu == "ppc64") {
+- sources += [ "src/heap/base/asm/ppc/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/ppc/push_registers_asm.cc" ]
+ } else if (current_cpu == "s390x") {
+- sources += [ "src/heap/base/asm/s390/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/s390/push_registers_asm.cc" ]
+ } else if (current_cpu == "mips64el") {
+- sources += [ "src/heap/base/asm/mips64/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/mips64/push_registers_asm.cc" ]
+ } else if (current_cpu == "loong64") {
+- sources += [ "src/heap/base/asm/loong64/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/loong64/push_registers_asm.cc" ]
+ } else if (current_cpu == "riscv64" || current_cpu == "riscv32") {
+- sources += [ "src/heap/base/asm/riscv/save_registers_asm.cc" ]
++ sources += [ "src/heap/base/asm/riscv/push_registers_asm.cc" ]
+ }
+ } else if (is_win) {
+ if (current_cpu == "x64") {
+- sources += [ "src/heap/base/asm/x64/save_registers_masm.asm" ]
++ sources += [ "src/heap/base/asm/x64/push_registers_masm.asm" ]
+ } else if (current_cpu == "x86") {
+- sources += [ "src/heap/base/asm/ia32/save_registers_masm.asm" ]
++ sources += [ "src/heap/base/asm/ia32/push_registers_masm.asm" ]
+ } else if (current_cpu == "arm64") {
+- sources += [ "src/heap/base/asm/arm64/save_registers_masm.S" ]
++ sources += [ "src/heap/base/asm/arm64/push_registers_masm.S" ]
+ }
+ }
+
+diff --git a/src/execution/isolate.cc b/src/execution/isolate.cc
+index 8a2ec80..31536a1 100644
+--- a/v8/src/execution/isolate.cc
++++ b/v8/src/execution/isolate.cc
+@@ -3075,8 +3075,7 @@
+ .get()
+ .get();
+ current = WasmContinuationObject::cast(current).parent();
+- thread_local_top()->stack_.SetStackStart(
+- reinterpret_cast<void*>(stack->base()));
++ heap()->SetStackStart(reinterpret_cast<void*>(stack->base()));
+ // We don't need to add all inactive stacks. Only the ones in the active chain
+ // may contain cpp heap pointers.
+ while (!current.IsUndefined()) {
+@@ -3372,9 +3371,12 @@
+ Isolate* saved_isolate = isolate->TryGetCurrent();
+ SetIsolateThreadLocals(isolate, nullptr);
+ isolate->set_thread_id(ThreadId::Current());
+- isolate->thread_local_top()->stack_ =
+- saved_isolate ? std::move(saved_isolate->thread_local_top()->stack_)
+- : ::heap::base::Stack(base::Stack::GetStackStart());
++ if (saved_isolate) {
++ isolate->thread_local_top()->stack_ =
++ std::move(saved_isolate->thread_local_top()->stack_);
++ } else {
++ isolate->heap()->SetStackStart(base::Stack::GetStackStart());
++ }
+
+ bool owns_shared_isolate = isolate->owns_shared_isolate_;
+ Isolate* maybe_shared_isolate = isolate->shared_isolate_;
+diff --git a/src/execution/thread-local-top.cc b/src/execution/thread-local-top.cc
+index 0d7071d..c115ae0 100644
+--- a/v8/src/execution/thread-local-top.cc
++++ b/v8/src/execution/thread-local-top.cc
+@@ -44,10 +44,13 @@
+ Clear();
+ isolate_ = isolate;
+ thread_id_ = ThreadId::Current();
+- stack_.SetStackStart(base::Stack::GetStackStart());
+ #if V8_ENABLE_WEBASSEMBLY
++ stack_.SetStackStart(base::Stack::GetStackStart(),
++ v8_flags.experimental_wasm_stack_switching);
+ thread_in_wasm_flag_address_ = reinterpret_cast<Address>(
+ trap_handler::GetThreadInWasmThreadLocalAddress());
++#else
++ stack_.SetStackStart(base::Stack::GetStackStart(), false);
+ #endif // V8_ENABLE_WEBASSEMBLY
+ #ifdef USE_SIMULATOR
+ simulator_ = Simulator::current(isolate);
+diff --git a/src/heap/base/asm/arm/push_registers_asm.cc b/src/heap/base/asm/arm/push_registers_asm.cc
+new file mode 100644
+index 0000000..5246c3f
+--- /dev/null
++++ b/v8/src/heap/base/asm/arm/push_registers_asm.cc
+@@ -0,0 +1,39 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++//
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++
++// We maintain 8-byte alignment at calls by pushing an additional
++// non-callee-saved register (r3).
++//
++// Calling convention source:
++// https://en.wikipedia.org/wiki/Calling_convention#ARM_(A32)
++// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4127.html
++asm(".globl PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers and save return address.
++ // Only {r4-r11} are callee-saved registers. Push r3 in addition to align
++ // the stack back to 8 bytes.
++ " push {r3-r11, lr} \n"
++ // Pass 1st parameter (r0) unchanged (Stack*).
++ // Pass 2nd parameter (r1) unchanged (StackVisitor*).
++ // Save 3rd parameter (r2; IterateStackCallback).
++ " mov r3, r2 \n"
++ // Pass 3rd parameter as sp (stack pointer).
++ " mov r2, sp \n"
++ // Call the callback.
++ " blx r3 \n"
++ // Discard all the registers.
++ " add sp, sp, #36 \n"
++ // Pop lr into pc which returns and switches mode if needed.
++ " pop {pc} \n");
+diff --git a/src/heap/base/asm/arm/save_registers_asm.cc b/src/heap/base/asm/arm/save_registers_asm.cc
+deleted file mode 100644
+index ace9503..0000000
+--- a/v8/src/heap/base/asm/arm/save_registers_asm.cc
++++ /dev/null
+@@ -1,36 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-//
+-// We maintain 8-byte alignment at calls by pushing an additional
+-// non-callee-saved register (r3).
+-//
+-// Calling convention source:
+-// https://en.wikipedia.org/wiki/Calling_convention#ARM_(A32)
+-// http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4127.html
+-
+-// 8 32-bit registers = 8 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 8,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 4, "Mismatch in word size");
+-
+-asm(".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // r0: [ intptr_t* buffer ]
+- // Save the callee-saved registers: {r4-r11}.
+- " stm r0, {r4-r11} \n"
+- // Return.
+- " bx lr \n");
+diff --git a/src/heap/base/asm/arm64/push_registers_asm.cc b/src/heap/base/asm/arm64/push_registers_asm.cc
+new file mode 100644
+index 0000000..1efcc34
+--- /dev/null
++++ b/v8/src/heap/base/asm/arm64/push_registers_asm.cc
+@@ -0,0 +1,62 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++//
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++
++// We maintain 16-byte alignment.
++//
++// Calling convention source:
++// https://en.wikipedia.org/wiki/Calling_convention#ARM_(A64)
++
++asm(
++#if defined(__APPLE__)
++ ".globl _PushAllRegistersAndIterateStack \n"
++ ".private_extern _PushAllRegistersAndIterateStack \n"
++ ".p2align 2 \n"
++ "_PushAllRegistersAndIterateStack: \n"
++#else // !defined(__APPLE__)
++ ".globl PushAllRegistersAndIterateStack \n"
++#if !defined(_WIN64)
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++#endif // !defined(_WIN64)
++ ".p2align 2 \n"
++ "PushAllRegistersAndIterateStack: \n"
++#endif // !defined(__APPLE__)
++ // x19-x29 are callee-saved.
++ " stp x19, x20, [sp, #-16]! \n"
++ " stp x21, x22, [sp, #-16]! \n"
++ " stp x23, x24, [sp, #-16]! \n"
++ " stp x25, x26, [sp, #-16]! \n"
++ " stp x27, x28, [sp, #-16]! \n"
++#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
++ // Sign return address.
++ " paciasp \n"
++#endif
++ " stp fp, lr, [sp, #-16]! \n"
++ // Maintain frame pointer.
++ " mov fp, sp \n"
++ // Pass 1st parameter (x0) unchanged (Stack*).
++ // Pass 2nd parameter (x1) unchanged (StackVisitor*).
++ // Save 3rd parameter (x2; IterateStackCallback)
++ " mov x7, x2 \n"
++ // Pass 3rd parameter as sp (stack pointer).
++ " mov x2, sp \n"
++ " blr x7 \n"
++ // Load return address and frame pointer.
++ " ldp fp, lr, [sp], #16 \n"
++#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
++ // Authenticate return address.
++ " autiasp \n"
++#endif
++ // Drop all callee-saved registers.
++ " add sp, sp, #80 \n"
++ " ret \n");
+diff --git a/src/heap/base/asm/arm64/push_registers_masm.S b/src/heap/base/asm/arm64/push_registers_masm.S
+new file mode 100644
+index 0000000..888523a
+--- /dev/null
++++ b/v8/src/heap/base/asm/arm64/push_registers_masm.S
+@@ -0,0 +1,32 @@
++; Copyright 2020 the V8 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.
++
++; This file is exactly the same as push_registers_asm.cc, just formatted for
++; the Microsoft Arm Assembler.
++
++ AREA |.text|, CODE, ALIGN=4, READONLY
++ EXPORT PushAllRegistersAndIterateStack
++PushAllRegistersAndIterateStack
++ ; x19-x29 are callee-saved
++ STP x19, x20, [sp, #-16]!
++ STP x21, x22, [sp, #-16]!
++ STP x23, x24, [sp, #-16]!
++ STP x25, x26, [sp, #-16]!
++ STP x27, x28, [sp, #-16]!
++ STP fp, lr, [sp, #-16]!
++ ; Maintain frame pointer
++ MOV fp, sp
++ ; Pass 1st parameter (x0) unchanged (Stack*).
++ ; Pass 2nd parameter (x1) unchanged (StackVisitor*).
++ ; Save 3rd parameter (x2; IterateStackCallback)
++ MOV x7, x2
++ ; Pass 3rd parameter as sp (stack pointer)
++ MOV x2, sp
++ BLR x7
++ ; Load return address
++ LDR lr, [sp, #8]
++ ; Restore frame pointer and pop all callee-saved registers.
++ LDR fp, [sp], #96
++ RET
++ END
+diff --git a/src/heap/base/asm/arm64/save_registers_asm.cc b/src/heap/base/asm/arm64/save_registers_asm.cc
+deleted file mode 100644
+index 5fe81d8..0000000
+--- a/v8/src/heap/base/asm/arm64/save_registers_asm.cc
++++ /dev/null
+@@ -1,50 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-//
+-// We maintain 16-byte alignment.
+-//
+-// Calling convention source:
+-// https://en.wikipedia.org/wiki/Calling_convention#ARM_(A64)
+-
+-// 11 64-bit registers = 11 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 11,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(
+-#if defined(__APPLE__)
+- ".globl _SaveCalleeSavedRegisters \n"
+- ".private_extern _SaveCalleeSavedRegisters \n"
+- ".p2align 2 \n"
+- "_SaveCalleeSavedRegisters: \n"
+-#else // !defined(__APPLE__)
+- ".globl SaveCalleeSavedRegisters \n"
+-#if !defined(_WIN64)
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+-#endif // !defined(_WIN64)
+- ".p2align 2 \n"
+- "SaveCalleeSavedRegisters: \n"
+-#endif // !defined(__APPLE__)
+- // $x0: [ intptr_t* buffer ]
+- // Save the callee-saved registers: x19-x29.
+- " stp x19, x20, [x0], #16 \n"
+- " stp x21, x22, [x0], #16 \n"
+- " stp x23, x24, [x0], #16 \n"
+- " stp x25, x26, [x0], #16 \n"
+- " stp x27, x28, [x0], #16 \n"
+- " str x29, [x0] \n"
+- // Return.
+- " ret \n");
+diff --git a/src/heap/base/asm/arm64/save_registers_masm.S b/src/heap/base/asm/arm64/save_registers_masm.S
+deleted file mode 100644
+index ab79055..0000000
+--- a/v8/src/heap/base/asm/arm64/save_registers_masm.S
++++ /dev/null
+@@ -1,24 +0,0 @@
+-; Copyright 2020 the V8 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.
+-
+-; This file is exactly the same as save_registers_asm.cc, just formatted for
+-; the Microsoft Arm Assembler.
+-
+-; Save all callee-saved registers in the specified buffer.
+-; extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+- AREA |.text|, CODE, ALIGN=4, READONLY
+- EXPORT SaveCalleeSavedRegisters
+-SaveCalleeSavedRegisters
+- ; x0: [ intptr_t* buffer ]
+- ; x19-x29 are callee-saved
+- STP x19, x20, [x0], #16
+- STP x21, x22, [x0], #16
+- STP x23, x24, [x0], #16
+- STP x25, x26, [x0], #16
+- STP x27, x28, [x0], #16
+- STR x29, [x0]
+- ; Return.
+- RET
+- END
+diff --git a/src/heap/base/asm/ia32/push_registers_asm.cc b/src/heap/base/asm/ia32/push_registers_asm.cc
+new file mode 100644
+index 0000000..ed9c14a
+--- /dev/null
++++ b/v8/src/heap/base/asm/ia32/push_registers_asm.cc
+@@ -0,0 +1,53 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++//
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++
++// We maintain 16-byte alignment at calls. There is an 4-byte return address
++// on the stack and we push 28 bytes which maintains 16-byte stack alignment
++// at the call.
++//
++// The following assumes cdecl calling convention.
++// Source: https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
++asm(
++#ifdef _WIN32
++ ".globl _PushAllRegistersAndIterateStack \n"
++ "_PushAllRegistersAndIterateStack: \n"
++#else // !_WIN32
++ ".globl PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++#endif // !_WIN32
++ // [ IterateStackCallback ]
++ // [ StackVisitor* ]
++ // [ Stack* ]
++ // [ ret ]
++ // ebp is callee-saved. Maintain proper frame pointer for debugging.
++ " push %ebp \n"
++ " movl %esp, %ebp \n"
++ " push %ebx \n"
++ " push %esi \n"
++ " push %edi \n"
++ // Save 3rd parameter (IterateStackCallback).
++ " movl 28(%esp), %ecx \n"
++ // Pass 3rd parameter as esp (stack pointer).
++ " push %esp \n"
++ // Pass 2nd parameter (StackVisitor*).
++ " push 28(%esp) \n"
++ // Pass 1st parameter (Stack*).
++ " push 28(%esp) \n"
++ " call *%ecx \n"
++ // Pop the callee-saved registers.
++ " addl $24, %esp \n"
++ // Restore rbp as it was used as frame pointer.
++ " pop %ebp \n"
++ " ret \n");
+diff --git a/src/heap/base/asm/ia32/push_registers_masm.asm b/src/heap/base/asm/ia32/push_registers_masm.asm
+new file mode 100644
+index 0000000..a35fd6e
+--- /dev/null
++++ b/v8/src/heap/base/asm/ia32/push_registers_masm.asm
+@@ -0,0 +1,48 @@
++;; Copyright 2020 the V8 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.
++
++;; MASM syntax
++;; https://docs.microsoft.com/en-us/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2019
++
++.model flat, C
++
++public PushAllRegistersAndIterateStack
++
++.code
++PushAllRegistersAndIterateStack:
++ ;; Push all callee-saved registers to get them on the stack for conservative
++ ;; stack scanning.
++ ;;
++ ;; We maintain 16-byte alignment at calls. There is an 8-byte return address
++ ;; on the stack and we push 72 bytes which maintains 16-byte stack alignment
++ ;; at the call.
++ ;;
++ ;; The following assumes cdecl calling convention.
++ ;; Source: https://docs.microsoft.com/en-us/cpp/cpp/cdecl?view=vs-2019
++ ;;
++ ;; [ IterateStackCallback ]
++ ;; [ StackVisitor* ]
++ ;; [ Stack* ]
++ ;; [ ret ]
++ push ebp
++ mov ebp, esp
++ push ebx
++ push esi
++ push edi
++ ;; Save 3rd parameter (IterateStackCallback).
++ mov ecx, [ esp + 28 ]
++ ;; Pass 3rd parameter as esp (stack pointer).
++ push esp
++ ;; Pass 2nd parameter (StackVisitor*).
++ push [ esp + 28 ]
++ ;; Pass 1st parameter (Stack*).
++ push [ esp + 28 ]
++ call ecx
++ ;; Pop the callee-saved registers.
++ add esp, 24
++ ;; Restore rbp as it was used as frame pointer.
++ pop ebp
++ ret
++
++end
+diff --git a/src/heap/base/asm/ia32/save_registers_asm.cc b/src/heap/base/asm/ia32/save_registers_asm.cc
+deleted file mode 100644
+index 7c05247..0000000
+--- a/v8/src/heap/base/asm/ia32/save_registers_asm.cc
++++ /dev/null
+@@ -1,48 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-//
+-// The following assumes cdecl calling convention.
+-// Source: https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
+-
+-// 3 32-bit registers = 3 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 3,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 4, "Mismatch in word size");
+-
+-asm(
+-#ifdef _WIN32
+- ".globl _SaveCalleeSavedRegisters \n"
+- "_SaveCalleeSavedRegisters: \n"
+-#else // !_WIN32
+- ".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+-#endif // !_WIN32
+- // 8: [ intptr_t* buffer ]
+- // 4: [ ret ]
+- // 0: [ saved %ebp ]
+- // %ebp is callee-saved. Maintain proper frame pointer for debugging.
+- " push %ebp \n"
+- " movl %esp, %ebp \n"
+- // Load the buffer's address in %ecx.
+- " movl 8(%ebp), %ecx \n"
+- // Save the callee-saved registers.
+- " movl %ebx, 0(%ecx) \n"
+- " movl %esi, 4(%ecx) \n"
+- " movl %edi, 8(%ecx) \n"
+- // Restore %ebp as it was used as frame pointer and return.
+- " pop %ebp \n"
+- " ret \n");
+diff --git a/src/heap/base/asm/ia32/save_registers_masm.asm b/src/heap/base/asm/ia32/save_registers_masm.asm
+deleted file mode 100644
+index 0892b02..0000000
+--- a/v8/src/heap/base/asm/ia32/save_registers_masm.asm
++++ /dev/null
+@@ -1,36 +0,0 @@
+-;; Copyright 2020 the V8 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.
+-
+-;; MASM syntax
+-;; https://docs.microsoft.com/en-us/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2019
+-
+-.model flat, C
+-
+-public SaveCalleeSavedRegisters
+-
+-.code
+- ;; Save all callee-saved registers in the specified buffer.
+- ;; extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+- ;;
+- ;; The following assumes cdecl calling convention.
+- ;; Source: https://docs.microsoft.com/en-us/cpp/cpp/cdecl?view=vs-2019
+-
+-SaveCalleeSavedRegisters:
+- ;; 8: [ intptr_t* buffer ]
+- ;; 4: [ ret ]
+- ;; 0: [ saved %ebp ]
+- ;; %ebp is callee-saved. Maintain proper frame pointer for debugging.
+- push ebp
+- mov ebp, esp
+- ;; Load the buffer's address in %ecx.
+- mov ecx, [ebp + 8]
+- ;; Save the callee-saved registers.
+- mov [ecx], ebx
+- mov [ecx + 4], esi
+- mov [ecx + 8], edi
+- ;; Restore %ebp as it was used as frame pointer and return.
+- pop ebp
+- ret
+-
+-end
+diff --git a/src/heap/base/asm/loong64/push_registers_asm.cc b/src/heap/base/asm/loong64/push_registers_asm.cc
+new file mode 100644
+index 0000000..aa8dcd3
+--- /dev/null
++++ b/v8/src/heap/base/asm/loong64/push_registers_asm.cc
+@@ -0,0 +1,48 @@
++// Copyright 2021 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++//
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++asm(".text \n"
++ ".global PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers and save return address.
++ " addi.d $sp, $sp, -96 \n"
++ " st.d $ra, $sp, 88 \n"
++ " st.d $s8, $sp, 80 \n"
++ " st.d $sp, $sp, 72 \n"
++ " st.d $fp, $sp, 64 \n"
++ " st.d $s7, $sp, 56 \n"
++ " st.d $s6, $sp, 48 \n"
++ " st.d $s5, $sp, 40 \n"
++ " st.d $s4, $sp, 32 \n"
++ " st.d $s3, $sp, 24 \n"
++ " st.d $s2, $sp, 16 \n"
++ " st.d $s1, $sp, 8 \n"
++ " st.d $s0, $sp, 0 \n"
++ // Maintain frame pointer.
++ " addi.d $s8, $sp, 0 \n"
++ // Pass 1st parameter (a0) unchanged (Stack*).
++ // Pass 2nd parameter (a1) unchanged (StackVisitor*).
++ // Save 3rd parameter (a2; IterateStackCallback).
++ " addi.d $a3, $a2, 0 \n"
++ // Call the callback.
++ // Pass 3rd parameter as sp (stack pointer).
++ " addi.d $a2, $sp, 0 \n"
++ " jirl $ra, $a3, 0 \n"
++ // Load return address.
++ " ld.d $ra, $sp, 88 \n"
++ // Restore frame pointer.
++ " ld.d $s8, $sp, 80 \n"
++ // Discard all callee-saved registers.
++ " addi.d $sp, $sp, 96 \n"
++ " jirl $zero, $ra, 0 \n");
+diff --git a/src/heap/base/asm/loong64/save_registers_asm.cc b/src/heap/base/asm/loong64/save_registers_asm.cc
+deleted file mode 100644
+index d5b110d..0000000
+--- a/v8/src/heap/base/asm/loong64/save_registers_asm.cc
++++ /dev/null
+@@ -1,40 +0,0 @@
+-// Copyright 2021 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-
+-// 11 64-bit registers = 11 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 11,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(".text \n"
+- ".global SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // $a0: [ intptr_t* buffer ]
+- // Save the callee-saved registers.
+- " st.d $s8, $a0, 0 \n"
+- " st.d $sp, $a0, 8 \n"
+- " st.d $fp, $a0, 16 \n"
+- " st.d $s7, $a0, 24 \n"
+- " st.d $s6, $a0, 32 \n"
+- " st.d $s5, $a0, 40 \n"
+- " st.d $s4, $a0, 48 \n"
+- " st.d $s3, $a0, 56 \n"
+- " st.d $s2, $a0, 64 \n"
+- " st.d $s1, $a0, 72 \n"
+- " st.d $s0, $a0, 80 \n"
+- // Return.
+- " jirl $zero, $ra, 0 \n");
+diff --git a/src/heap/base/asm/mips64/push_registers_asm.cc b/src/heap/base/asm/mips64/push_registers_asm.cc
+new file mode 100644
+index 0000000..47779e0
+--- /dev/null
++++ b/v8/src/heap/base/asm/mips64/push_registers_asm.cc
+@@ -0,0 +1,49 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++//
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++asm(".text \n"
++ ".set noreorder \n"
++ ".global PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers and save return address.
++ " daddiu $sp, $sp, -96 \n"
++ " sd $ra, 88($sp) \n"
++ " sd $s8, 80($sp) \n"
++ " sd $sp, 72($sp) \n"
++ " sd $gp, 64($sp) \n"
++ " sd $s7, 56($sp) \n"
++ " sd $s6, 48($sp) \n"
++ " sd $s5, 40($sp) \n"
++ " sd $s4, 32($sp) \n"
++ " sd $s3, 24($sp) \n"
++ " sd $s2, 16($sp) \n"
++ " sd $s1, 8($sp) \n"
++ " sd $s0, 0($sp) \n"
++ // Maintain frame pointer.
++ " move $s8, $sp \n"
++ // Pass 1st parameter (a0) unchanged (Stack*).
++ // Pass 2nd parameter (a1) unchanged (StackVisitor*).
++ // Save 3rd parameter (a2; IterateStackCallback).
++ " move $a3, $a2 \n"
++ // Call the callback.
++ " jalr $a3 \n"
++ // Delay slot: Pass 3rd parameter as sp (stack pointer).
++ " move $a2, $sp \n"
++ // Load return address.
++ " ld $ra, 88($sp) \n"
++ // Restore frame pointer.
++ " ld $s8, 80($sp) \n"
++ " jr $ra \n"
++ // Delay slot: Discard all callee-saved registers.
++ " daddiu $sp, $sp, 96 \n");
+diff --git a/src/heap/base/asm/mips64/save_registers_asm.cc b/src/heap/base/asm/mips64/save_registers_asm.cc
+deleted file mode 100644
+index 95bcc31..0000000
+--- a/v8/src/heap/base/asm/mips64/save_registers_asm.cc
++++ /dev/null
+@@ -1,41 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-
+-// 9 64-bit registers = 9 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 9,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(".text \n"
+- ".set noreorder \n"
+- ".global SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // $a0: [ intptr_t* buffer ]
+- // Save the callee-saved registers.
+- " sd $gp, 64($a0) \n"
+- " sd $s7, 56($a0) \n"
+- " sd $s6, 48($a0) \n"
+- " sd $s5, 40($a0) \n"
+- " sd $s4, 32($a0) \n"
+- " sd $s3, 24($a0) \n"
+- " sd $s2, 16($a0) \n"
+- " sd $s1, 8($a0) \n"
+- // ... one more in the delay slot!
+- // Return.
+- " jr $ra \n"
+- // Delay slot:
+- " sd $s0, 0($a0) \n");
+diff --git a/src/heap/base/asm/ppc/push_registers_asm.cc b/src/heap/base/asm/ppc/push_registers_asm.cc
+new file mode 100644
+index 0000000..f879980
+--- /dev/null
++++ b/v8/src/heap/base/asm/ppc/push_registers_asm.cc
+@@ -0,0 +1,97 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++
++// PPC ABI source:
++// http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html
++
++// AIX Runtime process stack:
++// https://www.ibm.com/support/knowledgecenter/ssw_aix_71/assembler/idalangref_runtime_process.html
++asm(
++#if defined(_AIX)
++ ".csect .text[PR] \n"
++ ".align 2 \n"
++ ".globl .PushAllRegistersAndIterateStack, hidden \n"
++ ".PushAllRegistersAndIterateStack: \n"
++#else
++ ".text \n"
++ ".align 2 \n"
++ ".globl PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++#endif
++ // Push all callee-saved registers.
++ // lr, TOC pointer, r16 to r31. 160 bytes.
++ // The parameter save area shall be allocated by the caller. 112 bytes.
++ // At anytime, SP (r1) needs to be multiple of 16 (i.e. 16-aligned).
++ " mflr 0 \n"
++ " std 0, 16(1) \n"
++#if defined(_AIX)
++ " std 2, 40(1) \n"
++#else
++ " std 2, 24(1) \n"
++#endif
++ " stdu 1, -256(1) \n"
++ " std 14, 112(1) \n"
++ " std 15, 120(1) \n"
++ " std 16, 128(1) \n"
++ " std 17, 136(1) \n"
++ " std 18, 144(1) \n"
++ " std 19, 152(1) \n"
++ " std 20, 160(1) \n"
++ " std 21, 168(1) \n"
++ " std 22, 176(1) \n"
++ " std 23, 184(1) \n"
++ " std 24, 192(1) \n"
++ " std 25, 200(1) \n"
++ " std 26, 208(1) \n"
++ " std 27, 216(1) \n"
++ " std 28, 224(1) \n"
++ " std 29, 232(1) \n"
++ " std 30, 240(1) \n"
++ " std 31, 248(1) \n"
++ // Pass 1st parameter (r3) unchanged (Stack*).
++ // Pass 2nd parameter (r4) unchanged (StackVisitor*).
++ // Save 3rd parameter (r5; IterateStackCallback).
++ " mr 6, 5 \n"
++#if defined(_AIX)
++ // Set up TOC for callee.
++ " ld 2,8(5) \n"
++ // AIX uses function descriptors, which means that
++ // pointers to functions do not point to code, but
++ // instead point to metadata about them, hence
++ // need to deterrence.
++ " ld 6,0(6) \n"
++#endif
++ // Pass 3rd parameter as sp (stack pointer).
++ " mr 5, 1 \n"
++#if !defined(_AIX)
++ // Set up r12 to be equal to the callee address (in order for TOC
++ // relocation). Only needed on LE Linux.
++ " mr 12, 6 \n"
++#endif
++ // Call the callback.
++ " mtctr 6 \n"
++ " bctrl \n"
++ // Discard all the registers.
++ " addi 1, 1, 256 \n"
++ // Restore lr.
++ " ld 0, 16(1) \n"
++ " mtlr 0 \n"
++#if defined(_AIX)
++ // Restore TOC pointer.
++ " ld 2, 40(1) \n"
++#else
++ " ld 2, 24(1) \n"
++#endif
++ " blr \n");
+diff --git a/src/heap/base/asm/ppc/save_registers_asm.cc b/src/heap/base/asm/ppc/save_registers_asm.cc
+deleted file mode 100644
+index 9e8102a..0000000
+--- a/v8/src/heap/base/asm/ppc/save_registers_asm.cc
++++ /dev/null
+@@ -1,113 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-//
+-// PPC ABI source:
+-// http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html
+-
+-// AIX Runtime process stack:
+-// https://www.ibm.com/support/knowledgecenter/ssw_aix_71/assembler/idalangref_runtime_process.html
+-
+-#ifdef __PPC64__
+-
+-// 20 64-bit registers = 20 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 20,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(
+-#if defined(_AIX)
+- ".csect .text[PR] \n"
+- ".align 2 \n"
+- ".globl .SaveCalleeSavedRegisters, hidden \n"
+- ".SaveCalleeSavedRegisters: \n"
+-#else
+- ".text \n"
+- ".align 2 \n"
+- ".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+-#endif
+- // r3: [ intptr_t* buffer ]
+- // Save the callee-saved registers: lr, TOC pointer (r2), r14-r31.
+- " mflr 0 \n"
+- " std 0, 8(3) \n"
+- " std 2, 16(3) \n"
+- " std 14, 24(3) \n"
+- " std 15, 32(3) \n"
+- " std 16, 40(3) \n"
+- " std 17, 48(3) \n"
+- " std 18, 56(3) \n"
+- " std 19, 64(3) \n"
+- " std 20, 72(3) \n"
+- " std 21, 80(3) \n"
+- " std 22, 88(3) \n"
+- " std 23, 96(3) \n"
+- " std 24, 104(3) \n"
+- " std 25, 112(3) \n"
+- " std 26, 120(3) \n"
+- " std 27, 128(3) \n"
+- " std 28, 136(3) \n"
+- " std 29, 144(3) \n"
+- " std 30, 152(3) \n"
+- " std 31, 160(3) \n"
+- // Return.
+- " blr \n");
+-
+-#else // !__PPC64__
+-
+-// 20 32-bit registers = 20 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 20,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 4, "Mismatch in word size");
+-
+-asm(
+-#if defined(_AIX)
+- ".globl .SaveCalleeSavedRegisters, hidden \n"
+- ".csect .text[PR] \n"
+- ".SaveCalleeSavedRegisters: \n"
+-#else
+- ".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+-#endif
+- // r3: [ intptr_t* buffer ]
+- // Save the callee-saved registers: lr, TOC pointer (r2), r14-r31.
+- " mflr 0 \n"
+- " st 0, 4(3) \n"
+- " st 2, 8(3) \n"
+- " st 14, 12(3) \n"
+- " st 15, 16(3) \n"
+- " st 16, 20(3) \n"
+- " st 17, 24(3) \n"
+- " st 18, 28(3) \n"
+- " st 19, 32(3) \n"
+- " st 20, 36(3) \n"
+- " st 21, 40(3) \n"
+- " st 22, 44(3) \n"
+- " st 23, 48(3) \n"
+- " st 24, 52(3) \n"
+- " st 25, 56(3) \n"
+- " st 26, 60(3) \n"
+- " st 27, 64(3) \n"
+- " st 28, 68(3) \n"
+- " st 29, 72(3) \n"
+- " st 30, 76(3) \n"
+- " st 31, 80(3) \n"
+- // Return.
+- " blr \n");
+-
+-#endif // __PPC64__
+diff --git a/src/heap/base/asm/riscv/push_registers_asm.cc b/src/heap/base/asm/riscv/push_registers_asm.cc
+new file mode 100644
+index 0000000..7cc13ea
+--- /dev/null
++++ b/v8/src/heap/base/asm/riscv/push_registers_asm.cc
+@@ -0,0 +1,93 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// See asm/x64/push_registers_asm.cc for why the function is not generated
++// using clang.
++//
++// Calling convention source:
++// https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf Table 18.2
++#ifdef V8_TARGET_ARCH_RISCV64
++asm(".global PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers and save return address.
++ " addi sp, sp, -112 \n"
++ // Save return address.
++ " sd ra, 104(sp) \n"
++ // sp is callee-saved.
++ " sd sp, 96(sp) \n"
++ // s0-s11 are callee-saved.
++ " sd s11, 88(sp) \n"
++ " sd s10, 80(sp) \n"
++ " sd s9, 72(sp) \n"
++ " sd s8, 64(sp) \n"
++ " sd s7, 56(sp) \n"
++ " sd s6, 48(sp) \n"
++ " sd s5, 40(sp) \n"
++ " sd s4, 32(sp) \n"
++ " sd s3, 24(sp) \n"
++ " sd s2, 16(sp) \n"
++ " sd s1, 8(sp) \n"
++ " sd s0, 0(sp) \n"
++ // Maintain frame pointer(fp is s0).
++ " mv s0, sp \n"
++ // Pass 1st parameter (a0) unchanged (Stack*).
++ // Pass 2nd parameter (a1) unchanged (StackVisitor*).
++ // Save 3rd parameter (a2; IterateStackCallback) to a3.
++ " mv a3, a2 \n"
++ // Pass 3rd parameter as sp (stack pointer).
++ " mv a2, sp \n"
++ // Call the callback.
++ " jalr a3 \n"
++ // Load return address.
++ " ld ra, 104(sp) \n"
++ // Restore frame pointer.
++ " ld s0, 0(sp) \n"
++ " addi sp, sp, 112 \n"
++ " jr ra \n");
++#elif V8_TARGET_ARCH_RISCV32
++asm(".global PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers and save return address.
++ " addi sp, sp, -56 \n"
++ // Save return address.
++ " sw ra, 52(sp) \n"
++ // sp is callee-saved.
++ " sw sp, 48(sp) \n"
++ // s0-s11 are callee-saved.
++ " sw s11, 44(sp) \n"
++ " sw s10, 40(sp) \n"
++ " sw s9, 36(sp) \n"
++ " sw s8, 32(sp) \n"
++ " sw s7, 28(sp) \n"
++ " sw s6, 24(sp) \n"
++ " sw s5, 20(sp) \n"
++ " sw s4, 16(sp) \n"
++ " sw s3, 12(sp) \n"
++ " sw s2, 8(sp) \n"
++ " sw s1, 4(sp) \n"
++ " sw s0, 0(sp) \n"
++ // Maintain frame pointer(fp is s0).
++ " mv s0, sp \n"
++ // Pass 1st parameter (a0) unchanged (Stack*).
++ // Pass 2nd parameter (a1) unchanged (StackVisitor*).
++ // Save 3rd parameter (a2; IterateStackCallback) to a3.
++ " mv a3, a2 \n"
++ // Pass 3rd parameter as sp (stack pointer).
++ " mv a2, sp \n"
++ // Call the callback.
++ " jalr a3 \n"
++ // Load return address.
++ " lw ra, 52(sp) \n"
++ // Restore frame pointer.
++ " lw s0, 0(sp) \n"
++ " addi sp, sp, 56 \n"
++ " jr ra \n");
++#endif
+diff --git a/src/heap/base/asm/riscv/save_registers_asm.cc b/src/heap/base/asm/riscv/save_registers_asm.cc
+deleted file mode 100644
+index ad0bf98..0000000
+--- a/v8/src/heap/base/asm/riscv/save_registers_asm.cc
++++ /dev/null
+@@ -1,68 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Calling convention source:
+-// https://riscv.org/wp-content/uploads/2015/01/riscv-calling.pdf Table 18.2
+-
+-#if V8_HOST_ARCH_RISCV64
+-// 12 64-bit registers = 12 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 12,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(".global SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // a0: [ intptr_t* buffer ]
+- // Save the callee-saved registers: s0-s11.
+- " sd s11, 88(a0) \n"
+- " sd s10, 80(a0) \n"
+- " sd s9, 72(a0) \n"
+- " sd s8, 64(a0) \n"
+- " sd s7, 56(a0) \n"
+- " sd s6, 48(a0) \n"
+- " sd s5, 40(a0) \n"
+- " sd s4, 32(a0) \n"
+- " sd s3, 24(a0) \n"
+- " sd s2, 16(a0) \n"
+- " sd s1, 8(a0) \n"
+- " sd s0, 0(a0) \n"
+- // Return.
+- " jr ra \n");
+-#elif V8_HOST_ARCH_RISCV32
+-// 12 32-bit registers = 12 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 12,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 4, "Mismatch in word size");
+-
+-asm(".global SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // a0: [ intptr_t* buffer ]
+- // Save the callee-saved registers: s0-s11.
+- " sw s11, 44(a0) \n"
+- " sw s10, 40(a0) \n"
+- " sw s9, 36(a0) \n"
+- " sw s8, 32(a0) \n"
+- " sw s7, 28(a0) \n"
+- " sw s6, 24(a0) \n"
+- " sw s5, 20(a0) \n"
+- " sw s4, 16(a0) \n"
+- " sw s3, 12(a0) \n"
+- " sw s2, 8(a0) \n"
+- " sw s1, 4(a0) \n"
+- " sw s0, 0(a0) \n"
+- // Return.
+- " jr ra \n");
+-#endif
+diff --git a/src/heap/base/asm/s390/push_registers_asm.cc b/src/heap/base/asm/s390/push_registers_asm.cc
+new file mode 100644
+index 0000000..ef954fa
+--- /dev/null
++++ b/v8/src/heap/base/asm/s390/push_registers_asm.cc
+@@ -0,0 +1,37 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++
++// See asm/x64/push_registers_clang.cc for why the function is not generated
++// using clang.
++
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++
++// S390 ABI source:
++// http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html
++asm(".text \n"
++ ".align 8 \n"
++ ".globl PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // Push all callee-saved registers.
++ // r6-r13, r14 and sp(r15)
++ " stmg %r6, %sp, 48(%sp) \n"
++ // Allocate frame.
++ " lay %sp, -160(%sp) \n"
++ // Pass 1st parameter (r2) unchanged (Stack*).
++ // Pass 2nd parameter (r3) unchanged (StackVisitor*).
++ // Save 3rd parameter (r4; IterateStackCallback).
++ " lgr %r5, %r4 \n"
++ // Pass sp as 3rd parameter. 160+48 to point
++ // to callee saved region stored above.
++ " lay %r4, 208(%sp) \n"
++ // Call the callback.
++ " basr %r14, %r5 \n"
++ " lmg %r14,%sp, 272(%sp) \n"
++ " br %r14 \n");
+diff --git a/src/heap/base/asm/s390/save_registers_asm.cc b/src/heap/base/asm/s390/save_registers_asm.cc
+deleted file mode 100644
+index be92cc2..0000000
+--- a/v8/src/heap/base/asm/s390/save_registers_asm.cc
++++ /dev/null
+@@ -1,34 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-// See asm/x64/save_registers_asm.cc for why the function is not generated
+-// using clang.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-
+-// S390 ABI source:
+-// http://refspecs.linuxbase.org/ELF/zSeries/lzsabi0_zSeries.html
+-
+-// 10 64-bit registers = 10 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 10,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(".text \n"
+- ".align 8 \n"
+- ".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // r2: [ intptr_t* buffer ]
+- // Save the callee-saved registers: r6-r13, r14 and sp(r15).
+- " stmg %r6, %sp, 0(%r2) \n"
+- // Return.
+- " br %r14 \n");
+diff --git a/src/heap/base/asm/x64/push_registers_asm.cc b/src/heap/base/asm/x64/push_registers_asm.cc
+new file mode 100644
+index 0000000..1781a58
+--- /dev/null
++++ b/v8/src/heap/base/asm/x64/push_registers_asm.cc
+@@ -0,0 +1,106 @@
++// Copyright 2020 the V8 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.
++
++// Push all callee-saved registers to get them on the stack for conservative
++// stack scanning.
++//
++// We cannot rely on clang generating the function and right symbol mangling
++// as `__attribute__((naked))` does not prevent clang from generating TSAN
++// function entry stubs (`__tsan_func_entry`). Even with
++// `__attribute__((no_sanitize_thread)` annotation clang generates the entry
++// stub.
++// See https://bugs.llvm.org/show_bug.cgi?id=45400.
++
++// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
++// GN toolchain (e.g. ChromeOS) and not provide them.
++// _WIN64 Defined as 1 when the compilation target is 64-bit ARM or x64.
++// Otherwise, undefined.
++#ifdef _WIN64
++
++// We maintain 16-byte alignment at calls. There is an 8-byte return address
++// on the stack and we push 232 bytes which maintains 16-byte stack alignment
++// at the call.
++// Source: https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
++asm(".globl PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++ // rbp is callee-saved. Maintain proper frame pointer for debugging.
++ " push %rbp \n"
++ " mov %rsp, %rbp \n"
++ // Dummy for alignment.
++ " push $0xCDCDCD \n"
++ " push %rsi \n"
++ " push %rdi \n"
++ " push %rbx \n"
++ " push %r12 \n"
++ " push %r13 \n"
++ " push %r14 \n"
++ " push %r15 \n"
++ " sub $160, %rsp \n"
++ // Use aligned instrs as we are certain that the stack is properly aligned.
++ " movdqa %xmm6, 144(%rsp) \n"
++ " movdqa %xmm7, 128(%rsp) \n"
++ " movdqa %xmm8, 112(%rsp) \n"
++ " movdqa %xmm9, 96(%rsp) \n"
++ " movdqa %xmm10, 80(%rsp) \n"
++ " movdqa %xmm11, 64(%rsp) \n"
++ " movdqa %xmm12, 48(%rsp) \n"
++ " movdqa %xmm13, 32(%rsp) \n"
++ " movdqa %xmm14, 16(%rsp) \n"
++ " movdqa %xmm15, (%rsp) \n"
++ // Pass 1st parameter (rcx) unchanged (Stack*).
++ // Pass 2nd parameter (rdx) unchanged (StackVisitor*).
++ // Save 3rd parameter (r8; IterateStackCallback)
++ " mov %r8, %r9 \n"
++ // Pass 3rd parameter as rsp (stack pointer).
++ " mov %rsp, %r8 \n"
++ // Call the callback.
++ " call *%r9 \n"
++ // Pop the callee-saved registers.
++ " add $224, %rsp \n"
++ // Restore rbp as it was used as frame pointer.
++ " pop %rbp \n"
++ " ret \n");
++
++#else // !_WIN64
++
++// We maintain 16-byte alignment at calls. There is an 8-byte return address
++// on the stack and we push 56 bytes which maintains 16-byte stack alignment
++// at the call.
++// Source: https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf
++asm(
++#ifdef __APPLE__
++ ".globl _PushAllRegistersAndIterateStack \n"
++ ".private_extern _PushAllRegistersAndIterateStack \n"
++ "_PushAllRegistersAndIterateStack: \n"
++#else // !__APPLE__
++ ".globl PushAllRegistersAndIterateStack \n"
++ ".type PushAllRegistersAndIterateStack, %function \n"
++ ".hidden PushAllRegistersAndIterateStack \n"
++ "PushAllRegistersAndIterateStack: \n"
++#endif // !__APPLE__
++ // rbp is callee-saved. Maintain proper frame pointer for debugging.
++ " push %rbp \n"
++ " mov %rsp, %rbp \n"
++ // Dummy for alignment.
++ " push $0xCDCDCD \n"
++ " push %rbx \n"
++ " push %r12 \n"
++ " push %r13 \n"
++ " push %r14 \n"
++ " push %r15 \n"
++ // Pass 1st parameter (rdi) unchanged (Stack*).
++ // Pass 2nd parameter (rsi) unchanged (StackVisitor*).
++ // Save 3rd parameter (rdx; IterateStackCallback)
++ " mov %rdx, %r8 \n"
++ // Pass 3rd parameter as rsp (stack pointer).
++ " mov %rsp, %rdx \n"
++ // Call the callback.
++ " call *%r8 \n"
++ // Pop the callee-saved registers.
++ " add $48, %rsp \n"
++ // Restore rbp as it was used as frame pointer.
++ " pop %rbp \n"
++ " ret \n");
++
++#endif // !_WIN64
+diff --git a/src/heap/base/asm/x64/push_registers_masm.asm b/src/heap/base/asm/x64/push_registers_masm.asm
+new file mode 100644
+index 0000000..a32e193
+--- /dev/null
++++ b/v8/src/heap/base/asm/x64/push_registers_masm.asm
+@@ -0,0 +1,57 @@
++;; Copyright 2020 the V8 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.
++
++;; MASM syntax
++;; https://docs.microsoft.com/en-us/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2019
++
++public PushAllRegistersAndIterateStack
++
++.code
++PushAllRegistersAndIterateStack:
++ ;; Push all callee-saved registers to get them on the stack for conservative
++ ;; stack scanning.
++ ;;
++ ;; We maintain 16-byte alignment at calls. There is an 8-byte return address
++ ;; on the stack and we push 232 bytes which maintains 16-byte stack
++ ;; alignment at the call.
++ ;; Source: https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
++ ;;
++ ;; rbp is callee-saved. Maintain proper frame pointer for debugging.
++ push rbp
++ mov rbp, rsp
++ push 0CDCDCDh ;; Dummy for alignment.
++ push rsi
++ push rdi
++ push rbx
++ push r12
++ push r13
++ push r14
++ push r15
++ sub rsp, 160
++ ;; Use aligned instrs as we are certain that the stack is properly aligned.
++ movdqa xmmword ptr [rsp + 144], xmm6
++ movdqa xmmword ptr [rsp + 128], xmm7
++ movdqa xmmword ptr [rsp + 112], xmm8
++ movdqa xmmword ptr [rsp + 96], xmm9
++ movdqa xmmword ptr [rsp + 80], xmm10
++ movdqa xmmword ptr [rsp + 64], xmm11
++ movdqa xmmword ptr [rsp + 48], xmm12
++ movdqa xmmword ptr [rsp + 32], xmm13
++ movdqa xmmword ptr [rsp + 16], xmm14
++ movdqa xmmword ptr [rsp], xmm15
++ ;; Pass 1st parameter (rcx) unchanged (Stack*).
++ ;; Pass 2nd parameter (rdx) unchanged (StackVisitor*).
++ ;; Save 3rd parameter (r8; IterateStackCallback)
++ mov r9, r8
++ ;; Pass 3rd parameter as rsp (stack pointer).
++ mov r8, rsp
++ ;; Call the callback.
++ call r9
++ ;; Pop the callee-saved registers.
++ add rsp, 224
++ ;; Restore rbp as it was used as frame pointer.
++ pop rbp
++ ret
++
++end
+diff --git a/src/heap/base/asm/x64/save_registers_asm.cc b/src/heap/base/asm/x64/save_registers_asm.cc
+deleted file mode 100644
+index 855a654..0000000
+--- a/v8/src/heap/base/asm/x64/save_registers_asm.cc
++++ /dev/null
+@@ -1,94 +0,0 @@
+-// Copyright 2020 the V8 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.
+-
+-#include <src/heap/base/stack.h>
+-
+-// Save all callee-saved registers in the specified buffer.
+-// extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-//
+-// We cannot rely on clang generating the function and right symbol mangling
+-// as `__attribute__((naked))` does not prevent clang from generating TSAN
+-// function entry stubs (`__tsan_func_entry`). Even with
+-// `__attribute__((no_sanitize_thread)` annotation clang generates the entry
+-// stub.
+-// See https://bugs.llvm.org/show_bug.cgi?id=45400.
+-//
+-// Do not depend on V8_TARGET_OS_* defines as some embedders may override the
+-// GN toolchain (e.g. ChromeOS) and not provide them.
+-// _WIN64 Defined as 1 when the compilation target is 64-bit ARM or x64.
+-// Otherwise, undefined.
+-
+-#ifdef _WIN64
+-// Source: https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
+-
+-// 7 64-bit registers + 1 for alignment purposes = 8 * 1 = 8 intprt_t
+-// 10 128-bit registers = 10 * 2 = 20 intptr_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 28,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(".globl SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+- // %rcx: [ intptr_t* buffer ]
+- // %rbp is callee-saved. Maintain proper frame pointer for debugging.
+- " push %rbp \n"
+- " mov %rsp, %rbp \n"
+- // Save the callee-saved registers.
+- " mov %rsi, 0(%rcx) \n"
+- " mov %rdi, 8(%rcx) \n"
+- " mov %rbx, 16(%rcx) \n"
+- " mov %r12, 24(%rcx) \n"
+- " mov %r13, 32(%rcx) \n"
+- " mov %r14, 40(%rcx) \n"
+- " mov %r15, 48(%rcx) \n"
+- // Skip one slot to achieve proper alignment and use aligned instructions,
+- // as we are sure that the buffer is properly aligned.
+- " movdqa %xmm6, 64(%rcx) \n"
+- " movdqa %xmm7, 80(%rcx) \n"
+- " movdqa %xmm8, 96(%rcx) \n"
+- " movdqa %xmm9, 112(%rcx) \n"
+- " movdqa %xmm10, 128(%rcx) \n"
+- " movdqa %xmm11, 144(%rcx) \n"
+- " movdqa %xmm12, 160(%rcx) \n"
+- " movdqa %xmm13, 176(%rcx) \n"
+- " movdqa %xmm14, 192(%rcx) \n"
+- " movdqa %xmm15, 208(%rcx) \n"
+- // Return.
+- " pop %rbp \n"
+- " ret \n");
+-
+-#else // !_WIN64
+-// Source: https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf
+-
+-// 5 64-bit registers = 5 intprt_t
+-static_assert(heap::base::Stack::NumberOfCalleeSavedRegisters() == 5,
+- "Mismatch in the number of callee-saved registers");
+-static_assert(sizeof(intptr_t) == 8, "Mismatch in word size");
+-
+-asm(
+-#ifdef __APPLE__
+- ".globl _SaveCalleeSavedRegisters \n"
+- ".private_extern _SaveCalleeSavedRegisters \n"
+- "_SaveCalleeSavedRegisters: \n"
+-#else // !__APPLE__
+- ".globl SaveCalleeSavedRegisters \n"
+- ".type SaveCalleeSavedRegisters, %function \n"
+- ".hidden SaveCalleeSavedRegisters \n"
+- "SaveCalleeSavedRegisters: \n"
+-#endif // !__APPLE__
+- // %rdi: [ intptr_t* buffer ]
+- // %rbp is callee-saved. Maintain proper frame pointer for debugging.
+- " push %rbp \n"
+- " mov %rsp, %rbp \n"
+- // Save the callee-saved registers.
+- " mov %rbx, 0(%rdi) \n"
+- " mov %r12, 8(%rdi) \n"
+- " mov %r13, 16(%rdi) \n"
+- " mov %r14, 24(%rdi) \n"
+- " mov %r15, 32(%rdi) \n"
+- // Restore %rbp as it was used as frame pointer and return.
+- " pop %rbp \n"
+- " ret \n");
+-
+-#endif // !_WIN64
+diff --git a/src/heap/base/asm/x64/save_registers_masm.asm b/src/heap/base/asm/x64/save_registers_masm.asm
+deleted file mode 100644
+index 29946a4..0000000
+--- a/v8/src/heap/base/asm/x64/save_registers_masm.asm
++++ /dev/null
+@@ -1,43 +0,0 @@
+-;; Copyright 2020 the V8 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.
+-
+-;; MASM syntax
+-;; https://docs.microsoft.com/en-us/cpp/assembler/masm/microsoft-macro-assembler-reference?view=vs-2019
+-
+-public SaveCalleeSavedRegisters
+-
+-.code
+- ;; Save all callee-saved registers in the specified buffer.
+- ;; extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
+-
+-SaveCalleeSavedRegisters:
+- ;; %rcx: [ intptr_t* buffer ]
+- ;; %rbp is callee-saved. Maintain proper frame pointer for debugging.
+- push rbp
+- mov rbp, rsp
+- ;; Save the callee-saved registers.
+- mov qword ptr [rcx], rsi
+- mov qword ptr [rcx + 8], rdi
+- mov qword ptr [rcx + 16], rbx
+- mov qword ptr [rcx + 24], r12
+- mov qword ptr [rcx + 32], r13
+- mov qword ptr [rcx + 40], r14
+- mov qword ptr [rcx + 48], r15
+- ;; Skip one slot to achieve proper alignment and use aligned instructions,
+- ;; as we are sure that the buffer is properly aligned.
+- movdqa xmmword ptr [rcx + 64], xmm6
+- movdqa xmmword ptr [rcx + 80], xmm7
+- movdqa xmmword ptr [rcx + 96], xmm8
+- movdqa xmmword ptr [rcx + 112], xmm9
+- movdqa xmmword ptr [rcx + 128], xmm10
+- movdqa xmmword ptr [rcx + 144], xmm11
+- movdqa xmmword ptr [rcx + 160], xmm12
+- movdqa xmmword ptr [rcx + 176], xmm13
+- movdqa xmmword ptr [rcx + 192], xmm14
+- movdqa xmmword ptr [rcx + 208], xmm15
+- ;; Restore %rbp as it was used as frame pointer and return.
+- pop rbp
+- ret
+-
+-end
+diff --git a/src/heap/base/stack.cc b/src/heap/base/stack.cc
+index d8e618d..54a8697 100644
+--- a/v8/src/heap/base/stack.cc
++++ b/v8/src/heap/base/stack.cc
+@@ -6,18 +6,21 @@
+
+ #include <limits>
+
++#include "src/base/platform/platform.h"
+ #include "src/base/sanitizer/asan.h"
+ #include "src/base/sanitizer/msan.h"
+ #include "src/base/sanitizer/tsan.h"
+
+ namespace heap::base {
+
+-Stack::Stack(const void* stack_start) : stack_start_(stack_start) {}
+-
+-void Stack::SetStackStart(const void* stack_start) {
+- DCHECK(!context_);
+- stack_start_ = stack_start;
+-}
++// Function with architecture-specific implementation:
++// Pushes all callee-saved registers to the stack and invokes the callback,
++// passing the supplied pointers (stack and argument) and the intended stack
++// marker.
++using IterateStackCallback = void (*)(const Stack*, StackVisitor*, const void*);
++extern "C" void PushAllRegistersAndIterateStack(const Stack* stack,
++ StackVisitor* visitor,
++ IterateStackCallback callback);
+
+ bool Stack::IsOnStack(const void* slot) const {
+ DCHECK_NOT_NULL(stack_start_);
+@@ -141,97 +144,62 @@
+
+ } // namespace
+
+-void Stack::IteratePointers(StackVisitor* visitor) const {
+- DCHECK_NOT_NULL(stack_start_);
+- DCHECK(context_);
+- DCHECK_NOT_NULL(context_->stack_marker);
+-
++// static
++void Stack::IteratePointersImpl(const Stack* stack, StackVisitor* visitor,
++ const void* stack_end) {
+ #ifdef V8_USE_ADDRESS_SANITIZER
+ const void* asan_fake_stack = __asan_get_current_fake_stack();
+ #else
+ const void* asan_fake_stack = nullptr;
+ #endif // V8_USE_ADDRESS_SANITIZER
+
+- // Iterate through the registers.
+- for (intptr_t value : context_->registers) {
+- const void* address = reinterpret_cast<const void*>(value);
+- MSAN_MEMORY_IS_INITIALIZED(&address, sizeof(address));
+- if (address == nullptr) continue;
+- visitor->VisitPointer(address);
+- IterateAsanFakeFrameIfNecessary(visitor, asan_fake_stack, stack_start_,
+- context_->stack_marker, address);
+- }
+-
+ // Iterate through the stack.
+ // All supported platforms should have their stack aligned to at least
+ // sizeof(void*).
+ constexpr size_t kMinStackAlignment = sizeof(void*);
+- CHECK_EQ(0u, reinterpret_cast<uintptr_t>(context_->stack_marker) &
+- (kMinStackAlignment - 1));
+- IteratePointersInStack(
+- visitor, reinterpret_cast<const void* const*>(context_->stack_marker),
+- stack_start_, asan_fake_stack);
++ CHECK_EQ(0u,
++ reinterpret_cast<uintptr_t>(stack_end) & (kMinStackAlignment - 1));
++ IteratePointersInStack(visitor,
++ reinterpret_cast<const void* const*>(stack_end),
++ stack->stack_start_, asan_fake_stack);
+
+- for (const auto& stack : inactive_stacks_) {
+- IteratePointersInStack(visitor, stack.top, stack.start, asan_fake_stack);
++ for (const auto& segment : stack->inactive_stacks_) {
++ IteratePointersInStack(visitor, segment.top, segment.start,
++ asan_fake_stack);
+ }
+
+ IterateUnsafeStackIfNecessary(visitor);
+ }
+
+-namespace {
+-// Function with architecture-specific implementation:
+-// Saves all callee-saved registers in the specified buffer.
+-extern "C" void SaveCalleeSavedRegisters(intptr_t* buffer);
++void Stack::IteratePointers(StackVisitor* visitor) const {
++ // TODO(v8:13493): Remove the implication as soon as IsOnCurrentStack is
++ // compatible with stack switching.
++ DCHECK_IMPLIES(!wasm_stack_switching_, IsOnCurrentStack(stack_start_));
++ PushAllRegistersAndIterateStack(this, visitor, &IteratePointersImpl);
++ // No need to deal with callee-saved registers as they will be kept alive by
++ // the regular conservative stack iteration.
++ // TODO(chromium:1056170): Add support for SIMD and/or filtering.
++ IterateUnsafeStackIfNecessary(visitor);
++}
++
++void Stack::IteratePointersUnsafe(StackVisitor* visitor,
++ const void* stack_end) const {
++ DCHECK_NOT_NULL(stack_start_);
++ DCHECK_NOT_NULL(stack_end);
++ DCHECK_GE(stack_start_, stack_end);
++ IteratePointersImpl(this, visitor, stack_end);
++}
+
+ #ifdef DEBUG
+-
+-bool IsOnCurrentStack(const void* ptr) {
++// static
++bool Stack::IsOnCurrentStack(const void* ptr) {
+ DCHECK_NOT_NULL(ptr);
+ const void* current_stack_start = v8::base::Stack::GetStackStart();
+ const void* current_stack_top = v8::base::Stack::GetCurrentStackPosition();
+ return ptr <= current_stack_start && ptr >= current_stack_top;
+ }
+-
+ #endif // DEBUG
+
+-} // namespace
+-
+-void Stack::SaveContext(bool check_invariant) {
+- // TODO(v8:13493): Remove the method's parameter and the implication as soon
+- // as IsOnCurrentStack is compatible with stack switching.
+- DCHECK_IMPLIES(check_invariant, IsOnCurrentStack(stack_start_));
+- // Contexts can be nested but the marker and the registers are only saved on
+- // the first invocation.
+- if (context_) {
+- ++context_->nesting_counter;
+- return;
+- }
+- // Allocate the context and set the marker.
+- const void* stack_top = v8::base::Stack::GetCurrentStackPosition();
+- DCHECK_NOT_NULL(stack_top);
+- context_ = std::make_unique<Context>(stack_top);
+- // TODO(v8:13493): Remove the implication as soon as IsValidMarker is
+- // compatible with stack switching.
+- DCHECK_IMPLIES(check_invariant, stack_top <= stack_start_);
+- context_->stack_marker = stack_top;
+- // Save the registers.
+- SaveCalleeSavedRegisters(context_->registers.data());
+-}
+-
+-void Stack::ClearContext(bool check_invariant) {
+- // TODO(v8:13493): Remove the method's parameter and the implication as soon
+- // as IsOnCurrentStack is compatible with stack switching.
+- DCHECK_IMPLIES(check_invariant, IsOnCurrentStack(stack_start_));
+- DCHECK(context_);
+- // Skip clearing the context if that was a nested invocation.
+- if (context_->nesting_counter > 0) {
+- --context_->nesting_counter;
+- return;
+- }
+- context_.reset();
+-}
+-
+ void Stack::AddStackSegment(const void* start, const void* top) {
+ DCHECK_LE(top, start);
+ inactive_stacks_.push_back({start, top});
+diff --git a/src/heap/base/stack.h b/src/heap/base/stack.h
+index 06edf4c..4b0a14e 100644
+--- a/v8/src/heap/base/stack.h
++++ b/v8/src/heap/base/stack.h
+@@ -5,10 +5,9 @@
+ #ifndef V8_HEAP_BASE_STACK_H_
+ #define V8_HEAP_BASE_STACK_H_
+
+-#include <memory>
++#include <vector>
+
+ #include "src/base/macros.h"
+-#include "src/base/platform/platform.h"
+
+ namespace heap::base {
+
+@@ -30,96 +29,54 @@
+ // of relevant GC stack regions where interesting pointers can be found.
+ class V8_EXPORT_PRIVATE Stack final {
+ public:
+- // The size of the buffer for storing the callee-saved registers is going to
+- // be equal to kNumberOfCalleeSavedRegisters * sizeof(intptr_t).
+- // This is architecture-specific.
+- static constexpr int NumberOfCalleeSavedRegisters() {
+- return Context::kNumberOfCalleeSavedRegisters;
+- }
+-
+- explicit Stack(const void* stack_start = nullptr);
++ explicit Stack(const void* stack_start = nullptr,
++ bool wasm_stack_switching = false)
++ : stack_start_(stack_start),
++ wasm_stack_switching_(wasm_stack_switching) {}
+
+ // Sets the start of the stack.
+- void SetStackStart(const void* stack_start);
++ void SetStackStart(const void* stack_start, bool wasm_stack_switching) {
++ stack_start_ = stack_start;
++ wasm_stack_switching_ = wasm_stack_switching;
++ }
+
+ // Returns true if |slot| is part of the stack and false otherwise.
+ bool IsOnStack(const void* slot) const;
+
+- // Word-aligned iteration of the stack and the saved registers.
+- // Slot values are passed on to `visitor`.
++ // Word-aligned iteration of the stack. Callee-saved registers are pushed to
++ // the stack before iterating pointers. Slot values are passed on to
++ // `visitor`.
+ void IteratePointers(StackVisitor* visitor) const;
+
+- // Saves and clears the stack context, i.e., it sets the stack marker and
+- // saves the registers.
+- // TODO(v8:13493): The parameter is for suppressing the invariant check in
+- // the case of WASM stack switching. It will be removed as soon as context
+- // saving becomes compatible with stack switching.
+- void SaveContext(bool check_invariant = true);
+- void ClearContext(bool check_invariant = true);
++ // Word-aligned iteration of the stack, starting at `stack_end`. Slot values
++ // are passed on to `visitor`. This is intended to be used with verifiers that
++ // only visit a subset of the stack of IteratePointers().
++ //
++ // **Ignores:**
++ // - Callee-saved registers.
++ // - SafeStack.
++ void IteratePointersUnsafe(StackVisitor* visitor,
++ const void* stack_end) const;
+
+ void AddStackSegment(const void* start, const void* top);
+ void ClearStackSegments();
+
+ private:
+- struct Context {
+- // The following constant is architecture-specific.
+-#if V8_HOST_ARCH_IA32
+- // Must be consistent with heap/base/asm/ia32/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 3;
+-#elif V8_HOST_ARCH_X64
+-#ifdef _WIN64
+- // Must be consistent with heap/base/asm/x64/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 28;
+-#else // !_WIN64
+- // Must be consistent with heap/base/asm/x64/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 5;
+-#endif // !_WIN64
+-#elif V8_HOST_ARCH_ARM64
+- // Must be consistent with heap/base/asm/arm64/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 11;
+-#elif V8_HOST_ARCH_ARM
+- // Must be consistent with heap/base/asm/arm/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 8;
+-#elif V8_HOST_ARCH_PPC64
+- // Must be consistent with heap/base/asm/ppc/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 20;
+-#elif V8_HOST_ARCH_PPC
+- // Must be consistent with heap/base/asm/ppc/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 20;
+-#elif V8_HOST_ARCH_MIPS64
+- // Must be consistent with heap/base/asm/mips64el/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 9;
+-#elif V8_HOST_ARCH_LOONG64
+- // Must be consistent with heap/base/asm/loong64/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 11;
+-#elif V8_HOST_ARCH_S390
+- // Must be consistent with heap/base/asm/s390/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 10;
+-#elif V8_HOST_ARCH_RISCV32
+- // Must be consistent with heap/base/asm/riscv/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 12;
+-#elif V8_HOST_ARCH_RISCV64
+- // Must be consistent with heap/base/asm/riscv/.
+- static constexpr int kNumberOfCalleeSavedRegisters = 12;
+-#else
+-#error Unknown architecture.
++#ifdef DEBUG
++ static bool IsOnCurrentStack(const void* ptr);
+ #endif
+
+- explicit Context(const void* marker) : stack_marker(marker) {}
+-
+- int nesting_counter = 0;
+- const void* stack_marker;
+- // We always double-align this buffer, to support for longer registers,
+- // e.g., 128-bit registers in WIN64.
+- alignas(2 * sizeof(intptr_t))
+- std::array<intptr_t, kNumberOfCalleeSavedRegisters> registers;
+- };
++ static void IteratePointersImpl(const Stack* stack, StackVisitor* visitor,
++ const void* stack_end);
+
+ const void* stack_start_;
+- std::unique_ptr<Context> context_;
+
+- // Stack segments that may also contain pointers and should be
+- // scanned.
++ // TODO(v8:13493): This is for suppressing the check that we are in the
++ // correct stack, in the case of WASM stack switching. It will be removed as
++ // soon as context saving becomes compatible with stack switching.
++ bool wasm_stack_switching_;
++
++ // Stack segments that may also contain pointers and should be scanned.
+ struct StackSegments {
+ const void* start;
+ const void* top;
+diff --git a/src/heap/cppgc-js/cpp-heap.cc b/src/heap/cppgc-js/cpp-heap.cc
+index c27c612..63c5212 100644
+--- a/v8/src/heap/cppgc-js/cpp-heap.cc
++++ b/v8/src/heap/cppgc-js/cpp-heap.cc
+@@ -16,6 +16,7 @@
+ #include "src/base/logging.h"
+ #include "src/base/macros.h"
+ #include "src/base/optional.h"
++#include "src/base/platform/platform.h"
+ #include "src/base/platform/time.h"
+ #include "src/execution/isolate-inl.h"
+ #include "src/flags/flags.h"
+@@ -839,7 +840,7 @@
+ const size_t bytes_allocated_in_prefinalizers = ExecutePreFinalizers();
+ #if CPPGC_VERIFY_HEAP
+ UnifiedHeapMarkingVerifier verifier(*this, *collection_type_);
+- verifier.Run(stack_state_of_prev_gc(),
++ verifier.Run(stack_state_of_prev_gc(), stack_end_of_current_gc(),
+ stats_collector()->marked_bytes_on_current_cycle() +
+ bytes_allocated_in_prefinalizers);
+ #endif // CPPGC_VERIFY_HEAP
+@@ -942,7 +943,7 @@
+ // Finish sweeping in case it is still running.
+ sweeper().FinishIfRunning();
+
+- SaveStackContextScope stack_context_scope(stack());
++ SetStackEndOfCurrentGC(v8::base::Stack::GetCurrentStackPosition());
+
+ if (isolate_) {
+ reinterpret_cast<v8::Isolate*>(isolate_)
+diff --git a/src/heap/cppgc/heap-base.h b/src/heap/cppgc/heap-base.h
+index ac1dd3f..29a88b2 100644
+--- a/v8/src/heap/cppgc/heap-base.h
++++ b/v8/src/heap/cppgc/heap-base.h
+@@ -183,6 +183,13 @@
+ stack_state_of_prev_gc_ = stack_state;
+ }
+
++ const void* stack_end_of_current_gc() const {
++ return stack_end_of_current_gc_;
++ }
++ void SetStackEndOfCurrentGC(const void* stack_end) {
++ stack_end_of_current_gc_ = stack_end;
++ }
++
+ void SetInAtomicPauseForTesting(bool value) { in_atomic_pause_ = value; }
+
+ virtual void StartIncrementalGarbageCollectionForTesting() = 0;
+@@ -288,6 +295,10 @@
+ EmbedderStackState::kNoHeapPointers;
+ std::unique_ptr<EmbedderStackState> override_stack_state_;
+
++ // Marker that signals end of the interesting stack region in which on-heap
++ // pointers can be found.
++ const void* stack_end_of_current_gc_ = nullptr;
++
+ bool in_atomic_pause_ = false;
+
+ int creation_thread_id_ = v8::base::OS::GetCurrentThreadId();
+diff --git a/src/heap/cppgc/heap.cc b/src/heap/cppgc/heap.cc
+index 7769412..28a11fc 100644
+--- a/v8/src/heap/cppgc/heap.cc
++++ b/v8/src/heap/cppgc/heap.cc
+@@ -166,10 +166,9 @@
+ DCHECK(!in_no_gc_scope());
+ CHECK(!in_disallow_gc_scope());
+ config_.stack_state = stack_state;
++ SetStackEndOfCurrentGC(v8::base::Stack::GetCurrentStackPosition());
+ in_atomic_pause_ = true;
+
+- stack()->SaveContext();
+-
+ #if defined(CPPGC_YOUNG_GENERATION)
+ // Check if the young generation was enabled. We must enable young generation
+ // before calling the custom weak callbacks to make sure that the callbacks
+@@ -188,7 +187,7 @@
+ const size_t bytes_allocated_in_prefinalizers = ExecutePreFinalizers();
+ #if CPPGC_VERIFY_HEAP
+ MarkingVerifier verifier(*this, config_.collection_type);
+- verifier.Run(config_.stack_state,
++ verifier.Run(config_.stack_state, stack_end_of_current_gc(),
+ stats_collector()->marked_bytes_on_current_cycle() +
+ bytes_allocated_in_prefinalizers);
+ #endif // CPPGC_VERIFY_HEAP
+@@ -197,8 +196,6 @@
+ #endif
+ USE(bytes_allocated_in_prefinalizers);
+
+- stack()->ClearContext();
+-
+ #if defined(CPPGC_YOUNG_GENERATION)
+ ResetRememberedSet();
+ #endif // defined(CPPGC_YOUNG_GENERATION)
+diff --git a/src/heap/cppgc/marking-verifier.cc b/src/heap/cppgc/marking-verifier.cc
+index 5508766..b7127c2 100644
+--- a/v8/src/heap/cppgc/marking-verifier.cc
++++ b/v8/src/heap/cppgc/marking-verifier.cc
+@@ -45,7 +45,8 @@
+ collection_type_(collection_type) {}
+
+ void MarkingVerifierBase::Run(
+- StackState stack_state, v8::base::Optional<size_t> expected_marked_bytes) {
++ StackState stack_state, const void* stack_end,
++ v8::base::Optional<size_t> expected_marked_bytes) {
+ Traverse(heap_.raw_heap());
+ // Avoid verifying the stack when running with TSAN as the TSAN runtime changes
+ // stack contents when e.g. working with locks. Specifically, the marker uses
+@@ -62,7 +63,7 @@
+ #if !defined(THREAD_SANITIZER) && !defined(CPPGC_POINTER_COMPRESSION)
+ if (stack_state == StackState::kMayContainHeapPointers) {
+ in_construction_objects_ = &in_construction_objects_stack_;
+- heap_.stack()->IteratePointers(this);
++ heap_.stack()->IteratePointersUnsafe(this, stack_end);
+ // The objects found through the unsafe iteration are only a subset of the
+ // regular iteration as they miss objects held alive only from callee-saved
+ // registers that are never pushed on the stack and SafeStack.
+diff --git a/src/heap/cppgc/marking-verifier.h b/src/heap/cppgc/marking-verifier.h
+index 5132b3a..5136f29 100644
+--- a/v8/src/heap/cppgc/marking-verifier.h
++++ b/v8/src/heap/cppgc/marking-verifier.h
+@@ -41,7 +41,7 @@
+ MarkingVerifierBase(const MarkingVerifierBase&) = delete;
+ MarkingVerifierBase& operator=(const MarkingVerifierBase&) = delete;
+
+- void Run(StackState, v8::base::Optional<size_t>);
++ void Run(StackState, const void*, v8::base::Optional<size_t>);
+
+ protected:
+ MarkingVerifierBase(HeapBase&, CollectionType, VerificationState&,
+diff --git a/src/heap/heap.cc b/src/heap/heap.cc
+index 4994a3a..f4b7da0 100644
+--- a/v8/src/heap/heap.cc
++++ b/v8/src/heap/heap.cc
+@@ -1685,7 +1685,22 @@
+ DevToolsTraceEventScope devtools_trace_event_scope(
+ this, IsYoungGenerationCollector(collector) ? "MinorGC" : "MajorGC",
+ GarbageCollectionReasonToString(gc_reason));
+- SaveStackContextScope stack_context_scope(&stack());
++
++ if (cpp_heap()) {
++ if (collector == GarbageCollector::MARK_COMPACTOR ||
++ (collector == GarbageCollector::MINOR_MARK_COMPACTOR &&
++ CppHeap::From(cpp_heap())->generational_gc_supported())) {
++ // CppHeap needs a stack marker at the top of all entry points to allow
++ // deterministic passes over the stack. E.g., a verifier that should
++ // only find a subset of references of the marker.
++ //
++ // TODO(chromium:1056170): Consider adding a component that keeps track
++ // of relevant GC stack regions where interesting pointers can be found.
++ static_cast<v8::internal::CppHeap*>(cpp_heap())
++ ->SetStackEndOfCurrentGC(
++ v8::base::Stack::GetCurrentStackPosition());
++ }
++ }
+
+ GarbageCollectionPrologue(gc_reason, gc_callback_flags);
+ {
+@@ -2396,8 +2411,6 @@
+ DCHECK(incremental_marking_->IsStopped());
+ DCHECK_NOT_NULL(isolate()->global_safepoint());
+
+- SaveStackContextScope stack_context_scope(&stack());
+-
+ isolate()->global_safepoint()->IterateClientIsolates([](Isolate* client) {
+ client->heap()->FreeSharedLinearAllocationAreas();
+
+@@ -5809,7 +5822,12 @@
+ }
+
+ void Heap::SetStackStart(void* stack_start) {
+- stack().SetStackStart(stack_start);
++#if V8_ENABLE_WEBASSEMBLY
++ stack().SetStackStart(stack_start,
++ v8_flags.experimental_wasm_stack_switching);
++#else
++ stack().SetStackStart(stack_start, false);
++#endif // V8_ENABLE_WEBASSEMBLY
+ }
+
+ ::heap::base::Stack& Heap::stack() {
+@@ -6391,8 +6409,7 @@
+ filtering_(filtering),
+ filter_(nullptr),
+ space_iterator_(nullptr),
+- object_iterator_(nullptr),
+- stack_context_scope_(&heap->stack()) {
++ object_iterator_(nullptr) {
+ heap_->MakeHeapIterable();
+ // Start the iteration.
+ space_iterator_ = new SpaceIterator(heap_);
+@@ -7371,28 +7388,5 @@
+ CppClassNamesAsHeapObjectNameScope::~CppClassNamesAsHeapObjectNameScope() =
+ default;
+
+-SaveStackContextScope::SaveStackContextScope(::heap::base::Stack* stack)
+- : stack_(stack) {
+-#if V8_ENABLE_WEBASSEMBLY
+- // TODO(v8:13493): Do not check the stack context invariant if WASM stack
+- // switching is enabled. This will be removed as soon as context saving
+- // becomes compatible with stack switching.
+- stack_->SaveContext(!v8_flags.experimental_wasm_stack_switching);
+-#else
+- stack_->SaveContext();
+-#endif // V8_ENABLE_WEBASSEMBLY
+-}
+-
+-SaveStackContextScope::~SaveStackContextScope() {
+-#if V8_ENABLE_WEBASSEMBLY
+- // TODO(v8:13493): Do not check the stack context invariant if WASM stack
+- // switching is enabled. This will be removed as soon as context saving
+- // becomes compatible with stack switching.
+- stack_->ClearContext(!v8_flags.experimental_wasm_stack_switching);
+-#else
+- stack_->ClearContext();
+-#endif // V8_ENABLE_WEBASSEMBLY
+-}
+-
+ } // namespace internal
+ } // namespace v8
+diff --git a/src/heap/heap.h b/src/heap/heap.h
+index c93d89c..bc565ca 100644
+--- a/v8/src/heap/heap.h
++++ b/v8/src/heap/heap.h
+@@ -2633,17 +2633,6 @@
+ Heap* heap_;
+ };
+
+-// TODO(v8:13493): This class will move to src/heap/base/stack.h once its
+-// implementation no longer needs access to V8 flags.
+-class V8_EXPORT_PRIVATE V8_NODISCARD SaveStackContextScope {
+- public:
+- explicit SaveStackContextScope(::heap::base::Stack* stack);
+- ~SaveStackContextScope();
+-
+- protected:
+- ::heap::base::Stack* stack_;
+-};
+-
+ class V8_NODISCARD DisableConservativeStackScanningScopeForTesting {
+ public:
+ explicit inline DisableConservativeStackScanningScopeForTesting(Heap* heap)
+@@ -2695,7 +2684,6 @@
+ SpaceIterator* space_iterator_;
+ // Object iterator for the space currently being iterated.
+ std::unique_ptr<ObjectIterator> object_iterator_;
+- SaveStackContextScope stack_context_scope_;
+
+ DISALLOW_GARBAGE_COLLECTION(no_heap_allocation_)
+ };
+diff --git a/src/profiler/heap-snapshot-generator.cc b/src/profiler/heap-snapshot-generator.cc
+index e076418..f0b3058 100644
+--- a/v8/src/profiler/heap-snapshot-generator.cc
++++ b/v8/src/profiler/heap-snapshot-generator.cc
+@@ -2055,16 +2055,14 @@
+ // its custom name to a generic builtin.
+ RootsReferencesExtractor extractor(this);
+ ReadOnlyRoots(heap_).Iterate(&extractor);
+- {
+- SaveStackContextScope scope(&heap_->stack());
+- heap_->IterateRoots(&extractor, base::EnumSet<SkipRoot>{SkipRoot::kWeak});
+- // TODO(v8:11800): The heap snapshot generator incorrectly considers the
+- // weak string tables as strong retainers. Move IterateWeakRoots after
+- // SetVisitingWeakRoots.
+- heap_->IterateWeakRoots(&extractor, {});
+- extractor.SetVisitingWeakRoots();
+- heap_->IterateWeakGlobalHandles(&extractor);
+- }
++ heap_->IterateRoots(&extractor, base::EnumSet<SkipRoot>{SkipRoot::kWeak});
++ // TODO(v8:11800): The heap snapshot generator incorrectly considers the weak
++ // string tables as strong retainers. Move IterateWeakRoots after
++ // SetVisitingWeakRoots.
++ heap_->IterateWeakRoots(&extractor, {});
++ extractor.SetVisitingWeakRoots();
++ heap_->IterateWeakGlobalHandles(&extractor);
++
+ bool interrupted = false;
+
+ CombinedHeapObjectIterator iterator(heap_,
diff --git a/chromium-111-v8-std-layout2.patch b/chromium-111-v8-std-layout2.patch
new file mode 100644
index 0000000..db983af
--- /dev/null
+++ b/chromium-111-v8-std-layout2.patch
@@ -0,0 +1,198 @@
+From 916641c08de44e0a915df223d55781c6c912717c Mon Sep 17 00:00:00 2001
+From: Nikolaos Papaspyrou <nikolaos@chromium.org>
+Date: Thu, 19 Jan 2023 13:43:10 +0100
+Subject: [PATCH] [heap] Move the Stack object from ThreadLocalTop to Isolate
+
+Stack information is thread-specific and, until now, it was stored in a
+field in ThreadLocalTop. This CL moves stack information to the isolate
+and makes sure to update the stack start whenever a main thread enters
+the isolate. At the same time, the Stack object is refactored and
+simplified.
+
+As a side effect, after removing the Stack object, ThreadLocalTop
+satisfies the std::standard_layout trait; this fixes some issues
+observed with different C++ compilers.
+
+Bug: v8:13630
+Bug: v8:13257
+Change-Id: I026a35af3bc6999a09b21f277756d4454c086343
+
+(stripped tests)
+---
+
+diff --git a/src/execution/isolate.cc b/src/execution/isolate.cc
+index 31536a1..22b8492 100644
+--- a/v8/src/execution/isolate.cc
++++ b/v8/src/execution/isolate.cc
+@@ -3069,21 +3069,23 @@
+ void Isolate::RecordStackSwitchForScanning() {
+ Object current = root(RootIndex::kActiveContinuation);
+ DCHECK(!current.IsUndefined());
+- thread_local_top()->stack_.ClearStackSegments();
+- wasm::StackMemory* stack = Managed<wasm::StackMemory>::cast(
+- WasmContinuationObject::cast(current).stack())
+- .get()
+- .get();
++ stack().ClearStackSegments();
++ wasm::StackMemory* wasm_stack =
++ Managed<wasm::StackMemory>::cast(
++ WasmContinuationObject::cast(current).stack())
++ .get()
++ .get();
+ current = WasmContinuationObject::cast(current).parent();
+- heap()->SetStackStart(reinterpret_cast<void*>(stack->base()));
++ heap()->SetStackStart(reinterpret_cast<void*>(wasm_stack->base()));
+ // We don't need to add all inactive stacks. Only the ones in the active chain
+ // may contain cpp heap pointers.
+ while (!current.IsUndefined()) {
+ auto cont = WasmContinuationObject::cast(current);
+- auto* stack = Managed<wasm::StackMemory>::cast(cont.stack()).get().get();
+- thread_local_top()->stack_.AddStackSegment(
+- reinterpret_cast<const void*>(stack->base()),
+- reinterpret_cast<const void*>(stack->jmpbuf()->sp));
++ auto* wasm_stack =
++ Managed<wasm::StackMemory>::cast(cont.stack()).get().get();
++ stack().AddStackSegment(
++ reinterpret_cast<const void*>(wasm_stack->base()),
++ reinterpret_cast<const void*>(wasm_stack->jmpbuf()->sp));
+ current = cont.parent();
+ }
+ }
+@@ -3371,23 +3373,13 @@
+ Isolate* saved_isolate = isolate->TryGetCurrent();
+ SetIsolateThreadLocals(isolate, nullptr);
+ isolate->set_thread_id(ThreadId::Current());
+- if (saved_isolate) {
+- isolate->thread_local_top()->stack_ =
+- std::move(saved_isolate->thread_local_top()->stack_);
+- } else {
+- isolate->heap()->SetStackStart(base::Stack::GetStackStart());
+- }
++ isolate->heap()->SetStackStart(base::Stack::GetStackStart());
+
+ bool owns_shared_isolate = isolate->owns_shared_isolate_;
+ Isolate* maybe_shared_isolate = isolate->shared_isolate_;
+
+ isolate->Deinit();
+
+- // Restore the saved isolate's stack.
+- if (saved_isolate)
+- saved_isolate->thread_local_top()->stack_ =
+- std::move(isolate->thread_local_top()->stack_);
+-
+ #ifdef DEBUG
+ non_disposed_isolates_--;
+ #endif // DEBUG
+@@ -4652,6 +4644,10 @@
+ void Isolate::Enter() {
+ Isolate* current_isolate = nullptr;
+ PerIsolateThreadData* current_data = CurrentPerIsolateThreadData();
++
++ // Set the stack start for the main thread that enters the isolate.
++ heap()->SetStackStart(base::Stack::GetStackStart());
++
+ if (current_data != nullptr) {
+ current_isolate = current_data->isolate_;
+ DCHECK_NOT_NULL(current_isolate);
+diff --git a/src/execution/isolate.h b/src/execution/isolate.h
+index afc3d0b..415e476 100644
+--- a/v8/src/execution/isolate.h
++++ b/v8/src/execution/isolate.h
+@@ -32,6 +32,7 @@
+ #include "src/execution/stack-guard.h"
+ #include "src/handles/handles.h"
+ #include "src/handles/traced-handles.h"
++#include "src/heap/base/stack.h"
+ #include "src/heap/factory.h"
+ #include "src/heap/heap.h"
+ #include "src/heap/read-only-heap.h"
+@@ -2028,6 +2029,8 @@
+ SimulatorData* simulator_data() { return simulator_data_; }
+ #endif
+
++ ::heap::base::Stack& stack() { return stack_; }
++
+ #ifdef V8_ENABLE_WEBASSEMBLY
+ wasm::StackMemory*& wasm_stacks() { return wasm_stacks_; }
+ // Update the thread local's Stack object so that it is aware of the new stack
+@@ -2526,6 +2529,9 @@
+ // The mutex only guards adding pages, the retrieval is signal safe.
+ base::Mutex code_pages_mutex_;
+
++ // Stack information for the main thread.
++ ::heap::base::Stack stack_;
++
+ #ifdef V8_ENABLE_WEBASSEMBLY
+ wasm::StackMemory* wasm_stacks_;
+ #endif
+diff --git a/src/execution/thread-local-top.cc b/src/execution/thread-local-top.cc
+index c115ae0..05cc20b 100644
+--- a/v8/src/execution/thread-local-top.cc
++++ b/v8/src/execution/thread-local-top.cc
+@@ -37,7 +37,6 @@
+ current_embedder_state_ = nullptr;
+ failed_access_check_callback_ = nullptr;
+ thread_in_wasm_flag_address_ = kNullAddress;
+- stack_ = ::heap::base::Stack();
+ }
+
+ void ThreadLocalTop::Initialize(Isolate* isolate) {
+@@ -45,12 +44,8 @@
+ isolate_ = isolate;
+ thread_id_ = ThreadId::Current();
+ #if V8_ENABLE_WEBASSEMBLY
+- stack_.SetStackStart(base::Stack::GetStackStart(),
+- v8_flags.experimental_wasm_stack_switching);
+ thread_in_wasm_flag_address_ = reinterpret_cast<Address>(
+ trap_handler::GetThreadInWasmThreadLocalAddress());
+-#else
+- stack_.SetStackStart(base::Stack::GetStackStart(), false);
+ #endif // V8_ENABLE_WEBASSEMBLY
+ #ifdef USE_SIMULATOR
+ simulator_ = Simulator::current(isolate);
+diff --git a/src/execution/thread-local-top.h b/src/execution/thread-local-top.h
+index 43fec0a..989c817 100644
+--- a/v8/src/execution/thread-local-top.h
++++ b/v8/src/execution/thread-local-top.h
+@@ -10,7 +10,6 @@
+ #include "include/v8-unwinder.h"
+ #include "src/common/globals.h"
+ #include "src/execution/thread-id.h"
+-#include "src/heap/base/stack.h"
+ #include "src/objects/contexts.h"
+ #include "src/utils/utils.h"
+
+@@ -30,7 +29,7 @@
+ // TODO(all): This is not particularly beautiful. We should probably
+ // refactor this to really consist of just Addresses and 32-bit
+ // integer fields.
+- static constexpr uint32_t kSizeInBytes = 30 * kSystemPointerSize;
++ static constexpr uint32_t kSizeInBytes = 25 * kSystemPointerSize;
+
+ // Does early low-level initialization that does not depend on the
+ // isolate being present.
+@@ -147,9 +146,6 @@
+
+ // Address of the thread-local "thread in wasm" flag.
+ Address thread_in_wasm_flag_address_;
+-
+- // Stack information.
+- ::heap::base::Stack stack_;
+ };
+
+ } // namespace internal
+diff --git a/src/heap/heap.cc b/src/heap/heap.cc
+index f4b7da0..6efd486 100644
+--- a/v8/src/heap/heap.cc
++++ b/v8/src/heap/heap.cc
+@@ -5830,9 +5830,7 @@
+ #endif // V8_ENABLE_WEBASSEMBLY
+ }
+
+-::heap::base::Stack& Heap::stack() {
+- return isolate_->thread_local_top()->stack_;
+-}
++::heap::base::Stack& Heap::stack() { return isolate_->stack(); }
+
+ void Heap::StartTearDown() {
+ // Finish any ongoing sweeping to avoid stray background tasks still accessing
diff --git a/chromium-60.0.3112.78-no-libpng-prefix.patch b/chromium-60.0.3112.78-no-libpng-prefix.patch
deleted file mode 100644
index 0dbdcf9..0000000
--- a/chromium-60.0.3112.78-no-libpng-prefix.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -up chromium-60.0.3112.78/third_party/libpng/pnglibconf.h.noprefix chromium-60.0.3112.78/third_party/libpng/pnglibconf.h
---- chromium-60.0.3112.78/third_party/libpng/pnglibconf.h.noprefix 2017-08-01 14:42:54.321986758 -0400
-+++ chromium-60.0.3112.78/third_party/libpng/pnglibconf.h 2017-08-01 14:43:01.493845832 -0400
-@@ -225,13 +225,4 @@
- #define PNG_USER_CHUNK_MALLOC_MAX 4000000L
- /* end of chromium settings */
-
--/* chromium prefixing */
--/*
-- * This is necessary to build multiple copies of libpng. We need this while pdfium builds
-- * its own copy of libpng.
-- */
--#define PNG_PREFIX
--#include "pngprefix.h"
--/* end of chromium prefixing */
--
- #endif /* PNGLCONF_H */
diff --git a/chromium-90.0.4430.93-epel8-aarch64-libpng16-symbol-prefixes.patch b/chromium-90.0.4430.93-epel8-aarch64-libpng16-symbol-prefixes.patch
deleted file mode 100644
index fdde71e..0000000
--- a/chromium-90.0.4430.93-epel8-aarch64-libpng16-symbol-prefixes.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff -up chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/1lwp_SIGSEGV.aarch64 chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/1lwp_SIGSEGV
-diff -up chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/2lwp_process_SIGSEGV.aarch64 chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/2lwp_process_SIGSEGV
-diff -up chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/2lwp_t2_SIGSEGV.aarch64 chromium-90.0.4430.93/third_party/llvm/lldb/test/API/functionalities/postmortem/netbsd-core/2lwp_t2_SIGSEGV
-diff -up chromium-90.0.4430.93/third_party/pdfium/third_party/libpng16/pngprefix.h.aarch64 chromium-90.0.4430.93/third_party/pdfium/third_party/libpng16/pngprefix.h
---- chromium-90.0.4430.93/third_party/pdfium/third_party/libpng16/pngprefix.h.aarch64 2021-05-03 14:08:47.184438786 -0400
-+++ chromium-90.0.4430.93/third_party/pdfium/third_party/libpng16/pngprefix.h 2021-05-03 14:09:59.289797317 -0400
-@@ -458,4 +458,11 @@
- #define png_zlib_inflate PDFIUM_png_zlib_inflate
- #define png_zstream_error PDFIUM_png_zstream_error
-
-+#if PNG_ARM_NEON_IMPLEMENTATION == 1
-+#define png_riffle_palette_neon PDFIUM_png_riffle_palette_neon
-+#define png_do_expand_palette_rgba8_neon PDFIUM_png_do_expand_palette_rgba8_neon
-+#define png_do_expand_palette_rgb8_neon PDFIUM_png_do_expand_palette_rgb8_neon
-+#endif
-+
-+
- #endif // PNGPREFIX_H
diff --git a/chromium.spec b/chromium.spec
index 0db6dee..50f4770 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -227,8 +227,8 @@
%endif
Name: chromium%{chromium_channel}
-Version: 109.0.5414.119
-Release: 2%{?dist}
+Version: 110.0.5481.61
+Release: 1%{?dist}
Summary: A WebKit (Blink) powered web browser that Google doesn't want you to use
Url: http://www.chromium.org/Home
License: BSD and LGPLv2+ and ASL 2.0 and IJG and MIT and GPLv2+ and ISC and OpenSSL and (MPLv1.1 or GPLv2 or LGPLv2)
@@ -242,9 +242,6 @@ Patch1: chromium-91.0.4472.77-initial_prefs-etc-path.patch
# Use gn system files
Patch2: chromium-107.0.5304.110-gn-system.patch
-# Do not prefix libpng functions
-Patch3: chromium-60.0.3112.78-no-libpng-prefix.patch
-
# Do not mangle zlib
Patch5: chromium-77.0.3865.75-no-zlib-mangle.patch
@@ -279,9 +276,6 @@ Patch56: chromium-96.0.4664.45-missing-cstdint-header.patch
# Missing <cstring> (thanks c++17)
Patch57: chromium-96.0.4664.45-missing-cstring.patch
-# https://github.com/stha09/chromium-patches/blob/master/chromium-103-VirtualCursor-std-layout.patch
-Patch59: chromium-103-VirtualCursor-std-layout.patch
-
# Fix headers to look for system paths when we are using system minizip
Patch61: chromium-109-system-minizip-header-fix.patch
@@ -315,15 +309,9 @@ Patch90: chromium-109-disable-GlobalMediaControlsCastStartStop.patch
# patch for using system opus
Patch91: chromium-108-system-opus.patch
-# Fix extra qualification error
-Patch97: chromium-107.0.5304.110-remoting-extra-qualification.patch
-
# From gentoo
Patch98: chromium-94.0.4606.71-InkDropHost-crash.patch
-# Enable WebRTCPPipeWireCapturer by default
-Patch99: chromium-108-enable-WebRTCPipeWireCapturer-byDefault.patch
-
# need to explicitly include a kernel header on EL7 to support MFD_CLOEXEC, F_SEAL_SHRINK, F_ADD_SEALS, F_SEAL_SEAL
Patch100: chromium-108-el7-include-fcntl-memfd.patch
@@ -349,10 +337,6 @@ Patch106: chromium-98.0.4758.80-epel7-erase-fix.patch
# Add additional operator== to make el7 happy.
Patch107: chromium-99.0.4844.51-el7-extra-operator==.patch
-# Again, not sure how epel8 is the only one to hit this...
-# AARCH64 neon symbols need to be prefixed too to prevent multiple definition issue at linktime
-Patch110: chromium-90.0.4430.93-epel8-aarch64-libpng16-symbol-prefixes.patch
-
# system ffmpeg
Patch114: chromium-107-ffmpeg-duration.patch
Patch115: chromium-107-proprietary-codecs.patch
@@ -371,11 +355,29 @@ Patch121: chromium-108-enable-allowqt.patch
# gcc13
Patch122: chromium-109-gcc13.patch
+# Patches by Stephan Hartmann, https://github.com/stha09/chromium-patches
+Patch130: chromium-103-VirtualCursor-std-layout.patch
+Patch131: chromium-110-CanvasResourceProvider-pragma.patch
+Patch132: chromium-110-CredentialUIEntry-const.patch
+Patch133: chromium-110-DarkModeLABColorSpace-pow.patch
+Patch134: chromium-110-dpf-arm64.patch
+Patch135: chromium-110-InProgressDownloadManager-include.patch
+Patch136: chromium-110-kCustomizeChromeColors-type.patch
+Patch137: chromium-110-NativeThemeBase-fabs.patch
+Patch138: chromium-110-Presenter-include.patch
+Patch139: chromium-110-raw_ptr-constexpr.patch
+Patch140: chromium-110-StorageQueue-decltype.patch
+Patch141: chromium-110-SyncIterator-template.patch
+Patch142: chromium-110-url_canon_internal-cast.patch
+Patch143: chromium-110-v8-gcc.patch
+Patch144: chromium-111-v8-std-layout1.patch
+Patch145: chromium-111-v8-std-layout2.patch
+
# VAAPI
# Upstream turned VAAPI on in Linux in 86
Patch202: chromium-104.0.5112.101-enable-hardware-accelerated-mjpeg.patch
Patch205: chromium-86.0.4240.75-fix-vaapi-on-intel.patch
-Patch206: chromium-109-ozone-wayland-vaapi-support.patch
+Patch206: chromium-110-ozone-wayland-vaapi-support.patch
# Apply these patches to work around EPEL8 issues
Patch300: chromium-99.0.4844.51-rhel8-force-disable-use_gnome_keyring.patch
@@ -947,7 +949,6 @@ udev.
%patch0 -p1 -b .sandboxpie
%patch1 -p1 -b .etc
%patch2 -p1 -b .gnsystem
-%patch3 -p1 -b .nolibpngprefix
%patch5 -p1 -b .nozlibmangle
%patch6 -p1 -b .nounrar
%patch7 -p1 -b .widevine-hack
@@ -964,7 +965,6 @@ udev.
%patch56 -p1 -b .missing-cstdint
%patch57 -p1 -b .missing-cstring
-%patch59 -p1 -b .VirtualCursor-std-layout
%if ! %{bundleminizip}
%patch61 -p1 -b .system-minizip
@@ -986,9 +986,7 @@ udev.
%patch91 -p1 -b .system-opus
%endif
-%patch97 -p1 -b .remoting-extra-qualification
%patch98 -p1 -b .InkDropHost-crash
-%patch99 -p1 -b .enable-WebRTCPipeWireCapturer-byDefault
# Fedora branded user agent
%if 0%{?fedora}
@@ -1015,14 +1013,27 @@ udev.
%patch107 -p1 -b .el7-extra-operator-equalequal
%endif
-%if 0%{?rhel} == 8
-%patch110 -p1 -b .el8-aarch64-libpng16-symbol-prefixes
-%endif
-
%if 0%{?rhel} || 0%{?fedora} == 36
%patch120 -p1 -b .link-error-clang14
%endif
+%patch130 -p1 -b .VirtualCursor-std-layout
+%patch131 -p1 -b .CanvasResourceProvider-pragma
+%patch132 -p1 -b .CredentialUIEntry-const
+%patch133 -p1 -b .DarkModeLABColorSpace-pow
+%patch134 -p1 -b .dpf-arm64
+%patch135 -p1 -b .InProgressDownloadManager-include
+%patch136 -p1 -b .kCustomizeChromeColors-type
+%patch137 -p1 -b .NativeThemeBase-fabs
+%patch138 -p1 -b .Presenter-include
+%patch139 -p1 -b .raw_ptr-constexpr
+%patch140 -p1 -b .StorageQueue-decltype
+%patch141 -p1 -b .SyncIterator-template
+%patch142 -p1 -b .url_canon_internal-cast
+%patch143 -p1 -b .v8-gcc
+%patch144 -p1 -b .v8-std-layout1
+%patch145 -p1 -b .v8-std-layout2
+
%if %{use_qt}
%patch121 -p1 -b .enable-allowqt
%endif
@@ -1168,7 +1179,7 @@ sed -i 's|moc|moc-qt5|g' ui/qt/moc_wrapper.py
export LANG=en_US.UTF-8
# Turning the buildsystem up to 11.
-ulimit -n 4096
+ulimit -n 2048
# reduce warnings
FLAGS=' -Wno-deprecated-declarations -Wno-unknown-warning-option -Wno-unused-command-line-argument'
@@ -1187,6 +1198,7 @@ CXXFLAGS="$CFLAGS"
# override system build flags
CFLAGS="$FLAGS"
CXXFLAGS="$FLAGS"
+LDFLAGS=""
%endif
%if %{clang}
@@ -1198,6 +1210,7 @@ export CXX=g++
%endif
export CFLAGS
export CXXFLAGS
+export LDFLAGS
export AR=ar
export NM=nm
@@ -1788,6 +1801,9 @@ getent group chrome-remote-desktop >/dev/null || groupadd -r chrome-remote-deskt
%{chromium_path}/chromedriver
%changelog
+* Sat Feb 04 2023 Than Ngo <than@redhat.com> - 110.0.5481.61-1
+- update to 110.0.5481.61
+
* Thu Feb 02 2023 Jan Grulich <jgrulich@redhat.com> - 109.0.5414.119-2
- Use ffmpeg decoders for h264 support
diff --git a/clean_ffmpeg.sh b/clean_ffmpeg.sh
index 16a59a7..d2f50ad 100755
--- a/clean_ffmpeg.sh
+++ b/clean_ffmpeg.sh
@@ -105,8 +105,6 @@ header_files=" libavcodec/x86/inline_asm.h \
libavcodec/internal.h \
libavcodec/kbdwin.h \
libavcodec/mathops.h \
- libavcodec/mdct15.c \
- libavcodec/mdct15.h \
libavcodec/me_cmp.h \
libavcodec/mlp_parse.h \
libavcodec/motion_est.h \
@@ -235,15 +233,12 @@ manual_files=" libavcodec/aarch64/fft_neon.S \
libavcodec/aarch64/vp8dsp_neon.S \
libavcodec/x86/hpeldsp.asm \
libavcodec/x86/hpeldsp_rnd_template.c \
- libavcodec/x86/mdct15.asm \
- libavcodec/x86/mdct15_init.c \
libavcodec/x86/rnd_template.c \
libavcodec/x86/videodsp.asm \
libavcodec/x86/videodsp_init.c \
libavcodec/x86/vorbisdsp_init.c \
libavcodec/x86/vp3dsp.asm \
libavcodec/x86/vp8dsp.asm \
- libavcodec/autorename_libavcodec_mdct15.c \
libavcodec/bit_depth_template.c \
libavcodec/fft_template.c \
libavcodec/flacdec.c \
@@ -253,7 +248,6 @@ manual_files=" libavcodec/aarch64/fft_neon.S \
libavcodec/h264pred_template.c \
libavcodec/hpel_template.c \
libavcodec/hpeldsp.c \
- libavcodec/mdct15.c \
libavcodec/mdct_template.c \
libavcodec/options.c \
libavcodec/pcm.c \
diff --git a/sources b/sources
index 28b9d33..38b873f 100644
--- a/sources
+++ b/sources
@@ -19,4 +19,4 @@ SHA512 (NotoSansSymbols2-Regular.ttf) = 2644b42c3fdccfe12395f9b61553aced169a0f1d
SHA512 (NotoSansTibetan-Regular.ttf) = fb5a48fcaea80eebe7d692f6fcf00d59d47658a358d0ec8e046fc559873f88bd595b2da474d2826abd9e9305f3741c69058d867b1e6048f37fe7d71b5d3af36a
SHA512 (node-v16.17.0-linux-x64.tar.xz) = aedfeeb71420a7fbcb07fbc4c5d2ba74ffe4f88c15998809346a84148132ec866dbae4e848531a2a77ca41413f442e1046f981d4f188bdf667faf88069aa28cd
SHA512 (node-v16.17.0-linux-arm64.tar.xz) = ae4aabc2389779c9e1b4a15622cae3ba50e0c313ca3d7a1dc7b2344df06ade1f303d6a75b941d37e2a0ef368cf047c862a822a893684494f55446afd6ab0610e
-SHA512 (chromium-109.0.5414.119-clean.tar.xz) = 140d10b025379781ac8b94386ed453bd3814228c70a303392c1506494228bf3b5f839a5166dcb1182af0d942039dfc1d6710b5f417c9d74f21b1f185d2f107b7
+SHA512 (chromium-110.0.5481.61-clean.tar.xz) = bc655e72ca94c741eede89f66e76f7829e59bf2edc1c3b5c19271317a2061a9a6b176da90357ca73d325047cd9ba24549da29e735b96ecc31244e2c2adbe65fd
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-07 16:04 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-07 16:04 [rpms/chromium] epel9-next: update to 110.0.5481.61 Than Ngo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox