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