Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] [WIP] chromium: update to 89.0.4389.72
@ 2021-03-03 14:20 pullmoll
  2021-03-03 15:15 ` [PR PATCH] [Updated] " pullmoll
                   ` (25 more replies)
  0 siblings, 26 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 14:20 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 821 bytes --]

There is a new pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patches apply w/o changes, not yet built, not yet tested
+ x86_64-musl patches not yet working, still trying to adjust them
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 193795 bytes --]

From 9b64f136c4959788faa579c31fdae44284c415ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patches apply w/o changes, not yet built, not yet tested
+ x86_64-musl patches not yet working, still trying to adjust them
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../files/musl-patches/musl-sandbox.patch     |   10 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   72 -
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   60 -
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 25 files changed, 51 insertions(+), 4301 deletions(-)
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-execinfo.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/sandbox-membarrier.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..b15bd1f7945 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -539,7 +539,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -399,6 +399,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -412,7 +412,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
deleted file mode 100644
index 386997e8ed1..00000000000
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ /dev/null
@@ -1,72 +0,0 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
-@@ -27,7 +27,7 @@
- #if !defined(USE_SYMBOLIZE)
- #include <cxxabi.h>
- #endif
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- #include <execinfo.h>
- #endif
- 
-@@ -86,7 +86,7 @@
-   // Note: code in this function is NOT async-signal safe (std::string uses
-   // malloc internally).
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   std::string::size_type search_from = 0;
-   while (search_from < text->size()) {
-     // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
-       search_from = mangled_start + 2;
-     }
-   }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- }
- #endif  // !defined(USE_SYMBOLIZE)
- 
-@@ -133,7 +133,7 @@
-   virtual ~BacktraceOutputHandler() = default;
- };
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
-   // This should be more than enough to store a 64-bit number in hex:
-   // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
-   }
- #endif  // defined(USE_SYMBOLIZE)
- }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- 
- void PrintToStderr(const char* output) {
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-   // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   // Though the backtrace API man page does not list any possible negative
-   // return values, we take no chance.
-   return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
- // NOTE: This code MUST be async-signal safe (it's used by in-process
- // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   PrintBacktraceOutputHandler handler;
-   ProcessBacktrace(trace_, count_, prefix_string, &handler);
- #endif
- }
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void StackTrace::OutputToStreamWithPrefix(std::ostream* os,
-                                           const char* prefix_string) const {
-   StreamBacktraceOutputHandler handler(os);
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
deleted file mode 100644
index a31a9f6a5e9..00000000000
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
-   switch (sysno) {
-     case __NR_exit:
-     case __NR_exit_group:
-+    case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
- #if defined(__i386__)
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
@ 2021-03-03 15:15 ` pullmoll
  2021-03-03 15:40 ` pullmoll
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 15:15 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 934 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patches apply w/o changes, not yet built, not yet tested
+ x86_64-musl patches not yet working, still trying to adjust them
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 203949 bytes --]

From 5aabd9cf0d68ea0c19178cf0dc731fddc5c91fe8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, not yet tested
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../files/musl-patches/musl-sandbox.patch     |   12 +-
 .../files/musl-patches/no-mallinfo.patch      |    6 +-
 .../files/musl-patches/resolver.patch         |    2 +-
 .../musl-patches/xxx-ppc64le-support.patch    |  110 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   72 -
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   60 -
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 28 files changed, 59 insertions(+), 4413 deletions(-)
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-execinfo.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/sandbox-membarrier.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
index 9001a2a854d..1be932312ef 100644
--- a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
@@ -1,46 +1,3 @@
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index a6aec544e..2a4a7f1bc 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,7 +16,7 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
--#elif defined(__powerpc64__)
-+#elif defined(__powerpc64__) && defined(__GLIBC__)
- // Manually define greg_t on ppc64
- typedef unsigned long long greg_t;
- #endif
-@@ -361,11 +361,11 @@ typedef struct pt_regs regs_struct;
- #define SECCOMP_ARCH AUDIT_ARCH_PPC64
- #endif
- 
--#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+#define SECCOMP_REG(_ctx, _reg) (((struct pt_regs *)(_ctx)->uc_mcontext.regs)->gpr[_reg])
- 
- #define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
--#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_IP(_ctx) ((struct pt_regs *)(_ctx)->uc_mcontext.regs)->nip
- #define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
- #define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index d53a7ff56..c290f0e92 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -499,9 +499,9 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-   // Same as MIPS, need to invert ret and set error register (cr0.SO)
-   if (ret_val <= -1 && ret_val >= -4095) {
-     ret_val = -ret_val;
--    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr |= (1 << 28);
-   } else {
--    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr &= ~(1 << 28);
-   }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
 diff --git third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
 index cdce9bf8..73d77dda 100644
 --- third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -56,7 +13,7 @@ index cdce9bf8..73d77dda 100644
  #else
 --- third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 +++ third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
-@@ -64,7 +64,7 @@
+@@ -59,7 +59,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -65,23 +22,11 @@ index cdce9bf8..73d77dda 100644
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index f9a60e37..25f3a0b7 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -637,6 +637,7 @@ if (is_linux || is_android) {
- 
-     if (current_cpu == "ppc64") {
-         defines = [ "HAVE_GETCONTEXT" ]
-+        libs += [ "ucontext" ]
-     } else {
-         sources += [
-             "breakpad/src/common/linux/breakpad_getcontext.S"
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 index 03afec7a..0264ecf1 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -273,6 +273,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
+@@ -210,6 +210,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
  
  #elif defined(__powerpc64__)
  
@@ -91,23 +36,11 @@ index 03afec7a..0264ecf1 100644
  uintptr_t ThreadInfo::GetInstructionPointer() const {
      return mcontext.gp_regs[PT_NIP];
  }
-@@ -290,9 +293,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-     out->ctr = mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] = \
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 index 1090470f..e580233d 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -257,6 +257,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -210,6 +210,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
  
  #elif defined(__powerpc64__)
  
@@ -117,18 +50,6 @@ index 1090470f..e580233d 100644
  uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
      return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
  }
-@@ -280,9 +283,9 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-     out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&uc->uc_mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&uc->uc_mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] =
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 index 5a7ab50c..ee8b858c 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
@@ -145,31 +66,6 @@ index 5a7ab50c..ee8b858c 100644
  namespace google_breakpad {
  
  namespace {
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 8e335a09..b2a0f155 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -469,7 +469,7 @@ struct MContext64 {
-   SignalThreadContext64 gp_regs;
-   SignalFloatContext64  fp_regs;
-   SignalVectorContext64 *v_regs;
--  int64_t vmx_reserve[69];
-+  int64_t vmx_reserve[101];
- };
- 
- struct ContextTraits64 : public Traits64 {
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index dea0d1f3..b203e5b2 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -30,6 +30,7 @@
- 
- #if defined(ARCH_CPU_PPC64_FAMILY)
- #include <sys/ucontext.h>
-+#include <asm/ptrace.h>
- #endif
- 
- namespace crashpad {
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
 index 9955ce44..4c1cc488 100644
 --- third_party/lss/linux_syscall_support.h
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
deleted file mode 100644
index 386997e8ed1..00000000000
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ /dev/null
@@ -1,72 +0,0 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
-@@ -27,7 +27,7 @@
- #if !defined(USE_SYMBOLIZE)
- #include <cxxabi.h>
- #endif
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- #include <execinfo.h>
- #endif
- 
-@@ -86,7 +86,7 @@
-   // Note: code in this function is NOT async-signal safe (std::string uses
-   // malloc internally).
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   std::string::size_type search_from = 0;
-   while (search_from < text->size()) {
-     // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
-       search_from = mangled_start + 2;
-     }
-   }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- }
- #endif  // !defined(USE_SYMBOLIZE)
- 
-@@ -133,7 +133,7 @@
-   virtual ~BacktraceOutputHandler() = default;
- };
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
-   // This should be more than enough to store a 64-bit number in hex:
-   // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
-   }
- #endif  // defined(USE_SYMBOLIZE)
- }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- 
- void PrintToStderr(const char* output) {
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-   // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   // Though the backtrace API man page does not list any possible negative
-   // return values, we take no chance.
-   return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
- // NOTE: This code MUST be async-signal safe (it's used by in-process
- // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   PrintBacktraceOutputHandler handler;
-   ProcessBacktrace(trace_, count_, prefix_string, &handler);
- #endif
- }
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void StackTrace::OutputToStreamWithPrefix(std::ostream* os,
-                                           const char* prefix_string) const {
-   StreamBacktraceOutputHandler handler(os);
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
deleted file mode 100644
index a31a9f6a5e9..00000000000
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
-   switch (sysno) {
-     case __NR_exit:
-     case __NR_exit_group:
-+    case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
- #if defined(__i386__)
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
  2021-03-03 15:15 ` [PR PATCH] [Updated] " pullmoll
@ 2021-03-03 15:40 ` pullmoll
  2021-03-03 15:49 ` pullmoll
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 15:40 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1013 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, not yet tested
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed? need to check again)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 203987 bytes --]

From f5aebc73156e63f5075aaba71ce6c6cf771a6a71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../files/musl-patches/musl-sandbox.patch     |   12 +-
 .../files/musl-patches/no-mallinfo.patch      |    6 +-
 .../files/musl-patches/resolver.patch         |    2 +-
 .../musl-patches/xxx-ppc64le-support.patch    |  110 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   65 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   60 -
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 28 files changed, 61 insertions(+), 4404 deletions(-)
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/sandbox-membarrier.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
index 9001a2a854d..1be932312ef 100644
--- a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
@@ -1,46 +1,3 @@
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index a6aec544e..2a4a7f1bc 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,7 +16,7 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
--#elif defined(__powerpc64__)
-+#elif defined(__powerpc64__) && defined(__GLIBC__)
- // Manually define greg_t on ppc64
- typedef unsigned long long greg_t;
- #endif
-@@ -361,11 +361,11 @@ typedef struct pt_regs regs_struct;
- #define SECCOMP_ARCH AUDIT_ARCH_PPC64
- #endif
- 
--#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+#define SECCOMP_REG(_ctx, _reg) (((struct pt_regs *)(_ctx)->uc_mcontext.regs)->gpr[_reg])
- 
- #define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
--#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_IP(_ctx) ((struct pt_regs *)(_ctx)->uc_mcontext.regs)->nip
- #define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
- #define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index d53a7ff56..c290f0e92 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -499,9 +499,9 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-   // Same as MIPS, need to invert ret and set error register (cr0.SO)
-   if (ret_val <= -1 && ret_val >= -4095) {
-     ret_val = -ret_val;
--    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr |= (1 << 28);
-   } else {
--    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr &= ~(1 << 28);
-   }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
 diff --git third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
 index cdce9bf8..73d77dda 100644
 --- third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -56,7 +13,7 @@ index cdce9bf8..73d77dda 100644
  #else
 --- third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 +++ third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
-@@ -64,7 +64,7 @@
+@@ -59,7 +59,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -65,23 +22,11 @@ index cdce9bf8..73d77dda 100644
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index f9a60e37..25f3a0b7 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -637,6 +637,7 @@ if (is_linux || is_android) {
- 
-     if (current_cpu == "ppc64") {
-         defines = [ "HAVE_GETCONTEXT" ]
-+        libs += [ "ucontext" ]
-     } else {
-         sources += [
-             "breakpad/src/common/linux/breakpad_getcontext.S"
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 index 03afec7a..0264ecf1 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -273,6 +273,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
+@@ -210,6 +210,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
  
  #elif defined(__powerpc64__)
  
@@ -91,23 +36,11 @@ index 03afec7a..0264ecf1 100644
  uintptr_t ThreadInfo::GetInstructionPointer() const {
      return mcontext.gp_regs[PT_NIP];
  }
-@@ -290,9 +293,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-     out->ctr = mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] = \
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 index 1090470f..e580233d 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -257,6 +257,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -210,6 +210,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
  
  #elif defined(__powerpc64__)
  
@@ -117,18 +50,6 @@ index 1090470f..e580233d 100644
  uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
      return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
  }
-@@ -280,9 +283,9 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-     out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&uc->uc_mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&uc->uc_mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] =
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 index 5a7ab50c..ee8b858c 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
@@ -145,31 +66,6 @@ index 5a7ab50c..ee8b858c 100644
  namespace google_breakpad {
  
  namespace {
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 8e335a09..b2a0f155 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -469,7 +469,7 @@ struct MContext64 {
-   SignalThreadContext64 gp_regs;
-   SignalFloatContext64  fp_regs;
-   SignalVectorContext64 *v_regs;
--  int64_t vmx_reserve[69];
-+  int64_t vmx_reserve[101];
- };
- 
- struct ContextTraits64 : public Traits64 {
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index dea0d1f3..b203e5b2 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -30,6 +30,7 @@
- 
- #if defined(ARCH_CPU_PPC64_FAMILY)
- #include <sys/ucontext.h>
-+#include <asm/ptrace.h>
- #endif
- 
- namespace crashpad {
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
 index 9955ce44..4c1cc488 100644
 --- third_party/lss/linux_syscall_support.h
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..f438431ee19 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:36:20.961602775 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,64 +9,3 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
-   // Note: code in this function is NOT async-signal safe (std::string uses
-   // malloc internally).
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   std::string::size_type search_from = 0;
-   while (search_from < text->size()) {
-     // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
-       search_from = mangled_start + 2;
-     }
-   }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- }
- #endif  // !defined(USE_SYMBOLIZE)
- 
-@@ -133,7 +133,7 @@
-   virtual ~BacktraceOutputHandler() = default;
- };
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
-   // This should be more than enough to store a 64-bit number in hex:
-   // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
-   }
- #endif  // defined(USE_SYMBOLIZE)
- }
--#endif  // !defined(__UCLIBC__) && !defined(_AIX)
-+#endif  // defined(__GLIBC__) && !defined(_AIX)
- 
- void PrintToStderr(const char* output) {
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
-   // NOTE: This code MUST be async-signal safe (it's used by in-process
-   // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   // Though the backtrace API man page does not list any possible negative
-   // return values, we take no chance.
-   return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
- // NOTE: This code MUST be async-signal safe (it's used by in-process
- // stack dumping signal handler). NO malloc or stdio is allowed here.
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
-   PrintBacktraceOutputHandler handler;
-   ProcessBacktrace(trace_, count_, prefix_string, &handler);
- #endif
- }
- 
--#if !defined(__UCLIBC__) && !defined(_AIX)
-+#if defined(__GLIBC__) && !defined(_AIX)
- void StackTrace::OutputToStreamWithPrefix(std::ostream* os,
-                                           const char* prefix_string) const {
-   StreamBacktraceOutputHandler handler(os);
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
deleted file mode 100644
index a31a9f6a5e9..00000000000
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
-   switch (sysno) {
-     case __NR_exit:
-     case __NR_exit_group:
-+    case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
- #if defined(__i386__)
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
  2021-03-03 15:15 ` [PR PATCH] [Updated] " pullmoll
  2021-03-03 15:40 ` pullmoll
@ 2021-03-03 15:49 ` pullmoll
  2021-03-03 16:49 ` pullmoll
                   ` (22 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 15:49 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1013 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, not yet tested
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed? need to check again)
+ opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 203251 bytes --]

From 070d16e1a60b21e8db9497159e5ec704a51e9023 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../files/musl-patches/musl-sandbox.patch     |   12 +-
 .../files/musl-patches/no-mallinfo.patch      |    6 +-
 .../files/musl-patches/resolver.patch         |    2 +-
 .../musl-patches/xxx-ppc64le-support.patch    |  110 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   60 -
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 28 files changed, 67 insertions(+), 4349 deletions(-)
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/sandbox-membarrier.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
index 9001a2a854d..1be932312ef 100644
--- a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
@@ -1,46 +1,3 @@
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index a6aec544e..2a4a7f1bc 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,7 +16,7 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
--#elif defined(__powerpc64__)
-+#elif defined(__powerpc64__) && defined(__GLIBC__)
- // Manually define greg_t on ppc64
- typedef unsigned long long greg_t;
- #endif
-@@ -361,11 +361,11 @@ typedef struct pt_regs regs_struct;
- #define SECCOMP_ARCH AUDIT_ARCH_PPC64
- #endif
- 
--#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+#define SECCOMP_REG(_ctx, _reg) (((struct pt_regs *)(_ctx)->uc_mcontext.regs)->gpr[_reg])
- 
- #define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
--#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_IP(_ctx) ((struct pt_regs *)(_ctx)->uc_mcontext.regs)->nip
- #define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
- #define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index d53a7ff56..c290f0e92 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -499,9 +499,9 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-   // Same as MIPS, need to invert ret and set error register (cr0.SO)
-   if (ret_val <= -1 && ret_val >= -4095) {
-     ret_val = -ret_val;
--    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr |= (1 << 28);
-   } else {
--    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr &= ~(1 << 28);
-   }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
 diff --git third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
 index cdce9bf8..73d77dda 100644
 --- third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -56,7 +13,7 @@ index cdce9bf8..73d77dda 100644
  #else
 --- third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 +++ third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
-@@ -64,7 +64,7 @@
+@@ -59,7 +59,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -65,23 +22,11 @@ index cdce9bf8..73d77dda 100644
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index f9a60e37..25f3a0b7 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -637,6 +637,7 @@ if (is_linux || is_android) {
- 
-     if (current_cpu == "ppc64") {
-         defines = [ "HAVE_GETCONTEXT" ]
-+        libs += [ "ucontext" ]
-     } else {
-         sources += [
-             "breakpad/src/common/linux/breakpad_getcontext.S"
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 index 03afec7a..0264ecf1 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -273,6 +273,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
+@@ -210,6 +210,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
  
  #elif defined(__powerpc64__)
  
@@ -91,23 +36,11 @@ index 03afec7a..0264ecf1 100644
  uintptr_t ThreadInfo::GetInstructionPointer() const {
      return mcontext.gp_regs[PT_NIP];
  }
-@@ -290,9 +293,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-     out->ctr = mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] = \
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 index 1090470f..e580233d 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -257,6 +257,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -210,6 +210,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
  
  #elif defined(__powerpc64__)
  
@@ -117,18 +50,6 @@ index 1090470f..e580233d 100644
  uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
      return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
  }
-@@ -280,9 +283,9 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-     out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&uc->uc_mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&uc->uc_mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] =
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 index 5a7ab50c..ee8b858c 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
@@ -145,31 +66,6 @@ index 5a7ab50c..ee8b858c 100644
  namespace google_breakpad {
  
  namespace {
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 8e335a09..b2a0f155 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -469,7 +469,7 @@ struct MContext64 {
-   SignalThreadContext64 gp_regs;
-   SignalFloatContext64  fp_regs;
-   SignalVectorContext64 *v_regs;
--  int64_t vmx_reserve[69];
-+  int64_t vmx_reserve[101];
- };
- 
- struct ContextTraits64 : public Traits64 {
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index dea0d1f3..b203e5b2 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -30,6 +30,7 @@
- 
- #if defined(ARCH_CPU_PPC64_FAMILY)
- #include <sys/ucontext.h>
-+#include <asm/ptrace.h>
- #endif
- 
- namespace crashpad {
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
 index 9955ce44..4c1cc488 100644
 --- third_party/lss/linux_syscall_support.h
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
deleted file mode 100644
index a31a9f6a5e9..00000000000
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
-   switch (sysno) {
-     case __NR_exit:
-     case __NR_exit_group:
-+    case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
- #if defined(__i386__)
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (2 preceding siblings ...)
  2021-03-03 15:49 ` pullmoll
@ 2021-03-03 16:49 ` pullmoll
  2021-03-03 17:00 ` pullmoll
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 16:49 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1006 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, currently bulding, not yet tested
+ ppc64le patch removed for now as nothing applies (already upstreamed?)
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 204863 bytes --]

From 4f66c5c0faebccc5c608d1fcb66b037c01a35eff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, not yet tested
+ patches/ppc64le-ppc64le-support.patch removed for now (already upstreamed? need to check again)
+ files/musl-paches/xxx-ppc64le-support.patch stripped down to what still applies
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../musl-patches/musl-no-glibc-version.patch  |   28 +
 .../files/musl-patches/musl-sandbox.patch     |   12 +-
 .../files/musl-patches/no-mallinfo.patch      |    6 +-
 .../files/musl-patches/resolver.patch         |    2 +-
 .../musl-patches/xxx-ppc64le-support.patch    |  110 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   60 -
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 29 files changed, 95 insertions(+), 4349 deletions(-)
 create mode 100644 srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/sandbox-membarrier.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
new file mode 100644
index 00000000000..9ffec62465c
--- /dev/null
+++ b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
@@ -0,0 +1,28 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig	2021-03-02 18:45:03.000000000 +0100
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc	2021-03-03 17:39:14.944100746 +0100
+@@ -55,7 +55,9 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+ #include <gnu/libc-version.h>
++#endif
+ 
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -317,6 +319,7 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+   base::Version version(gnu_get_libc_version());
+ 
+   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
+@@ -338,6 +341,7 @@
+   }
+   base::UmaHistogramSparse("Linux.GlibcVersion", glibc_version_result);
+ #endif
++#endif
+ }
+ 
+ void RecordTouchEventState() {
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
index 9001a2a854d..1be932312ef 100644
--- a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
@@ -1,46 +1,3 @@
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index a6aec544e..2a4a7f1bc 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,7 +16,7 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
--#elif defined(__powerpc64__)
-+#elif defined(__powerpc64__) && defined(__GLIBC__)
- // Manually define greg_t on ppc64
- typedef unsigned long long greg_t;
- #endif
-@@ -361,11 +361,11 @@ typedef struct pt_regs regs_struct;
- #define SECCOMP_ARCH AUDIT_ARCH_PPC64
- #endif
- 
--#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+#define SECCOMP_REG(_ctx, _reg) (((struct pt_regs *)(_ctx)->uc_mcontext.regs)->gpr[_reg])
- 
- #define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
--#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_IP(_ctx) ((struct pt_regs *)(_ctx)->uc_mcontext.regs)->nip
- #define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
- #define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index d53a7ff56..c290f0e92 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -499,9 +499,9 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-   // Same as MIPS, need to invert ret and set error register (cr0.SO)
-   if (ret_val <= -1 && ret_val >= -4095) {
-     ret_val = -ret_val;
--    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr |= (1 << 28);
-   } else {
--    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr &= ~(1 << 28);
-   }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
 diff --git third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
 index cdce9bf8..73d77dda 100644
 --- third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -56,7 +13,7 @@ index cdce9bf8..73d77dda 100644
  #else
 --- third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 +++ third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
-@@ -64,7 +64,7 @@
+@@ -59,7 +59,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -65,23 +22,11 @@ index cdce9bf8..73d77dda 100644
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index f9a60e37..25f3a0b7 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -637,6 +637,7 @@ if (is_linux || is_android) {
- 
-     if (current_cpu == "ppc64") {
-         defines = [ "HAVE_GETCONTEXT" ]
-+        libs += [ "ucontext" ]
-     } else {
-         sources += [
-             "breakpad/src/common/linux/breakpad_getcontext.S"
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 index 03afec7a..0264ecf1 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -273,6 +273,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
+@@ -210,6 +210,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
  
  #elif defined(__powerpc64__)
  
@@ -91,23 +36,11 @@ index 03afec7a..0264ecf1 100644
  uintptr_t ThreadInfo::GetInstructionPointer() const {
      return mcontext.gp_regs[PT_NIP];
  }
-@@ -290,9 +293,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-     out->ctr = mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] = \
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 index 1090470f..e580233d 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -257,6 +257,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -210,6 +210,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
  
  #elif defined(__powerpc64__)
  
@@ -117,18 +50,6 @@ index 1090470f..e580233d 100644
  uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
      return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
  }
-@@ -280,9 +283,9 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-     out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&uc->uc_mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&uc->uc_mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] =
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 index 5a7ab50c..ee8b858c 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
@@ -145,31 +66,6 @@ index 5a7ab50c..ee8b858c 100644
  namespace google_breakpad {
  
  namespace {
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 8e335a09..b2a0f155 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -469,7 +469,7 @@ struct MContext64 {
-   SignalThreadContext64 gp_regs;
-   SignalFloatContext64  fp_regs;
-   SignalVectorContext64 *v_regs;
--  int64_t vmx_reserve[69];
-+  int64_t vmx_reserve[101];
- };
- 
- struct ContextTraits64 : public Traits64 {
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index dea0d1f3..b203e5b2 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -30,6 +30,7 @@
- 
- #if defined(ARCH_CPU_PPC64_FAMILY)
- #include <sys/ucontext.h>
-+#include <asm/ptrace.h>
- #endif
- 
- namespace crashpad {
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
 index 9955ce44..4c1cc488 100644
 --- third_party/lss/linux_syscall_support.h
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
deleted file mode 100644
index a31a9f6a5e9..00000000000
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ /dev/null
@@ -1,60 +0,0 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
-   switch (sysno) {
-     case __NR_exit:
-     case __NR_exit_group:
-+    case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
- #if defined(__i386__)
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (3 preceding siblings ...)
  2021-03-03 16:49 ` pullmoll
@ 2021-03-03 17:00 ` pullmoll
  2021-03-03 17:06 ` pullmoll
                   ` (20 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:00 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 291 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789881184

Comment:
Not sure if the x86_64-musl syscall crash is because of me already using musl-1.2.2.
I'll check to see what syscall 0324 is and what to do about it.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (4 preceding siblings ...)
  2021-03-03 17:00 ` pullmoll
@ 2021-03-03 17:06 ` pullmoll
  2021-03-03 17:20 ` pullmoll
                   ` (19 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:06 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 381 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789881184

Comment:
Not sure if the x86_64-musl syscall crash is because of me already using musl-1.2.2.
I'll check to see what syscall 0324 is and what to do about it.

I suppose it's 324 `__NR_membarrier` and not 0324 (octal) as printed in the crash log.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (5 preceding siblings ...)
  2021-03-03 17:06 ` pullmoll
@ 2021-03-03 17:20 ` pullmoll
  2021-03-03 17:20 ` ericonr
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:20 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 572 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789881184

Comment:
Not sure if the x86_64-musl syscall crash is because of me already using musl-1.2.2.
I'll check to see what syscall 0324 is and what to do about it.

I suppose it's 324 `__NR_membarrier` and not 0324 (octal) as printed in the crash log.

Edit: I need to partially restore the sandbox-membarrier.patch. The `#if !defined(_NR_membarrier)` are now in the headers while the `case _NR_membarrier:` is missing in `syscall_sets.cc`.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (6 preceding siblings ...)
  2021-03-03 17:20 ` pullmoll
@ 2021-03-03 17:20 ` ericonr
  2021-03-03 17:21 ` ericonr
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: ericonr @ 2021-03-03 17:20 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 348 bytes --]

New comment by ericonr on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789904138

Comment:
Do you have it in your repository for musl? The current version doesn't crash on musl 1.2.1, at least. I haven't updated to 1.2.2 because it breaks Firefox seccomp (Firefox needs to be built for musl 1.2.2).

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (7 preceding siblings ...)
  2021-03-03 17:20 ` ericonr
@ 2021-03-03 17:21 ` ericonr
  2021-03-03 17:23 ` pullmoll
                   ` (16 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: ericonr @ 2021-03-03 17:21 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 393 bytes --]

New comment by ericonr on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789904138

Comment:
Do you have it in your repository for musl? The current version doesn't crash on musl 1.2.1, at least. I haven't updated to 1.2.2 because it breaks Firefox seccomp (Firefox needs to be built for musl 1.2.2), so it could perhaps be the same situation.


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (8 preceding siblings ...)
  2021-03-03 17:21 ` ericonr
@ 2021-03-03 17:23 ` pullmoll
  2021-03-03 17:23 ` pullmoll
                   ` (15 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:23 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 345 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789905922

Comment:
@ericonr You can get it from https://repo.voidlinux.de/binpkgs/chromium-89.0.4389.72_1.x86_64-musl.xbps already, the `x86_musl/...` is not yet updated because a lot of `live/...` files are before that.


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (9 preceding siblings ...)
  2021-03-03 17:23 ` pullmoll
@ 2021-03-03 17:23 ` pullmoll
  2021-03-03 17:24 ` pullmoll
                   ` (14 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:23 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 348 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789905922

Comment:
@ericonr You can get it from https://repo.voidlinux.de/binpkgs/chromium-89.0.4389.72_1.x86_64-musl.xbps already, the `x86_64-musl/...` is not yet updated because a lot of `live/...` files are before that.


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (10 preceding siblings ...)
  2021-03-03 17:23 ` pullmoll
@ 2021-03-03 17:24 ` pullmoll
  2021-03-03 17:25 ` pullmoll
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:24 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 424 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789905922

Comment:
@ericonr You can get it from https://repo.voidlinux.de/binpkgs/chromium-89.0.4389.72_1.x86_64-musl.xbps already, the `x86_64-musl/...` is not yet updated because a lot of `live/...` files are before that.
But see above. I think I removed an important part of a patch that failed.


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (11 preceding siblings ...)
  2021-03-03 17:24 ` pullmoll
@ 2021-03-03 17:25 ` pullmoll
  2021-03-03 17:27 ` [PR PATCH] [Updated] " pullmoll
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:25 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 459 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789905922

Comment:
@ericonr You can get it from https://repo.voidlinux.de/binpkgs/chromium-89.0.4389.72_1.x86_64-musl.xbps already, the `x86_64-musl/...` is not yet updated because a lot of `live/...` files are before that.
But see above. I think I removed an important part of a patch that failed.
I'll rebuild x86_64-musl with that.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (12 preceding siblings ...)
  2021-03-03 17:25 ` pullmoll
@ 2021-03-03 17:27 ` pullmoll
  2021-03-03 17:30 ` pullmoll
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:27 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1164 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, "Aw, Snap!" in a VM
  seccomp-bpf failure in syscall 0324
+ patches/ppc64le-ppc64le-support.patch removed for now (already upstreamed? need to check again)
+ files/musl-paches/xxx-ppc64le-support.patch stripped down to what still applies
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 205170 bytes --]

From 1c06b0ae5f7e15aa785a7b018104fccf0963a9ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, needs testing
+ patches/ppc64le-ppc64le-support.patch removed for now (already upstreamed? need to check again)
+ files/musl-paches/xxx-ppc64le-support.patch stripped down to what still applies
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |    4 +-
 .../files/musl-patches/musl-fixes.patch       |   40 +-
 .../files/musl-patches/musl-hacks.patch       |    4 +-
 .../files/musl-patches/musl-libc++.patch      |    6 +-
 .../musl-patches/musl-no-glibc-version.patch  |   28 +
 .../files/musl-patches/musl-sandbox.patch     |   12 +-
 .../files/musl-patches/no-mallinfo.patch      |    6 +-
 .../files/musl-patches/resolver.patch         |    2 +-
 .../musl-patches/xxx-ppc64le-support.patch    |  110 +-
 srcpkgs/chromium/patches/browser-size_t.patch |   10 -
 .../chromium-88-AXTreeFormatter-include.patch |   27 -
 ...ium-88-BookmarkModelObserver-include.patch |   21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |   36 -
 .../chromium-88-StringPool-include.patch      |   20 -
 ...romium-88-federated_learning-include.patch |   21 -
 .../patches/chromium-88-glibc-2.33.patch      |  144 -
 ...hromium-88-ideographicSpaceCharacter.patch |   27 -
 .../patches/chromium-88-ityp-include.patch    |   25 -
 .../patches/chromium-88-vaapi-attribute.patch |   39 -
 ...um-89-CompositorFrameReporter-dcheck.patch |   11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |   23 +-
 ...remove-unsupported-compiler-warnings.patch |   26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |   24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |   16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |   27 -
 srcpkgs/chromium/patches/no-std-time.patch    |   11 +
 .../chromium/patches/sandbox-membarrier.patch |   61 +-
 .../patches/xxx-ppc64le-support.patch         | 3656 -----------------
 srcpkgs/chromium/template                     |    8 +-
 29 files changed, 103 insertions(+), 4342 deletions(-)
 create mode 100644 srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch
 delete mode 100644 srcpkgs/chromium/patches/xxx-ppc64le-support.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
new file mode 100644
index 00000000000..9ffec62465c
--- /dev/null
+++ b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
@@ -0,0 +1,28 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig	2021-03-02 18:45:03.000000000 +0100
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc	2021-03-03 17:39:14.944100746 +0100
+@@ -55,7 +55,9 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+ #include <gnu/libc-version.h>
++#endif
+ 
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -317,6 +319,7 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+   base::Version version(gnu_get_libc_version());
+ 
+   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
+@@ -338,6 +341,7 @@
+   }
+   base::UmaHistogramSparse("Linux.GlibcVersion", glibc_version_result);
+ #endif
++#endif
+ }
+ 
+ void RecordTouchEventState() {
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
index 9001a2a854d..1be932312ef 100644
--- a/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/files/musl-patches/xxx-ppc64le-support.patch
@@ -1,46 +1,3 @@
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index a6aec544e..2a4a7f1bc 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,7 +16,7 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
--#elif defined(__powerpc64__)
-+#elif defined(__powerpc64__) && defined(__GLIBC__)
- // Manually define greg_t on ppc64
- typedef unsigned long long greg_t;
- #endif
-@@ -361,11 +361,11 @@ typedef struct pt_regs regs_struct;
- #define SECCOMP_ARCH AUDIT_ARCH_PPC64
- #endif
- 
--#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+#define SECCOMP_REG(_ctx, _reg) (((struct pt_regs *)(_ctx)->uc_mcontext.regs)->gpr[_reg])
- 
- #define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
--#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_IP(_ctx) ((struct pt_regs *)(_ctx)->uc_mcontext.regs)->nip
- #define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
- #define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
- #define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index d53a7ff56..c290f0e92 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -499,9 +499,9 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-   // Same as MIPS, need to invert ret and set error register (cr0.SO)
-   if (ret_val <= -1 && ret_val >= -4095) {
-     ret_val = -ret_val;
--    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr |= (1 << 28);
-   } else {
--    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+    ((struct pt_regs *)ctx->uc_mcontext.regs)->ccr &= ~(1 << 28);
-   }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
 diff --git third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
 index cdce9bf8..73d77dda 100644
 --- third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h
@@ -56,7 +13,7 @@ index cdce9bf8..73d77dda 100644
  #else
 --- third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
 +++ third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h
-@@ -64,7 +64,7 @@
+@@ -59,7 +59,7 @@
  #elif defined(__i386__) || defined(__x86_64__)
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_x86-inl.inc"
@@ -65,23 +22,11 @@ index cdce9bf8..73d77dda 100644
  #define ABSL_STACKTRACE_INL_HEADER \
    "absl/debugging/internal/stacktrace_powerpc-inl.inc"
  #elif defined(__aarch64__)
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index f9a60e37..25f3a0b7 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -637,6 +637,7 @@ if (is_linux || is_android) {
- 
-     if (current_cpu == "ppc64") {
-         defines = [ "HAVE_GETCONTEXT" ]
-+        libs += [ "ucontext" ]
-     } else {
-         sources += [
-             "breakpad/src/common/linux/breakpad_getcontext.S"
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 index 03afec7a..0264ecf1 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -273,6 +273,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
+@@ -210,6 +210,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
  
  #elif defined(__powerpc64__)
  
@@ -91,23 +36,11 @@ index 03afec7a..0264ecf1 100644
  uintptr_t ThreadInfo::GetInstructionPointer() const {
      return mcontext.gp_regs[PT_NIP];
  }
-@@ -290,9 +293,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-     out->ctr = mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] = \
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 index 1090470f..e580233d 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -257,6 +257,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -210,6 +210,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
  
  #elif defined(__powerpc64__)
  
@@ -117,18 +50,6 @@ index 1090470f..e580233d 100644
  uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
      return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
  }
-@@ -280,9 +283,9 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-     out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-     
-     for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
--        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+        out->float_save.fpregs[i] = ((uint64_t *)&uc->uc_mcontext.fp_regs)[i];
- 
--    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+    out->float_save.fpscr = ((uint64_t *)&uc->uc_mcontext.fp_regs)[ELF_NFPREG-1];
- 
-     for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-         out->vector_save.save_vr[i] =
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 index 5a7ab50c..ee8b858c 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
@@ -145,31 +66,6 @@ index 5a7ab50c..ee8b858c 100644
  namespace google_breakpad {
  
  namespace {
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 8e335a09..b2a0f155 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -469,7 +469,7 @@ struct MContext64 {
-   SignalThreadContext64 gp_regs;
-   SignalFloatContext64  fp_regs;
-   SignalVectorContext64 *v_regs;
--  int64_t vmx_reserve[69];
-+  int64_t vmx_reserve[101];
- };
- 
- struct ContextTraits64 : public Traits64 {
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index dea0d1f3..b203e5b2 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -30,6 +30,7 @@
- 
- #if defined(ARCH_CPU_PPC64_FAMILY)
- #include <sys/ucontext.h>
-+#include <asm/ptrace.h>
- #endif
- 
- namespace crashpad {
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
 index 9955ce44..4c1cc488 100644
 --- third_party/lss/linux_syscall_support.h
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
index a31a9f6a5e9..b30bbc02cb6 100644
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ b/srcpkgs/chromium/patches/sandbox-membarrier.patch
@@ -1,56 +1,6 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
+--- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig	2021-03-03 18:04:45.167674791 +0100
++++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc	2021-03-03 18:13:17.036547592 +0100
+@@ -394,11 +394,12 @@
    switch (sysno) {
      case __NR_exit:
      case __NR_exit_group:
@@ -58,3 +8,8 @@
      case __NR_wait4:
      case __NR_waitid:
  #if defined(__i386__)
+     case __NR_waitpid:
+ #endif
+       return true;
+     case __NR_clone:  // Should be parameter-restricted.
+     case __NR_setns:  // Privileged.
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
deleted file mode 100644
index 805755c2125..00000000000
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ /dev/null
@@ -1,3656 +0,0 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
-
-    ppc64le support
-
-diff --git build/download_nacl_toolchains.py build/download_nacl_toolchains.py
-index 286a92a27..ec36a85d3 100755
---- build/download_nacl_toolchains.py
-+++ build/download_nacl_toolchains.py
-@@ -13,6 +13,10 @@ import sys
- 
- 
- def Main(args):
-+  # If `disable_nacl=1` is in GYP_DEFINES, exit
-+  if 'disable_nacl=1' in os.environ.get('GYP_DEFINES', ''):
-+    return 0
-+
-   script_dir = os.path.dirname(os.path.abspath(__file__))
-   src_dir = os.path.dirname(script_dir)
-   nacl_dir = os.path.join(src_dir, 'native_client')
-diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
---- chrome/installer/linux/BUILD.gn
-+++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
-                     "$root_out_dir/xdg-mime",
-                     "$root_out_dir/xdg-settings",
-                     "$root_out_dir/locales/en-US.pak",
--                    "$root_out_dir/MEIPreload/manifest.json",
--                    "$root_out_dir/MEIPreload/preloaded_data.pb",
-                   ]
- 
- action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
-     ":theme_files",
-     "//chrome",
-     "//chrome:packed_resources",
--    "//chrome/browser/resources/media/mei_preload:component",
-     "//sandbox/linux:chrome_sandbox",
-     "//third_party/crashpad/crashpad/handler:crashpad_handler",
-   ]
-diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
---- sandbox/features.gni
-+++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
-                   (current_cpu == "x86" || current_cpu == "x64" ||
-                    current_cpu == "arm" || current_cpu == "arm64" ||
--                   current_cpu == "mipsel" || current_cpu == "mips64el")
-+                   current_cpu == "mipsel" || current_cpu == "mips64el" ||
-+                   current_cpu == "ppc64")
- 
- use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
-diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
---- sandbox/linux/BUILD.gn
-+++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
- 
- source_set("sandbox_services_headers") {
-   sources = [
-+    "system_headers/ppc64_linux_syscalls.h",
-+    "system_headers/ppc64_linux_ucontext.h",
-     "system_headers/arm64_linux_syscalls.h",
-     "system_headers/arm_linux_syscalls.h",
-     "system_headers/arm_linux_ucontext.h",
-diff --git sandbox/linux/bpf_dsl/linux_syscall_ranges.h sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-index 313511f22..0ca3a326f 100644
---- sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-+++ sandbox/linux/bpf_dsl/linux_syscall_ranges.h
-@@ -56,6 +56,13 @@
- #define MAX_PUBLIC_SYSCALL __NR_syscalls
- #define MAX_SYSCALL MAX_PUBLIC_SYSCALL
- 
-+#elif defined(__powerpc64__)
-+
-+#include <asm/unistd.h>
-+#define MIN_SYSCALL 0u
-+#define MAX_PUBLIC_SYSCALL 386u
-+#define MAX_SYSCALL MAX_PUBLIC_SYSCALL
-+
- #else
- #error "Unsupported architecture"
- #endif
-diff --git sandbox/linux/bpf_dsl/seccomp_macros.h sandbox/linux/bpf_dsl/seccomp_macros.h
-index 1a407b952..a6aec544e 100644
---- sandbox/linux/bpf_dsl/seccomp_macros.h
-+++ sandbox/linux/bpf_dsl/seccomp_macros.h
-@@ -16,6 +16,9 @@
- #if defined(__mips__)
- // sys/user.h in eglibc misses size_t definition
- #include <stddef.h>
-+#elif defined(__powerpc64__)
-+// Manually define greg_t on ppc64
-+typedef unsigned long long greg_t;
- #endif
- #endif
- 
-@@ -346,6 +349,51 @@ struct regs_struct {
- #define SECCOMP_PT_PARM4(_regs) (_regs).regs[3]
- #define SECCOMP_PT_PARM5(_regs) (_regs).regs[4]
- #define SECCOMP_PT_PARM6(_regs) (_regs).regs[5]
-+
-+#elif defined(__powerpc64__)
-+#include <asm/ptrace.h>
-+
-+typedef struct pt_regs regs_struct;
-+
-+#ifdef ARCH_CPU_LITTLE_ENDIAN
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64LE
-+#else
-+#define SECCOMP_ARCH AUDIT_ARCH_PPC64
-+#endif
-+
-+#define SECCOMP_REG(_ctx, _reg) ((_ctx)->uc_mcontext.regs->gpr[_reg])
-+
-+#define SECCOMP_RESULT(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_SYSCALL(_ctx) SECCOMP_REG(_ctx, 0)
-+#define SECCOMP_IP(_ctx) (_ctx)->uc_mcontext.regs->nip
-+#define SECCOMP_PARM1(_ctx) SECCOMP_REG(_ctx, 3)
-+#define SECCOMP_PARM2(_ctx) SECCOMP_REG(_ctx, 4)
-+#define SECCOMP_PARM3(_ctx) SECCOMP_REG(_ctx, 5)
-+#define SECCOMP_PARM4(_ctx) SECCOMP_REG(_ctx, 6)
-+#define SECCOMP_PARM5(_ctx) SECCOMP_REG(_ctx, 7)
-+#define SECCOMP_PARM6(_ctx) SECCOMP_REG(_ctx, 8)
-+
-+#define SECCOMP_NR_IDX (offsetof(struct arch_seccomp_data, nr))
-+#define SECCOMP_ARCH_IDX (offsetof(struct arch_seccomp_data, arch))
-+#define SECCOMP_IP_MSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 4)
-+#define SECCOMP_IP_LSB_IDX \
-+  (offsetof(struct arch_seccomp_data, instruction_pointer) + 0)
-+#define SECCOMP_ARG_MSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 4)
-+#define SECCOMP_ARG_LSB_IDX(nr) \
-+  (offsetof(struct arch_seccomp_data, args) + 8 * (nr) + 0)
-+
-+#define SECCOMP_PT_RESULT(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_SYSCALL(_regs) (_regs).gpr[0]
-+#define SECCOMP_PT_IP(_regs) (_regs).nip
-+#define SECCOMP_PT_PARM1(_regs) (_regs).gpr[3]
-+#define SECCOMP_PT_PARM2(_regs) (_regs).gpr[4]
-+#define SECCOMP_PT_PARM3(_regs) (_regs).gpr[5]
-+#define SECCOMP_PT_PARM4(_regs) (_regs).gpr[6]
-+#define SECCOMP_PT_PARM5(_regs) (_regs).gpr[7]
-+#define SECCOMP_PT_PARM6(_regs) (_regs).gpr[8]
-+
- #else
- #error Unsupported target platform
- 
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-@@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
-          SyscallSets::IsPrctl(sysno) ||
-          SyscallSets::IsProcessGroupOrSession(sysno) ||
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-          SyscallSets::IsSocketCall(sysno) ||
- #endif
- #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_mmap)
-     return RestrictMmapFlags();
- #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-     return RestrictPrctl();
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   if (sysno == __NR_socketpair) {
-     // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
-     static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
-   }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   if (SyscallSets::IsSocketCall(sysno))
-     return RestrictSocketcallCommand();
- #endif
-diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
- TEST_BASELINE_SIGSYS(__NR_eventfd)
- TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
- TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-@@ -40,7 +40,8 @@
- #include <sys/ptrace.h>
- #if (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \
-     !defined(__arm__) && !defined(__aarch64__) &&           \
--    !defined(PTRACE_GET_THREAD_AREA)
-+    !defined(PTRACE_GET_THREAD_AREA) &&			    \
-+    !defined(__powerpc64__)
- // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance
- // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA.
- // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't
-@@ -49,6 +50,11 @@
- #endif
- #endif  // !OS_NACL_NONSFI
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- #if defined(OS_ANDROID)
- 
- #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
- #endif
- }
- 
-+inline bool IsArchitecturePPC64() {
-+#if defined(__powerpc64__)
-+  return true;
-+#else
-+  return false;
-+#endif
-+}
-+
-+
- // Ubuntu's version of glibc has a race condition in sem_post that can cause
- // it to call futex(2) with bogus op arguments. To workaround this, we need
- // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
-   uint64_t kOLargeFileFlag = O_LARGEFILE;
-   if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
-     kOLargeFileFlag = 0100000;
-+  else if (IsArchitecturePPC64())
-+    kOLargeFileFlag = 0200000;
- 
-   const Arg<int> cmd(1);
-   const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
-               F_SETLKW,
-               F_GETLK,
-               F_DUPFD,
--              F_DUPFD_CLOEXEC),
--             Allow())
-+              F_DUPFD_CLOEXEC
-+#if defined(__powerpc64__)
-+// On PPC64, F_SETLK, F_GETLK, F_SETLKW are defined as the 64-bit variants
-+// but glibc will sometimes still use the 32-bit versions. Allow both.
-+              ,
-+              5, /* F_GETLK (32) */
-+              6, /* F_SETLK (32) */
-+              7  /* F_SETLKW (32) */
-+#endif
-+              ),
-+            Allow())
-       .Case(F_SETFL,
-             If((long_arg & ~kAllowedMask) == 0, Allow()).Else(CrashSIGSYS()))
-       .Default(CrashSIGSYS());
- }
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- ResultExpr RestrictSocketcallCommand() {
-   // Unfortunately, we are unable to restrict the first parameter to
-   // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
- #endif
-   return Switch(request)
-       .CASES((
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-                  PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
-                  PTRACE_GETREGSET,
- #endif
-
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-index ba4289f05..9a4d5ab2d 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
-@@ -48,7 +48,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictMprotectFlags();
- // O_NONBLOCK | O_SYNC | O_LARGEFILE | O_CLOEXEC | O_NOATIME.
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictFcntlCommands();
- 
--#if defined(__i386__) || defined(__mips__)
-+#if defined(__i386__) || defined(__mips__) || defined(__powerpc64__)
- // Restrict socketcall(2) to only allow socketpair(2), send(2), recv(2),
- // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
- SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-   switch (sysno) {
-     case __NR_gettimeofday:
- #if defined(__i386__) || defined(__x86_64__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_time:
- #endif
-       return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
-     case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
-     case __NR_clock_settime:    // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ftime:  // Obsolete.
- #endif
-     case __NR_settimeofday:  // Privileged.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stime:
- #endif
-     default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_faccessat:  // EPERM not a valid errno.
-     case __NR_fchmodat:
-     case __NR_fchownat:  // Should be called chownat ?
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
- #elif defined(__i386__) || defined(__arm__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_memfd_create:
-     case __NR_mkdirat:
-     case __NR_mknodat:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldlstat:
-     case __NR_oldstat:
- #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
- #endif
-     case __NR_statfs:  // EPERM not a valid errno.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_statfs64:
- #endif
-     case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
-     case __NR_truncate64:
- #endif
-     case __NR_unlinkat:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_utime:
- #endif
-     case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
- #endif
-       return true;
- // TODO(jln): these should be denied gracefully as well (moved below).
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_fadvise64:  // EPERM not a valid errno.
- #endif
- #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_flock:      // EPERM not a valid errno.
-     case __NR_fstatfs:    // Give information about the whole filesystem.
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_fstatfs64:
- #endif
-     case __NR_fsync:  // EPERM not a valid errno.
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_oldfstat:
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
-     case __NR_sync_file_range:  // EPERM not a valid errno.
- #elif defined(__arm__)
-     case __NR_arm_sync_file_range:  // EPERM not a valid errno.
-+#elif defined(__powerpc64__)
-+    case __NR_sync_file_range2: // EPERM not a valid errno.
- #endif
-     default:
-       return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
- #endif
-     case __NR_getdents64:  // EPERM not a valid errno.
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_readdir:
- #endif
-       return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
- bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
-   switch (sysno) {
-     case __NR_capset:
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_ioperm:  // Intel privilege.
-     case __NR_iopl:    // Intel privilege.
- #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
-     case __NR_rt_sigreturn:
-     case __NR_rt_sigtimedwait:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigaction:
-     case __NR_sigprocmask:
-     case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
- #endif
-     case __NR_signalfd4:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_sigpending:
-     case __NR_sigsuspend:
- #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
- #endif
-     case __NR_dup3:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_shutdown:
- #endif
-       return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
-     case __NR_membarrier:
-     case __NR_wait4:
-     case __NR_waitid:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_waitpid:
- #endif
-       return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
- #endif
-     case __NR_set_tid_address:
-     case __NR_unshare:
--#if !defined(__mips__) && !defined(__aarch64__)
-+#if !defined(__mips__) && !defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_vfork:
- #endif
-     default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
-       return true;
-     default:
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_socketpair:  // We will want to inspect its argument.
- #endif
-       return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
- bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
-   switch (sysno) {
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_accept:
-     case __NR_accept4:
-     case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
- }
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big multiplexing system call for sockets.
- bool SyscallSets::IsSocketCall(int sysno) {
-   switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
- }
- #endif
- 
--#if defined(__x86_64__) || defined(__arm__) || defined(__mips__)
-+#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
-+    defined(__powerpc64__)
- bool SyscallSets::IsNetworkSocketInformation(int sysno) {
-   switch (sysno) {
-     case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
-     case __NR_mincore:
-     case __NR_mlockall:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_mmap:
- #endif
- #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-   switch (sysno) {
-     case __NR_lseek:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR__llseek:
- #endif
- #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
-     case __NR_readv:
-     case __NR_pread64:
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_recv:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_recvfrom:  // Could specify source.
-     case __NR_recvmsg:   // Could specify source.
- #endif
--#if defined(__i386__) || defined(__x86_64__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_select:
- #endif
--#if defined(__i386__) || defined(__arm__) || defined(__mips__)
-+#if defined(__i386__) || defined(__arm__) || defined(__mips__) || defined(__powerpc64__)
-     case __NR__newselect:
- #endif
- #if defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_send:
- #endif
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_sendmsg:  // Could specify destination.
-     case __NR_sendto:   // Could specify destination.
- #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
-       return true;
-     case __NR_getpriority:
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_nice:
- #endif
-     case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
- bool SyscallSets::IsAdminOperation(int sysno) {
-   switch (sysno) {
- #if defined(__i386__) || defined(__arm__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_bdflush:
- #endif
-     case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
- 
- bool SyscallSets::IsKernelModule(int sysno) {
-   switch (sysno) {
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_create_module:
-     case __NR_get_kernel_syms:  // Should ENOSYS.
-     case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
-     case __NR_swapoff:
-     case __NR_swapon:
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_umount:
- #endif
-     case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
-     case __NR_getcpu:
-     case __NR_mbind:
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_migrate_pages:
- #endif
-     case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
-   switch (sysno) {
-     case __NR_acct:  // Privileged.
- #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_getrlimit:
- #endif
--#if defined(__i386__) || defined(__arm__)
-+#if defined(__i386__) || defined(__arm__) || defined(__powerpc64__)
-     case __NR_ugetrlimit:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_ulimit:
- #endif
-     case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
- #endif
-     case __NR_sysinfo:
-     case __NR_uname:
--#if defined(__i386__)
-+#if defined(__i386__) || defined(__powerpc64__)
-     case __NR_olduname:
-     case __NR_oldolduname:
- #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
- }
- #endif
- 
-+/* shitty hack around Void's 4.19 kernel headers missing those numbers */
-+#if defined(__powerpc64__) && !defined(__NR_shmget)
-+#define __NR_shmget 395
-+#define __NR_shmctl 396
-+#define __NR_shmat 397
-+#define __NR_shmdt 398
-+#endif
-+
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
- // These give a lot of ambient authority and bypass the setuid sandbox.
- bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
- // Big system V multiplexing system call.
- bool SyscallSets::IsSystemVIpc(int sysno) {
-   switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
-   return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
-          IsSystemVSharedMemory(sysno);
- #elif defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   return IsSystemVIpc(sysno);
- #endif
- }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
- bool SyscallSets::IsTimer(int sysno) {
-   switch (sysno) {
-     case __NR_getitimer:
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_alarm:
- #endif
-     case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_syncfs:
-     case __NR_vhangup:
- // The system calls below are not implemented.
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_afs_syscall:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_break:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_getpmsg:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_gtty:
-     case __NR_idle:
-     case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
-     case __NR_prof:
-     case __NR_profil:
- #endif
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-+    defined(__powerpc64__)
-     case __NR_putpmsg:
- #endif
- #if defined(__x86_64__)
-     case __NR_security:
- #endif
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-     case __NR_stty:
- #endif
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
-     case __NR_tuxcall:
- #endif
--#if !defined(__aarch64__)
-+#if !defined(__aarch64__) && !defined(__powerpc64__)
-     case __NR_vserver:
- #endif
-       return true;
-diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.h sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-index 923533ec9..411f72acd 100644
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.h
-@@ -43,13 +43,14 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsDeniedGetOrModifySocket(int sysno);
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big multiplexing system call for sockets.
-   static bool IsSocketCall(int sysno);
- #endif
- 
- #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
-   static bool IsNetworkSocketInformation(int sysno);
- #endif
- 
-@@ -76,7 +77,7 @@ class SANDBOX_EXPORT SyscallSets {
-   static bool IsSystemVSemaphores(int sysno);
- #endif
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__) ||                                         \
-+    defined(__aarch64__) || defined(__powerpc64__) || \
-     (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
-   // These give a lot of ambient authority and bypass the setuid sandbox.
-   static bool IsSystemVSharedMemory(int sysno);
-@@ -88,7 +89,8 @@ class SANDBOX_EXPORT SyscallSets {
- #endif
- 
- #if defined(__i386__) || \
--    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-+    (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) || \
-+    defined(__powerpc64__)
-   // Big system V multiplexing system call.
-   static bool IsSystemVIpc(int sysno);
- #endif
-diff --git sandbox/linux/seccomp-bpf/syscall.cc sandbox/linux/seccomp-bpf/syscall.cc
-index e47e98bf5..d53a7ff56 100644
---- sandbox/linux/seccomp-bpf/syscall.cc
-+++ sandbox/linux/seccomp-bpf/syscall.cc
-@@ -18,7 +18,7 @@ namespace sandbox {
- namespace {
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined (ARCH_CPU_PPC64_FAMILY)
- // Number that's not currently used by any Linux kernel ABIs.
- const int kInvalidSyscallNumber = 0x351d3;
- #else
-@@ -310,12 +310,56 @@ asm(// We need to be able to tell the kernel exactly where we made a
-     // Enter the kernel
-     "svc 0\n"
-     "2:ret\n"
-+    ".cfi_endproc\n"
-+    ".size SyscallAsm, .-SyscallAsm\n"
-+#elif defined(__powerpc64__)
-+    ".text\n"
-+    ".align 4\n"
-+    ".type SyscallAsm @function\n"
-+    "SyscallAsm:\n"
-+    ".cfi_startproc\n"
-+
-+    // Check if r3 is negative
-+    "cmpdi 3, 0\n"
-+    "bgt 2f\n"
-+
-+    // Load address of 3f into r3 and return
-+    "mflr 10\n"
-+    "bl 1f\n"
-+    "1: mflr 3\n"
-+    "mtlr 10\n"
-+    "addi 3, 3, 4*13\n"
-+    "blr\n"
-+
-+    // Load arguments from array into r3-8
-+    // save param 3 in r10
-+    "2:\n"
-+    "mr 0, 3\n"
-+    "ld 3, 0(4)\n"
-+    "ld 5, 16(4)\n"
-+    "ld 6, 24(4)\n"
-+    "ld 7, 32(4)\n"
-+    "ld 8, 40(4)\n"
-+    "ld 4, 8(4)\n"
-+    "li 9, 0\n"
-+
-+    // Enter kernel
-+    "sc\n"
-+
-+    // Magic return address
-+    "3:\n"
-+    // Like MIPS, ppc64 return values are always positive.
-+    // Check for error in cr0.SO and negate upon error
-+    "bc 4, 3, 4f\n"
-+    "neg 3, 3\n"
-+    "4: blr\n"
-+
-     ".cfi_endproc\n"
-     ".size SyscallAsm, .-SyscallAsm\n"
- #endif
-     );  // asm
- 
--#if defined(__x86_64__)
-+#if defined(__x86_64__) || defined(__powerpc64__)
- extern "C" {
- intptr_t SyscallAsm(intptr_t nr, const intptr_t args[6]);
- }
-@@ -429,6 +473,8 @@ intptr_t Syscall::Call(int nr,
-     ret = inout;
-   }
- 
-+#elif defined(__powerpc64__)
-+  intptr_t ret = SyscallAsm(nr, args);
- #else
- #error "Unimplemented architecture"
- #endif
-@@ -445,8 +491,18 @@ void Syscall::PutValueInUcontext(intptr_t ret_val, ucontext_t* ctx) {
-     // needs to be changed back.
-     ret_val = -ret_val;
-     SECCOMP_PARM4(ctx) = 1;
--  } else
-+  } else {
-     SECCOMP_PARM4(ctx) = 0;
-+  }
-+#endif
-+#if defined(__powerpc64__)
-+  // Same as MIPS, need to invert ret and set error register (cr0.SO)
-+  if (ret_val <= -1 && ret_val >= -4095) {
-+    ret_val = -ret_val;
-+    ctx->uc_mcontext.regs->ccr |= (1 << 28);
-+  } else {
-+    ctx->uc_mcontext.regs->ccr &= ~(1 << 28);
-+  }
- #endif
-   SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
- }
-diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
---- sandbox/linux/seccomp-bpf/trap.cc
-+++ sandbox/linux/seccomp-bpf/trap.cc
-@@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
-       SetIsInSigHandler();
-     }
- 
-+#if defined(__powerpc64__)
-+    // On ppc64+glibc, some syscalls seem to accidentally negate the first
-+    // parameter which causes checks against it to fail. For now, manually
-+    // negate them back.
-+    // TODO(shawn@anastas.io): investigate this issue further
-+    auto nr = SECCOMP_SYSCALL(ctx);
-+    if (nr == __NR_openat || nr == __NR_mkdirat || nr == __NR_faccessat || nr == __NR_readlinkat ||
-+        nr == __NR_renameat || nr == __NR_renameat2 || nr == __NR_newfstatat || nr == __NR_unlinkat) {
-+        if (static_cast<int>(SECCOMP_PARM1(ctx)) > 0) {
-+            SECCOMP_PARM1(ctx) = -SECCOMP_PARM1(ctx);
-+        }
-+    }
-+#endif
-+
-     // Copy the seccomp-specific data into a arch_seccomp_data structure. This
-     // is what we are showing to TrapFnc callbacks that the system call
-     // evaluator registered with the sandbox.
-diff --git sandbox/linux/services/credentials.cc sandbox/linux/services/credentials.cc
-index d7b5d8c44..4adc6d0d4 100644
---- sandbox/linux/services/credentials.cc
-+++ sandbox/linux/services/credentials.cc
-@@ -81,7 +81,7 @@ bool ChrootToSafeEmptyDir() {
-   pid_t pid = -1;
-   alignas(16) char stack_buf[PTHREAD_STACK_MIN];
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // The stack grows downward.
-   void* stack = stack_buf + sizeof(stack_buf);
- #else
-diff --git sandbox/linux/services/syscall_wrappers.cc sandbox/linux/services/syscall_wrappers.cc
-index fcfd2aa12..f6eb32fb7 100644
---- sandbox/linux/services/syscall_wrappers.cc
-+++ sandbox/linux/services/syscall_wrappers.cc
-@@ -58,7 +58,7 @@ long sys_clone(unsigned long flags,
- #if defined(ARCH_CPU_X86_64)
-   return syscall(__NR_clone, flags, child_stack, ptid, ctid, tls);
- #elif defined(ARCH_CPU_X86) || defined(ARCH_CPU_ARM_FAMILY) || \
--    defined(ARCH_CPU_MIPS_FAMILY)
-+    defined(ARCH_CPU_MIPS_FAMILY) || defined(ARCH_CPU_PPC64_FAMILY)
-   // CONFIG_CLONE_BACKWARDS defined.
-   return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
- #endif
-diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
---- sandbox/linux/syscall_broker/broker_process.cc
-+++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
- #endif
--#if defined(__x86_64__) || defined(__aarch64__)
-+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
-     case __NR_newfstatat:
- #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
-diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
---- sandbox/linux/system_headers/linux_seccomp.h
-+++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
- #ifndef EM_AARCH64
- #define EM_AARCH64 183
- #endif
-+#ifndef EM_PPC64
-+#define EM_PPC64 21
-+#endif
- 
- #ifndef __AUDIT_ARCH_64BIT
- #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
- #ifndef AUDIT_ARCH_AARCH64
- #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
- #endif
-+#ifndef AUDIT_ARCH_PPC64
-+#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
-+#endif
-+#ifndef AUDIT_ARCH_PPC64LE
-+#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-+#endif
- 
- // For prctl.h
- #ifndef PR_SET_SECCOMP
-diff --git sandbox/linux/system_headers/linux_signal.h sandbox/linux/system_headers/linux_signal.h
-index f5a736761..515b21a5f 100644
---- sandbox/linux/system_headers/linux_signal.h
-+++ sandbox/linux/system_headers/linux_signal.h
-@@ -13,7 +13,7 @@
- // (not undefined, but defined different values and in different memory
- // layouts). So, fill the gap here.
- #if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
--    defined(__aarch64__)
-+    defined(__aarch64__) || defined(__powerpc64__)
- 
- #define LINUX_SIGHUP 1
- #define LINUX_SIGINT 2
-diff --git sandbox/linux/system_headers/linux_syscalls.h sandbox/linux/system_headers/linux_syscalls.h
-index 2b78a0cc3..0a70f5ea5 100644
---- sandbox/linux/system_headers/linux_syscalls.h
-+++ sandbox/linux/system_headers/linux_syscalls.h
-@@ -35,5 +35,9 @@
- #include "sandbox/linux/system_headers/arm64_linux_syscalls.h"
- #endif
- 
-+#if defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_syscalls.h"
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_LINUX_SYSCALLS_H_
- 
-diff --git sandbox/linux/system_headers/linux_ucontext.h sandbox/linux/system_headers/linux_ucontext.h
-index 22ce78027..a69b024c2 100644
---- sandbox/linux/system_headers/linux_ucontext.h
-+++ sandbox/linux/system_headers/linux_ucontext.h
-@@ -11,6 +11,8 @@
- #include "sandbox/linux/system_headers/arm_linux_ucontext.h"
- #elif defined(__i386__)
- #include "sandbox/linux/system_headers/i386_linux_ucontext.h"
-+#elif defined(__powerpc64__)
-+#include "sandbox/linux/system_headers/ppc64_linux_ucontext.h"
- #else
- #error "No support for your architecture in PNaCl header"
- #endif
-diff --git sandbox/linux/system_headers/ppc64_linux_syscalls.h sandbox/linux/system_headers/ppc64_linux_syscalls.h
-new file mode 100644
-index 000000000..ccacffe22
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_syscalls.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-+
-+#include <asm/unistd.h>
-+
-+//TODO: is it necessary to redefine syscall numbers for PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_SYSCALLS_H_
-diff --git sandbox/linux/system_headers/ppc64_linux_ucontext.h sandbox/linux/system_headers/ppc64_linux_ucontext.h
-new file mode 100644
-index 000000000..07728e087
---- /dev/null
-+++ sandbox/linux/system_headers/ppc64_linux_ucontext.h
-@@ -0,0 +1,12 @@
-+// Copyright 2014 The Chromium Authors. All rights reserved.
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+#define SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-+
-+#include <sys/ucontext.h>
-+
-+//TODO: is it necessary to redefine ucontext on PPC64?
-+
-+#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
---- sandbox/policy/linux/bpf_renderer_policy_linux.cc
-+++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -15,6 +15,11 @@
- #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
- 
-+// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
-+#ifdef __powerpc64__
-+#include <termios.h>
-+#endif
-+
- // TODO(vignatti): replace the local definitions below with #include
- // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
- #include <linux/types.h>
-diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
---- third_party/angle/src/compiler/translator/InfoSink.h
-+++ third_party/angle/src/compiler/translator/InfoSink.h
-@@ -92,7 +92,16 @@ class TInfoSinkBase
-             stream.precision(8);
-             stream << f;
-         }
--        sink.append(stream.str());
-+
-+        // Hack to work around a bug where negative floating point values
-+        // are rendered like '.0.5' instead of '-0.5'
-+        std::string res(stream.str());
-+
-+        if (signbit(f)) { // test if f is negative
-+            res[0] = '-';
-+        }
-+
-+        sink.append(res);
-         return *this;
-     }
-     // Write boolean values as their names instead of integral value.
-diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
---- third_party/angle/src/libANGLE/Constants.h
-+++ third_party/angle/src/libANGLE/Constants.h
-@@ -9,6 +9,7 @@
- #ifndef LIBANGLE_CONSTANTS_H_
- #define LIBANGLE_CONSTANTS_H_
- 
-+#include <cstddef>
- #include "common/platform.h"
- 
- #include <stdint.h>
-diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
---- third_party/boringssl/BUILD.gn
-+++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
-       } else {
-         public_configs = [ ":no_asm_config" ]
-       }
-+    } else if (current_cpu == "ppc64") {
-+      if (is_linux) {
-+        # TODO: ppc64 (be) check
-+        sources += crypto_sources_linux_ppc64le
-+      } else {
-+        public_configs = [ ":no_asm_config" ]
-+      }
-     } else {
-       public_configs = [ ":no_asm_config" ]
-     }
-diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
---- third_party/breakpad/BUILD.gn
-+++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/minidump_file_writer.h",
-       "breakpad/src/common/convert_UTF.cc",
-       "breakpad/src/common/convert_UTF.h",
--      "breakpad/src/common/linux/breakpad_getcontext.S",
-       "breakpad/src/common/linux/elf_core_dump.cc",
-       "breakpad/src/common/linux/elf_core_dump.h",
-       "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
- 
-     libs = [ "dl" ]
- 
-+    if (current_cpu == "ppc64") {
-+        defines = [ "HAVE_GETCONTEXT" ]
-+    } else {
-+        sources += [
-+            "breakpad/src/common/linux/breakpad_getcontext.S"
-+        ]
-+    }
-+
-     include_dirs = [
-       ".",
-       "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
-       "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
-       "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
--      "breakpad/src/common/linux/breakpad_getcontext_unittest.cc",
-       "breakpad/src/common/linux/elf_core_dump_unittest.cc",
-       "breakpad/src/common/linux/file_id_unittest.cc",
-       "breakpad/src/common/linux/linux_libc_support_unittest.cc",
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-@@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
- typedef MDRawContextARM64_Old RawContextCPU;
- #elif defined(__mips__)
- typedef MDRawContextMIPS RawContextCPU;
-+#elif defined(__powerpc64__)
-+typedef MDRawContextPPC64 RawContextCPU;
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-@@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-   out->float_save.fir = mcontext.fpc_eir;
- #endif
- }
--#endif  // __mips__
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t ThreadInfo::GetInstructionPointer() const {
-+    return mcontext.gp_regs[PT_NIP];
-+}
-+
-+void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = mcontext.gp_regs[i];
-+
-+    out->lr = mcontext.gp_regs[PT_LNK];
-+    out->srr0 = mcontext.gp_regs[PT_NIP];
-+    out->srr1 = mcontext.gp_regs[PT_MSR];
-+    out->cr = mcontext.gp_regs[PT_CCR];
-+    out->xer = mcontext.gp_regs[PT_XER];
-+    out->ctr = mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] = \
-+            {(((uint64_t)vregs.vrregs[i][0]) << 32) 
-+                          | vregs.vrregs[i][1], 
-+            (((uint64_t)vregs.vrregs[i][2]) << 32)
-+                         | vregs.vrregs[i][3]};
-+
-+    out->vrsave = vregs.vrsave;
-+    out->vector_save.save_vscr = {0, vregs.vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+#endif  // __powerpc64__
- 
- void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-   assert(gp_regs || size);
-@@ -279,6 +314,11 @@ void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
-     *gp_regs = mcontext.gregs;
-   if (size)
-     *size = sizeof(mcontext.gregs);
-+#elif defined(__powerpc64__)
-+  if (gp_regs)
-+    *gp_regs = mcontext.gp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.gp_regs);
- #else
-   if (gp_regs)
-     *gp_regs = &regs;
-@@ -294,6 +334,11 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
-     *fp_regs = &mcontext.fpregs;
-   if (size)
-     *size = sizeof(mcontext.fpregs);
-+#elif defined(__powerpc64__)
-+  if (fp_regs)
-+    *fp_regs = &mcontext.fp_regs;
-+  if (size)
-+    *size = sizeof(mcontext.fp_regs);
- #else
-   if (fp_regs)
-     *fp_regs = &fpregs;
-@@ -302,4 +347,13 @@ void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
- #endif
- }
- 
-+#if defined(__powerpc64__)
-+void ThreadInfo::GetVectorRegisters(void** v_regs, size_t* size) {
-+    if (v_regs)
-+        *v_regs = &vregs;
-+    if (size)
-+        *size = sizeof(vregs);
-+}
-+#endif
-+
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-@@ -68,6 +68,10 @@ struct ThreadInfo {
-   // Use the structures defined in <sys/user.h>
-   struct user_regs_struct regs;
-   struct user_fpsimd_struct fpregs;
-+#elif defined(__powerpc64__)
-+  // Use the structures defined in <sys/ucontext.h>.
-+  mcontext_t mcontext;
-+  vrregset_t vregs;
- #elif defined(__mips__)
-   // Use the structure defined in <sys/ucontext.h>.
-   mcontext_t mcontext;
-@@ -84,6 +88,11 @@ struct ThreadInfo {
- 
-   // Returns the pointer and size of float point register area.
-   void GetFloatingPointRegisters(void** fp_regs, size_t* size);
-+
-+#if defined(__powerpc64__)
-+  // Returns the pointer and size of the vector register area. (PPC64 only)
-+  void GetVectorRegisters(void** v_regs, size_t* size);
-+#endif
- };
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
-   out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
- #endif
- }
-+
-+#elif defined(__powerpc64__)
-+
-+uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP];
-+}
-+
-+uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
-+    return uc->uc_mcontext.gp_regs[PT_NIP];
-+}
-+
-+void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
-+                                    const vrregset_t* vregs) {
-+    out->context_flags = MD_CONTEXT_PPC64_FULL;
-+
-+    for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+        out->gpr[i] = uc->uc_mcontext.gp_regs[i];
-+
-+    out->lr = uc->uc_mcontext.gp_regs[PT_LNK];    
-+    out->srr0 = uc->uc_mcontext.gp_regs[PT_NIP];
-+    out->srr1 = uc->uc_mcontext.gp_regs[PT_MSR];
-+    out->cr = uc->uc_mcontext.gp_regs[PT_CCR];
-+    out->xer = uc->uc_mcontext.gp_regs[PT_XER];
-+    out->ctr = uc->uc_mcontext.gp_regs[PT_CTR];
-+    
-+    for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+        out->float_save.fpregs[i] = uc->uc_mcontext.fp_regs[i];
-+
-+    out->float_save.fpscr = uc->uc_mcontext.fp_regs[NFPREG-1];
-+
-+    for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++)
-+        out->vector_save.save_vr[i] =
-+            {(((uint64_t)vregs->vrregs[i][0]) << 32) 
-+                         | vregs->vrregs[i][1], 
-+             (((uint64_t)vregs->vrregs[i][2]) << 32)
-+                         | vregs->vrregs[i][3]};
-+
-+    out->vrsave = vregs->vrsave;
-+    out->vector_save.save_vscr = {0, vregs->vscr.vscr_word};
-+    out->vector_save.save_vrvalid = 0xFFFFFFFF; 
-+}
-+
- #endif
- 
- }  // namespace google_breakpad
-diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
---- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-+++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -55,6 +55,9 @@ struct UContextReader {
- #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-                              const struct fpsimd_context* fpregs);
-+#elif defined(__powerpc64__)
-+  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
-+                             const vrregset_t* vregs);
- #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-@@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
-     memcpy(&g_crash_context_.float_state, fp_ptr,
-            sizeof(g_crash_context_.float_state));
-   }
-+#elif defined(__powerpc64__)
-+  // On PPC64, we must copy VR state
-+  ucontext_t* uc_ptr = (ucontext_t*)uc;
-+  if (uc_ptr->uc_mcontext.v_regs) {
-+    memcpy(&g_crash_context_.vector_state, uc_ptr->uc_mcontext.v_regs,
-+           sizeof(g_crash_context_.vector_state));
-+  }
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
-   // FP state is not part of user ABI on ARM Linux.
--  // In case of MIPS Linux FP state is already part of ucontext_t
-+  // In case of MIPS, Linux FP state is already part of ucontext_t
-   // and 'float_state' is not a member of CrashContext.
-   ucontext_t* uc_ptr = (ucontext_t*)uc;
-   if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
-   }
- #endif
- 
--#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__)
-+#if !defined(__ARM_EABI__) && !defined(__aarch64__) && !defined(__mips__) \
-+    && !defined(__powerpc64__)
-   // FPU state is not part of ARM EABI ucontext_t.
-   memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
-          sizeof(context.float_state));
- #endif
-+
-+#if defined(__powerpc64__)
-+  // Vector registers must be copied on PPC64
-+  memcpy(&context.vector_state, context.context.uc_mcontext.v_regs,
-+         sizeof(context.vector_state));
-+#endif
-+
-   context.tid = sys_gettid();
- 
-   // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
- #elif defined(__mips__)
-   context.siginfo.si_addr =
-       reinterpret_cast<void*>(context.context.uc_mcontext.pc);
-+#elif defined(__powerpc64__)
-+  context.siginfo.si_addr =
-+      reinterpret_cast<void*>(context.context.uc_mcontext.gp_regs[PT_NIP]);
- #else
- #error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-@@ -192,7 +192,11 @@ class ExceptionHandler {
-     siginfo_t siginfo;
-     pid_t tid;  // the crashing thread.
-     ucontext_t context;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    // PPC64's FP state is a part of ucontext_t like MIPS but the vector
-+    // state is not, so a struct is needed.
-+    vstate_t vector_state;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     // #ifdef this out because FP state is not part of user ABI for Linux ARM.
-     // In case of MIPS Linux FP state is already part of ucontext_t so
-     // 'float_state' is not required.
-diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-@@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
-   }
- 
-   // Wait a while until the child should have crashed.
--  usleep(1000000);
-+  usleep(2000000);
-   // Kill the child if it is still running.
-   kill(child, SIGKILL);
- 
-@@ -559,6 +559,8 @@ const unsigned char kIllegalInstruction[] = {
- #if defined(__mips__)
-   // mfc2 zero,Impl - usually illegal in userspace.
-   0x48, 0x00, 0x00, 0x48
-+#elif defined(__powerpc64__)
-+  0x01, 0x01, 0x01, 0x01 // Crashes on a tested POWER9 cpu
- #else
-   // This crashes with SIGILL on x86/x86-64/arm.
-   0xff, 0xff, 0xff, 0xff
-@@ -754,10 +756,10 @@ TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {
- 
-   // These are defined here so the parent can use them to check the
-   // data from the minidump afterwards.
--  // Use 4k here because the OS will hand out a single page even
-+  // Use the page size here because the OS will hand out a single page even
-   // if a smaller size is requested, and this test wants to
-   // test the upper bound of the memory range.
--  const uint32_t kMemorySize = 4096;  // bytes
-+  const uint32_t kMemorySize = getpagesize();  // bytes
-   const int kOffset = kMemorySize - sizeof(kIllegalInstruction);
- 
-   const pid_t child = fork();
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-@@ -138,7 +138,9 @@ class MicrodumpWriter {
-                   const MicrodumpExtraInfo& microdump_extra_info,
-                   LinuxDumper* dumper)
-       : ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -337,6 +339,8 @@ class MicrodumpWriter {
- # else
- #  error "This mips ABI is currently not supported (n32)"
- #endif
-+#elif defined(__powerpc64__)
-+    const char kArch[] = "ppc64";
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -409,7 +413,9 @@ class MicrodumpWriter {
-   void DumpCPUState() {
-     RawContextCPU cpu;
-     my_memset(&cpu, 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+    UContextReader::FillCPUContext(&cpu, ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-     UContextReader::FillCPUContext(&cpu, ucontext_, float_state_);
- #else
-     UContextReader::FillCPUContext(&cpu, ucontext_);
-@@ -605,7 +611,9 @@ class MicrodumpWriter {
-   void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
- 
-   const ucontext_t* const ucontext_;
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
---- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-@@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
-   CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf);
-   ASSERT_TRUE(ContainsMicrodump(buf));
- 
-+  int page_size = getpagesize();
- #ifdef __LP64__
--  ASSERT_NE(std::string::npos,
--            buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
--                     "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  // This test is only available for the following page sizes
-+  ASSERT_TRUE((page_size == 4096) || (page_size == 65536));
-+  if (page_size == 4096) { 
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000001000 000000000000002A 0000000000001000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  } else {
-+    ASSERT_NE(std::string::npos,
-+              buf.find("M 0000000000010000 000000000000002A 0000000000010000 "
-+                       "33221100554477668899AABBCCDDEEFF0 libfoo.so"));
-+  }
- #else
-   ASSERT_NE(std::string::npos,
-             buf.find("M 00001000 0000002A 00001000 "
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-@@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-@@ -197,7 +200,10 @@ bool LinuxCoreDumper::EnumerateThreads() {
-         memset(&info, 0, sizeof(ThreadInfo));
-         info.tgid = status->pr_pgrp;
-         info.ppid = status->pr_ppid;
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        for (int i = 0; i < 31; i++)
-+            info.mcontext.gp_regs[i] = status->pr_reg[i];
-+#elif defined(__mips__)
- #if defined(__ANDROID__)
-         for (int i = EF_R0; i <= EF_R31; i++)
-           info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-@@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
-       reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
- 
-   // The number of bytes of stack which we try to capture.
--  static const ptrdiff_t kStackToCapture = 32 * 1024;
-+  // This now depends on page_size to avoid missing data
-+  // on systems with larger page sizes.
-+  static const ptrdiff_t kStackToCapture = 8 * page_size;
- 
-   const MappingInfo* mapping = FindMapping(stack_pointer);
-   if (!mapping)
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-@@ -63,7 +63,8 @@ namespace google_breakpad {
-  (defined(__mips__) && _MIPS_SIM == _ABIO32)
- typedef Elf32_auxv_t elf_aux_entry;
- #elif defined(__x86_64) || defined(__aarch64__) || \
--     (defined(__mips__) && _MIPS_SIM != _ABIO32)
-+     (defined(__mips__) && _MIPS_SIM != _ABIO32) || \
-+     defined(__powerpc64__)
- typedef Elf64_auxv_t elf_aux_entry;
- #endif
- 
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-@@ -51,6 +51,8 @@
- #define TID_PTR_REGISTER "rcx"
- #elif defined(__mips__)
- #define TID_PTR_REGISTER "$1"
-+#elif defined(__powerpc64__)
-+#define TID_PTR_REGISTER "r8"
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-@@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
-   return true;
- }
- 
--bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid)
--{
-+bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) {
- #ifdef PTRACE_GETREGSET
-   struct iovec io;
-   info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) {
-     return false;
-   }
- 
-   info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len);
--  if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) {
-     return false;
-   }
-+
-+#if defined(__powerpc64__)
-+  // Grab the vector registers on PPC64 too
-+  info->GetVectorRegisters(&io.iov_base, &io.iov_len);
-+  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PPC_VMX, (void*)&io) == -1) {
-+    return false;
-+  }
-+#endif // defined(__powerpc64__)
-+
-   return true;
- #else
-   return false;
-@@ -298,6 +306,9 @@ bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
- #elif defined(__mips__)
-   stack_pointer =
-       reinterpret_cast<uint8_t*>(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]);
-+#elif defined(__powerpc64__)
-+  stack_pointer =
-+      reinterpret_cast<uint8_t*>(info->mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP]);
- #else
- #error "This code hasn't been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-@@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
- #elif defined(__mips__)
-     pid_t* process_tid_location =
-         reinterpret_cast<pid_t*>(one_thread.mcontext.gregs[1]);
-+#elif defined(__powerpc64__)
-+    pid_t* process_tid_location =
-+        reinterpret_cast<pid_t*>(one_thread.mcontext.gp_regs[8]);
- #else
- #error This test has not been ported to this platform.
- #endif
-@@ -559,6 +562,8 @@ TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) {
-   uintptr_t heap_addr = thread_info.regs.rcx;
- #elif defined(__mips__)
-   uintptr_t heap_addr = thread_info.mcontext.gregs[1];
-+#elif defined(__powerpc64__)
-+  uintptr_t heap_addr = thread_info.mcontext.gp_regs[8];
- #else
- #error This test has not been ported to this platform.
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-@@ -136,7 +136,9 @@ class MinidumpWriter {
-       : fd_(minidump_fd),
-         path_(minidump_path),
-         ucontext_(context ? &context->context : NULL),
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        vector_state_(context ? &context->vector_state : NULL),
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         float_state_(context ? &context->float_state : NULL),
- #endif
-         dumper_(dumper),
-@@ -468,7 +470,9 @@ class MinidumpWriter {
-         if (!cpu.Allocate())
-           return false;
-         my_memset(cpu.get(), 0, sizeof(RawContextCPU));
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+        UContextReader::FillCPUContext(cpu.get(), ucontext_, vector_state_);
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-         UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_);
- #else
-         UContextReader::FillCPUContext(cpu.get(), ucontext_);
-@@ -897,7 +901,7 @@ class MinidumpWriter {
-     dirent->location.rva = 0;
-   }
- 
--#if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
-+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || defined(__powerpc64__)
-   bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
-     char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
-     static const char vendor_id_name[] = "vendor_id";
-@@ -917,7 +921,9 @@ class MinidumpWriter {
- 
-     // processor_architecture should always be set, do this first
-     sys_info->processor_architecture =
--#if defined(__mips__)
-+#if defined(__powerpc64__)
-+        MD_CPU_ARCHITECTURE_PPC64;
-+#elif defined(__mips__)
- # if _MIPS_SIM == _ABIO32
-         MD_CPU_ARCHITECTURE_MIPS;
- # elif _MIPS_SIM == _ABI64
-@@ -1333,7 +1339,9 @@ class MinidumpWriter {
-   const char* path_;  // Path to the file where the minidum should be written.
- 
-   const ucontext_t* const ucontext_;  // also from the signal handler
--#if !defined(__ARM_EABI__) && !defined(__mips__)
-+#if defined(__powerpc64__)
-+  const google_breakpad::vstate_t* const vector_state_;
-+#elif !defined(__ARM_EABI__) && !defined(__mips__)
-   const google_breakpad::fpstate_t* const float_state_;  // ditto
- #endif
-   LinuxDumper* dumper_;
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-@@ -48,6 +48,8 @@ class ExceptionHandler;
- 
- #if defined(__aarch64__)
- typedef struct fpsimd_context fpstate_t;
-+#elif defined(__powerpc64__)
-+typedef vrregset_t vstate_t;
- #elif !defined(__ARM_EABI__) && !defined(__mips__)
- typedef std::remove_pointer<fpregset_t>::type fpstate_t;
- #endif
-diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
---- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-+++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-@@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
- #elif defined(__mips__)
-   context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
-       invalid_stack_pointer;
-+#elif defined(__powerpc64__)
-+  context.context.uc_mcontext.gp_regs[MD_CONTEXT_PPC64_REG_SP] =
-+      invalid_stack_pointer;
- #else
- # error "This code has not been ported to your platform yet."
- #endif
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-@@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
-   }
- 
- #if defined(__x86_64__) || defined(__aarch64__) || \
--   (defined(__mips__) && _MIPS_SIM == _ABI64)
--
-+   (defined(__mips__) && _MIPS_SIM == _ABI64) || defined(__powerpc64__)
-   struct kernel_stat st;
-   if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
- #else
-diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
---- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-@@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
- TEST_F(MemoryMappedFileTest, MapWithOffset) {
-   // Put more data in the test file this time. Offsets can only be
-   // done on page boundaries, so we need a two page file to test this.
--  const int page_size = 4096;
--  char data1[2 * page_size];
--  size_t data1_size = sizeof(data1);
-+  const int page_size = getpagesize();
-+  char *data1 = static_cast<char*>(malloc(2 * page_size));
-+  EXPECT_TRUE(data1 != NULL);
-+  size_t data1_size = (2 * page_size);
-   for (size_t i = 0; i < data1_size; ++i) {
-     data1[i] = i & 0x7f;
-   }
-diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
---- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-+++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
- 
-   EXPECT_EQ(0U, allocator.pages_allocated());
-   uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
-+  uint64_t expected_pages = 1 + ((10000 - 1) / getpagesize());
-   ASSERT_FALSE(p == NULL);
--  EXPECT_EQ(3U, allocator.pages_allocated());
-+  EXPECT_EQ(expected_pages, allocator.pages_allocated());
-   for (unsigned i = 1; i < 10; ++i) {
-     uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
-     ASSERT_FALSE(p == NULL);
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-@@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
-   // Check architecture and set architecture variable to corresponding flag
-   // in objdump.
-   switch (context->GetContextCPU()) {
-+#if defined(__i386) || defined(__x86_64)
-     case MD_CONTEXT_X86:
-       architecture = "i386";
-       break;
-     case MD_CONTEXT_AMD64:
-       architecture = "i386:x86-64";
-       break;
-+#endif
-     default:
-       // Unsupported architecture. Note that ARM architectures are not
-       // supported because objdump does not support ARM.
-diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
---- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-+++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-@@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
- }
- 
- TEST(ExploitabilityTest, TestWindowsEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("ascii_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -136,9 +138,12 @@ TEST(ExploitabilityTest, TestWindowsEngine) {
-             ExploitabilityFor("read_av_clobber_write.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
-             ExploitabilityFor("read_av_conditional.dmp"));
-+#endif
- }
- 
- TEST(ExploitabilityTest, TestLinuxEngine) {
-+// The following tests are only executable on an x86-class linux machine.
-+#if defined(__i386) || defined(__x86_64)
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_null_read_av.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -171,7 +176,8 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_executable_heap.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
--#ifndef _WIN32
-+#endif
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-             ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
-@@ -182,10 +188,10 @@ TEST(ExploitabilityTest, TestLinuxEngine) {
-             ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
-   ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
-             ExploitabilityFor("linux_write_to_under_4k.dmp"));
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (!defined(__i386) && !defined(__x86_64))
- }
- 
--#ifndef _WIN32
-+#if !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
- TEST(ExploitabilityLinuxUtilsTest, DisassembleBytesTest) {
-   ASSERT_FALSE(ExploitabilityLinuxTest::DisassembleBytes("", NULL, 5, NULL));
-   uint8_t bytes[6] = {0xc7, 0x0, 0x5, 0x0, 0x0, 0x0};
-@@ -301,6 +307,7 @@ TEST(ExploitabilityLinuxUtilsTest, CalculateAddressTest) {
-                                                          context,
-                                                          &write_address));
- }
--#endif  // _WIN32
-+#endif  // !defined(_WIN32) && (defined(__i386) || defined(__x86_64))
-+
- 
- }  // namespace
-diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
---- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-+++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-@@ -77,6 +77,8 @@
-   #define ELF_ARCH  EM_MIPS
- #elif defined(__aarch64__)
-   #define ELF_ARCH  EM_AARCH64
-+#elif defined(__powerpc64__)
-+  #define ELF_ARCH  EM_PPC64
- #endif
- 
- #if defined(__arm__)
-@@ -87,6 +89,8 @@ typedef user_regs user_regs_struct;
- #elif defined (__mips__)
- // This file-local typedef simplifies the source code.
- typedef gregset_t user_regs_struct;
-+#elif defined(__powerpc64__)
-+typedef struct pt_regs user_regs_struct;
- #endif
- 
- using google_breakpad::MDTypeHelper;
-@@ -321,6 +325,9 @@ struct CrashedProcess {
- #endif
- #if defined(__aarch64__)
-     user_fpsimd_struct fpregs;
-+#endif
-+#if defined(__powerpc64__)
-+    mcontext_t mcontext;
- #endif
-     uintptr_t stack_addr;
-     const uint8_t* stack;
-@@ -535,6 +542,38 @@ ParseThreadRegisters(CrashedProcess::Thread* thread,
-   thread->mcontext.fpc_eir = rawregs->float_save.fir;
- #endif
- }
-+#elif defined(__powerpc64__)
-+static void
-+ParseThreadRegisters(CrashedProcess::Thread* thread,
-+                     const MinidumpMemoryRange& range) {
-+  const MDRawContextPPC64* rawregs = range.GetData<MDRawContextPPC64>(0);
-+
-+  for (int i = 0; i < MD_CONTEXT_PPC64_GPR_COUNT; i++)
-+    thread->mcontext.gp_regs[i] = rawregs->gpr[i];
-+
-+  thread->mcontext.gp_regs[PT_LNK] = rawregs->lr;
-+  thread->mcontext.gp_regs[PT_NIP] = rawregs->srr0;
-+  thread->mcontext.gp_regs[PT_MSR] = rawregs->srr1;
-+  thread->mcontext.gp_regs[PT_CCR] = rawregs->cr;
-+  thread->mcontext.gp_regs[PT_XER] = rawregs->xer;
-+  thread->mcontext.gp_regs[PT_CTR] = rawregs->ctr;
-+  thread->mcontext.v_regs->vrsave = rawregs->vrsave;
-+
-+  for (int i = 0; i < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; i++)
-+      thread->mcontext.fp_regs[i] = rawregs->float_save.fpregs[i];
-+
-+  thread->mcontext.fp_regs[NFPREG-1] = rawregs->float_save.fpscr;
-+
-+  for (int i = 0; i < MD_VECTORSAVEAREA_PPC_VR_COUNT; i++) {
-+      thread->mcontext.v_regs->vrregs[i][0] = rawregs->vector_save.save_vr[i].high >> 32;
-+      thread->mcontext.v_regs->vrregs[i][1] = rawregs->vector_save.save_vr[i].high;
-+      thread->mcontext.v_regs->vrregs[i][2] = rawregs->vector_save.save_vr[i].low >> 32;
-+      thread->mcontext.v_regs->vrregs[i][3] = rawregs->vector_save.save_vr[i].low;
-+  }
-+
-+  thread->mcontext.v_regs->vscr.vscr_word = rawregs->vector_save.save_vscr.low & 0xFFFFFFFF;
-+}
-+
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-@@ -623,6 +662,12 @@ ParseSystemInfo(const Options& options, CrashedProcess* crashinfo,
- # else
- #  error "This mips ABI is currently not supported (n32)"
- # endif
-+#elif defined(__powerpc64__)
-+  if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_PPC64) {
-+    fprintf(stderr,
-+            "This version of minidump-2-core only supports PPC64.\n");
-+    exit(1);
-+  }
- #else
- #error "This code has not been ported to your platform yet"
- #endif
-diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
---- third_party/crashpad/crashpad/CONTRIBUTORS
-+++ third_party/crashpad/crashpad/CONTRIBUTORS
-@@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
- Robert Sesek <rsesek@chromium.org>
- Scott Graham <scottmg@chromium.org>
- Joshua Peraza <jperaza@chromium.org>
-+Shawn Anastasio <shawn@anastas.io>
-diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
---- third_party/crashpad/crashpad/compat/linux/sys/user.h
-+++ third_party/crashpad/crashpad/compat/linux/sys/user.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- #define CRASHPAD_COMPAT_LINUX_SYS_USER_H_
- 
-+#include <cstddef>
- #include_next <sys/user.h>
- 
- #include <features.h>
-diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
---- third_party/crashpad/crashpad/minidump/minidump_context.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context.h
-@@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief ppc64-specific flags for MinidumpPPC64::context_flags
-+//! Based on minidump_cpu_ppc64.h from breakpad
-+enum MinidumpContextPPC64Flags : uint32_t {
-+  //! \brief Identifies the context as PPC64.
-+  kMinidumpContextPPC64 = 0x01000000,
-+
-+  //! \brief Indicates the validity of general purpose registers.
-+  //!
-+  //! Registers `r0`-`r31`, `nip`, `msr`, `lr`, etc. are valid.
-+  kMinidumpContextPPC64Base = kMinidumpContextPPC64 | 0x00000001,
-+
-+  //! \brief Indicates the validity of floating point registers.
-+  //!
-+  //! Registers `fp0`-`fp31`, `fpscr` are valid.
-+  kMinidumpContextPPC64Floating = kMinidumpContextPPC64 | 0x00000008,
-+
-+  //! \brief Indicates the validity of Altivec/VMX registers.
-+  //!
-+  //! Registers `v0`-`v31`, `vscr`, `vrsave`.
-+  kMinidumpContextPPC64Vector = kMinidumpContextPPC64 | 0x00000020,
-+
-+  //! \brief Indicates the validity of all registers
-+  kMinidumpContextPPC64All = kMinidumpContextPPC64Base     |
-+                             kMinidumpContextPPC64Floating |
-+                             kMinidumpContextPPC64Vector
-+};
-+
-+//! \brief A PPC64 CPU context carried in a minidump file.
-+//! Based on minidump_cpu_ppc64.h from breakpad.
-+struct MinidumpContextPPC64 {
-+  uint64_t context_flags;
-+
-+  //! \brief General purpose registers.
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+
-+  //! \brief Floating point registers.
-+  double fpregs[32];
-+
-+  //! \brief FPU status register.
-+  double fpscr;
-+
-+  //! \brief Altivec/VMX vector registers.
-+  struct {
-+      //! \brief Vector registers are 128bits.
-+      uint128_struct save_vr[32];
-+      uint128_struct save_vscr;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad5[4];
-+
-+      //! \brief VRSAVE register.
-+      uint32_t save_vrsave;
-+
-+      //! \brief Padding included for breakpad compatibiltiy.
-+      uint32_t save_pad6[7];
-+  } vregs;
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-@@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
-       break;
-     }
- 
-+    case kCPUArchitecturePPC64: {
-+      context = std::make_unique<MinidumpContextPPC64Writer>();
-+      reinterpret_cast<MinidumpContextPPC64Writer*>(context.get())
-+          ->InitalizeFromSnapshot(context_snapshot->ppc64);
-+      break;
-+    }
-+
-     default: {
-       LOG(ERROR) << "unknown context architecture "
-                  << context_snapshot->architecture;
-@@ -453,4 +460,47 @@ size_t MinidumpContextMIPS64Writer::ContextSize() const {
-   return sizeof(context_);
- }
- 
-+MinidumpContextPPC64Writer::MinidumpContextPPC64Writer()
-+  : MinidumpContextWriter(), context_() {
-+    context_.context_flags = kMinidumpContextPPC64;
-+}
-+
-+MinidumpContextPPC64Writer::~MinidumpContextPPC64Writer() = default;
-+
-+void MinidumpContextPPC64Writer::InitalizeFromSnapshot(
-+    const CPUContextPPC64* context_snapshot) {
-+  DCHECK_EQ(state(), kStateMutable);
-+  DCHECK_EQ(context_.context_flags, kMinidumpContextPPC64);
-+
-+  context_.context_flags = kMinidumpContextPPC64All;
-+
-+  memcpy(context_.regs, context_snapshot->regs, sizeof(context_.regs));
-+  context_.nip = context_snapshot->nip;
-+  context_.msr = context_snapshot->msr;
-+  context_.ccr = context_snapshot->ccr;
-+  context_.xer = context_snapshot->xer;
-+  context_.lnk = context_snapshot->lnk;
-+  context_.ctr = context_snapshot->ctr;
-+
-+  memcpy(context_.fpregs, context_snapshot->fpregs, sizeof(context_.fpregs));
-+  context_.fpscr = context_snapshot->fpscr;
-+
-+  memcpy(context_.vregs.save_vr, context_snapshot->vregs.save_vr,
-+         sizeof(context_.vregs.save_vr));
-+  memcpy(&context_.vregs.save_vscr, &context_snapshot->vregs.save_vscr,
-+         sizeof(context_.vregs.save_vscr));
-+  context_.vregs.save_vrsave = context_snapshot->vregs.save_vrsave;
-+}
-+
-+bool MinidumpContextPPC64Writer::WriteObject(
-+    FileWriterInterface* file_writer) {
-+  DCHECK_EQ(state(), kStateWritable);
-+  return file_writer->Write(&context_, sizeof(context_));
-+}
-+
-+size_t MinidumpContextPPC64Writer::ContextSize() const {
-+  DCHECK_GE(state(), kStateFrozen);
-+  return sizeof(context_);
-+}
-+
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-@@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
-   DISALLOW_COPY_AND_ASSIGN(MinidumpContextMIPS64Writer);
- };
- 
-+class MinidumpContextPPC64Writer final : public MinidumpContextWriter {
-+ public:
-+  MinidumpContextPPC64Writer();
-+  ~MinidumpContextPPC64Writer() override;
-+
-+  //! \brief Initalizes the MinidumpContextPPC64 based on \a context_snapshot.
-+  //!
-+  //! \param[in] context_snapshot The context snapshot to use as source data.
-+  //!
-+  //! \note Valid in #kStateMutable. No mutation of context() may be done before
-+  //!     calling this method, and it is not normally necessary to alter
-+  //!     context() after calling this method.
-+  void InitalizeFromSnapshot(const CPUContextPPC64* context_snapshot);
-+
-+  //! \brief Returns a pointer to the context structure that this object will
-+  //!     write.
-+  //!
-+  //! \attention This returns a non-`const` pointer to this object’s private
-+  //!     data so that a caller can populate the context structure directly.
-+  //!     This is done because providing setter interfaces to each field in the
-+  //!     context structure would be unwieldy and cumbersome. Care must be taken
-+  //!     to populate the context structure correctly. The context structure
-+  //!     must only be modified while this object is in the #kStateMutable
-+  //!     state.
-+  MinidumpContextPPC64* context() { return &context_; }
-+
-+ protected:
-+  // MinidumpWritable:
-+  bool WriteObject(FileWriterInterface* file_writer) override;
-+
-+  // MinidumpContextWriter:
-+  size_t ContextSize() const override;
-+
-+ private:
-+  MinidumpContextPPC64 context_;
-+
-+  DISALLOW_COPY_AND_ASSIGN(MinidumpContextPPC64Writer);
-+};
-+
- }  // namespace crashpad
- 
- #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
-diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
---- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-@@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
-       context, ExpectMinidumpContextMIPS64, kSeed);
- }
- 
-+TEST(MinidumpContextWriter, PPC64_Zeros) {
-+  EmptyContextTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+    ExpectMinidumpContextPPC64);
-+}
-+
-+TEST(MinidumpContextWriter, PPC64_FromSnapshot) {
-+  constexpr uint32_t kSeed = 64;
-+  CPUContextPPC64 context_ppc64;
-+  CPUContext context;
-+  context.ppc64 = &context_ppc64;
-+  InitializeCPUContextPPC64(&context, kSeed);
-+  FromSnapshotTest<MinidumpContextPPC64Writer, MinidumpContextPPC64>(
-+      context, ExpectMinidumpContextPPC64, kSeed);
-+}
-+
- }  // namespace
- }  // namespace test
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
---- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-+++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
-   static constexpr char kCPU[] = "mips";
- #elif defined(ARCH_CPU_MIPS64EL)
-   static constexpr char kCPU[] = "mips64";
-+#elif defined(ARCH_CPU_PPC64)
-+  static constexpr char kCPU[] = "ppc64";
- #else
- #error define kCPU for this CPU
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
---- third_party/crashpad/crashpad/snapshot/capture_memory.cc
-+++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
-   for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
-     MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  MaybeCaptureMemoryAround(delegate, context.ppc64->nip);
-+  for (size_t i = 0; i < base::size(context.ppc64->regs); ++i) {
-+    MaybeCaptureMemoryAround(delegate, context.ppc64->regs[i]);
-+  }
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
---- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-@@ -43,7 +43,10 @@ enum CPUArchitecture {
-   kCPUArchitectureMIPSEL,
- 
-   //! \brief 64-bit MIPSEL.
--  kCPUArchitectureMIPS64EL
-+  kCPUArchitectureMIPS64EL,
-+
-+  //! \brief 64-bit PPC64.
-+  kCPUArchitecturePPC64
- };
- 
- }  // namespace crashpad
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.cc
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
-@@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
-       return arm->pc;
-     case kCPUArchitectureARM64:
-       return arm64->pc;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->nip;
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -185,6 +187,8 @@ uint64_t CPUContext::StackPointer() const {
-       return arm->sp;
-     case kCPUArchitectureARM64:
-       return arm64->sp;
-+    case kCPUArchitecturePPC64:
-+      return ppc64->regs[1];
-     default:
-       NOTREACHED();
-       return ~0ull;
-@@ -196,6 +200,7 @@ bool CPUContext::Is64Bit() const {
-     case kCPUArchitectureX86_64:
-     case kCPUArchitectureARM64:
-     case kCPUArchitectureMIPS64EL:
-+    case kCPUArchitecturePPC64:
-       return true;
-     case kCPUArchitectureX86:
-     case kCPUArchitectureARM:
-diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
---- third_party/crashpad/crashpad/snapshot/cpu_context.h
-+++ third_party/crashpad/crashpad/snapshot/cpu_context.h
-@@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
-   uint64_t fir;
- };
- 
-+//! \brief A context structure carrying PPC64 CPU state.
-+struct CPUContextPPC64 {
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t regs[32];
-+  uint64_t ccr;
-+  uint64_t xer;
-+  uint64_t lnk;
-+  uint64_t ctr;
-+  double fpregs[32];
-+  double fpscr;
-+  struct {
-+    uint128_struct save_vr[32];
-+    uint128_struct save_vscr;
-+    uint32_t save_vrsave;
-+  } vregs;
-+};
-+
- //! \brief A context structure capable of carrying the context of any supported
- //!     CPU architecture.
- struct CPUContext {
-@@ -382,6 +400,7 @@ struct CPUContext {
-     CPUContextARM64* arm64;
-     CPUContextMIPS* mipsel;
-     CPUContextMIPS64* mips64;
-+    CPUContextPPC64* ppc64;
-   };
- };
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
---- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-@@ -15,6 +15,7 @@
- #ifndef CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- #define CRASHPAD_SNAPSHOT_LINUX_CPU_CONTEXT_LINUX_H_
- 
-+#include <cstring>
- #include "build/build_config.h"
- #include "snapshot/cpu_context.h"
- #include "snapshot/linux/signal_context.h"
-@@ -174,6 +175,78 @@ void InitializeCPUContextMIPS(
- 
- #endif  // ARCH_CPU_MIPS_FAMILY || DOXYGEN
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY) || DOXYGEN
-+
-+//! \brief Initalizes a CPUContextPPC64 structure from native context
-+//!     structures on Linux.
-+//!
-+//! \param[in] thread_context The native thread context.
-+//! \param[in] float_context The native float context.
-+//! \param[in] vector_context The native vector context.
-+//! \param[out] context The CPUContextPPC64 structure to initalize.
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const ThreadContext::t64_t& thread_context,
-+    const FloatContext::f64_t& float_context,
-+    const VectorContext::v64_t& vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.gpr, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.fpregs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+template <typename Traits>
-+void InitializeCPUContextPPC64(
-+    const SignalThreadContext64 &thread_context,
-+    const SignalFloatContext64 &float_context,
-+    const SignalVectorContext64 &vector_context,
-+    typename Traits::CPUContext* context) {
-+
-+  memcpy(context->regs, thread_context.regs, sizeof(context->regs));
-+  context->nip = thread_context.nip;
-+  context->msr = thread_context.msr;
-+  context->ccr = thread_context.ccr;
-+  context->xer = thread_context.xer;
-+  context->lnk = thread_context.lnk;
-+  context->ctr = thread_context.ctr;
-+
-+  memcpy(context->fpregs, float_context.regs, sizeof(context->fpregs));
-+  context->fpscr = float_context.fpscr;
-+
-+  for (uint8_t i = 0; i < 32; i++) {
-+    context->vregs.save_vr[i] = {
-+      (((uint64_t)vector_context.vrregs[i][0]) << 32) |
-+        vector_context.vrregs[i][1],
-+      (((uint64_t)vector_context.vrregs[i][2]) << 32) |
-+        vector_context.vrregs[i][3]
-+    };
-+  }
-+  context->vregs.save_vrsave = vector_context.vrsave;
-+  context->vregs.save_vscr = {0, (uint64_t)vector_context.vscr.vscr_word};
-+}
-+
-+
-+#endif
-+
- }  // namespace internal
- }  // namespace crashpad
- 
-diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
---- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
-               device == 0 && inode == 0 && mapping_name == "[vdso]";
-           static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-@@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-       reader, context_address, context_.mips64);
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+template <typename Traits>
-+static bool ReadContext(ProcessReaderLinux* reader,
-+                        LinuxVMAddress context_address,
-+                        typename Traits::CPUContext* dest_context) {
-+  const ProcessMemory* memory = reader->Memory();
-+
-+  LinuxVMAddress gp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, gp_regs);
-+
-+  typename Traits::SignalThreadContext thread_context;
-+  if (!memory->Read(gp_regs_address, sizeof(thread_context), &thread_context)) {
-+    LOG(ERROR) << "Couldn't read gp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress fp_regs_address = context_address +
-+                                   offsetof(UContext, mcontext) +
-+                                   offsetof(typename Traits::MContext, fp_regs);
-+
-+  typename Traits::SignalFloatContext fp_context;
-+  if (!memory->Read(fp_regs_address, sizeof(fp_context), &fp_context)) {
-+    LOG(ERROR) << "Couldn't read fp_regs!";
-+    return false;
-+  }
-+
-+  LinuxVMAddress v_regs_ptr_address = context_address +
-+                                  offsetof(UContext, mcontext) +
-+                                  offsetof(typename Traits::MContext, vmx_reserve) + 8;
-+
-+  typename Traits::SignalVectorContext v_context;
-+  if (!memory->Read(v_regs_ptr_address, sizeof(v_context), &v_context)) {
-+    LOG(ERROR) << "Couldn't read v_regs!";
-+    return false;
-+  }
-+
-+  InitializeCPUContextPPC64<ContextTraits64>(thread_context, fp_context,
-+                            v_context, dest_context);
-+
-+  return true;
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+
-+  return internal::ReadContext<ContextTraits64>(
-+      reader, context_address, context_.ppc64);
-+}
-+
-+template<>
-+bool ExceptionSnapshotLinux::ReadContext<ContextTraits32>(
-+    ProcessReaderLinux* reader,
-+    LinuxVMAddress context_address) {
-+  // PPC64 is 64-bit
-+  return false;
-+}
-+
- #endif  // ARCH_CPU_X86_FAMILY
- 
- bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-@@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #endif
-   } context_union_;
-   CPUContext context_;
-diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
---- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-@@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-             0);
- #undef CPU_ARCH_NAME
- }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+using NativeCPUContext = ucontext_t;
-+
-+void InitializeContext(NativeCPUContext* context) {
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    context->uc_mcontext.gp_regs[reg] = reg;
-+  }
-+
-+  memset(&context->uc_mcontext.fp_regs, 44,
-+      sizeof(context->uc_mcontext.fp_regs));
-+}
- 
-+void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
-+  EXPECT_EQ(actual.architecture, kCPUArchitecturePPC64);
-+
-+  for (size_t reg = 0; reg < 32; ++reg) {
-+    EXPECT_EQ(actual.ppc64->regs[reg], expected.uc_mcontext.gp_regs[reg]);
-+  }
-+
-+  EXPECT_EQ(memcmp(actual.ppc64->fpregs, expected.uc_mcontext.fp_regs,
-+            sizeof(actual.ppc64->fpregs)), 0);
-+}
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-@@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   stack_pointer = reader->Is64Bit() ? thread_info.thread_context.t64.regs[29]
-                                     : thread_info.thread_context.t32.regs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  stack_pointer = thread_info.thread_context.t64.gpr[1];
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
-diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
---- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-+++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-@@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
-               "context offset mismatch");
- #endif
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+
-+struct SignalThreadContext64 {
-+  uint64_t regs[32];
-+  uint64_t nip;
-+  uint64_t msr;
-+  uint64_t orig_r3;
-+  uint64_t ctr;
-+  uint64_t lnk;
-+  uint64_t xer;
-+  uint64_t ccr;
-+  uint64_t softe;
-+  uint64_t trap;
-+  uint64_t dar;
-+  uint64_t dsisr;
-+  uint64_t result;
-+  uint64_t dscr;
-+  uint64_t fpr0[3];
-+};
-+
-+struct SignalFloatContext64 {
-+  double regs[32];
-+  double fpscr;
-+};
-+
-+struct SignalVectorContext64 {
-+  int32_t vrregs[32][4];
-+  struct {
-+    int32_t __pad[3];
-+    int32_t vscr_word;
-+  } vscr;
-+  int32_t vrsave;
-+  int32_t __pad[3];
-+} __attribute__((__aligned__(16)));
-+
-+
-+#pragma pack(pop)
-+struct MContext64 {
-+  uint64_t reserved[4];
-+  int32_t signal;
-+  int32_t __pad0;
-+  uint64_t handler;
-+  uint64_t oldmask;
-+  uint64_t pt_regs_ptr;
-+  SignalThreadContext64 gp_regs;
-+  SignalFloatContext64  fp_regs;
-+  SignalVectorContext64 *v_regs;
-+  int64_t vmx_reserve[69];
-+};
-+
-+struct ContextTraits64 : public Traits64 {
-+  using MContext = MContext64;
-+  using SignalThreadContext = SignalThreadContext64;
-+  using SignalFloatContext = SignalFloatContext64;
-+  using SignalVectorContext = SignalVectorContext64;
-+  using CPUContext = CPUContextPPC64;
-+};
-+
-+struct ContextTraits32 : public Traits32 {};
-+
-+struct UContext {
-+  uint64_t flags;
-+  uint64_t link;
-+  SignalStack<ContextTraits64> stack;
-+  Sigset<ContextTraits64> sigmask;
-+  MContext64 mcontext;
-+};
-+#pragma pack(push, 1)
-+
-+static_assert(sizeof(UContext) == sizeof(ucontext_t),
-+              "ucontext_t size mismatch");
-+static_assert(sizeof(MContext64) == sizeof(mcontext_t),
-+              "mcontext_t size mismatch");
-+static_assert(sizeof(SignalThreadContext64) == sizeof(gregset_t),
-+              "gregset_t size mismatch");
-+static_assert(sizeof(SignalFloatContext64) == sizeof(fpregset_t),
-+              "fpregset_t size mismatch");
-+static_assert(sizeof(SignalVectorContext64) == sizeof(vrregset_t),
-+              "vrregset_t size mismatch");
-+static_assert(offsetof(UContext, mcontext) ==
-+              offsetof(ucontext_t, uc_mcontext), "mcontext offset mismatch");
-+static_assert(offsetof(MContext64, gp_regs) ==
-+              offsetof(mcontext_t, gp_regs), "gp_regs offset mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
---- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
-                                     : kCPUArchitectureMIPSEL;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return kCPUArchitecturePPC64;
- #else
- #error port to your architecture
- #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return 0;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return 0;
- #else
- #error port to your architecture
- #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return std::string();
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return std::string();
- #else
- #error port to your architecture
- #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   // Not implementable on MIPS
-   return false;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  // Not yet implemented on PPC64
-+  return false;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-@@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
-         thread.thread_info.float_context.f32,
-         context_.mipsel);
-   }
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  context_.architecture = kCPUArchitecturePPC64;
-+  context_.ppc64 = &context_union_.ppc64;
-+  InitializeCPUContextPPC64<ContextTraits64>(
-+      thread.thread_info.thread_context.t64,
-+      thread.thread_info.float_context.f64,
-+      thread.thread_info.vector_context.v64,
-+      context_.ppc64);
- #else
- #error Port.
- #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
---- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-+++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-@@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-     CPUContextMIPS mipsel;
-     CPUContextMIPS64 mips64;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    CPUContextPPC64 ppc64;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
---- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-+++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-@@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
-     if (type == AT_IGNORE) {
-       continue;
-     }
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    if (type == AT_IGNOREPPC) {
-+      continue;
-+    }
-+#endif
-     if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
-       LOG(ERROR) << "duplicate auxv entry";
-       return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
-diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
---- third_party/crashpad/crashpad/util/linux/ptracer.cc
-+++ third_party/crashpad/crashpad/util/linux/ptracer.cc
-@@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
-   return true;
- }
- 
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+// PPC64 has had HAVE_ARCH_TRACEHOOK set since 2.6.27 (even before x86 had it).
-+// That means we can simply use PTRACE_GETREGESET.
-+
-+template <typename Destination>
-+bool GetRegisterSet(pid_t tid, int set, Destination* dest, bool can_log) {
-+  iovec iov;
-+  iov.iov_base = reinterpret_cast<void*>(dest);
-+  iov.iov_len = sizeof(*dest);
-+  if (ptrace(PTRACE_GETREGSET, tid, reinterpret_cast<void*>(set), &iov) != 0) {
-+    PLOG_IF(ERROR, can_log) << "ptrace";
-+    return false;
-+  }
-+  if (iov.iov_len != sizeof(*dest)) {
-+    LOG_IF(ERROR, can_log) << "Unexpected registers size";
-+    return false;
-+  }
-+  return true;
-+}
-+
-+bool GetVectorRegisters64(pid_t tid,
-+                          VectorContext* context,
-+                          bool can_log) {
-+  return GetRegisterSet(tid, NT_PPC_VMX, &context->v64, can_log);
-+}
-+
-+bool GetFloatingPointRegisters64(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) {
-+  return GetRegisterSet(tid, NT_PRFPREG, &context->f64, can_log);
-+}
-+
-+bool GetThreadArea64(pid_t tid,
-+                     const ThreadContext& context,
-+                     LinuxVMAddress* address,
-+                     bool can_log) {
-+  // PPC64 doesn't have PTRACE_GET_THREAD_AREA since the thread pointer
-+  // is stored in GPR 13.
-+  ThreadContext::t64_t tc;
-+  if (!GetRegisterSet(tid, NT_PRSTATUS, &tc, can_log)) {
-+    LOG_IF(ERROR, can_log) << "Unable to get thread pointer!";
-+    return false;
-+  }
-+
-+  *address = tc.gpr[13];
-+
-+  return true;
-+}
-+
-+// Stubs for 32-bit functions not applicable on PPC64
-+bool GetFloatingPointRegisters32(pid_t tid,
-+                                 FloatContext* context,
-+                                 bool can_log) { return false; }
-+bool GetThreadArea32(pid_t tid,
-+                     const ThreadContext &context,
-+                     LinuxVMAddress *address,
-+                     bool can_log) { return false; }
-+
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -494,6 +552,9 @@ bool Ptracer::GetThreadInfo(pid_t tid, ThreadInfo* info) {
-   if (is_64_bit_) {
-     return GetGeneralPurposeRegisters64(tid, &info->thread_context, can_log_) &&
-            GetFloatingPointRegisters64(tid, &info->float_context, can_log_) &&
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+           GetVectorRegisters64(tid, &info->vector_context, can_log_) &&
-+#endif
-            GetThreadArea64(tid,
-                            info->thread_context,
-                            &info->thread_specific_data_address,
-diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
---- third_party/crashpad/crashpad/util/linux/thread_info.h
-+++ third_party/crashpad/crashpad/util/linux/thread_info.h
-@@ -28,6 +28,10 @@
- #include <android/api-level.h>
- #endif
- 
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+#include <sys/ucontext.h>
-+#endif
-+
- namespace crashpad {
- 
- //! \brief The set of general purpose registers for an architecture family.
-@@ -79,6 +83,8 @@ union ThreadContext {
-     uint32_t cp0_status;
-     uint32_t cp0_cause;
-     uint32_t padding1_;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // PPC64 is 64-bit
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -132,6 +138,21 @@ union ThreadContext {
-     uint64_t cp0_badvaddr;
-     uint64_t cp0_status;
-     uint64_t cp0_cause;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects struct pt_regs in asm/ptrace.h.
-+    uint64_t gpr[32];
-+    uint64_t nip;
-+    uint64_t msr;
-+    uint64_t orig_gpr3;
-+    uint64_t ctr;
-+    uint64_t lnk;
-+    uint64_t xer;
-+    uint64_t ccr;
-+    uint64_t softe;
-+    uint64_t trap;
-+    uint64_t dar;
-+    uint64_t dsisr;
-+    uint64_t result;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -143,6 +164,8 @@ union ThreadContext {
-   using NativeThreadContext = user_regs;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate NativeThreadsContext type available for MIPS
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  using NativeThreadContext = struct pt_regs;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY || ARCH_CPU_ARM64
-@@ -218,6 +241,9 @@ union FloatContext {
-     } fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Crashpad's PPC support is 64-bit only, so this
-+    // 32bit-only struct is declared as empty.
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -252,6 +278,10 @@ union FloatContext {
-     double fpregs[32];
-     uint32_t fpcsr;
-     uint32_t fpu_id;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects fpregset_t in sys/ucontext.h
-+    double fpregs[32];
-+    double fpscr;
- #else
- #error Port.
- #endif  // ARCH_CPU_X86_FAMILY
-@@ -280,6 +310,8 @@ union FloatContext {
-   static_assert(sizeof(f64) == sizeof(user_fpsimd_struct), "Size mismatch");
- #elif defined(ARCH_CPU_MIPS_FAMILY)
- // No appropriate floating point context native type for available MIPS.
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  static_assert(sizeof(f64) == sizeof(fpregset_t), "Size mismatch");
- #else
- #error Port.
- #endif  // ARCH_CPU_X86
-@@ -287,6 +319,26 @@ union FloatContext {
- static_assert(std::is_standard_layout<FloatContext>::value,
-               "Not standard layout");
- 
-+//! \brief The vector registers used for an architecture family
-+union VectorContext {
-+  struct v32_t {} v32;
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+  __attribute__((__aligned__(16))) // Vector context must be doubleword aligned.
-+#endif
-+  struct v64_t {
-+#if defined(ARCH_CPU_PPC64_FAMILY)
-+    // Reflects vrregset_t in sys/ucontext.h
-+    uint32_t vrregs[32][4];
-+    struct {
-+      uint32_t __pad[3];
-+      uint32_t vscr_word;
-+    } vscr;
-+    uint32_t vrsave;
-+    uint32_t __pad[3];
-+#endif
-+  } v64;
-+};
-+
- //! \brief A collection of `ptrace`-able information about a thread.
- struct ThreadInfo {
-   ThreadInfo();
-@@ -298,6 +350,9 @@ struct ThreadInfo {
-   //! \brief The floating point registers for the thread.
-   FloatContext float_context;
- 
-+  //! \brief (Optional) The vector registers used for the thread.
-+  VectorContext vector_context;
-+
-   //! \brief The thread-local storage address for the thread.
-   LinuxVMAddress thread_specific_data_address;
- };
-diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context.h
-+++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
- //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
- //!     Linux               | ARM/ARM64    | `r0`/`x0`
- //!     Linux               | MIPS/MIPS64  | `$a0`
-+//!     Linux               | PPC64        | `r3`
- //!
- //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
- //!     this function.
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-+++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-@@ -32,7 +32,7 @@
-   .balign 4, 0x0
-   .type CAPTURECONTEXT_SYMBOL, %function
-   .type CAPTURECONTEXT_SYMBOL2, %function
--#elif defined(__mips__)
-+#elif defined(__mips__) || defined(__powerpc64__)
-   .balign 4, 0x0
- #endif
- 
-@@ -423,4 +423,214 @@ CAPTURECONTEXT_SYMBOL2:
-   jr $ra
- 
-   .set at
-+#elif defined(__powerpc64__)
-+  // Store r0-r31
-+  std 0, 0xe8(3)   // context->uc_mcontext.gp_regs[0]
-+  std 1, 0xf0(3)   // context->uc_mcontext.gp_regs[1]
-+  std 2, 0xf8(3)   // context->uc_mcontext.gp_regs[2]
-+  // note that r3's original value was lost
-+  std 3, 0x100(3)  // context->uc_mcontext.gp_regs[3]
-+  std 4, 0x108(3)  // context->uc_mcontext.gp_regs[4]
-+  std 5, 0x110(3)  // context->uc_mcontext.gp_regs[5]
-+  std 6, 0x118(3)  // context->uc_mcontext.gp_regs[6]
-+  std 7, 0x120(3)  // context->uc_mcontext.gp_regs[7]
-+  std 8, 0x128(3)  // context->uc_mcontext.gp_regs[8]
-+  std 9, 0x130(3)  // context->uc_mcontext.gp_regs[9]
-+  std 10, 0x138(3) // context->uc_mcontext.gp_regs[10]
-+  std 11, 0x140(3) // context->uc_mcontext.gp_regs[11]
-+  std 12, 0x148(3) // context->uc_mcontext.gp_regs[12]
-+  std 13, 0x150(3) // context->uc_mcontext.gp_regs[13]
-+  std 14, 0x158(3) // context->uc_mcontext.gp_regs[14]
-+  std 15, 0x160(3) // context->uc_mcontext.gp_regs[15]
-+  std 16, 0x168(3) // context->uc_mcontext.gp_regs[16]
-+  std 17, 0x170(3) // context->uc_mcontext.gp_regs[17]
-+  std 18, 0x178(3) // context->uc_mcontext.gp_regs[18]
-+  std 19, 0x180(3) // context->uc_mcontext.gp_regs[19]
-+  std 20, 0x188(3) // context->uc_mcontext.gp_regs[20]
-+  std 21, 0x190(3) // context->uc_mcontext.gp_regs[21]
-+  std 22, 0x198(3) // context->uc_mcontext.gp_regs[22]
-+  std 23, 0x1a0(3) // context->uc_mcontext.gp_regs[23]
-+  std 24, 0x1a8(3) // context->uc_mcontext.gp_regs[24]
-+  std 25, 0x1b0(3) // context->uc_mcontext.gp_regs[25]
-+  std 26, 0x1b8(3) // context->uc_mcontext.gp_regs[26]
-+  std 27, 0x1c0(3) // context->uc_mcontext.gp_regs[27]
-+  std 28, 0x1c8(3) // context->uc_mcontext.gp_regs[28]
-+  std 29, 0x1d0(3) // context->uc_mcontext.gp_regs[29]
-+  std 30, 0x1d8(3) // context->uc_mcontext.gp_regs[30]
-+  std 31, 0x1e0(3) // context->uc_mcontext.gp_regs[31]
-+
-+  // For NIP, we can use the value in the link register
-+  mflr 0
-+  std 0, 0x1e8(3) // context->uc_mcontext.gp_regs[PT_NIP]
-+
-+  // CTR
-+  mfctr 0
-+  std 0, 0x200(3) // context->uc_mcontext.gp_regs[PT_CTR]
-+
-+  // For LNK, we'll use the caller's LR save area (2 stack frames up).
-+  // r4 can be used as a scratch register since it has already been saved.
-+  ld 4, 0(1)
-+  ld 4, 16(4)
-+  std 4, 0x208(3) // context->uc_mcontext.gp_regs[PT_LNK]
-+
-+  // XER
-+  mfxer 0
-+  std 0, 0x210(3) // context->uc_mcontext.gp_regs[PT_XER]
-+
-+  // CCR
-+  mfcr 0
-+  std 0, 0x218(3) // context->uc_mcontext.gp_regs[PT_CCR]
-+
-+  // MSR, orig_r3, MQ, TRAP, DAR, DSISR, RESULT, DSCR,
-+  // not used or not relevant,  zero them out.
-+  li 4, 0
-+  std 4, 0x1f0(3) // context->uc_mcontext.gp_regs[PT_MSR]
-+  std 4, 0x1f8(3) // context->uc_mcontext.gp_regs[PT_ORIG_R3]
-+  std 4, 0x220(3) // context->uc_mcontext.gp_regs[PT_MQ]
-+  std 4, 0x228(3) // context->uc_mcontext.gp_regs[PT_TRAP]
-+  std 4, 0x230(3) // context->uc_mcontext.gp_regs[PT_DAR]
-+  std 4, 0x238(3) // context->uc_mcontext.gp_regs[PT_DSISR]
-+  std 4, 0x240(3) // context->uc_mcontext.gp_regs[PT_RESULT]
-+  std 4, 0x248(3) // context->uc_mcontext.gp_regs[PT_DSCR]
-+
-+  // Update context->uc_mcontext.regs to point to gp_regs
-+  addi 0, 3, 0xe8
-+  std 0, 0xe0(3)
-+
-+  // Save floating point registers 0-31
-+  stfd 0, 0x268(3)  // context->uc_mcontext.fp_regs[0]
-+  stfd 1, 0x270(3)  // context->uc_mcontext.fp_regs[1]
-+  stfd 2, 0x278(3)  // context->uc_mcontext.fp_regs[2]
-+  stfd 3, 0x280(3)  // context->uc_mcontext.fp_regs[3]
-+  stfd 4, 0x288(3)  // context->uc_mcontext.fp_regs[4]
-+  stfd 5, 0x290(3)  // context->uc_mcontext.fp_regs[5]
-+  stfd 6, 0x298(3)  // context->uc_mcontext.fp_regs[6]
-+  stfd 7, 0x2a0(3)  // context->uc_mcontext.fp_regs[7]
-+  stfd 8, 0x2a8(3)  // context->uc_mcontext.fp_regs[8]
-+  stfd 9, 0x2b0(3)  // context->uc_mcontext.fp_regs[9]
-+  stfd 10, 0x2b8(3) // context->uc_mcontext.fp_regs[10]
-+  stfd 11, 0x2c0(3) // context->uc_mcontext.fp_regs[11]
-+  stfd 12, 0x2c8(3) // context->uc_mcontext.fp_regs[12]
-+  stfd 13, 0x2d0(3) // context->uc_mcontext.fp_regs[13]
-+  stfd 14, 0x2d8(3) // context->uc_mcontext.fp_regs[14]
-+  stfd 15, 0x2e0(3) // context->uc_mcontext.fp_regs[15]
-+  stfd 16, 0x2e8(3) // context->uc_mcontext.fp_regs[16]
-+  stfd 17, 0x2f0(3) // context->uc_mcontext.fp_regs[17]
-+  stfd 18, 0x2f8(3) // context->uc_mcontext.fp_regs[18]
-+  stfd 19, 0x300(3) // context->uc_mcontext.fp_regs[19]
-+  stfd 20, 0x308(3) // context->uc_mcontext.fp_regs[20]
-+  stfd 21, 0x310(3) // context->uc_mcontext.fp_regs[21]
-+  stfd 22, 0x318(3) // context->uc_mcontext.fp_regs[22]
-+  stfd 23, 0x320(3) // context->uc_mcontext.fp_regs[23]
-+  stfd 24, 0x328(3) // context->uc_mcontext.fp_regs[24]
-+  stfd 25, 0x330(3) // context->uc_mcontext.fp_regs[25]
-+  stfd 26, 0x338(3) // context->uc_mcontext.fp_regs[26]
-+  stfd 27, 0x340(3) // context->uc_mcontext.fp_regs[27]
-+  stfd 28, 0x348(3) // context->uc_mcontext.fp_regs[28]
-+  stfd 29, 0x350(3) // context->uc_mcontext.fp_regs[29]
-+  stfd 30, 0x358(3) // context->uc_mcontext.fp_regs[30]
-+  stfd 31, 0x360(3) // context->uc_mcontext.fp_regs[31]
-+
-+  // FPSCR
-+  mffs 0
-+  stfd 0, 0x368(3) // context->uc_mcontext.fp_regs[32]
-+
-+  // Save VMX Vector registers
-+  // Update r4 to contain the base address of vmx_reserve
-+  addi 4, 3, 0x378
-+  // Ensure that it is quadword aligned
-+  andi. 5, 4, 0xF
-+  beq 1f // No alignment is necessary
-+  // Address is doubleword aligned and not quadword aligned, add 8
-+  addi 4, 4, 8
-+
-+1:
-+  // Store VMX registers 0-31
-+  // r4 will contain the base address
-+  // r5 will contain the index
-+  li 5, 0
-+  stvx 0, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 0]
-+  addi 5, 5, 16
-+  stvx 1, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 1]
-+  addi 5, 5, 16
-+  stvx 2, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 2]
-+  addi 5, 5, 16
-+  stvx 3, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 3]
-+  addi 5, 5, 16
-+  stvx 4, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 4]
-+  addi 5, 5, 16
-+  stvx 5, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 5]
-+  addi 5, 5, 16
-+  stvx 6, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 6]
-+  addi 5, 5, 16
-+  stvx 7, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 7]
-+  addi 5, 5, 16
-+  stvx 8, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 8]
-+  addi 5, 5, 16
-+  stvx 9, 4, 5   // context->uc_mcontext.vmx_reserve[(align) + 9]
-+  addi 5, 5, 16
-+  stvx 10, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 10]
-+  addi 5, 5, 16
-+  stvx 11, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 11]
-+  addi 5, 5, 16
-+  stvx 12, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 12]
-+  addi 5, 5, 16
-+  stvx 13, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 13]
-+  addi 5, 5, 16
-+  stvx 14, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 14]
-+  addi 5, 5, 16
-+  stvx 15, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 15]
-+  addi 5, 5, 16
-+  stvx 16, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 16]
-+  addi 5, 5, 16
-+  stvx 17, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 17]
-+  addi 5, 5, 16
-+  stvx 18, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 18]
-+  addi 5, 5, 16
-+  stvx 19, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 19]
-+  addi 5, 5, 16
-+  stvx 20, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 20]
-+  addi 5, 5, 16
-+  stvx 21, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 21]
-+  addi 5, 5, 16
-+  stvx 22, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 22]
-+  addi 5, 5, 16
-+  stvx 23, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 23]
-+  addi 5, 5, 16
-+  stvx 24, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 24]
-+  addi 5, 5, 16
-+  stvx 25, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 25]
-+  addi 5, 5, 16
-+  stvx 26, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 26]
-+  addi 5, 5, 16
-+  stvx 27, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 27]
-+  addi 5, 5, 16
-+  stvx 28, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 28]
-+  addi 5, 5, 16
-+  stvx 29, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 29]
-+  addi 5, 5, 16
-+  stvx 30, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 30]
-+  addi 5, 5, 16
-+  stvx 31, 4, 5  // context->uc_mcontext.vmx_reserve[(align) + 31]
-+  addi 5, 5, 16
-+
-+  // VSCR
-+  mfvscr 0
-+  stvx 0, 4, 5
-+  addi 5, 5, 16
-+
-+  // VRSAVE
-+  mfvrsave 0
-+  stwx 0, 4, 5
-+
-+  // Update context->uc_mcontext.v_regs to point to vmx_reserve + alignment.
-+  std 4, 0x370(3)
-+
-+  // Zero out all unused fields
-+  li 4, 0
-+  std 4, 0xc8(3) // context->uc_mcontext.signal
-+  std 4, 0xd0(3) // context->uc_mcontext.handler
-+  std 4, 0xd8(3) // context->uc_mcontext.oldmask
-+
-+  blr
- #endif  // __i386__
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-@@ -57,7 +57,7 @@ void TestCaptureContext() {
-   uintptr_t pc = ProgramCounterFromContext(context_1);
- 
- #if !defined(ADDRESS_SANITIZER) && !defined(ARCH_CPU_MIPS_FAMILY) && \
--    !defined(MEMORY_SANITIZER)
-+    !defined(MEMORY_SANITIZER) && !defined(ARCH_CPU_PPC64_FAMILY)
-   // Sanitizers can cause enough code bloat that the “nearby” check would
-   // likely fail.
-   const uintptr_t kReferencePC =
-diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
---- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-+++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
-   EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  EXPECT_EQ(context.uc_mcontext.gp_regs[3], FromPointerCast<uintptr_t>(&context));
- #endif
- }
- 
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.pc;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.pc;
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[PT_NIP];
- #endif
- }
- 
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
-   return context.uc_mcontext.sp;
- #elif defined(ARCH_CPU_MIPS_FAMILY)
-   return context.uc_mcontext.gregs[29];
-+#elif defined(ARCH_CPU_PPC64_FAMILY)
-+  return context.uc_mcontext.gp_regs[1];
- #endif
- }
- 
-diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
-   return sig == SIGABRT ||
-          sig == SIGALRM ||
-          sig == SIGBUS ||
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-          sig == SIGFPE ||
--#endif  // !defined(ARCH_CPU_ARM64)
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-          sig == SIGILL ||
- #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
-       break;
-     }
- 
--#if !defined(ARCH_CPU_ARM64)
-+#if !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
-     // ARM64 has hardware integer division instructions that don’t generate a
-     // trap for divide-by-zero, so this doesn’t produce SIGFPE.
-+    //
-+    // PPC64 fixed-point division by zero also doesn't produce a SIGFPE.
-     case SIGFPE: {
-       // Optimization makes this tricky, so get zero from a system call likely
-       // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
-       fstat(quotient, &stat_buf);
-       break;
-     }
--#endif  // ARCH_CPU_ARM64
-+#endif  // !defined(ARCH_CPU_ARM64) && !defined(ARCH_CPU_PPC64)
- 
- #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-     case SIGILL: {
-diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
---- third_party/dav1d/BUILD.gn
-+++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
-     sources += arm_template_sources
-   } else if (current_cpu == "arm64") {
-     sources += arm_template_sources
-+  } else if (current_cpu == "ppc64") {
-+    sources += ppc64_template_sources
-   }
- 
-   cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
- 
-+    cflags = dav1d_copts
-+  }
-+} else if (current_cpu == "ppc64") {
-+  static_library("dav1d_ppc") {
-+    sources = [
-+      "libdav1d/src/ppc/cpu.c",
-+      "libdav1d/src/ppc/cpu.h",
-+    ]
-+
-+    configs -= [ "//build/config/compiler:chromium_code" ]
-+    configs += [
-+      "//build/config/compiler:no_chromium_code",
-+      ":dav1d_config",
-+    ]
-+
-     cflags = dav1d_copts
-   }
- }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
-     }
-   } else if (current_cpu == "arm" || current_cpu == "arm64") {
-     deps += [ ":dav1d_arm" ]
-+  } else if (current_cpu == "ppc64") {
-+    deps += [ ":dav1d_ppc" ]
-   }
- }
-diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
-new file mode 100644
-index 00000000..f6ca57f7
---- /dev/null
-+++ third_party/dav1d/config/linux/ppc64/config.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Autogenerated by the Meson build system.
-+ * Do not edit, your changes will be lost.
-+ */
-+
-+#pragma once
-+
-+#define ARCH_AARCH64 0
-+
-+#define ARCH_ARM 0
-+
-+#define ARCH_PPC64LE 1
-+
-+#define ARCH_X86 0
-+
-+#define ARCH_X86_32 0
-+
-+#define ARCH_X86_64 0
-+
-+#define CONFIG_16BPC 1
-+
-+#define CONFIG_8BPC 1
-+
-+// #define CONFIG_LOG 1 -- Logging is controlled by Chromium
-+
-+#define ENDIANNESS_BIG 0
-+
-+#define HAVE_ASM 1
-+
-+#define HAVE_CLOCK_GETTIME 1
-+
-+#define HAVE_DLSYM 1
-+
-+#define HAVE_GETAUXVAL 1
-+
-+#define HAVE_POSIX_MEMALIGN 1
-+
-+#define HAVE_UNISTD_H 1
-+
-diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
---- third_party/dav1d/dav1d_generated.gni
-+++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
-   "libdav1d/src/arm/mc_init_tmpl.c",
- ]
- 
-+ppc64_template_sources = [
-+  "libdav1d/src/ppc/cdef_init_tmpl.c",
-+  "libdav1d/src/ppc/looprestoration_init_tmpl.c",
-+]
-+
- template_sources = [
-   "libdav1d/src/cdef_apply_tmpl.c",
-   "libdav1d/src/cdef_tmpl.c",
-diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
---- third_party/dav1d/generate_source.py
-+++ third_party/dav1d/generate_source.py
-@@ -50,7 +50,8 @@ def WriteGn(fd):
-   WriteArray(fd, "arm32_asm_sources", glob.glob("libdav1d/src/arm/32/*.S"))
-   WriteArray(fd, "arm64_asm_sources", glob.glob("libdav1d/src/arm/64/*.S"))
-   WriteArray(fd, "arm_template_sources", glob.glob("libdav1d/src/arm/*_tmpl.c"))
--
-+  WriteArray(fd, "ppc64_template_sources", glob.glob("libdav1d/src/ppc/*_tmpl.c"))
-+ 
-   template_sources = glob.glob("libdav1d/src/*_tmpl.c")
-   WriteArray(fd, "template_sources", template_sources)
- 
-diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
---- third_party/dav1d/libdav1d/src/ppc/types.h
-+++ third_party/dav1d/libdav1d/src/ppc/types.h
-@@ -51,4 +51,19 @@
- #define u16l_to_i32(v) ((i32x4) vec_mergel((u16x8) v, vec_splat_u16(0)))
- #define i16l_to_i32(v) ((i32x4) vec_unpackl((i16x8)v))
- 
-+#if defined(__clang__)
-+#undef vec_splats
-+#define vec_splats(N)                     \
-+    _Generic((N),                         \
-+        unsigned char:      ((u8x16)(N)), \
-+        signed char:        ((i8x16)(N)), \
-+        unsigned short:     ((u16x8)(N)), \
-+        signed short:       ((i16x8)(N)), \
-+        unsigned int:       ((u32x4)(N)), \
-+        signed int:         ((i32x4)(N)), \
-+        unsigned long long: ((u64x2)(N)), \
-+        signed long long:   ((i64x2)(N))  \
-+    )
-+#endif
-+
- #endif /* DAV1D_SRC_PPC_TYPES_H */
-diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
---- third_party/lss/linux_syscall_support.h
-+++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
-       LSS_REG(2, buf);
-       LSS_BODY(void*, mmap2, "0"(__r2));
-     }
--#else
-+#elif !defined(__powerpc64__) /* ppc64 doesn't have mmap2 */
-     #define __NR__mmap2 __NR_mmap2
-     LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
-                          size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
-   #if defined(__i386__) ||                                                    \
-       defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
-      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
--      defined(__PPC__) ||                                                     \
-+     (defined(__PPC__) && !defined(__powerpc64__)) ||                                                     \
-      (defined(__s390__) && !defined(__s390x__))
-     /* On these architectures, implement mmap() with mmap2(). */
-     LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d,
-diff --git third_party/pffft/src/pffft.c third_party/pffft/src/pffft.c
-index bdac4d784..51e0f2cac 100644
---- third_party/pffft/src/pffft.c
-+++ third_party/pffft/src/pffft.c
-@@ -100,6 +100,7 @@
-    Altivec support macros 
- */
- #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
-+#include <altivec.h>
- typedef vector float v4sf;
- #  define SIMD_SZ 4
- #  define VZERO() ((vector float) vec_splat_u8(0))
-diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
---- third_party/skia/src/sksl/SkSLString.cpp
-+++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
-     if (needsDotZero) {
-         buffer << ".0";
-     }
--    return String(buffer.str().c_str());
-+
-+    std::string ret(buffer.str());
-+    if (signbit(value) && ret[0] == '.') {
-+        ret[0] = '-';
-+    }
-+    return String(ret.c_str());
- }
- 
- SKSL_INT stoi(const String& s) {
-diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
---- third_party/sqlite/src/amalgamation/sqlite3.c
-+++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
---- third_party/sqlite/src/amalgamation_dev/sqlite3.c
-+++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) ||   \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
---- third_party/sqlite/src/ext/rtree/rtree.c
-+++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
- #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
-     defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
-     defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
--    defined(__arm__)
-+    defined(__arm__) || defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- # define SQLITE_BYTEORDER    1234
- #elif defined(sparc)    || defined(__ppc__)
- # define SQLITE_BYTEORDER    4321
-diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
---- third_party/sqlite/src/src/sqliteInt.h
-+++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
- # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
-      defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
-      defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
--     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64)
-+     defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) || \
-+     defined(__powerpc64__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- #   define SQLITE_BYTEORDER    1234
- # elif defined(sparc)     || defined(__ppc__) || \
-        defined(__ARMEB__) || defined(__AARCH64EB__)
-diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
-   static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
- 
-   if (!diff_proc) {
--#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
--    // For ARM and MIPS processors, always use C version.
--    // TODO(hclam): Implement a NEON version.
--    diff_proc = &VectorDifference_C;
--#else
-+#if defined(WEBRTC_ARCH_X86_FAMILY)
-     bool have_sse2 = GetCPUInfo(kSSE2) != 0;
-     // For x86 processors, check if SSE2 is supported.
-     if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
-     } else {
-       diff_proc = &VectorDifference_C;
-     }
-+#else
-+    // For other processors, always use C version.
-+    // TODO(hclam): Implement a NEON version.
-+    diff_proc = &VectorDifference_C;
- #endif
-   }
- 
-diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
---- third_party/webrtc/rtc_base/system/arch.h
-+++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
- #elif defined(__EMSCRIPTEN__)
- #define WEBRTC_ARCH_32_BITS
- #define WEBRTC_ARCH_LITTLE_ENDIAN
-+#elif defined(__PPC__)
-+#define WEBRTC_ARCH_PPC_FAMILY
-+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-+#define WEBRTC_ARCH_LITTLE_ENDIAN
-+#else
-+#define WEBRTC_ARCH_BIG_ENDIAN
-+#endif
-+#if defined(__LP64__)
-+#define WEBRTC_ARCH_64_BITS
-+#else
-+#define WEBRTC_ARCH_32_BITS
-+#endif
- #else
- #error Please add support for your architecture in rtc_base/system/arch.h
- #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
---- v8/BUILD.gn
-+++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
-     }
-     if (host_byteorder == "little") {
-       defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
-+        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
-+        "-mcpu=power8",
-+        "-maltivec",
-+        "-mvsx",
-+      ]
-     } else if (host_byteorder == "big") {
-       defines += [ "V8_TARGET_ARCH_PPC_BE" ]
-       if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
-diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
---- v8/test/BUILD.gn
-+++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
-       "cctest:cctest",
-       "cctest:generate-bytecode-expectations",
--      "unittests:unittests",
-+      #"unittests:unittests",
-     ]
-   }
- }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
-     "message:v8_message",
-     "mjsunit:v8_mjsunit",
-     "mkgrokdump:mkgrokdump",
--    "unittests:unittests",
-+    #"unittests:unittests",
-     "wasm-api-tests:wasm_api_tests",
-     "wasm-js:v8_wasm_js",
-     "wasm-spec-tests:v8_wasm_spec_tests",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (13 preceding siblings ...)
  2021-03-03 17:27 ` [PR PATCH] [Updated] " pullmoll
@ 2021-03-03 17:30 ` pullmoll
  2021-03-03 18:13 ` pullmoll
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 17:30 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 267 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789911263

Comment:
Updated: `patches/sandbox-membarrier.patch` now just adds the `case _NR_membarrier:` line and I'm rebuilding x86_64-musl now.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (14 preceding siblings ...)
  2021-03-03 17:30 ` pullmoll
@ 2021-03-03 18:13 ` pullmoll
  2021-03-03 18:13 ` q66
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:13 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 460 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789911263

Comment:
Updated: `patches/sandbox-membarrier.patch` now just adds the `case _NR_membarrier:` line and I'm rebuilding x86_64-musl now.

Status update: x86_64-musl does not immediately crash but soon after when viewing a website:
`libva error: vaGetDriverByNameIndex() failed with unknown libva error, driver name = (null)`


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (15 preceding siblings ...)
  2021-03-03 18:13 ` pullmoll
@ 2021-03-03 18:13 ` q66
  2021-03-03 18:15 ` pullmoll
                   ` (8 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: q66 @ 2021-03-03 18:13 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 642 bytes --]

New comment by q66 on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789948339

Comment:
why are you removing patches that apply? (e.g. `no-getcontext.patch`, the `libc_malloc.patch` should probably stay as well, etc)

`xxx-ppc64le-support.patch` just needs a trivial 5-minute rebase so idk why you're removing it https://gist.github.com/q66/3b7ec52349d4d7390456e3f10726b38f (but i did it myself since i don't trust anyone else not to mess it up)

you'll find that `xxx-ppc64le-support.patch` in musl patches then applies cleanly, without removing any of it (i.e. revert your changes to it)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (16 preceding siblings ...)
  2021-03-03 18:13 ` q66
@ 2021-03-03 18:15 ` pullmoll
  2021-03-03 18:25 ` [PR PATCH] [Updated] " pullmoll
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:15 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 550 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789911263

Comment:
Updated: `patches/sandbox-membarrier.patch` now just adds the `case _NR_membarrier:` line and I'm rebuilding x86_64-musl now.

Status update: x86_64-musl does not immediately crash but soon after when viewing a website:
`libva error: vaGetDriverByNameIndex() failed with unknown libva error, driver name = (null)`
https://voidlinux.org/ shows and does not crash... this requires further investigation :-(

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (17 preceding siblings ...)
  2021-03-03 18:15 ` pullmoll
@ 2021-03-03 18:25 ` pullmoll
  2021-03-03 18:27 ` pullmoll
                   ` (6 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:25 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1160 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, "Aw, Snap!" in a VM
  seccomp-bpf failure in syscall 0324
+ patches/xxx-ppc64le-support.patch removed for now (already upstreamed? need to check again)
+ files/musl-paches/xxx-ppc64le-support.patch stripped down to what still applies
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 125344 bytes --]

From 31eed02d302da5316113170551827448b3844422 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, needs testing
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]
---
 .../default-pthread-stacksize.patch           |   4 +-
 .../files/musl-patches/musl-fixes.patch       |  40 +-
 .../files/musl-patches/musl-hacks.patch       |   4 +-
 .../files/musl-patches/musl-libc++.patch      |   6 +-
 .../musl-patches/musl-no-glibc-version.patch  |  28 ++
 .../files/musl-patches/musl-sandbox.patch     |  12 +-
 .../files/musl-patches/no-mallinfo.patch      |   6 +-
 .../files/musl-patches/resolver.patch         |   2 +-
 srcpkgs/chromium/patches/browser-size_t.patch |  10 -
 .../chromium-88-AXTreeFormatter-include.patch |  27 -
 ...ium-88-BookmarkModelObserver-include.patch |  21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |  36 --
 .../chromium-88-StringPool-include.patch      |  20 -
 ...romium-88-federated_learning-include.patch |  21 -
 .../patches/chromium-88-glibc-2.33.patch      | 144 ------
 ...hromium-88-ideographicSpaceCharacter.patch |  27 -
 .../patches/chromium-88-ityp-include.patch    |  25 -
 .../patches/chromium-88-vaapi-attribute.patch |  39 --
 ...um-89-CompositorFrameReporter-dcheck.patch |  11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |  23 +-
 ...remove-unsupported-compiler-warnings.patch |  26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |  24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |  16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |  27 -
 srcpkgs/chromium/patches/no-std-time.patch    |  11 +
 .../chromium/patches/sandbox-membarrier.patch |  61 +--
 .../patches/xxx-ppc64le-support.patch         | 475 ++++++++----------
 srcpkgs/chromium/template                     |   8 +-
 28 files changed, 321 insertions(+), 833 deletions(-)
 create mode 100644 srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
new file mode 100644
index 00000000000..9ffec62465c
--- /dev/null
+++ b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
@@ -0,0 +1,28 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig	2021-03-02 18:45:03.000000000 +0100
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc	2021-03-03 17:39:14.944100746 +0100
+@@ -55,7 +55,9 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+ #include <gnu/libc-version.h>
++#endif
+ 
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -317,6 +319,7 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+   base::Version version(gnu_get_libc_version());
+ 
+   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
+@@ -338,6 +341,7 @@
+   }
+   base::UmaHistogramSparse("Linux.GlibcVersion", glibc_version_result);
+ #endif
++#endif
+ }
+ 
+ void RecordTouchEventState() {
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
index a31a9f6a5e9..b30bbc02cb6 100644
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ b/srcpkgs/chromium/patches/sandbox-membarrier.patch
@@ -1,56 +1,6 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
+--- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig	2021-03-03 18:04:45.167674791 +0100
++++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc	2021-03-03 18:13:17.036547592 +0100
+@@ -394,11 +394,12 @@
    switch (sysno) {
      case __NR_exit:
      case __NR_exit_group:
@@ -58,3 +8,8 @@
      case __NR_wait4:
      case __NR_waitid:
  #if defined(__i386__)
+     case __NR_waitpid:
+ #endif
+       return true;
+     case __NR_clone:  // Should be parameter-restricted.
+     case __NR_setns:  // Privileged.
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
index 805755c2125..bbcfbad34e5 100644
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
@@ -1,6 +1,6 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
+commit 2c013a317b1114ef67cdbbc30824b28907b9ea94
+Author: Daniel Kolesa <daniel@octaforge.org>
+Date:   Wed Mar 3 19:08:29 2021 +0100
 
     ppc64le support
 
@@ -20,10 +20,10 @@ index 286a92a27..ec36a85d3 100755
    src_dir = os.path.dirname(script_dir)
    nacl_dir = os.path.join(src_dir, 'native_client')
 diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
+index 35f01d0a4..28f2e7475 100644
 --- chrome/installer/linux/BUILD.gn
 +++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
+@@ -94,8 +94,6 @@ packaging_files = packaging_files_binaries + [
                      "$root_out_dir/xdg-mime",
                      "$root_out_dir/xdg-settings",
                      "$root_out_dir/locales/en-US.pak",
@@ -32,7 +32,7 @@ index b101b0cb2..9fd5a7617 100644
                    ]
  
  action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
+@@ -315,7 +313,6 @@ group("installer_deps") {
      ":theme_files",
      "//chrome",
      "//chrome:packed_resources",
@@ -41,11 +41,11 @@ index b101b0cb2..9fd5a7617 100644
      "//third_party/crashpad/crashpad/handler:crashpad_handler",
    ]
 diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
+index db30ae6d6..9dc09bf53 100644
 --- sandbox/features.gni
 +++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
+@@ -11,7 +11,8 @@ import("//build/config/nacl/config.gni")
+ use_seccomp_bpf = (is_linux || is_chromeos || is_android) &&
                    (current_cpu == "x86" || current_cpu == "x64" ||
                     current_cpu == "arm" || current_cpu == "arm64" ||
 -                   current_cpu == "mipsel" || current_cpu == "mips64el")
@@ -53,11 +53,12 @@ index 09280d35f..42514157f 100644
 +                   current_cpu == "ppc64")
  
  use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
+ 
 diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
+index e9a94b461..cca1a5da5 100644
 --- sandbox/linux/BUILD.gn
 +++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
+@@ -427,6 +427,8 @@ component("sandbox_services") {
  
  source_set("sandbox_services_headers") {
    sources = [
@@ -151,7 +152,7 @@ index 1a407b952..a6aec544e 100644
  #error Unsupported target platform
  
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
+index 6a1ec2389..f20c582dd 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 @@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
@@ -164,7 +165,7 @@ index a6d2c0dfb..37fdc179a 100644
           SyscallSets::IsSocketCall(sysno) ||
  #endif
  #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -227,7 +228,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -173,7 +174,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_mmap)
      return RestrictMmapFlags();
  #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -245,7 +246,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
      return RestrictPrctl();
  
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -182,7 +183,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_socketpair) {
      // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
      static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -285,7 +286,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || \
@@ -193,22 +194,20 @@ index a6d2c0dfb..37fdc179a 100644
      return RestrictSocketcallCommand();
  #endif
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
+index 01c046dda..7e5a6be82 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
+@@ -302,7 +302,7 @@ TEST_BASELINE_SIGSYS(__NR_sysinfo)
+ TEST_BASELINE_SIGSYS(__NR_syslog)
+ TEST_BASELINE_SIGSYS(__NR_timer_create)
+ 
+-#if !defined(__aarch64__)
++#if !defined(__aarch64__) && !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_eventfd)
  TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
+index 2a97d3916..8e81aa6cf 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 @@ -40,7 +40,8 @@
@@ -233,7 +232,7 @@ index f51915edc..ca2f4f106 100644
  #if defined(OS_ANDROID)
  
  #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
+@@ -98,6 +104,15 @@ inline bool IsArchitectureMips() {
  #endif
  }
  
@@ -249,7 +248,7 @@ index f51915edc..ca2f4f106 100644
  // Ubuntu's version of glibc has a race condition in sem_post that can cause
  // it to call futex(2) with bogus op arguments. To workaround this, we need
  // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
+@@ -239,6 +254,8 @@ ResultExpr RestrictFcntlCommands() {
    uint64_t kOLargeFileFlag = O_LARGEFILE;
    if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
      kOLargeFileFlag = 0100000;
@@ -258,7 +257,7 @@ index f51915edc..ca2f4f106 100644
  
    const Arg<int> cmd(1);
    const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
+@@ -253,14 +270,23 @@ ResultExpr RestrictFcntlCommands() {
                F_SETLKW,
                F_GETLK,
                F_DUPFD,
@@ -285,7 +284,7 @@ index f51915edc..ca2f4f106 100644
  ResultExpr RestrictSocketcallCommand() {
    // Unfortunately, we are unable to restrict the first parameter to
    // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
+@@ -413,7 +439,7 @@ ResultExpr RestrictPtrace() {
  #endif
    return Switch(request)
        .CASES((
@@ -294,7 +293,6 @@ index f51915edc..ca2f4f106 100644
                   PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
                   PTRACE_GETREGSET,
  #endif
-
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
 index ba4289f05..9a4d5ab2d 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
@@ -309,7 +307,7 @@ index ba4289f05..9a4d5ab2d 100644
  // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
  SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
+index 642df7207..34f47eb73 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 @@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
@@ -322,7 +320,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_time:
  #endif
        return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
+@@ -45,12 +46,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
      case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
      case __NR_clock_settime:    // Privileged.
  #if defined(__i386__) || \
@@ -339,7 +337,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_stime:
  #endif
      default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -116,7 +119,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_faccessat:  // EPERM not a valid errno.
      case __NR_fchmodat:
      case __NR_fchownat:  // Should be called chownat ?
@@ -348,7 +346,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
  #elif defined(__i386__) || defined(__arm__) || \
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -135,7 +138,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_memfd_create:
      case __NR_mkdirat:
      case __NR_mknodat:
@@ -357,7 +355,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldlstat:
      case __NR_oldstat:
  #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -149,7 +152,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
  #endif
      case __NR_statfs:  // EPERM not a valid errno.
  #if defined(__i386__) || defined(__arm__) || \
@@ -367,7 +365,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_statfs64:
  #endif
      case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -159,7 +163,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_truncate64:
  #endif
      case __NR_unlinkat:
@@ -377,7 +375,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_utime:
  #endif
      case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -181,7 +186,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
  #endif
        return true;
  // TODO(jln): these should be denied gracefully as well (moved below).
@@ -387,7 +385,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_fadvise64:  // EPERM not a valid errno.
  #endif
  #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -194,11 +200,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_flock:      // EPERM not a valid errno.
      case __NR_fstatfs:    // Give information about the whole filesystem.
  #if defined(__i386__) || defined(__arm__) || \
@@ -402,7 +400,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldfstat:
  #endif
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -206,6 +213,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_sync_file_range:  // EPERM not a valid errno.
  #elif defined(__arm__)
      case __NR_arm_sync_file_range:  // EPERM not a valid errno.
@@ -411,7 +409,7 @@ index d3693fd78..d492cf94b 100644
  #endif
      default:
        return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
+@@ -231,7 +240,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
  #endif
      case __NR_getdents64:  // EPERM not a valid errno.
  #if defined(__i386__) || \
@@ -421,7 +419,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_readdir:
  #endif
        return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
+@@ -272,7 +282,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
  bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
    switch (sysno) {
      case __NR_capset:
@@ -430,7 +428,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ioperm:  // Intel privilege.
      case __NR_iopl:    // Intel privilege.
  #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -323,7 +333,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
      case __NR_rt_sigreturn:
      case __NR_rt_sigtimedwait:
  #if defined(__i386__) || defined(__arm__) || \
@@ -440,7 +438,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigaction:
      case __NR_sigprocmask:
      case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -339,7 +350,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
  #endif
      case __NR_signalfd4:
  #if defined(__i386__) || defined(__arm__) || \
@@ -450,7 +448,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigpending:
      case __NR_sigsuspend:
  #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
+@@ -363,7 +375,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
  #endif
      case __NR_dup3:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -459,7 +457,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_shutdown:
  #endif
        return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -397,7 +409,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
      case __NR_membarrier:
      case __NR_wait4:
      case __NR_waitid:
@@ -468,7 +466,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_waitpid:
  #endif
        return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -414,7 +426,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #endif
      case __NR_set_tid_address:
      case __NR_unshare:
@@ -477,7 +475,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_vfork:
  #endif
      default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -463,7 +475,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
        return true;
      default:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -486,7 +484,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_socketpair:  // We will want to inspect its argument.
  #endif
        return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -473,7 +485,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
  bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
    switch (sysno) {
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -495,7 +493,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_accept:
      case __NR_accept4:
      case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
+@@ -488,7 +500,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
  }
  
  #if defined(__i386__) || \
@@ -505,7 +503,7 @@ index d3693fd78..d492cf94b 100644
  // Big multiplexing system call for sockets.
  bool SyscallSets::IsSocketCall(int sysno) {
    switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
+@@ -502,7 +515,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
  }
  #endif
  
@@ -515,7 +513,7 @@ index d3693fd78..d492cf94b 100644
  bool SyscallSets::IsNetworkSocketInformation(int sysno) {
    switch (sysno) {
      case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
+@@ -527,7 +541,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
      case __NR_mincore:
      case __NR_mlockall:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -524,7 +522,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_mmap:
  #endif
  #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -557,7 +571,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
    switch (sysno) {
      case __NR_lseek:
  #if defined(__i386__) || defined(__arm__) || \
@@ -534,7 +532,7 @@ index d3693fd78..d492cf94b 100644
      case __NR__llseek:
  #endif
  #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -569,26 +584,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
      case __NR_readv:
      case __NR_pread64:
  #if defined(__arm__) || \
@@ -569,7 +567,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sendmsg:  // Could specify destination.
      case __NR_sendto:   // Could specify destination.
  #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -645,7 +662,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
        return true;
      case __NR_getpriority:
  #if defined(__i386__) || defined(__arm__) || \
@@ -579,7 +577,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_nice:
  #endif
      case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -657,7 +675,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
  bool SyscallSets::IsAdminOperation(int sysno) {
    switch (sysno) {
  #if defined(__i386__) || defined(__arm__) || \
@@ -589,7 +587,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_bdflush:
  #endif
      case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
+@@ -673,7 +692,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
  
  bool SyscallSets::IsKernelModule(int sysno) {
    switch (sysno) {
@@ -599,7 +597,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_create_module:
      case __NR_get_kernel_syms:  // Should ENOSYS.
      case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
+@@ -706,7 +726,8 @@ bool SyscallSets::IsFsControl(int sysno) {
      case __NR_swapoff:
      case __NR_swapon:
  #if defined(__i386__) || \
@@ -609,7 +607,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_umount:
  #endif
      case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
+@@ -722,7 +743,7 @@ bool SyscallSets::IsNuma(int sysno) {
      case __NR_getcpu:
      case __NR_mbind:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -618,7 +616,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_migrate_pages:
  #endif
      case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
+@@ -751,14 +772,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
    switch (sysno) {
      case __NR_acct:  // Privileged.
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -637,7 +635,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ulimit:
  #endif
      case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
+@@ -792,7 +814,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
  #endif
      case __NR_sysinfo:
      case __NR_uname:
@@ -646,7 +644,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_olduname:
      case __NR_oldolduname:
  #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
+@@ -854,8 +876,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
  }
  #endif
  
@@ -664,7 +662,7 @@ index d3693fd78..d492cf94b 100644
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
  // These give a lot of ambient authority and bypass the setuid sandbox.
  bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
+@@ -887,7 +917,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
  #endif
  
  #if defined(__i386__) || \
@@ -674,7 +672,7 @@ index d3693fd78..d492cf94b 100644
  // Big system V multiplexing system call.
  bool SyscallSets::IsSystemVIpc(int sysno) {
    switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
+@@ -907,7 +938,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
    return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
           IsSystemVSharedMemory(sysno);
  #elif defined(__i386__) || \
@@ -684,7 +682,7 @@ index d3693fd78..d492cf94b 100644
    return IsSystemVIpc(sysno);
  #endif
  }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
+@@ -960,7 +992,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
  bool SyscallSets::IsTimer(int sysno) {
    switch (sysno) {
      case __NR_getitimer:
@@ -694,7 +692,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_alarm:
  #endif
      case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1019,18 +1052,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_syncfs:
      case __NR_vhangup:
  // The system calls below are not implemented.
@@ -721,7 +719,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_gtty:
      case __NR_idle:
      case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1038,20 +1075,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_prof:
      case __NR_profil:
  #endif
@@ -889,7 +887,7 @@ index e47e98bf5..d53a7ff56 100644
    SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
  }
 diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
+index f5b86a73a..5e6c4a068 100644
 --- sandbox/linux/seccomp-bpf/trap.cc
 +++ sandbox/linux/seccomp-bpf/trap.cc
 @@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
@@ -940,23 +938,23 @@ index fcfd2aa12..f6eb32fb7 100644
    return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
  #endif
 diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
+index d72c9d238..77f1d95f5 100644
 --- sandbox/linux/syscall_broker/broker_process.cc
 +++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
+@@ -169,7 +169,7 @@ bool BrokerProcess::IsSyscallBrokerable(int sysno, bool fast_check) const {
+ #if defined(__NR_fstatat64)
+     case __NR_fstatat64:
  #endif
 -#if defined(__x86_64__) || defined(__aarch64__)
 +#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
      case __NR_newfstatat:
  #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
+       return !fast_check || allowed_command_set_.test(COMMAND_STAT);
 diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
+index 1fa47ed09..39cc9ab53 100644
 --- sandbox/linux/system_headers/linux_seccomp.h
 +++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
+@@ -41,6 +41,9 @@
  #ifndef EM_AARCH64
  #define EM_AARCH64 183
  #endif
@@ -966,7 +964,7 @@ index a60fe2ad3..9dccdb51d 100644
  
  #ifndef __AUDIT_ARCH_64BIT
  #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
+@@ -73,6 +76,12 @@
  #ifndef AUDIT_ARCH_AARCH64
  #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
  #endif
@@ -1055,13 +1053,13 @@ index 000000000..07728e087
 +//TODO: is it necessary to redefine ucontext on PPC64?
 +
 +#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
+diff --git sandbox/policy/linux/bpf_renderer_policy_linux.cc sandbox/policy/linux/bpf_renderer_policy_linux.cc
+index 2588fc792..d455c4601 100644
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
 @@ -15,6 +15,11 @@
  #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+ #include "sandbox/policy/linux/sandbox_linux.h"
  
 +// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
 +#ifdef __powerpc64__
@@ -1072,7 +1070,7 @@ index fb89b3356..1e984731e 100644
  // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
  #include <linux/types.h>
 diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
+index 3a807e1e3..5258617a7 100644
 --- third_party/angle/src/compiler/translator/InfoSink.h
 +++ third_party/angle/src/compiler/translator/InfoSink.h
 @@ -92,7 +92,16 @@ class TInfoSinkBase
@@ -1094,7 +1092,7 @@ index 3a807e1e..5258617a 100644
      }
      // Write boolean values as their names instead of integral value.
 diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
+index fcbc9246a..39ae66148 100644
 --- third_party/angle/src/libANGLE/Constants.h
 +++ third_party/angle/src/libANGLE/Constants.h
 @@ -9,6 +9,7 @@
@@ -1106,10 +1104,10 @@ index 42964cc1..6607deeb 100644
  
  #include <stdint.h>
 diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
+index 17cf9cda9..8ce96bd32 100644
 --- third_party/boringssl/BUILD.gn
 +++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+@@ -103,6 +103,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
        } else {
          public_configs = [ ":no_asm_config" ]
        }
@@ -1124,10 +1122,10 @@ index b435499f4..ac8a84b6d 100644
        public_configs = [ ":no_asm_config" ]
      }
 diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
+index 4af3d7bbf..adbf54159 100644
 --- third_party/breakpad/BUILD.gn
 +++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
+@@ -596,7 +596,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/minidump_file_writer.h",
        "breakpad/src/common/convert_UTF.cc",
        "breakpad/src/common/convert_UTF.h",
@@ -1135,7 +1133,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/elf_core_dump.cc",
        "breakpad/src/common/linux/elf_core_dump.h",
        "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
+@@ -634,6 +633,14 @@ if (is_linux || is_chromeos || is_android) {
  
      libs = [ "dl" ]
  
@@ -1150,7 +1148,7 @@ index 5617de88..dc8bc176 100644
      include_dirs = [
        ".",
        "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
+@@ -682,7 +689,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
        "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
@@ -1159,7 +1157,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/file_id_unittest.cc",
        "breakpad/src/common/linux/linux_libc_support_unittest.cc",
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
+index 07d9171a0..9aed4cb36 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 @@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
@@ -1172,7 +1170,7 @@ index 07d9171a..9aed4cb3 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
+index aae1dc13b..03afec7a5 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 @@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
@@ -1258,7 +1256,7 @@ index aae1dc13..03afec7a 100644
 +
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
+index fb216fa6d..593aac822 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 @@ -68,6 +68,10 @@ struct ThreadInfo {
@@ -1285,10 +1283,10 @@ index fb216fa6..593aac82 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
+index 6eec1be24..741983a1a 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) {
    out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
  #endif
  }
@@ -1338,21 +1336,21 @@ index ee515c41..1090470f 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
+index 7d4100881..c122ac92e 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 @@ -55,6 +55,9 @@ struct UContextReader {
  #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
                               const struct fpsimd_context* fpregs);
 +#elif defined(__powerpc64__)
 +  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
 +                             const vrregset_t* vregs);
  #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc);
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
+index a6cb5f984..ae16b64d9 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 @@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
@@ -1373,7 +1371,7 @@ index c65feaa1..5a7ab50c 100644
    // and 'float_state' is not a member of CrashContext.
    ucontext_t* uc_ptr = (ucontext_t*)uc;
    if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -708,11 +715,19 @@ bool ExceptionHandler::WriteMinidump() {
    }
  #endif
  
@@ -1394,7 +1392,7 @@ index c65feaa1..5a7ab50c 100644
    context.tid = sys_gettid();
  
    // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -733,6 +748,9 @@ bool ExceptionHandler::WriteMinidump() {
  #elif defined(__mips__)
    context.siginfo.si_addr =
        reinterpret_cast<void*>(context.context.uc_mcontext.pc);
@@ -1405,7 +1403,7 @@ index c65feaa1..5a7ab50c 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
+index f80843ea7..260dd10f7 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 @@ -192,7 +192,11 @@ class ExceptionHandler {
@@ -1422,7 +1420,7 @@ index f44483ff..36ce6d6c 100644
      // In case of MIPS Linux FP state is already part of ucontext_t so
      // 'float_state' is not required.
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
+index 35dcbfd4d..7934370fd 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 @@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
@@ -1457,7 +1455,7 @@ index 8d8809fa..e2eb031e 100644
  
    const pid_t child = fork();
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
+index fa3c1713a..6ce709e2f 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 @@ -138,7 +138,9 @@ class MicrodumpWriter {
@@ -1503,7 +1501,7 @@ index fa3c1713..6ce709e2 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
+index 6339ac0cd..291af106b 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 @@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
@@ -1530,7 +1528,7 @@ index 6339ac0c..291af106 100644
    ASSERT_NE(std::string::npos,
              buf.find("M 00001000 0000002A 00001000 "
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
+index 415068983..b93e4afcf 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 @@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
@@ -1556,7 +1554,7 @@ index 41506898..b93e4afc 100644
          for (int i = EF_R0; i <= EF_R31; i++)
            info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
+index 7fd6532ad..199cbfffd 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 @@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
@@ -1571,7 +1569,7 @@ index 1112035b..8523dad6 100644
    const MappingInfo* mapping = FindMapping(stack_pointer);
    if (!mapping)
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
+index 7bee160f1..07bb2b81a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 @@ -63,7 +63,8 @@ namespace google_breakpad {
@@ -1585,7 +1583,7 @@ index f4a75d90..020981f5 100644
  #endif
  
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
+index 331f4bb34..3f722947f 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 @@ -51,6 +51,8 @@
@@ -1598,7 +1596,7 @@ index 3ad48e50..1688c365 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
+index e3ddb81a6..fa28575ef 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 @@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
@@ -1644,7 +1642,7 @@ index e3ddb81a..fa28575e 100644
  #error "This code hasn't been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
+index da71e15dc..12bfb317a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 @@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
@@ -1667,7 +1665,7 @@ index ea6b9a12..9b318fe0 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
+index 32634ef00..2a56948de 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 @@ -136,7 +136,9 @@ class MinidumpWriter {
@@ -1724,7 +1722,7 @@ index f8cdf2a1..cb808c15 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
+index e3b0b16da..ccd8aa0a4 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 @@ -48,6 +48,8 @@ class ExceptionHandler;
@@ -1737,7 +1735,7 @@ index e3b0b16d..ccd8aa0a 100644
  typedef std::remove_pointer<fpregset_t>::type fpstate_t;
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
+index d192e5cbb..fc1bfa8d7 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 @@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
@@ -1751,7 +1749,7 @@ index 3017a49a..364efd79 100644
  # error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
+index 99362945c..c54ba7145 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 @@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
@@ -1765,7 +1763,7 @@ index 4e938269..f0ff15d9 100644
    if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
  #else
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
+index fad59f40c..616496d67 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 @@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
@@ -1783,10 +1781,10 @@ index fad59f40..616496d6 100644
      data1[i] = i & 0x7f;
    }
 diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
+index 5803b90d5..2a1cf14f0 100644
 --- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
+@@ -57,8 +57,9 @@ TEST(PageAllocatorTest, LargeObject) {
  
    EXPECT_EQ(0U, allocator.pages_allocated());
    uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
@@ -1798,7 +1796,7 @@ index 43c86314..27325b81 100644
      uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
      ASSERT_FALSE(p == NULL);
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
+index 798056dfa..22bd81fff 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 @@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
@@ -1817,7 +1815,7 @@ index ccc9f145..debaed4d 100644
        // Unsupported architecture. Note that ARM architectures are not
        // supported because objdump does not support ARM.
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
+index 528ee5f21..72764d6c1 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 @@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
@@ -1875,7 +1873,7 @@ index 528ee5f2..72764d6c 100644
  
  }  // namespace
 diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
+index aade82c99..195aa73f3 100644
 --- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 +++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 @@ -77,6 +77,8 @@
@@ -1959,7 +1957,7 @@ index a60be323..35b11b6d 100644
  #error "This code has not been ported to your platform yet"
  #endif
 diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
+index 8724b7f32..8e29424ef 100644
 --- third_party/crashpad/crashpad/CONTRIBUTORS
 +++ third_party/crashpad/crashpad/CONTRIBUTORS
 @@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
@@ -1968,7 +1966,7 @@ index 8724b7f3..8e29424e 100644
  Joshua Peraza <jperaza@chromium.org>
 +Shawn Anastasio <shawn@anastas.io>
 diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
+index 6ed77a98e..1fd83469a 100644
 --- third_party/crashpad/crashpad/compat/linux/sys/user.h
 +++ third_party/crashpad/crashpad/compat/linux/sys/user.h
 @@ -15,6 +15,7 @@
@@ -1980,7 +1978,7 @@ index 6ed77a98..1fd83469 100644
  
  #include <features.h>
 diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
+index 3a3e603cb..3118d9e9f 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context.h
 @@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
@@ -2055,7 +2053,7 @@ index 3a3e603c..3118d9e9 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
+index d7e53a493..d89eb9e01 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 @@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
@@ -2121,7 +2119,7 @@ index d7e53a49..d89eb9e0 100644
 +
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
+index d4ab936ee..1d22fc59c 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 @@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
@@ -2171,7 +2169,7 @@ index d4ab936e..1d22fc59 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
+index 3216a906b..a9fcbe9d8 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 @@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
@@ -2197,10 +2195,10 @@ index 3216a906..a9fcbe9d 100644
  }  // namespace test
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
+index 0974e3ddf..b71ec5880 100644
 --- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
+@@ -135,6 +135,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
    static constexpr char kCPU[] = "mips";
  #elif defined(ARCH_CPU_MIPS64EL)
    static constexpr char kCPU[] = "mips64";
@@ -2210,10 +2208,10 @@ index a1340760..95dc9252 100644
  #error define kCPU for this CPU
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
+index 7a1b2763c..beda8da9e 100644
 --- third_party/crashpad/crashpad/snapshot/capture_memory.cc
 +++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
+@@ -112,6 +112,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
    for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
      MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
    }
@@ -2226,7 +2224,7 @@ index a51626cc..61e0b20a 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
+index 811a72095..f4f83981d 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 @@ -43,7 +43,10 @@ enum CPUArchitecture {
@@ -2242,7 +2240,7 @@ index 811a7209..f4f83981 100644
  
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
+index c75b5555e..aeade577a 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.cc
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
 @@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
@@ -2272,7 +2270,7 @@ index 6fb8d7e7..b01f7cad 100644
      case kCPUArchitectureX86:
      case kCPUArchitectureARM:
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
+index fb23c4679..eebede63c 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.h
 @@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
@@ -2309,7 +2307,7 @@ index fb23c467..eebede63 100644
  };
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
+index 9f46a4897..aa677c4eb 100644
 --- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 @@ -15,6 +15,7 @@
@@ -2400,24 +2398,20 @@ index 9f46a489..aa677c4e 100644
  }  // namespace crashpad
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
+index d32bd1937..2dd538c2b 100644
 --- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
+@@ -192,6 +192,8 @@ void TestAgainstTarget(PtraceConnection* connection) {
                device == 0 && inode == 0 && mapping_name == "[vdso]";
+ #if defined(ARCH_CPU_X86)
+           static constexpr char kPrefix[] = "linux-gate.so.";
++#elif defined(ARCH_CPU_PPC64)
++          static constexpr char kPrefix[] = "linux-vdso64.so.";
+ #else
            static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
+ #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
+index cd40b3b12..6bcf23b6f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 @@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
@@ -2491,7 +2485,7 @@ index cd40b3b1..6bcf23b6 100644
  
  bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
+index ea0cd2106..e42df520f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 @@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
@@ -2504,7 +2498,7 @@ index ea0cd210..e42df520 100644
    } context_union_;
    CPUContext context_;
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
+index c17170b43..b6a714cc6 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 @@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
@@ -2537,7 +2531,7 @@ index e4ff1ab7..25534dd0 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
+index ee246e8bc..9555dce04 100644
 --- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 @@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
@@ -2549,21 +2543,8 @@ index b96abfe7..df12ca56 100644
  #else
  #error Port.
  #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
+index 110024680..a1f2da259 100644
 --- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 +++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 @@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
@@ -2657,10 +2638,10 @@ index 11002468..8e335a09 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
+index a99da3e4b..03b973083 100644
 --- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
+@@ -204,6 +204,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
                                      : kCPUArchitectureMIPSEL;
@@ -2669,7 +2650,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
+@@ -219,6 +221,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return 0;
@@ -2679,7 +2660,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
+@@ -239,6 +244,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return std::string();
@@ -2689,7 +2670,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
+@@ -372,6 +380,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return false;
@@ -2699,8 +2680,21 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
+diff --git third_party/crashpad/crashpad/snapshot/linux/test_modules.cc third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+index b2450c206..7ba78b2ae 100644
+--- third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
++++ third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+@@ -110,6 +110,8 @@ bool WriteTestModule(const base::FilePath& module_path,
+   module.ehdr.e_machine = EM_AARCH64;
+ #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
+   module.ehdr.e_machine = EM_MIPS;
++#elif defined(ARCH_CPU_PPC64)
++  module.ehdr.e_machine = EM_PPC64;
+ #endif
+ 
+   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
+index e3e2bebdd..8ef43752e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 @@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
@@ -2719,7 +2713,7 @@ index e3e2bebd..8ef43752 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
+index 44cc6f6d9..d4136461e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 @@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
@@ -2732,7 +2726,7 @@ index 44cc6f6d..d4136461 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
+index d3d5ebdfb..3fd730cb5 100644
 --- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 +++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 @@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
@@ -2747,23 +2741,8 @@ index d3d5ebdf..3fd730cb 100644
      if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
        LOG(ERROR) << "duplicate auxv entry";
        return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
 diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
+index 557e0d363..08ae434b8 100644
 --- third_party/crashpad/crashpad/util/linux/ptracer.cc
 +++ third_party/crashpad/crashpad/util/linux/ptracer.cc
 @@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
@@ -2842,7 +2821,7 @@ index 557e0d36..08ae434b 100644
                             info->thread_context,
                             &info->thread_specific_data_address,
 diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
+index 5b55c24a7..dea0d1f39 100644
 --- third_party/crashpad/crashpad/util/linux/thread_info.h
 +++ third_party/crashpad/crashpad/util/linux/thread_info.h
 @@ -28,6 +28,10 @@
@@ -2964,10 +2943,10 @@ index 5b55c24a..dea0d1f3 100644
    LinuxVMAddress thread_specific_data_address;
  };
 diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
+index d21a24f19..acc325349 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context.h
 +++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
+@@ -69,6 +69,7 @@ using NativeCPUContext = ucontext_t;
  //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
  //!     Linux               | ARM/ARM64    | `r0`/`x0`
  //!     Linux               | MIPS/MIPS64  | `$a0`
@@ -2976,7 +2955,7 @@ index 3ff71184..3e82f4b9 100644
  //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
  //!     this function.
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
+index 52215ee5d..b3e4a3ec7 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 +++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 @@ -32,7 +32,7 @@
@@ -3204,7 +3183,7 @@ index 52215ee5..b3e4a3ec 100644
 +  blr
  #endif  // __i386__
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
+index cf23c2def..5f264bc92 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 @@ -57,7 +57,7 @@ void TestCaptureContext() {
@@ -3217,10 +3196,10 @@ index cf23c2de..5f264bc9 100644
    // likely fail.
    const uintptr_t kReferencePC =
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
+index 30a2ab21d..60509f21d 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
+@@ -35,6 +35,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
    EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
@@ -3229,7 +3208,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
+@@ -49,6 +51,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.pc;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.pc;
@@ -3238,7 +3217,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
+@@ -63,6 +67,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.sp;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.gregs[29];
@@ -3248,10 +3227,10 @@ index 9fc5db28..5f69f8dc 100644
  }
  
 diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
+index 54cc2f19f..298b5c993 100644
+--- third_party/crashpad/crashpad/util/posix/signals_test.cc
++++ third_party/crashpad/crashpad/util/posix/signals_test.cc
+@@ -46,9 +46,9 @@ bool CanCauseSignal(int sig) {
    return sig == SIGABRT ||
           sig == SIGALRM ||
           sig == SIGBUS ||
@@ -3263,7 +3242,7 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
           sig == SIGILL ||
  #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
+@@ -117,9 +117,11 @@ void CauseSignal(int sig) {
        break;
      }
  
@@ -3276,7 +3255,7 @@ index 58bfa8f8..8fc37c46 100644
      case SIGFPE: {
        // Optimization makes this tricky, so get zero from a system call likely
        // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
+@@ -137,7 +139,7 @@ void CauseSignal(int sig) {
        fstat(quotient, &stat_buf);
        break;
      }
@@ -3286,10 +3265,10 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
      case SIGILL: {
 diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
+index 6b4566fc3..c07f732ad 100644
 --- third_party/dav1d/BUILD.gn
 +++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
+@@ -184,6 +184,8 @@ static_library("dav1d_8bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3298,7 +3277,7 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
+@@ -212,6 +214,8 @@ static_library("dav1d_10bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3307,9 +3286,9 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
+@@ -263,6 +267,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
+       defines = [ "PREFIX" ]
+     }
  
 +    cflags = dav1d_copts
 +  }
@@ -3329,7 +3308,7 @@ index 788dc6cf..5fd7e8fd 100644
      cflags = dav1d_copts
    }
  }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
+@@ -292,5 +311,7 @@ static_library("dav1d") {
      }
    } else if (current_cpu == "arm" || current_cpu == "arm64") {
      deps += [ ":dav1d_arm" ]
@@ -3339,7 +3318,7 @@ index 788dc6cf..5fd7e8fd 100644
  }
 diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
 new file mode 100644
-index 00000000..f6ca57f7
+index 000000000..9fbbf75cc
 --- /dev/null
 +++ third_party/dav1d/config/linux/ppc64/config.h
 @@ -0,0 +1,39 @@
@@ -3383,10 +3362,10 @@ index 00000000..f6ca57f7
 +#define HAVE_UNISTD_H 1
 +
 diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
+index c59cb0821..3060284a8 100644
 --- third_party/dav1d/dav1d_generated.gni
 +++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
+@@ -82,6 +82,11 @@ arm_template_sources = [
    "libdav1d/src/arm/mc_init_tmpl.c",
  ]
  
@@ -3399,7 +3378,7 @@ index 8becac02..d5f4fcac 100644
    "libdav1d/src/cdef_apply_tmpl.c",
    "libdav1d/src/cdef_tmpl.c",
 diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
+index 9ab5e00b8..ad3feffee 100755
 --- third_party/dav1d/generate_source.py
 +++ third_party/dav1d/generate_source.py
 @@ -50,7 +50,8 @@ def WriteGn(fd):
@@ -3413,7 +3392,7 @@ index 9ab5e00b..ad3feffe 100755
    WriteArray(fd, "template_sources", template_sources)
  
 diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
+index 0b4bd72f0..a0caa5e71 100644
 --- third_party/dav1d/libdav1d/src/ppc/types.h
 +++ third_party/dav1d/libdav1d/src/ppc/types.h
 @@ -51,4 +51,19 @@
@@ -3437,10 +3416,10 @@ index 0b4bd72f..a0caa5e7 100644
 +
  #endif /* DAV1D_SRC_PPC_TYPES_H */
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
+index e4ac22644..1c57015db 100644
 --- third_party/lss/linux_syscall_support.h
 +++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
+@@ -3947,7 +3947,7 @@ struct kernel_statfs {
        LSS_REG(2, buf);
        LSS_BODY(void*, mmap2, "0"(__r2));
      }
@@ -3449,7 +3428,7 @@ index d2baee9d..9955ce44 100644
      #define __NR__mmap2 __NR_mmap2
      LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
                           size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
+@@ -4058,7 +4058,7 @@ struct kernel_statfs {
    #if defined(__i386__) ||                                                    \
        defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
       (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
@@ -3471,10 +3450,10 @@ index bdac4d784..51e0f2cac 100644
  #  define SIMD_SZ 4
  #  define VZERO() ((vector float) vec_splat_u8(0))
 diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
+index ec3e56964..4cf8999a2 100644
 --- third_party/skia/src/sksl/SkSLString.cpp
 +++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
+@@ -234,7 +234,12 @@ String to_string(double value) {
      if (needsDotZero) {
          buffer << ".0";
      }
@@ -3487,12 +3466,12 @@ index 88eb1c7d..4be33fa5 100644
 +    return String(ret.c_str());
  }
  
- SKSL_INT stoi(const String& s) {
+ bool stod(const StringFragment& s, SKSL_FLOAT* value) {
 diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
+index 6b4a7899d..b8c7fe414 100644
 --- third_party/sqlite/src/amalgamation/sqlite3.c
 +++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
+@@ -14474,7 +14474,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3503,10 +3482,10 @@ index 1b2c2ec7..7593dba1 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
+index d30c9b7de..cf75a69d9 100644
 --- third_party/sqlite/src/amalgamation_dev/sqlite3.c
 +++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
+@@ -14487,7 +14487,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3517,10 +3496,10 @@ index 19c87689..c7ab039e 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
+index f5b57a5e2..80a2d0ad8 100644
 --- third_party/sqlite/src/ext/rtree/rtree.c
 +++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
+@@ -450,7 +450,7 @@ struct RtreeMatchArg {
  #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
@@ -3530,10 +3509,10 @@ index efaef813..4cd57d55 100644
  #elif defined(sparc)    || defined(__ppc__)
  # define SQLITE_BYTEORDER    4321
 diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
+index 245070d4f..b25164e95 100644
 --- third_party/sqlite/src/src/sqliteInt.h
 +++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
+@@ -877,7 +877,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3544,10 +3523,10 @@ index 122e26ad..ec21dcb5 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
+index 4f0c5430c..54ee0829e 100644
+--- third_party/webrtc/modules/desktop_capture/differ_block.cc
++++ third_party/webrtc/modules/desktop_capture/differ_block.cc
+@@ -30,11 +30,7 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
    static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
  
    if (!diff_proc) {
@@ -3560,7 +3539,7 @@ index dd9ab457..c005d959 100644
      bool have_sse2 = GetCPUInfo(kSSE2) != 0;
      // For x86 processors, check if SSE2 is supported.
      if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
+@@ -44,6 +40,10 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
      } else {
        diff_proc = &VectorDifference_C;
      }
@@ -3572,10 +3551,10 @@ index dd9ab457..c005d959 100644
    }
  
 diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
+index be2367b85..be4ee4233 100644
 --- third_party/webrtc/rtc_base/system/arch.h
 +++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
+@@ -79,6 +79,18 @@
  #elif defined(__EMSCRIPTEN__)
  #define WEBRTC_ARCH_32_BITS
  #define WEBRTC_ARCH_LITTLE_ENDIAN
@@ -3594,15 +3573,15 @@ index ed216e66..25d36c07 100644
  #else
  #error Please add support for your architecture in rtc_base/system/arch.h
  #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
+diff --git v8/BUILD.gn v8/BUILD.gn
+index f39529a3a..e84fc449e 100644
 --- v8/BUILD.gn
 +++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
+@@ -850,6 +850,12 @@ config("toolchain") {
      }
      if (host_byteorder == "little") {
        defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
++      cflags += [
 +        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
 +        "-mcpu=power8",
 +        "-maltivec",
@@ -3611,24 +3590,12 @@ index 167e63503..125c445ea 100644
      } else if (host_byteorder == "big") {
        defines += [ "V8_TARGET_ARCH_PPC_BE" ]
        if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
 diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
+index fb872ad39..45fc585dd 100644
 --- v8/test/BUILD.gn
 +++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
+@@ -36,7 +36,7 @@ group("gn_all") {
+       "benchmarks/cpp:gn_all",
        "cctest:cctest",
        "cctest:generate-bytecode-expectations",
 -      "unittests:unittests",
@@ -3636,7 +3603,7 @@ index f6d30537a..287b27080 100644
      ]
    }
  }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
+@@ -78,7 +78,7 @@ group("v8_bot_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
@@ -3645,7 +3612,7 @@ index f6d30537a..287b27080 100644
      "wasm-api-tests:wasm_api_tests",
      "wasm-js:v8_wasm_js",
      "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
+@@ -98,7 +98,7 @@ group("v8_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (18 preceding siblings ...)
  2021-03-03 18:25 ` [PR PATCH] [Updated] " pullmoll
@ 2021-03-03 18:27 ` pullmoll
  2021-03-03 18:30 ` pullmoll
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:27 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 350 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789957742

Comment:
@q66 This is WIP and I didn't claim it was finished. You're welcome to help or, if you so desire, take over what I started :-P Took your updated xxx-ppc64le-musl.patch and restored the one in musl-pataches...

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (19 preceding siblings ...)
  2021-03-03 18:27 ` pullmoll
@ 2021-03-03 18:30 ` pullmoll
  2021-03-03 18:32 ` pullmoll
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:30 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 411 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789957742

Comment:
@q66 This is WIP and I didn't claim it was finished. You're welcome to help or, if you so desire, take over what I started :-P Took your updated xxx-ppc64le-musl.patch and restored the one in musl-pataches...

Oh, and  the previous libc_malloc.patch does not compile.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (20 preceding siblings ...)
  2021-03-03 18:30 ` pullmoll
@ 2021-03-03 18:32 ` pullmoll
  2021-03-03 18:42 ` q66
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 18:32 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 410 bytes --]

New comment by pullmoll on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789957742

Comment:
@q66 This is WIP and I didn't claim it was finished. You're welcome to help or, if you so desire, take over what I started :-P Took your updated xxx-ppc64le-musl.patch and restored the one in musl-patches...

Oh, and  the previous libc_malloc.patch does not compile.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (21 preceding siblings ...)
  2021-03-03 18:32 ` pullmoll
@ 2021-03-03 18:42 ` q66
  2021-03-03 19:56 ` [PR PATCH] [Updated] " pullmoll
                   ` (2 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: q66 @ 2021-03-03 18:42 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 412 bytes --]

New comment by q66 on void-packages repository

https://github.com/void-linux/void-packages/pull/29205#issuecomment-789967689

Comment:
well I'm not expecting it to be finished, i'm just saying the patches tend to depend on each other, so by making patches later in the sequence apply after removing patches earlier in the sequence is just wasting your time (and may result in bugs being introduced by accident)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (22 preceding siblings ...)
  2021-03-03 18:42 ` q66
@ 2021-03-03 19:56 ` pullmoll
  2021-03-07 12:06 ` pullmoll
  2021-03-11 19:11 ` [PR PATCH] [Closed]: " q66
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-03 19:56 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 1160 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, "Aw, Snap!" in a VM
  seccomp-bpf failure in syscall 0324
+ patches/xxx-ppc64le-support.patch removed for now (already upstreamed? need to check again)
+ files/musl-paches/xxx-ppc64le-support.patch stripped down to what still applies
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself:
https://repo.voidlinux.de/x86_64/chromium-89.0.4389.72_1.x86_64.xbps
https://repo.voidlinux.de/i686/chromium-89.0.4389.72_1.i686.xbps


A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 124950 bytes --]

From aff0f74fee39656e9a4bad3126e5dcbf48e71466 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

CVE-2021-21166

[ci skip]
---
 .../default-pthread-stacksize.patch           |   4 +-
 .../files/musl-patches/musl-fixes.patch       |  40 +-
 .../files/musl-patches/musl-hacks.patch       |   4 +-
 .../files/musl-patches/musl-libc++.patch      |   6 +-
 .../musl-patches/musl-no-glibc-version.patch  |  28 ++
 .../files/musl-patches/musl-sandbox.patch     |  12 +-
 .../files/musl-patches/no-mallinfo.patch      |   6 +-
 .../files/musl-patches/resolver.patch         |   2 +-
 srcpkgs/chromium/patches/browser-size_t.patch |  10 -
 .../chromium-88-AXTreeFormatter-include.patch |  27 -
 ...ium-88-BookmarkModelObserver-include.patch |  21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |  36 --
 .../chromium-88-StringPool-include.patch      |  20 -
 ...romium-88-federated_learning-include.patch |  21 -
 .../patches/chromium-88-glibc-2.33.patch      | 144 ------
 ...hromium-88-ideographicSpaceCharacter.patch |  27 -
 .../patches/chromium-88-ityp-include.patch    |  25 -
 .../patches/chromium-88-vaapi-attribute.patch |  39 --
 ...um-89-CompositorFrameReporter-dcheck.patch |  11 +
 srcpkgs/chromium/patches/libc_malloc.patch    |  23 +-
 ...remove-unsupported-compiler-warnings.patch |  26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |  24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |  16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |  27 -
 srcpkgs/chromium/patches/no-std-time.patch    |  11 +
 .../chromium/patches/sandbox-membarrier.patch |  61 +--
 .../patches/xxx-ppc64le-support.patch         | 475 ++++++++----------
 srcpkgs/chromium/template                     |   8 +-
 28 files changed, 321 insertions(+), 833 deletions(-)
 create mode 100644 srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
new file mode 100644
index 00000000000..9ffec62465c
--- /dev/null
+++ b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
@@ -0,0 +1,28 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig	2021-03-02 18:45:03.000000000 +0100
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc	2021-03-03 17:39:14.944100746 +0100
+@@ -55,7 +55,9 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+ #include <gnu/libc-version.h>
++#endif
+ 
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -317,6 +319,7 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+   base::Version version(gnu_get_libc_version());
+ 
+   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
+@@ -338,6 +341,7 @@
+   }
+   base::UmaHistogramSparse("Linux.GlibcVersion", glibc_version_result);
+ #endif
++#endif
+ }
+ 
+ void RecordTouchEventState() {
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
index a31a9f6a5e9..b30bbc02cb6 100644
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ b/srcpkgs/chromium/patches/sandbox-membarrier.patch
@@ -1,56 +1,6 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
+--- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig	2021-03-03 18:04:45.167674791 +0100
++++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc	2021-03-03 18:13:17.036547592 +0100
+@@ -394,11 +394,12 @@
    switch (sysno) {
      case __NR_exit:
      case __NR_exit_group:
@@ -58,3 +8,8 @@
      case __NR_wait4:
      case __NR_waitid:
  #if defined(__i386__)
+     case __NR_waitpid:
+ #endif
+       return true;
+     case __NR_clone:  // Should be parameter-restricted.
+     case __NR_setns:  // Privileged.
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
index 805755c2125..bbcfbad34e5 100644
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
@@ -1,6 +1,6 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
+commit 2c013a317b1114ef67cdbbc30824b28907b9ea94
+Author: Daniel Kolesa <daniel@octaforge.org>
+Date:   Wed Mar 3 19:08:29 2021 +0100
 
     ppc64le support
 
@@ -20,10 +20,10 @@ index 286a92a27..ec36a85d3 100755
    src_dir = os.path.dirname(script_dir)
    nacl_dir = os.path.join(src_dir, 'native_client')
 diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
+index 35f01d0a4..28f2e7475 100644
 --- chrome/installer/linux/BUILD.gn
 +++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
+@@ -94,8 +94,6 @@ packaging_files = packaging_files_binaries + [
                      "$root_out_dir/xdg-mime",
                      "$root_out_dir/xdg-settings",
                      "$root_out_dir/locales/en-US.pak",
@@ -32,7 +32,7 @@ index b101b0cb2..9fd5a7617 100644
                    ]
  
  action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
+@@ -315,7 +313,6 @@ group("installer_deps") {
      ":theme_files",
      "//chrome",
      "//chrome:packed_resources",
@@ -41,11 +41,11 @@ index b101b0cb2..9fd5a7617 100644
      "//third_party/crashpad/crashpad/handler:crashpad_handler",
    ]
 diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
+index db30ae6d6..9dc09bf53 100644
 --- sandbox/features.gni
 +++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
+@@ -11,7 +11,8 @@ import("//build/config/nacl/config.gni")
+ use_seccomp_bpf = (is_linux || is_chromeos || is_android) &&
                    (current_cpu == "x86" || current_cpu == "x64" ||
                     current_cpu == "arm" || current_cpu == "arm64" ||
 -                   current_cpu == "mipsel" || current_cpu == "mips64el")
@@ -53,11 +53,12 @@ index 09280d35f..42514157f 100644
 +                   current_cpu == "ppc64")
  
  use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
+ 
 diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
+index e9a94b461..cca1a5da5 100644
 --- sandbox/linux/BUILD.gn
 +++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
+@@ -427,6 +427,8 @@ component("sandbox_services") {
  
  source_set("sandbox_services_headers") {
    sources = [
@@ -151,7 +152,7 @@ index 1a407b952..a6aec544e 100644
  #error Unsupported target platform
  
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
+index 6a1ec2389..f20c582dd 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 @@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
@@ -164,7 +165,7 @@ index a6d2c0dfb..37fdc179a 100644
           SyscallSets::IsSocketCall(sysno) ||
  #endif
  #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -227,7 +228,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -173,7 +174,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_mmap)
      return RestrictMmapFlags();
  #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -245,7 +246,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
      return RestrictPrctl();
  
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -182,7 +183,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_socketpair) {
      // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
      static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -285,7 +286,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || \
@@ -193,22 +194,20 @@ index a6d2c0dfb..37fdc179a 100644
      return RestrictSocketcallCommand();
  #endif
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
+index 01c046dda..7e5a6be82 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
+@@ -302,7 +302,7 @@ TEST_BASELINE_SIGSYS(__NR_sysinfo)
+ TEST_BASELINE_SIGSYS(__NR_syslog)
+ TEST_BASELINE_SIGSYS(__NR_timer_create)
+ 
+-#if !defined(__aarch64__)
++#if !defined(__aarch64__) && !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_eventfd)
  TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
+index 2a97d3916..8e81aa6cf 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 @@ -40,7 +40,8 @@
@@ -233,7 +232,7 @@ index f51915edc..ca2f4f106 100644
  #if defined(OS_ANDROID)
  
  #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
+@@ -98,6 +104,15 @@ inline bool IsArchitectureMips() {
  #endif
  }
  
@@ -249,7 +248,7 @@ index f51915edc..ca2f4f106 100644
  // Ubuntu's version of glibc has a race condition in sem_post that can cause
  // it to call futex(2) with bogus op arguments. To workaround this, we need
  // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
+@@ -239,6 +254,8 @@ ResultExpr RestrictFcntlCommands() {
    uint64_t kOLargeFileFlag = O_LARGEFILE;
    if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
      kOLargeFileFlag = 0100000;
@@ -258,7 +257,7 @@ index f51915edc..ca2f4f106 100644
  
    const Arg<int> cmd(1);
    const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
+@@ -253,14 +270,23 @@ ResultExpr RestrictFcntlCommands() {
                F_SETLKW,
                F_GETLK,
                F_DUPFD,
@@ -285,7 +284,7 @@ index f51915edc..ca2f4f106 100644
  ResultExpr RestrictSocketcallCommand() {
    // Unfortunately, we are unable to restrict the first parameter to
    // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
+@@ -413,7 +439,7 @@ ResultExpr RestrictPtrace() {
  #endif
    return Switch(request)
        .CASES((
@@ -294,7 +293,6 @@ index f51915edc..ca2f4f106 100644
                   PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
                   PTRACE_GETREGSET,
  #endif
-
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
 index ba4289f05..9a4d5ab2d 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
@@ -309,7 +307,7 @@ index ba4289f05..9a4d5ab2d 100644
  // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
  SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
+index 642df7207..34f47eb73 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 @@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
@@ -322,7 +320,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_time:
  #endif
        return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
+@@ -45,12 +46,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
      case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
      case __NR_clock_settime:    // Privileged.
  #if defined(__i386__) || \
@@ -339,7 +337,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_stime:
  #endif
      default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -116,7 +119,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_faccessat:  // EPERM not a valid errno.
      case __NR_fchmodat:
      case __NR_fchownat:  // Should be called chownat ?
@@ -348,7 +346,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
  #elif defined(__i386__) || defined(__arm__) || \
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -135,7 +138,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_memfd_create:
      case __NR_mkdirat:
      case __NR_mknodat:
@@ -357,7 +355,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldlstat:
      case __NR_oldstat:
  #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -149,7 +152,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
  #endif
      case __NR_statfs:  // EPERM not a valid errno.
  #if defined(__i386__) || defined(__arm__) || \
@@ -367,7 +365,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_statfs64:
  #endif
      case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -159,7 +163,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_truncate64:
  #endif
      case __NR_unlinkat:
@@ -377,7 +375,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_utime:
  #endif
      case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -181,7 +186,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
  #endif
        return true;
  // TODO(jln): these should be denied gracefully as well (moved below).
@@ -387,7 +385,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_fadvise64:  // EPERM not a valid errno.
  #endif
  #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -194,11 +200,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_flock:      // EPERM not a valid errno.
      case __NR_fstatfs:    // Give information about the whole filesystem.
  #if defined(__i386__) || defined(__arm__) || \
@@ -402,7 +400,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldfstat:
  #endif
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -206,6 +213,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_sync_file_range:  // EPERM not a valid errno.
  #elif defined(__arm__)
      case __NR_arm_sync_file_range:  // EPERM not a valid errno.
@@ -411,7 +409,7 @@ index d3693fd78..d492cf94b 100644
  #endif
      default:
        return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
+@@ -231,7 +240,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
  #endif
      case __NR_getdents64:  // EPERM not a valid errno.
  #if defined(__i386__) || \
@@ -421,7 +419,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_readdir:
  #endif
        return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
+@@ -272,7 +282,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
  bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
    switch (sysno) {
      case __NR_capset:
@@ -430,7 +428,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ioperm:  // Intel privilege.
      case __NR_iopl:    // Intel privilege.
  #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -323,7 +333,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
      case __NR_rt_sigreturn:
      case __NR_rt_sigtimedwait:
  #if defined(__i386__) || defined(__arm__) || \
@@ -440,7 +438,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigaction:
      case __NR_sigprocmask:
      case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -339,7 +350,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
  #endif
      case __NR_signalfd4:
  #if defined(__i386__) || defined(__arm__) || \
@@ -450,7 +448,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigpending:
      case __NR_sigsuspend:
  #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
+@@ -363,7 +375,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
  #endif
      case __NR_dup3:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -459,7 +457,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_shutdown:
  #endif
        return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -397,7 +409,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
      case __NR_membarrier:
      case __NR_wait4:
      case __NR_waitid:
@@ -468,7 +466,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_waitpid:
  #endif
        return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -414,7 +426,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #endif
      case __NR_set_tid_address:
      case __NR_unshare:
@@ -477,7 +475,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_vfork:
  #endif
      default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -463,7 +475,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
        return true;
      default:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -486,7 +484,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_socketpair:  // We will want to inspect its argument.
  #endif
        return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -473,7 +485,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
  bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
    switch (sysno) {
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -495,7 +493,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_accept:
      case __NR_accept4:
      case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
+@@ -488,7 +500,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
  }
  
  #if defined(__i386__) || \
@@ -505,7 +503,7 @@ index d3693fd78..d492cf94b 100644
  // Big multiplexing system call for sockets.
  bool SyscallSets::IsSocketCall(int sysno) {
    switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
+@@ -502,7 +515,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
  }
  #endif
  
@@ -515,7 +513,7 @@ index d3693fd78..d492cf94b 100644
  bool SyscallSets::IsNetworkSocketInformation(int sysno) {
    switch (sysno) {
      case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
+@@ -527,7 +541,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
      case __NR_mincore:
      case __NR_mlockall:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -524,7 +522,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_mmap:
  #endif
  #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -557,7 +571,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
    switch (sysno) {
      case __NR_lseek:
  #if defined(__i386__) || defined(__arm__) || \
@@ -534,7 +532,7 @@ index d3693fd78..d492cf94b 100644
      case __NR__llseek:
  #endif
  #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -569,26 +584,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
      case __NR_readv:
      case __NR_pread64:
  #if defined(__arm__) || \
@@ -569,7 +567,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sendmsg:  // Could specify destination.
      case __NR_sendto:   // Could specify destination.
  #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -645,7 +662,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
        return true;
      case __NR_getpriority:
  #if defined(__i386__) || defined(__arm__) || \
@@ -579,7 +577,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_nice:
  #endif
      case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -657,7 +675,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
  bool SyscallSets::IsAdminOperation(int sysno) {
    switch (sysno) {
  #if defined(__i386__) || defined(__arm__) || \
@@ -589,7 +587,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_bdflush:
  #endif
      case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
+@@ -673,7 +692,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
  
  bool SyscallSets::IsKernelModule(int sysno) {
    switch (sysno) {
@@ -599,7 +597,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_create_module:
      case __NR_get_kernel_syms:  // Should ENOSYS.
      case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
+@@ -706,7 +726,8 @@ bool SyscallSets::IsFsControl(int sysno) {
      case __NR_swapoff:
      case __NR_swapon:
  #if defined(__i386__) || \
@@ -609,7 +607,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_umount:
  #endif
      case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
+@@ -722,7 +743,7 @@ bool SyscallSets::IsNuma(int sysno) {
      case __NR_getcpu:
      case __NR_mbind:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -618,7 +616,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_migrate_pages:
  #endif
      case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
+@@ -751,14 +772,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
    switch (sysno) {
      case __NR_acct:  // Privileged.
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -637,7 +635,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ulimit:
  #endif
      case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
+@@ -792,7 +814,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
  #endif
      case __NR_sysinfo:
      case __NR_uname:
@@ -646,7 +644,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_olduname:
      case __NR_oldolduname:
  #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
+@@ -854,8 +876,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
  }
  #endif
  
@@ -664,7 +662,7 @@ index d3693fd78..d492cf94b 100644
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
  // These give a lot of ambient authority and bypass the setuid sandbox.
  bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
+@@ -887,7 +917,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
  #endif
  
  #if defined(__i386__) || \
@@ -674,7 +672,7 @@ index d3693fd78..d492cf94b 100644
  // Big system V multiplexing system call.
  bool SyscallSets::IsSystemVIpc(int sysno) {
    switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
+@@ -907,7 +938,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
    return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
           IsSystemVSharedMemory(sysno);
  #elif defined(__i386__) || \
@@ -684,7 +682,7 @@ index d3693fd78..d492cf94b 100644
    return IsSystemVIpc(sysno);
  #endif
  }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
+@@ -960,7 +992,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
  bool SyscallSets::IsTimer(int sysno) {
    switch (sysno) {
      case __NR_getitimer:
@@ -694,7 +692,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_alarm:
  #endif
      case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1019,18 +1052,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_syncfs:
      case __NR_vhangup:
  // The system calls below are not implemented.
@@ -721,7 +719,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_gtty:
      case __NR_idle:
      case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1038,20 +1075,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_prof:
      case __NR_profil:
  #endif
@@ -889,7 +887,7 @@ index e47e98bf5..d53a7ff56 100644
    SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
  }
 diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
+index f5b86a73a..5e6c4a068 100644
 --- sandbox/linux/seccomp-bpf/trap.cc
 +++ sandbox/linux/seccomp-bpf/trap.cc
 @@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
@@ -940,23 +938,23 @@ index fcfd2aa12..f6eb32fb7 100644
    return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
  #endif
 diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
+index d72c9d238..77f1d95f5 100644
 --- sandbox/linux/syscall_broker/broker_process.cc
 +++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
+@@ -169,7 +169,7 @@ bool BrokerProcess::IsSyscallBrokerable(int sysno, bool fast_check) const {
+ #if defined(__NR_fstatat64)
+     case __NR_fstatat64:
  #endif
 -#if defined(__x86_64__) || defined(__aarch64__)
 +#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
      case __NR_newfstatat:
  #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
+       return !fast_check || allowed_command_set_.test(COMMAND_STAT);
 diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
+index 1fa47ed09..39cc9ab53 100644
 --- sandbox/linux/system_headers/linux_seccomp.h
 +++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
+@@ -41,6 +41,9 @@
  #ifndef EM_AARCH64
  #define EM_AARCH64 183
  #endif
@@ -966,7 +964,7 @@ index a60fe2ad3..9dccdb51d 100644
  
  #ifndef __AUDIT_ARCH_64BIT
  #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
+@@ -73,6 +76,12 @@
  #ifndef AUDIT_ARCH_AARCH64
  #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
  #endif
@@ -1055,13 +1053,13 @@ index 000000000..07728e087
 +//TODO: is it necessary to redefine ucontext on PPC64?
 +
 +#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
+diff --git sandbox/policy/linux/bpf_renderer_policy_linux.cc sandbox/policy/linux/bpf_renderer_policy_linux.cc
+index 2588fc792..d455c4601 100644
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
 @@ -15,6 +15,11 @@
  #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+ #include "sandbox/policy/linux/sandbox_linux.h"
  
 +// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
 +#ifdef __powerpc64__
@@ -1072,7 +1070,7 @@ index fb89b3356..1e984731e 100644
  // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
  #include <linux/types.h>
 diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
+index 3a807e1e3..5258617a7 100644
 --- third_party/angle/src/compiler/translator/InfoSink.h
 +++ third_party/angle/src/compiler/translator/InfoSink.h
 @@ -92,7 +92,16 @@ class TInfoSinkBase
@@ -1094,7 +1092,7 @@ index 3a807e1e..5258617a 100644
      }
      // Write boolean values as their names instead of integral value.
 diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
+index fcbc9246a..39ae66148 100644
 --- third_party/angle/src/libANGLE/Constants.h
 +++ third_party/angle/src/libANGLE/Constants.h
 @@ -9,6 +9,7 @@
@@ -1106,10 +1104,10 @@ index 42964cc1..6607deeb 100644
  
  #include <stdint.h>
 diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
+index 17cf9cda9..8ce96bd32 100644
 --- third_party/boringssl/BUILD.gn
 +++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+@@ -103,6 +103,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
        } else {
          public_configs = [ ":no_asm_config" ]
        }
@@ -1124,10 +1122,10 @@ index b435499f4..ac8a84b6d 100644
        public_configs = [ ":no_asm_config" ]
      }
 diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
+index 4af3d7bbf..adbf54159 100644
 --- third_party/breakpad/BUILD.gn
 +++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
+@@ -596,7 +596,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/minidump_file_writer.h",
        "breakpad/src/common/convert_UTF.cc",
        "breakpad/src/common/convert_UTF.h",
@@ -1135,7 +1133,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/elf_core_dump.cc",
        "breakpad/src/common/linux/elf_core_dump.h",
        "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
+@@ -634,6 +633,14 @@ if (is_linux || is_chromeos || is_android) {
  
      libs = [ "dl" ]
  
@@ -1150,7 +1148,7 @@ index 5617de88..dc8bc176 100644
      include_dirs = [
        ".",
        "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
+@@ -682,7 +689,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
        "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
@@ -1159,7 +1157,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/file_id_unittest.cc",
        "breakpad/src/common/linux/linux_libc_support_unittest.cc",
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
+index 07d9171a0..9aed4cb36 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 @@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
@@ -1172,7 +1170,7 @@ index 07d9171a..9aed4cb3 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
+index aae1dc13b..03afec7a5 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 @@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
@@ -1258,7 +1256,7 @@ index aae1dc13..03afec7a 100644
 +
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
+index fb216fa6d..593aac822 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 @@ -68,6 +68,10 @@ struct ThreadInfo {
@@ -1285,10 +1283,10 @@ index fb216fa6..593aac82 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
+index 6eec1be24..741983a1a 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) {
    out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
  #endif
  }
@@ -1338,21 +1336,21 @@ index ee515c41..1090470f 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
+index 7d4100881..c122ac92e 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 @@ -55,6 +55,9 @@ struct UContextReader {
  #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
                               const struct fpsimd_context* fpregs);
 +#elif defined(__powerpc64__)
 +  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
 +                             const vrregset_t* vregs);
  #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc);
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
+index a6cb5f984..ae16b64d9 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 @@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
@@ -1373,7 +1371,7 @@ index c65feaa1..5a7ab50c 100644
    // and 'float_state' is not a member of CrashContext.
    ucontext_t* uc_ptr = (ucontext_t*)uc;
    if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -708,11 +715,19 @@ bool ExceptionHandler::WriteMinidump() {
    }
  #endif
  
@@ -1394,7 +1392,7 @@ index c65feaa1..5a7ab50c 100644
    context.tid = sys_gettid();
  
    // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -733,6 +748,9 @@ bool ExceptionHandler::WriteMinidump() {
  #elif defined(__mips__)
    context.siginfo.si_addr =
        reinterpret_cast<void*>(context.context.uc_mcontext.pc);
@@ -1405,7 +1403,7 @@ index c65feaa1..5a7ab50c 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
+index f80843ea7..260dd10f7 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 @@ -192,7 +192,11 @@ class ExceptionHandler {
@@ -1422,7 +1420,7 @@ index f44483ff..36ce6d6c 100644
      // In case of MIPS Linux FP state is already part of ucontext_t so
      // 'float_state' is not required.
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
+index 35dcbfd4d..7934370fd 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 @@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
@@ -1457,7 +1455,7 @@ index 8d8809fa..e2eb031e 100644
  
    const pid_t child = fork();
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
+index fa3c1713a..6ce709e2f 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 @@ -138,7 +138,9 @@ class MicrodumpWriter {
@@ -1503,7 +1501,7 @@ index fa3c1713..6ce709e2 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
+index 6339ac0cd..291af106b 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 @@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
@@ -1530,7 +1528,7 @@ index 6339ac0c..291af106 100644
    ASSERT_NE(std::string::npos,
              buf.find("M 00001000 0000002A 00001000 "
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
+index 415068983..b93e4afcf 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 @@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
@@ -1556,7 +1554,7 @@ index 41506898..b93e4afc 100644
          for (int i = EF_R0; i <= EF_R31; i++)
            info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
+index 7fd6532ad..199cbfffd 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 @@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
@@ -1571,7 +1569,7 @@ index 1112035b..8523dad6 100644
    const MappingInfo* mapping = FindMapping(stack_pointer);
    if (!mapping)
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
+index 7bee160f1..07bb2b81a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 @@ -63,7 +63,8 @@ namespace google_breakpad {
@@ -1585,7 +1583,7 @@ index f4a75d90..020981f5 100644
  #endif
  
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
+index 331f4bb34..3f722947f 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 @@ -51,6 +51,8 @@
@@ -1598,7 +1596,7 @@ index 3ad48e50..1688c365 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
+index e3ddb81a6..fa28575ef 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 @@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
@@ -1644,7 +1642,7 @@ index e3ddb81a..fa28575e 100644
  #error "This code hasn't been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
+index da71e15dc..12bfb317a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 @@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
@@ -1667,7 +1665,7 @@ index ea6b9a12..9b318fe0 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
+index 32634ef00..2a56948de 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 @@ -136,7 +136,9 @@ class MinidumpWriter {
@@ -1724,7 +1722,7 @@ index f8cdf2a1..cb808c15 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
+index e3b0b16da..ccd8aa0a4 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 @@ -48,6 +48,8 @@ class ExceptionHandler;
@@ -1737,7 +1735,7 @@ index e3b0b16d..ccd8aa0a 100644
  typedef std::remove_pointer<fpregset_t>::type fpstate_t;
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
+index d192e5cbb..fc1bfa8d7 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 @@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
@@ -1751,7 +1749,7 @@ index 3017a49a..364efd79 100644
  # error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
+index 99362945c..c54ba7145 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 @@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
@@ -1765,7 +1763,7 @@ index 4e938269..f0ff15d9 100644
    if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
  #else
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
+index fad59f40c..616496d67 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 @@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
@@ -1783,10 +1781,10 @@ index fad59f40..616496d6 100644
      data1[i] = i & 0x7f;
    }
 diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
+index 5803b90d5..2a1cf14f0 100644
 --- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
+@@ -57,8 +57,9 @@ TEST(PageAllocatorTest, LargeObject) {
  
    EXPECT_EQ(0U, allocator.pages_allocated());
    uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
@@ -1798,7 +1796,7 @@ index 43c86314..27325b81 100644
      uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
      ASSERT_FALSE(p == NULL);
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
+index 798056dfa..22bd81fff 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 @@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
@@ -1817,7 +1815,7 @@ index ccc9f145..debaed4d 100644
        // Unsupported architecture. Note that ARM architectures are not
        // supported because objdump does not support ARM.
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
+index 528ee5f21..72764d6c1 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 @@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
@@ -1875,7 +1873,7 @@ index 528ee5f2..72764d6c 100644
  
  }  // namespace
 diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
+index aade82c99..195aa73f3 100644
 --- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 +++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 @@ -77,6 +77,8 @@
@@ -1959,7 +1957,7 @@ index a60be323..35b11b6d 100644
  #error "This code has not been ported to your platform yet"
  #endif
 diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
+index 8724b7f32..8e29424ef 100644
 --- third_party/crashpad/crashpad/CONTRIBUTORS
 +++ third_party/crashpad/crashpad/CONTRIBUTORS
 @@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
@@ -1968,7 +1966,7 @@ index 8724b7f3..8e29424e 100644
  Joshua Peraza <jperaza@chromium.org>
 +Shawn Anastasio <shawn@anastas.io>
 diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
+index 6ed77a98e..1fd83469a 100644
 --- third_party/crashpad/crashpad/compat/linux/sys/user.h
 +++ third_party/crashpad/crashpad/compat/linux/sys/user.h
 @@ -15,6 +15,7 @@
@@ -1980,7 +1978,7 @@ index 6ed77a98..1fd83469 100644
  
  #include <features.h>
 diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
+index 3a3e603cb..3118d9e9f 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context.h
 @@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
@@ -2055,7 +2053,7 @@ index 3a3e603c..3118d9e9 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
+index d7e53a493..d89eb9e01 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 @@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
@@ -2121,7 +2119,7 @@ index d7e53a49..d89eb9e0 100644
 +
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
+index d4ab936ee..1d22fc59c 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 @@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
@@ -2171,7 +2169,7 @@ index d4ab936e..1d22fc59 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
+index 3216a906b..a9fcbe9d8 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 @@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
@@ -2197,10 +2195,10 @@ index 3216a906..a9fcbe9d 100644
  }  // namespace test
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
+index 0974e3ddf..b71ec5880 100644
 --- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
+@@ -135,6 +135,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
    static constexpr char kCPU[] = "mips";
  #elif defined(ARCH_CPU_MIPS64EL)
    static constexpr char kCPU[] = "mips64";
@@ -2210,10 +2208,10 @@ index a1340760..95dc9252 100644
  #error define kCPU for this CPU
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
+index 7a1b2763c..beda8da9e 100644
 --- third_party/crashpad/crashpad/snapshot/capture_memory.cc
 +++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
+@@ -112,6 +112,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
    for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
      MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
    }
@@ -2226,7 +2224,7 @@ index a51626cc..61e0b20a 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
+index 811a72095..f4f83981d 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 @@ -43,7 +43,10 @@ enum CPUArchitecture {
@@ -2242,7 +2240,7 @@ index 811a7209..f4f83981 100644
  
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
+index c75b5555e..aeade577a 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.cc
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
 @@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
@@ -2272,7 +2270,7 @@ index 6fb8d7e7..b01f7cad 100644
      case kCPUArchitectureX86:
      case kCPUArchitectureARM:
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
+index fb23c4679..eebede63c 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.h
 @@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
@@ -2309,7 +2307,7 @@ index fb23c467..eebede63 100644
  };
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
+index 9f46a4897..aa677c4eb 100644
 --- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 @@ -15,6 +15,7 @@
@@ -2400,24 +2398,20 @@ index 9f46a489..aa677c4e 100644
  }  // namespace crashpad
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
+index d32bd1937..2dd538c2b 100644
 --- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
+@@ -192,6 +192,8 @@ void TestAgainstTarget(PtraceConnection* connection) {
                device == 0 && inode == 0 && mapping_name == "[vdso]";
+ #if defined(ARCH_CPU_X86)
+           static constexpr char kPrefix[] = "linux-gate.so.";
++#elif defined(ARCH_CPU_PPC64)
++          static constexpr char kPrefix[] = "linux-vdso64.so.";
+ #else
            static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
+ #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
+index cd40b3b12..6bcf23b6f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 @@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
@@ -2491,7 +2485,7 @@ index cd40b3b1..6bcf23b6 100644
  
  bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
+index ea0cd2106..e42df520f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 @@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
@@ -2504,7 +2498,7 @@ index ea0cd210..e42df520 100644
    } context_union_;
    CPUContext context_;
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
+index c17170b43..b6a714cc6 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 @@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
@@ -2537,7 +2531,7 @@ index e4ff1ab7..25534dd0 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
+index ee246e8bc..9555dce04 100644
 --- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 @@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
@@ -2549,21 +2543,8 @@ index b96abfe7..df12ca56 100644
  #else
  #error Port.
  #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
+index 110024680..a1f2da259 100644
 --- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 +++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 @@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
@@ -2657,10 +2638,10 @@ index 11002468..8e335a09 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
+index a99da3e4b..03b973083 100644
 --- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
+@@ -204,6 +204,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
                                      : kCPUArchitectureMIPSEL;
@@ -2669,7 +2650,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
+@@ -219,6 +221,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return 0;
@@ -2679,7 +2660,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
+@@ -239,6 +244,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return std::string();
@@ -2689,7 +2670,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
+@@ -372,6 +380,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return false;
@@ -2699,8 +2680,21 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
+diff --git third_party/crashpad/crashpad/snapshot/linux/test_modules.cc third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+index b2450c206..7ba78b2ae 100644
+--- third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
++++ third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+@@ -110,6 +110,8 @@ bool WriteTestModule(const base::FilePath& module_path,
+   module.ehdr.e_machine = EM_AARCH64;
+ #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
+   module.ehdr.e_machine = EM_MIPS;
++#elif defined(ARCH_CPU_PPC64)
++  module.ehdr.e_machine = EM_PPC64;
+ #endif
+ 
+   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
+index e3e2bebdd..8ef43752e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 @@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
@@ -2719,7 +2713,7 @@ index e3e2bebd..8ef43752 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
+index 44cc6f6d9..d4136461e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 @@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
@@ -2732,7 +2726,7 @@ index 44cc6f6d..d4136461 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
+index d3d5ebdfb..3fd730cb5 100644
 --- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 +++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 @@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
@@ -2747,23 +2741,8 @@ index d3d5ebdf..3fd730cb 100644
      if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
        LOG(ERROR) << "duplicate auxv entry";
        return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
 diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
+index 557e0d363..08ae434b8 100644
 --- third_party/crashpad/crashpad/util/linux/ptracer.cc
 +++ third_party/crashpad/crashpad/util/linux/ptracer.cc
 @@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
@@ -2842,7 +2821,7 @@ index 557e0d36..08ae434b 100644
                             info->thread_context,
                             &info->thread_specific_data_address,
 diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
+index 5b55c24a7..dea0d1f39 100644
 --- third_party/crashpad/crashpad/util/linux/thread_info.h
 +++ third_party/crashpad/crashpad/util/linux/thread_info.h
 @@ -28,6 +28,10 @@
@@ -2964,10 +2943,10 @@ index 5b55c24a..dea0d1f3 100644
    LinuxVMAddress thread_specific_data_address;
  };
 diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
+index d21a24f19..acc325349 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context.h
 +++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
+@@ -69,6 +69,7 @@ using NativeCPUContext = ucontext_t;
  //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
  //!     Linux               | ARM/ARM64    | `r0`/`x0`
  //!     Linux               | MIPS/MIPS64  | `$a0`
@@ -2976,7 +2955,7 @@ index 3ff71184..3e82f4b9 100644
  //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
  //!     this function.
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
+index 52215ee5d..b3e4a3ec7 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 +++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 @@ -32,7 +32,7 @@
@@ -3204,7 +3183,7 @@ index 52215ee5..b3e4a3ec 100644
 +  blr
  #endif  // __i386__
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
+index cf23c2def..5f264bc92 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 @@ -57,7 +57,7 @@ void TestCaptureContext() {
@@ -3217,10 +3196,10 @@ index cf23c2de..5f264bc9 100644
    // likely fail.
    const uintptr_t kReferencePC =
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
+index 30a2ab21d..60509f21d 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
+@@ -35,6 +35,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
    EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
@@ -3229,7 +3208,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
+@@ -49,6 +51,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.pc;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.pc;
@@ -3238,7 +3217,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
+@@ -63,6 +67,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.sp;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.gregs[29];
@@ -3248,10 +3227,10 @@ index 9fc5db28..5f69f8dc 100644
  }
  
 diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
+index 54cc2f19f..298b5c993 100644
+--- third_party/crashpad/crashpad/util/posix/signals_test.cc
++++ third_party/crashpad/crashpad/util/posix/signals_test.cc
+@@ -46,9 +46,9 @@ bool CanCauseSignal(int sig) {
    return sig == SIGABRT ||
           sig == SIGALRM ||
           sig == SIGBUS ||
@@ -3263,7 +3242,7 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
           sig == SIGILL ||
  #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
+@@ -117,9 +117,11 @@ void CauseSignal(int sig) {
        break;
      }
  
@@ -3276,7 +3255,7 @@ index 58bfa8f8..8fc37c46 100644
      case SIGFPE: {
        // Optimization makes this tricky, so get zero from a system call likely
        // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
+@@ -137,7 +139,7 @@ void CauseSignal(int sig) {
        fstat(quotient, &stat_buf);
        break;
      }
@@ -3286,10 +3265,10 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
      case SIGILL: {
 diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
+index 6b4566fc3..c07f732ad 100644
 --- third_party/dav1d/BUILD.gn
 +++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
+@@ -184,6 +184,8 @@ static_library("dav1d_8bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3298,7 +3277,7 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
+@@ -212,6 +214,8 @@ static_library("dav1d_10bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3307,9 +3286,9 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
+@@ -263,6 +267,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
+       defines = [ "PREFIX" ]
+     }
  
 +    cflags = dav1d_copts
 +  }
@@ -3329,7 +3308,7 @@ index 788dc6cf..5fd7e8fd 100644
      cflags = dav1d_copts
    }
  }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
+@@ -292,5 +311,7 @@ static_library("dav1d") {
      }
    } else if (current_cpu == "arm" || current_cpu == "arm64") {
      deps += [ ":dav1d_arm" ]
@@ -3339,7 +3318,7 @@ index 788dc6cf..5fd7e8fd 100644
  }
 diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
 new file mode 100644
-index 00000000..f6ca57f7
+index 000000000..9fbbf75cc
 --- /dev/null
 +++ third_party/dav1d/config/linux/ppc64/config.h
 @@ -0,0 +1,39 @@
@@ -3383,10 +3362,10 @@ index 00000000..f6ca57f7
 +#define HAVE_UNISTD_H 1
 +
 diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
+index c59cb0821..3060284a8 100644
 --- third_party/dav1d/dav1d_generated.gni
 +++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
+@@ -82,6 +82,11 @@ arm_template_sources = [
    "libdav1d/src/arm/mc_init_tmpl.c",
  ]
  
@@ -3399,7 +3378,7 @@ index 8becac02..d5f4fcac 100644
    "libdav1d/src/cdef_apply_tmpl.c",
    "libdav1d/src/cdef_tmpl.c",
 diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
+index 9ab5e00b8..ad3feffee 100755
 --- third_party/dav1d/generate_source.py
 +++ third_party/dav1d/generate_source.py
 @@ -50,7 +50,8 @@ def WriteGn(fd):
@@ -3413,7 +3392,7 @@ index 9ab5e00b..ad3feffe 100755
    WriteArray(fd, "template_sources", template_sources)
  
 diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
+index 0b4bd72f0..a0caa5e71 100644
 --- third_party/dav1d/libdav1d/src/ppc/types.h
 +++ third_party/dav1d/libdav1d/src/ppc/types.h
 @@ -51,4 +51,19 @@
@@ -3437,10 +3416,10 @@ index 0b4bd72f..a0caa5e7 100644
 +
  #endif /* DAV1D_SRC_PPC_TYPES_H */
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
+index e4ac22644..1c57015db 100644
 --- third_party/lss/linux_syscall_support.h
 +++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
+@@ -3947,7 +3947,7 @@ struct kernel_statfs {
        LSS_REG(2, buf);
        LSS_BODY(void*, mmap2, "0"(__r2));
      }
@@ -3449,7 +3428,7 @@ index d2baee9d..9955ce44 100644
      #define __NR__mmap2 __NR_mmap2
      LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
                           size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
+@@ -4058,7 +4058,7 @@ struct kernel_statfs {
    #if defined(__i386__) ||                                                    \
        defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
       (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
@@ -3471,10 +3450,10 @@ index bdac4d784..51e0f2cac 100644
  #  define SIMD_SZ 4
  #  define VZERO() ((vector float) vec_splat_u8(0))
 diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
+index ec3e56964..4cf8999a2 100644
 --- third_party/skia/src/sksl/SkSLString.cpp
 +++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
+@@ -234,7 +234,12 @@ String to_string(double value) {
      if (needsDotZero) {
          buffer << ".0";
      }
@@ -3487,12 +3466,12 @@ index 88eb1c7d..4be33fa5 100644
 +    return String(ret.c_str());
  }
  
- SKSL_INT stoi(const String& s) {
+ bool stod(const StringFragment& s, SKSL_FLOAT* value) {
 diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
+index 6b4a7899d..b8c7fe414 100644
 --- third_party/sqlite/src/amalgamation/sqlite3.c
 +++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
+@@ -14474,7 +14474,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3503,10 +3482,10 @@ index 1b2c2ec7..7593dba1 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
+index d30c9b7de..cf75a69d9 100644
 --- third_party/sqlite/src/amalgamation_dev/sqlite3.c
 +++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
+@@ -14487,7 +14487,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3517,10 +3496,10 @@ index 19c87689..c7ab039e 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
+index f5b57a5e2..80a2d0ad8 100644
 --- third_party/sqlite/src/ext/rtree/rtree.c
 +++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
+@@ -450,7 +450,7 @@ struct RtreeMatchArg {
  #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
@@ -3530,10 +3509,10 @@ index efaef813..4cd57d55 100644
  #elif defined(sparc)    || defined(__ppc__)
  # define SQLITE_BYTEORDER    4321
 diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
+index 245070d4f..b25164e95 100644
 --- third_party/sqlite/src/src/sqliteInt.h
 +++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
+@@ -877,7 +877,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3544,10 +3523,10 @@ index 122e26ad..ec21dcb5 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
+index 4f0c5430c..54ee0829e 100644
+--- third_party/webrtc/modules/desktop_capture/differ_block.cc
++++ third_party/webrtc/modules/desktop_capture/differ_block.cc
+@@ -30,11 +30,7 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
    static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
  
    if (!diff_proc) {
@@ -3560,7 +3539,7 @@ index dd9ab457..c005d959 100644
      bool have_sse2 = GetCPUInfo(kSSE2) != 0;
      // For x86 processors, check if SSE2 is supported.
      if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
+@@ -44,6 +40,10 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
      } else {
        diff_proc = &VectorDifference_C;
      }
@@ -3572,10 +3551,10 @@ index dd9ab457..c005d959 100644
    }
  
 diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
+index be2367b85..be4ee4233 100644
 --- third_party/webrtc/rtc_base/system/arch.h
 +++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
+@@ -79,6 +79,18 @@
  #elif defined(__EMSCRIPTEN__)
  #define WEBRTC_ARCH_32_BITS
  #define WEBRTC_ARCH_LITTLE_ENDIAN
@@ -3594,15 +3573,15 @@ index ed216e66..25d36c07 100644
  #else
  #error Please add support for your architecture in rtc_base/system/arch.h
  #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
+diff --git v8/BUILD.gn v8/BUILD.gn
+index f39529a3a..e84fc449e 100644
 --- v8/BUILD.gn
 +++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
+@@ -850,6 +850,12 @@ config("toolchain") {
      }
      if (host_byteorder == "little") {
        defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
++      cflags += [
 +        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
 +        "-mcpu=power8",
 +        "-maltivec",
@@ -3611,24 +3590,12 @@ index 167e63503..125c445ea 100644
      } else if (host_byteorder == "big") {
        defines += [ "V8_TARGET_ARCH_PPC_BE" ]
        if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
 diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
+index fb872ad39..45fc585dd 100644
 --- v8/test/BUILD.gn
 +++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
+@@ -36,7 +36,7 @@ group("gn_all") {
+       "benchmarks/cpp:gn_all",
        "cctest:cctest",
        "cctest:generate-bytecode-expectations",
 -      "unittests:unittests",
@@ -3636,7 +3603,7 @@ index f6d30537a..287b27080 100644
      ]
    }
  }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
+@@ -78,7 +78,7 @@ group("v8_bot_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
@@ -3645,7 +3612,7 @@ index f6d30537a..287b27080 100644
      "wasm-api-tests:wasm_api_tests",
      "wasm-js:v8_wasm_js",
      "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
+@@ -98,7 +98,7 @@ group("v8_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Updated] [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (23 preceding siblings ...)
  2021-03-03 19:56 ` [PR PATCH] [Updated] " pullmoll
@ 2021-03-07 12:06 ` pullmoll
  2021-03-11 19:11 ` [PR PATCH] [Closed]: " q66
  25 siblings, 0 replies; 27+ messages in thread
From: pullmoll @ 2021-03-07 12:06 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 860 bytes --]

There is an updated pull request by pullmoll against master on the void-packages repository

https://github.com/pullmoll/void-packages chromium
https://github.com/void-linux/void-packages/pull/29205

[WIP] chromium: update to 89.0.4389.72
CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, works but can crash, see comments below
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself my repo has the update for testing.

A patch file from https://github.com/void-linux/void-packages/pull/29205.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-chromium-29205.patch --]
[-- Type: text/x-diff, Size: 126112 bytes --]

From 02b4d5419a31deb2a8723caff9ce12fffa0448ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Buchm=C3=BCller?= <pullmoll@t-online.de>
Date: Wed, 3 Mar 2021 15:06:38 +0100
Subject: [PATCH] chromium: update to 89.0.4389.72

CVE-2021-21166
Disable Widevine CDM component updater (Debian patch)

[ci skip]
---
 .../default-pthread-stacksize.patch           |   4 +-
 .../files/musl-patches/musl-fixes.patch       |  40 +-
 .../files/musl-patches/musl-hacks.patch       |   4 +-
 .../files/musl-patches/musl-libc++.patch      |   6 +-
 .../musl-patches/musl-no-glibc-version.patch  |  28 ++
 .../files/musl-patches/musl-sandbox.patch     |  12 +-
 .../files/musl-patches/no-mallinfo.patch      |   6 +-
 .../files/musl-patches/resolver.patch         |   2 +-
 srcpkgs/chromium/patches/browser-size_t.patch |  10 -
 .../chromium-88-AXTreeFormatter-include.patch |  27 -
 ...ium-88-BookmarkModelObserver-include.patch |  21 -
 ...um-88-CompositorFrameReporter-dcheck.patch |  36 --
 .../chromium-88-StringPool-include.patch      |  20 -
 ...romium-88-federated_learning-include.patch |  21 -
 .../patches/chromium-88-glibc-2.33.patch      | 144 ------
 ...hromium-88-ideographicSpaceCharacter.patch |  27 -
 .../patches/chromium-88-ityp-include.patch    |  25 -
 .../patches/chromium-88-vaapi-attribute.patch |  39 --
 ...um-89-CompositorFrameReporter-dcheck.patch |  11 +
 ...bian_patches_disable_widevine-cdm-cu.patch |  16 +
 srcpkgs/chromium/patches/libc_malloc.patch    |  23 +-
 ...remove-unsupported-compiler-warnings.patch |  26 -
 ...-v8-monotonic-pthread-cont_timedwait.patch |  24 -
 srcpkgs/chromium/patches/no-execinfo.patch    |  16 +-
 srcpkgs/chromium/patches/no-getcontext.patch  |  27 -
 srcpkgs/chromium/patches/no-std-time.patch    |  11 +
 .../chromium/patches/sandbox-membarrier.patch |  61 +--
 .../patches/xxx-ppc64le-support.patch         | 475 ++++++++----------
 srcpkgs/chromium/template                     |   8 +-
 29 files changed, 337 insertions(+), 833 deletions(-)
 create mode 100644 srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
 delete mode 100644 srcpkgs/chromium/patches/browser-size_t.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-ityp-include.patch
 delete mode 100644 srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
 create mode 100644 srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
 create mode 100644 srcpkgs/chromium/patches/debian_patches_disable_widevine-cdm-cu.patch
 delete mode 100644 srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
 delete mode 100644 srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
 delete mode 100644 srcpkgs/chromium/patches/no-getcontext.patch
 create mode 100644 srcpkgs/chromium/patches/no-std-time.patch

diff --git a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
index 16e4d21e6ed..8bf9a3dfb34 100644
--- a/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
+++ b/srcpkgs/chromium/files/musl-patches/default-pthread-stacksize.patch
@@ -1,12 +1,12 @@
 --- base/threading/platform_thread_linux.cc.orig
 +++ base/threading/platform_thread_linux.cc
-@@ -99 +99,2 @@ size_t GetDefaultThreadStackSize(const p
+@@ -440 +440,2 @@ size_t GetDefaultThreadStackSize(const p
 -  return 0;
 +  // use 8mb like glibc to avoid running out of space
 +  return (1 << 23);
 --- chrome/app/shutdown_signal_handlers_posix.cc.orig
 +++ chrome/app/shutdown_signal_handlers_posix.cc
-@@ -184,11 +184,19 @@
+@@ -187,11 +187,19 @@
    g_shutdown_pipe_read_fd = pipefd[0];
    g_shutdown_pipe_write_fd = pipefd[1];
  #if !defined(ADDRESS_SANITIZER)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
index a7832ff32e8..1f12ff8b08d 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-fixes.patch
@@ -1,6 +1,6 @@
 --- ./third_party/lss/linux_syscall_support.h.orig
 +++ ./third_party/lss/linux_syscall_support.h
-@@ -1127,6 +1127,12 @@
+@@ -1258,6 +1258,12 @@
  #ifndef __NR_fallocate
  #define __NR_fallocate          285
  #endif
@@ -15,7 +15,7 @@
  #if _MIPS_SIM == _MIPS_SIM_ABI32
 --- ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h.orig
 +++ ./third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-@@ -37,6 +37,10 @@
+@@ -38,6 +38,10 @@
  #include "common/memory.h"
  #include "google_breakpad/common/minidump_format.h"
  
@@ -28,7 +28,7 @@
  // Wraps platform-dependent implementations of accessors to ucontext_t structs.
 --- ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h.orig
 +++ ./third_party/breakpad/breakpad/src/common/linux/elf_core_dump.h
-@@ -36,6 +36,7 @@
+@@ -37,6 +37,7 @@
  #include <elf.h>
  #include <link.h>
  #include <stddef.h>
@@ -38,7 +38,7 @@
  
 --- ./sandbox/linux/suid/process_util.h.orig
 +++ ./sandbox/linux/suid/process_util.h
-@@ -11,6 +11,14 @@
+@@ -12,6 +12,14 @@
  #include <stdbool.h>
  #include <sys/types.h>
  
@@ -66,7 +66,7 @@
  #if defined(__mips__)
 --- ./third_party/ffmpeg/libavutil/cpu.c.orig
 +++ ./third_party/ffmpeg/libavutil/cpu.c
-@@ -38,7 +38,6 @@
+@@ -41,7 +41,6 @@
  #include <sys/param.h>
  #endif
  #include <sys/types.h>
@@ -74,28 +74,6 @@
  #endif
  #if HAVE_UNISTD_H
  #include <unistd.h>
-diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
---- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-+++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
-@@ -39,7 +39,9 @@
- #endif  // defined(OS_ANDROID) && defined(__arm__)
- 
- #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__)
- #include <gnu/libc-version.h>
-+#endif
- 
- #include "base/linux_util.h"
- #include "base/strings/string_split.h"
-@@ -295,7 +297,7 @@ void RecordLinuxDistro() {
- #endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
- 
- void RecordLinuxGlibcVersion() {
--#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-+#if defined(__GLIBC__) && !defined(OS_CHROMEOS)
-   base::Version version(gnu_get_libc_version());
- 
-   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
 --- services/device/serial/serial_io_handler_posix.cc.orig	2019-07-03 10:57:32.568171835 -0400
 +++ services/device/serial/serial_io_handler_posix.cc	2019-07-03 10:57:16.867983031 -0400
 @@ -6,6 +6,7 @@
@@ -131,7 +109,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      base::debug::StackTrace stack_trace;
 --- ./third_party/blink/renderer/platform/wtf/stack_util.cc.orig
 +++ ./third_party/blink/renderer/platform/wtf/stack_util.cc
-@@ -28,7 +28,7 @@
+@@ -29,7 +29,7 @@
  // FIXME: On Mac OSX and Linux, this method cannot estimate stack size
  // correctly for the main thread.
  
@@ -140,7 +118,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
      defined(OS_FUCHSIA)
    // pthread_getattr_np() can fail if the thread is not invoked by
    // pthread_create() (e.g., the main thread of blink_unittests).
-@@ -96,7 +96,7 @@
+@@ -97,7 +97,7 @@
  }
  
  void* GetStackStart() {
@@ -151,7 +129,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
    int error;
 --- ./net/dns/dns_config_service_posix.cc.orig
 +++ ./net/dns/dns_config_service_posix.cc
-@@ -122,7 +122,7 @@
+@@ -150,7 +150,7 @@
    ConfigParsePosixResult result;
    config->unhandled_options = false;
  // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia.
@@ -181,7 +159,7 @@ diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/incl
  
 --- third_party/nasm/nasmlib/realpath.c.orig	2019-07-03 12:23:05.021949895 -0400
 +++ third_party/nasm/nasmlib/realpath.c	2019-07-03 12:24:24.246862665 -0400
-@@ -49,7 +49,7 @@
+@@ -47,7 +47,7 @@
  
  #include "nasmlib.h"
  
diff --git a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
index edc1b060dfb..9276e48ab8e 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-hacks.patch
@@ -1,6 +1,6 @@
 --- base/debug/stack_trace.cc.orig	2018-12-08 14:11:25.303475116 +0100
 +++ base/debug/stack_trace.cc	2018-12-08 18:00:43.874946999 +0100
-@@ -229,7 +229,7 @@
+@@ -225,7 +225,7 @@
  }
  std::string StackTrace::ToStringWithPrefix(const char* prefix_string) const {
    std::stringstream stream;
@@ -11,7 +11,7 @@
    return stream.str();
 --- net/socket/udp_socket_posix.cc.orig	2019-07-03 13:13:46.034342649 -0400
 +++ net/socket/udp_socket_posix.cc	2019-07-03 13:23:53.117081909 -0400
-@@ -1194,7 +1194,7 @@
+@@ -1153,7 +1153,7 @@
      msg_iov->push_back({const_cast<char*>(buffer->data()), buffer->length()});
    msgvec->reserve(buffers.size());
    for (size_t j = 0; j < buffers.size(); j++)
diff --git a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
index 088d80fad52..e0776823402 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-libc++.patch
@@ -2,7 +2,7 @@ diff --git a/buildtools/third_party/libc++/trunk/include/locale b/buildtools/thi
 index d29a2dc..53998bc 100644
 --- buildtools/third_party/libc++/trunk/include/locale
 +++ buildtools/third_party/libc++/trunk/include/locale
-@@ -11,6 +11,15 @@
+@@ -10,6 +10,15 @@
  #ifndef _LIBCPP_LOCALE
  #define _LIBCPP_LOCALE
  
@@ -22,7 +22,7 @@ diff --git a/buildtools/third_party/libc++/trunk/src/locale.cpp b/buildtools/thi
 index 4163c2c..3d1902a 100644
 --- a/buildtools/third_party/libc++/trunk/src/locale.cpp
 +++ buildtools/third_party/libc++/trunk/src/locale.cpp
-@@ -1028,11 +1028,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
+@@ -1019,11 +1019,11 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
      return low;
  }
  
@@ -36,7 +36,7 @@ index 4163c2c..3d1902a 100644
  
  #ifdef _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
  const ctype<char>::mask*
-@@ -1136,12 +1136,10 @@ ctype<char>::classic_table()  _NOEXCEPT
+@@ -1127,12 +1127,10 @@ ctype<char>::classic_table()  _NOEXCEPT
  #elif defined(_AIX)
      return (const unsigned int *)__lc_ctype_ptr->obj->mask;
  #else
diff --git a/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
new file mode 100644
index 00000000000..9ffec62465c
--- /dev/null
+++ b/srcpkgs/chromium/files/musl-patches/musl-no-glibc-version.patch
@@ -0,0 +1,28 @@
+--- chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc.orig	2021-03-02 18:45:03.000000000 +0100
++++ chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc	2021-03-03 17:39:14.944100746 +0100
+@@ -55,7 +55,9 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+ #include <gnu/libc-version.h>
++#endif
+ 
+ #include "base/linux_util.h"
+ #include "base/strings/string_split.h"
+@@ -317,6 +319,7 @@
+ // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
+ // of lacros-chrome is complete.
+ #if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
++#if defined(__GLIBC__)
+   base::Version version(gnu_get_libc_version());
+ 
+   UMALinuxGlibcVersion glibc_version_result = UMA_LINUX_GLIBC_NOT_PARSEABLE;
+@@ -338,6 +341,7 @@
+   }
+   base::UmaHistogramSparse("Linux.GlibcVersion", glibc_version_result);
+ #endif
++#endif
+ }
+ 
+ void RecordTouchEventState() {
diff --git a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
index 230bb7bbd29..0b98253f4d6 100644
--- a/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
+++ b/srcpkgs/chromium/files/musl-patches/musl-sandbox.patch
@@ -1,6 +1,6 @@
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc.orig	2019-07-03 11:53:21.213479736 -0400
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc	2019-07-03 11:57:01.304998253 -0400
-@@ -140,31 +140,14 @@
+@@ -131,31 +131,14 @@
  ResultExpr RestrictCloneToThreadsAndEPERMFork() {
    const Arg<unsigned long> flags(0);
  
@@ -41,7 +41,7 @@
  
 --- ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig
 +++ ./sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -494,6 +494,7 @@
+@@ -521,6 +521,7 @@
      case __NR_mlock:
      case __NR_munlock:
      case __NR_munmap:
@@ -49,7 +49,7 @@
        return true;
      case __NR_madvise:
      case __NR_mincore:
-@@ -509,7 +510,6 @@
+@@ -540,7 +540,6 @@
      case __NR_modify_ldt:
  #endif
      case __NR_mprotect:
@@ -61,7 +61,7 @@ diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc b/sandbox/linux/s
 index 80f02c0..21fbe21 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -373,6 +373,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -400,6 +400,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__)
      case __NR_waitpid:
  #endif
@@ -69,7 +69,7 @@ index 80f02c0..21fbe21 100644
        return true;
      case __NR_clone:  // Should be parameter-restricted.
      case __NR_setns:  // Privileged.
-@@ -385,7 +386,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -413,7 +413,6 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__)
      case __NR_set_thread_area:
  #endif
@@ -79,7 +79,7 @@ index 80f02c0..21fbe21 100644
      case __NR_vfork:
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
-@@ -100,9 +100,9 @@
+@@ -95,9 +95,9 @@
      case __NR_uname:
      case __NR_sched_getparam:
      case __NR_sched_getscheduler:
diff --git a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
index 254a1f632da..16e7e368175 100644
--- a/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
+++ b/srcpkgs/chromium/files/musl-patches/no-mallinfo.patch
@@ -1,6 +1,6 @@
 --- base/trace_event/malloc_dump_provider.cc.orig
 +++ base/trace_event/malloc_dump_provider.cc
-@@ -243,7 +243,7 @@
+@@ -184,7 +184,7 @@
    allocated_objects_count = main_heap_info.block_count;
  #elif defined(OS_FUCHSIA)
  // TODO(fuchsia): Port, see https://crbug.com/706592.
@@ -30,7 +30,7 @@
  #endif
 --- third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc
 +++ third_party/swiftshader/third_party/llvm-subzero/lib/Support/Unix/Process.inc.orig
-@@ -84,7 +84,7 @@
+@@ -86,7 +86,7 @@
  }
  
  size_t Process::GetMallocUsage() {
@@ -42,7 +42,7 @@
 
 --- third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h.orig	2019-09-30 13:03:42.556880537 -0400
 +++ third_party/swiftshader/third_party/llvm-10.0/configs/linux/include/llvm/Config/config.h	2019-09-30 13:07:27.989821227 -0400
-@@ -122,7 +122,9 @@
+@@ -125,7 +125,9 @@
  /* #undef HAVE_MALLCTL */
  
  /* Define to 1 if you have the `mallinfo' function. */
diff --git a/srcpkgs/chromium/files/musl-patches/resolver.patch b/srcpkgs/chromium/files/musl-patches/resolver.patch
index 29fe2d2f1f3..0ce77c96a60 100644
--- a/srcpkgs/chromium/files/musl-patches/resolver.patch
+++ b/srcpkgs/chromium/files/musl-patches/resolver.patch
@@ -1,6 +1,6 @@
 --- net/dns/host_resolver_manager.cc.orig	2020-10-09 16:39:12.064069835 -0400
 +++ net/dns/host_resolver_manager.cc	2020-10-09 16:42:49.738302772 -0400
-@@ -2779,8 +2779,7 @@
+@@ -2562,8 +2562,7 @@
    NetworkChangeNotifier::AddConnectionTypeObserver(this);
    if (system_dns_config_notifier_)
      system_dns_config_notifier_->AddObserver(this);
diff --git a/srcpkgs/chromium/patches/browser-size_t.patch b/srcpkgs/chromium/patches/browser-size_t.patch
deleted file mode 100644
index fa214d987d6..00000000000
--- a/srcpkgs/chromium/patches/browser-size_t.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- chrome/browser/search/background/ntp_backgrounds.h	2020-08-10 20:39:20.000000000 +0200
-+++ chrome/browser/search/background/ntp_backgrounds.h	2020-09-04 13:48:22.640023256 +0200
-@@ -6,6 +6,7 @@
- #define CHROME_BROWSER_SEARCH_BACKGROUND_NTP_BACKGROUNDS_H_
- 
- #include <array>
-+#include <cstddef>
- 
- class GURL;
- 
diff --git a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch b/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
deleted file mode 100644
index 54781098920..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-AXTreeFormatter-include.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6e402d97c2dec5726f37e95f97b7f7e12b1d3b1d Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 11:02:13 +0100
-Subject: [PATCH] IWYU: include headers for std::vector and std::unique_ptr in AXTreeFormatter
-
-Fix these build errors with libstdc++:
-../../ui/accessibility/platform/inspect/tree_formatter.h:35:12: error: ‘std::vector’ has not been declared
-../../ui/accessibility/platform/inspect/tree_formatter.h:61:16: error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
-
-Bug: 957519
-Change-Id: I402ac0644255b3cd4932ff2fe72d999b125a7895
----
-
-diff --git a/ui/accessibility/platform/inspect/tree_formatter.h b/ui/accessibility/platform/inspect/tree_formatter.h
-index 4a70a4d..bb23768 100644
---- ui/accessibility/platform/inspect/tree_formatter.h
-+++ ui/accessibility/platform/inspect/tree_formatter.h
-@@ -5,6 +5,9 @@
- #ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- #define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
- 
-+#include <memory>
-+#include <vector>
-+
- #include "ui/accessibility/platform/inspect/inspect.h"
- 
- #include "ui/gfx/native_widget_types.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch b/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
deleted file mode 100644
index 0b26a60a36e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-BookmarkModelObserver-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 127ec3b1bf26ab37f2ae8333f284008868756274 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:59:23 +0000
-Subject: [PATCH] IWYU: size_t is defined stddef.h
-
-Change-Id: I4400ac7c6004b49ec6e72c44f2754e2166642f88
----
-
-diff --git a/components/bookmarks/browser/bookmark_model_observer.h b/components/bookmarks/browser/bookmark_model_observer.h
-index 69c40e7..0e5eb96 100644
---- components/bookmarks/browser/bookmark_model_observer.h
-+++ components/bookmarks/browser/bookmark_model_observer.h
-@@ -7,6 +7,8 @@
- 
- #include <set>
- 
-+#include <stddef.h>
-+
- class GURL;
- 
- namespace bookmarks {
diff --git a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
deleted file mode 100644
index aa1c52e0b7e..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-CompositorFrameReporter-dcheck.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 56c654a91600e3bf254aa9f66c1151b0850b6ee4 Mon Sep 17 00:00:00 2001
-From: Jose Dapena Paz <jdapena@igalia.com>
-Date: Wed, 11 Nov 2020 10:24:47 +0100
-Subject: [PATCH] GCC: do not pass unique_ptr to DCHECK_NE, but the actual pointer, in CompositorFrameReporter
-
-DCHECK_NE comparison requires CheckOpValueStr to be defined for the
-type, or providing an output stream operator. A unique_ptr does not
-provide any.
-
-Compilation in GCC is failing in CompositorFrameReporter because of
-this:
-../../cc/metrics/compositor_frame_reporter.cc: In member function ‘void cc::CompositorFrameReporter::ReportEventLatencyHistograms() const’:
-../../base/check_op.h:224:59: error: no matching function for call to ‘CheckOpValueStr(const std::unique_ptr<cc::EventMetrics>&)’
-
-Fixed comparing the result of get() method for unique_ptr instead of
-the unique_ptr.
-
-Bug: 819294
-Change-Id: I11103d1867c7196c1de92e72f9f12dcfd31c29f1
-
-(updated to use DCHECK as suggested in comments)
----
-
-diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
-index 725beb0..fafd0f3 100644
---- cc/metrics/compositor_frame_reporter.cc
-+++ cc/metrics/compositor_frame_reporter.cc
-@@ -686,7 +686,7 @@
- 
- void CompositorFrameReporter::ReportEventLatencyHistograms() const {
-   for (const auto& event_metrics : events_metrics_) {
--    DCHECK_NE(event_metrics, nullptr);
-+    DCHECK(event_metrics);
-     const std::string histogram_base_name =
-         GetEventLatencyHistogramBaseName(*event_metrics);
-     const int event_type_index = static_cast<int>(event_metrics->type());
diff --git a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch b/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
deleted file mode 100644
index e55bbae2ece..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-StringPool-include.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 372366b4180533f27d3250a50810828370d697b0 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 16:12:18 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: Ia5226e1432a622f4f4abc8f1b18bcab8638a73c6
----
-
-diff --git a/src/trace_processor/containers/string_pool.h b/src/trace_processor/containers/string_pool.h
-index 11ae91c..58c6db2 100644
---- third_party/perfetto/src/trace_processor/containers/string_pool.h
-+++ third_party/perfetto/src/trace_processor/containers/string_pool.h
-@@ -22,6 +22,7 @@
- 
- #include <unordered_map>
- #include <vector>
-+#include <limits>
- 
- #include "perfetto/ext/base/optional.h"
- #include "perfetto/ext/base/paged_memory.h"
diff --git a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch b/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
deleted file mode 100644
index 3eb1537d801..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-federated_learning-include.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From bcb20babee602b55fe4bd026e13a41d10b89632f Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sat, 21 Nov 2020 15:55:02 +0000
-Subject: [PATCH] IWYU: include limits for std::numeric_limits
-
-Change-Id: I1b6b07ebb397a29c84d3ed51ae41523e3ecab497
----
-
-diff --git a/components/federated_learning/floc_constants.cc b/components/federated_learning/floc_constants.cc
-index df66e5d..2eb50f1 100644
---- components/federated_learning/floc_constants.cc
-+++ components/federated_learning/floc_constants.cc
-@@ -4,6 +4,8 @@
- 
- #include "components/federated_learning/floc_constants.h"
- 
-+#include <limits>
-+
- namespace federated_learning {
- 
- // This is only for experimentation and won't be served to websites.
diff --git a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch b/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
deleted file mode 100644
index 64306d5e429..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-glibc-2.33.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-# Patch made by Kevin Kofler <Kevin@tigcc.ticalc.org>
-# https://bugzilla.redhat.com/show_bug.cgi?id=1904652
-
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
---- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc.fstatfix	2021-01-25 10:11:45.427436398 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc	2021-01-25 10:12:51.337699003 -0500
-@@ -257,6 +257,18 @@ ResultExpr EvaluateSyscallImpl(int fs_de
-     return RestrictKillTarget(current_pid, sysno);
-   }
- 
-+#if defined(__NR_newfstatat)
-+  if (sysno == __NR_newfstatat) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-+#if defined(__NR_fstatat64)
-+  if (sysno == __NR_fstatat64) {
-+    return RewriteFstatatSIGSYS();
-+  }
-+#endif
-+
-   if (SyscallSets::IsFileSystem(sysno) ||
-       SyscallSets::IsCurrentDirectory(sysno)) {
-     return Error(fs_denied_errno);
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc.fstatfix	2021-01-25 10:13:10.179774081 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc	2021-01-25 10:16:18.790525746 -0500
-@@ -6,6 +6,8 @@
- 
- #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
- 
-+#include <errno.h>
-+#include <fcntl.h>
- #include <stddef.h>
- #include <stdint.h>
- #include <string.h>
-@@ -355,6 +357,35 @@ intptr_t SIGSYSSchedHandler(const struct
-   return -ENOSYS;
- }
- 
-+intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args,
-+                              void* aux) {
-+  switch (args.nr) {
-+#if defined(__NR_newfstatat)
-+    case __NR_newfstatat:
-+#endif
-+#if defined(__NR_fstatat64)
-+    case __NR_fstatat64:
-+#endif
-+#if defined(__NR_newfstatat) || defined(__NR_fstatat64)
-+      if (*reinterpret_cast<const char *>(args.args[1]) == '\0'
-+          && args.args[3] == static_cast<uint64_t>(AT_EMPTY_PATH)) {
-+        return sandbox::sys_fstat64(static_cast<int>(args.args[0]),
-+                                    reinterpret_cast<struct stat64 *>(args.args[2]));
-+      } else {
-+        errno = EACCES;
-+        return -1;
-+      }
-+      break;
-+#endif
-+  }
-+
-+  CrashSIGSYS_Handler(args, aux);
-+
-+  // Should never be reached.
-+  RAW_CHECK(false);
-+  return -ENOSYS;
-+}
-+
- bpf_dsl::ResultExpr CrashSIGSYS() {
-   return bpf_dsl::Trap(CrashSIGSYS_Handler, NULL);
- }
-@@ -387,6 +418,10 @@ bpf_dsl::ResultExpr RewriteSchedSIGSYS()
-   return bpf_dsl::Trap(SIGSYSSchedHandler, NULL);
- }
- 
-+bpf_dsl::ResultExpr RewriteFstatatSIGSYS() {
-+  return bpf_dsl::Trap(SIGSYSFstatatHandler, NULL);
-+}
-+
- void AllocateCrashKeys() {
- #if !defined(OS_NACL_NONSFI)
-   if (seccomp_crash_key)
-diff -up chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h
---- sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h.fstatfix	2021-01-25 10:16:36.982598236 -0500
-+++ sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h	2021-01-25 10:18:45.705111027 -0500
-@@ -62,6 +62,10 @@ SANDBOX_EXPORT intptr_t SIGSYSPtraceFail
- // sched_setparam(), sched_setscheduler()
- SANDBOX_EXPORT intptr_t SIGSYSSchedHandler(const arch_seccomp_data& args,
-                                            void* aux);
-+// If the fstatat syscall is actually a disguised fstat, calls the regular fstat
-+// syscall, otherwise, crashes in the same way as CrashSIGSYS_Handler.
-+SANDBOX_EXPORT intptr_t SIGSYSFstatatHandler(const struct arch_seccomp_data& args, 
-+                                             void* aux);
- 
- // Variants of the above functions for use with bpf_dsl.
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYS();
-@@ -72,6 +76,7 @@ SANDBOX_EXPORT bpf_dsl::ResultExpr Crash
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSFutex();
- SANDBOX_EXPORT bpf_dsl::ResultExpr CrashSIGSYSPtrace();
- SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteSchedSIGSYS();
-+SANDBOX_EXPORT bpf_dsl::ResultExpr RewriteFstatatSIGSYS();
- 
- // Allocates a crash key so that Seccomp information can be recorded.
- void AllocateCrashKeys();
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.cc
---- sandbox/linux/services/syscall_wrappers.cc.fstatfix	2021-01-25 10:18:53.307141311 -0500
-+++ sandbox/linux/services/syscall_wrappers.cc	2021-01-25 10:19:46.982355293 -0500
-@@ -261,4 +261,13 @@ int sys_sigaction(int signum,
- 
- #endif  // defined(MEMORY_SANITIZER)
- 
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf)
-+{
-+#if defined(__NR_fstat64)
-+    return syscall(__NR_fstat64, fd, buf);
-+#else
-+    return syscall(__NR_fstat, fd, buf);
-+#endif
-+}
-+
- }  // namespace sandbox
-diff -up chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h.fstatfix chromium-88.0.4324.96/sandbox/linux/services/syscall_wrappers.h
---- sandbox/linux/services/syscall_wrappers.h.fstatfix	2021-01-25 10:19:53.115379741 -0500
-+++ sandbox/linux/services/syscall_wrappers.h	2021-01-25 10:20:45.485588421 -0500
-@@ -17,6 +17,7 @@ struct sock_fprog;
- struct rlimit64;
- struct cap_hdr;
- struct cap_data;
-+struct stat64;
- 
- namespace sandbox {
- 
-@@ -84,6 +85,9 @@ SANDBOX_EXPORT int sys_sigaction(int sig
-                                  const struct sigaction* act,
-                                  struct sigaction* oldact);
- 
-+// Recent glibc rewrites fstat to fstatat.
-+SANDBOX_EXPORT int sys_fstat64(int fd, struct stat64 *buf);
-+
- }  // namespace sandbox
- 
- #endif  // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch b/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
deleted file mode 100644
index 38a11423b2d..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ideographicSpaceCharacter.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 75ff882bb5f2fcd14431e65fa638ae72bdb47086 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 15 Nov 2020 14:31:23 +0000
-Subject: [PATCH] fix ideographicSpaceCharacter constant for system icu
-
-https://chromium-review.googlesource.com/c/chromium/src/+/1687411
-renamed ideographicSpaceCharacter to kIdeographicSpaceCharacter.
----
- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-index fb8ab05..5d4ea13 100644
---- third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-+++ third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
-@@ -432,7 +432,7 @@ String TextCodecICU::Decode(const char* bytes,
-   // ICU decodes it as U+E5E5.
-   if (!strcmp(encoding_.GetName(), "GBK")) {
-     if (EqualIgnoringASCIICase(encoding_.GetName(), "gb18030"))
--      resultString.Replace(0xE5E5, ideographicSpaceCharacter);
-+      resultString.Replace(0xE5E5, kIdeographicSpaceCharacter);
-     // Make GBK compliant to the encoding spec and align with GB18030
-     resultString.Replace(0x01F9, 0xE7C8);
-     // FIXME: Once https://www.w3.org/Bugs/Public/show_bug.cgi?id=28740#c3
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch b/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
deleted file mode 100644
index c54b6fffd54..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-ityp-include.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From bc383a5dd7fa8f2b535f28815fd6932fbc0d2a45 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Wed, 28 Oct 2020 16:00:35 +0000
-Subject: [PATCH] IWYU: include stddef.h for size_t
-
----
- third_party/dawn/src/common/ityp_array.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/third_party/dawn/src/common/ityp_array.h b/third_party/dawn/src/common/ityp_array.h
-index 48e080f..c784198 100644
---- third_party/dawn/src/common/ityp_array.h
-+++ third_party/dawn/src/common/ityp_array.h
-@@ -21,6 +21,8 @@
- #include <array>
- #include <type_traits>
- 
-+#include <stddef.h>
-+
- namespace ityp {
- 
-     // ityp::array is a helper class that wraps std::array with the restriction that
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch b/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
deleted file mode 100644
index e4161af45c7..00000000000
--- a/srcpkgs/chromium/patches/chromium-88-vaapi-attribute.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 4f4604877f3b666ac7a373ae443e3c3795424569 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Fri, 6 Nov 2020 11:18:42 +0000
-Subject: [PATCH] GCC: fix attribute on function definition
-
-GCC does not accept attributes at the end for function definitions.
-Solution is to move it before function name. Otherwise GCC fails like
-this:
-
-../../base/compiler_specific.h:97:28: error: attributes are not allowed
-on a function-definition
-   97 | #define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-         |                            ^~~~~~~~~~~~~
-	 ../../media/gpu/vaapi/vaapi_wrapper.h:322:36: note: in
-	 expansion of macro 'WARN_UNUSED_RESULT'
-	   322 |                     const T* data) WARN_UNUSED_RESULT {
-	       |                                    ^~~~~~~~~~~~~~~~~~
----
- media/gpu/vaapi/vaapi_wrapper.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
-index fd1fd82..deeda1f 100644
---- media/gpu/vaapi/vaapi_wrapper.h
-+++ media/gpu/vaapi/vaapi_wrapper.h
-@@ -318,8 +318,8 @@ class MEDIA_GPU_EXPORT VaapiWrapper
-   // Convenient templatized version of SubmitBuffer() where |size| is deduced to
-   // be the size of the type of |*data|.
-   template <typename T>
--  bool SubmitBuffer(VABufferType va_buffer_type,
--                    const T* data) WARN_UNUSED_RESULT {
-+  bool WARN_UNUSED_RESULT SubmitBuffer(VABufferType va_buffer_type,
-+                                       const T* data) {
-     return SubmitBuffer(va_buffer_type, sizeof(T), data);
-   }
-   // Batch-version of SubmitBuffer(), where the lock for accessing libva is
--- 
-2.26.2
-
diff --git a/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
new file mode 100644
index 00000000000..d31ad7fec48
--- /dev/null
+++ b/srcpkgs/chromium/patches/chromium-89-CompositorFrameReporter-dcheck.patch
@@ -0,0 +1,11 @@
+--- net/third_party/quiche/src/quic/core/quic_path_validator.cc.orig	2021-03-02 18:48:06.000000000 +0100
++++ net/third_party/quiche/src/quic/core/quic_path_validator.cc	2021-03-03 13:17:56.624281475 +0100
+@@ -68,7 +68,7 @@
+ void QuicPathValidator::StartPathValidation(
+     std::unique_ptr<QuicPathValidationContext> context,
+     std::unique_ptr<ResultDelegate> result_delegate) {
+-  DCHECK_NE(nullptr, context);
++  DCHECK(context);
+   QUIC_DLOG(INFO) << "Start validating path " << *context
+                   << " via writer: " << context->WriterToUse();
+   if (path_context_ != nullptr) {
diff --git a/srcpkgs/chromium/patches/debian_patches_disable_widevine-cdm-cu.patch b/srcpkgs/chromium/patches/debian_patches_disable_widevine-cdm-cu.patch
new file mode 100644
index 00000000000..c3754636a3d
--- /dev/null
+++ b/srcpkgs/chromium/patches/debian_patches_disable_widevine-cdm-cu.patch
@@ -0,0 +1,16 @@
+description: Disable Widevine CDM component updater
+author: Michel Le Bihan <michel@lebihan.pl>
+
+--- chrome/browser/component_updater/registration.cc
++++ chrome/browser/component_updater/registration.cc
+@@ -100,10 +100,6 @@ void RegisterComponentsForUpdate(bool is_off_the_record_profile,
+   RegisterPepperFlashComponent(cus);
+ #endif
+ 
+-#if BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
+-  RegisterWidevineCdmComponent(cus);
+-#endif  // BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
+-
+ #if BUILDFLAG(ENABLE_NACL) && !defined(OS_ANDROID)
+ #if defined(OS_CHROMEOS)
+   // PNaCl on Chrome OS is on rootfs and there is no need to download it. But
diff --git a/srcpkgs/chromium/patches/libc_malloc.patch b/srcpkgs/chromium/patches/libc_malloc.patch
index eda11ec8663..f8d8d66da18 100644
--- a/srcpkgs/chromium/patches/libc_malloc.patch
+++ b/srcpkgs/chromium/patches/libc_malloc.patch
@@ -1,26 +1,11 @@
---- base/process/memory_linux.cc.orig	2017-09-15 08:41:43.000000000 +0000
-+++ base/process/memory_linux.cc	2017-09-15 08:44:39.804995469 +0000
-@@ -21,6 +21,12 @@
- #include "third_party/tcmalloc/chromium/src/gperftools/tcmalloc.h"
- #endif
- 
-+#if defined(LIBC_GLIBC)
-+extern "C" {
-+extern void *__libc_malloc(size_t size);
-+}
-+#endif
-+
- namespace base {
- 
- size_t g_oom_size = 0U;
---- base/process/memory_linux.cc.orig	2020-08-30 14:18:35.401132593 -0400
-+++ base/process/memory_linux.cc	2020-08-30 14:19:08.030199189 -0400
-@@ -141,7 +141,7 @@
+--- base/process/memory_linux.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/process/memory_linux.cc	2021-03-03 12:05:57.952296984 +0100
+@@ -151,7 +151,7 @@
      (!defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC))
    *result = malloc(size);
  #elif defined(LIBC_GLIBC) && !BUILDFLAG(USE_TCMALLOC)
 -  *result = __libc_malloc(size);
-+  *result = ::__libc_malloc(size);
++  *result = malloc(size);
  #elif BUILDFLAG(USE_TCMALLOC)
    *result = tc_malloc_skip_new_handler(size);
  #endif
diff --git a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch b/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
deleted file mode 100644
index 3016b065212..00000000000
--- a/srcpkgs/chromium/patches/llvm-remove-unsupported-compiler-warnings.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- build/config/compiler/BUILD.gn.orig	2021-01-20 09:01:44.362114311 -0500
-+++ build/config/compiler/BUILD.gn	2021-01-20 09:03:41.880232248 -0500
-@@ -1534,9 +1534,6 @@
- 
-           # TODO(https://crbug.com/1028110): Evaluate and possible enable.
-           "-Wno-deprecated-copy",
--
--          # TODO(https://crbug.com/1050281): Clean up, enable.
--          "-Wno-non-c-typedef-for-linkage",
-         ]
- 
-         cflags_c += [
-@@ -1548,13 +1545,6 @@
-           # TODO(https://crbug.com/1143700): Clean up and re-enable.
-           cflags_objc = [ "-Wno-gnu-folding-constant" ]
-         }
--
--        if (enable_wmax_tokens) {
--          cflags += [ "-Wmax-tokens" ]
--        } else {
--          # TODO(https://crbug.com/1049569): Remove after Clang 87b235db.
--          cflags += [ "-Wno-max-tokens" ]
--        }
-       }
-     }
-   }
diff --git a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch b/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
deleted file mode 100644
index 33a8ea32c9c..00000000000
--- a/srcpkgs/chromium/patches/musl-v8-monotonic-pthread-cont_timedwait.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Use monotonic clock for pthread_cond_timedwait with musl too.
-
-diff --git a/v8/src/base/platform/condition-variable.cc b/v8/src/base/platform/condition-variable.cc
-index 5ea7083..c13027e 100644
---- ./v8/src/base/platform/condition-variable.cc
-+++ ./v8/src/base/platform/condition-variable.cc
-@@ -16,7 +16,7 @@ namespace base {
- 
- ConditionVariable::ConditionVariable() {
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   pthread_condattr_t attr;
-@@ -92,7 +92,7 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) {
-       &native_handle_, &mutex->native_handle(), &ts);
- #else
- #if (V8_OS_FREEBSD || V8_OS_NETBSD || V8_OS_OPENBSD || \
--     (V8_OS_LINUX && V8_LIBC_GLIBC))
-+     V8_OS_LINUX)
-   // On Free/Net/OpenBSD and Linux with glibc we can change the time
-   // source for pthread_cond_timedwait() to use the monotonic clock.
-   result = clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/srcpkgs/chromium/patches/no-execinfo.patch b/srcpkgs/chromium/patches/no-execinfo.patch
index 386997e8ed1..356a7619ac9 100644
--- a/srcpkgs/chromium/patches/no-execinfo.patch
+++ b/srcpkgs/chromium/patches/no-execinfo.patch
@@ -1,5 +1,5 @@
---- base/debug/stack_trace_posix.cc.orig	2019-05-14 14:49:44.000000000 -0400
-+++ base/debug/stack_trace_posix.cc	2019-07-02 10:43:43.490045013 -0400
+--- base/debug/stack_trace_posix.cc.orig	2021-03-02 18:44:58.000000000 +0100
++++ base/debug/stack_trace_posix.cc	2021-03-03 16:46:37.828883973 +0100
 @@ -27,7 +27,7 @@
  #if !defined(USE_SYMBOLIZE)
  #include <cxxabi.h>
@@ -9,7 +9,7 @@
  #include <execinfo.h>
  #endif
  
-@@ -86,7 +86,7 @@
+@@ -88,7 +88,7 @@
    // Note: code in this function is NOT async-signal safe (std::string uses
    // malloc internally).
  
@@ -18,7 +18,7 @@
    std::string::size_type search_from = 0;
    while (search_from < text->size()) {
      // Look for the start of a mangled symbol, from search_from.
-@@ -121,7 +121,7 @@
+@@ -123,7 +123,7 @@
        search_from = mangled_start + 2;
      }
    }
@@ -27,7 +27,7 @@
  }
  #endif  // !defined(USE_SYMBOLIZE)
  
-@@ -133,7 +133,7 @@
+@@ -135,7 +135,7 @@
    virtual ~BacktraceOutputHandler() = default;
  };
  
@@ -36,7 +36,7 @@
  void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
    // This should be more than enough to store a 64-bit number in hex:
    // 16 hex digits + 1 for null-terminator.
-@@ -216,7 +216,7 @@
+@@ -218,7 +218,7 @@
    }
  #endif  // defined(USE_SYMBOLIZE)
  }
@@ -45,7 +45,7 @@
  
  void PrintToStderr(const char* output) {
    // NOTE: This code MUST be async-signal safe (it's used by in-process
-@@ -812,7 +812,7 @@
+@@ -827,7 +827,7 @@
    // NOTE: This code MUST be async-signal safe (it's used by in-process
    // stack dumping signal handler). NO malloc or stdio is allowed here.
  
@@ -54,7 +54,7 @@
    // Though the backtrace API man page does not list any possible negative
    // return values, we take no chance.
    return base::saturated_cast<size_t>(backtrace(trace, count));
-@@ -825,13 +825,13 @@
+@@ -840,13 +840,13 @@
  // NOTE: This code MUST be async-signal safe (it's used by in-process
  // stack dumping signal handler). NO malloc or stdio is allowed here.
  
diff --git a/srcpkgs/chromium/patches/no-getcontext.patch b/srcpkgs/chromium/patches/no-getcontext.patch
deleted file mode 100644
index b2a498734c9..00000000000
--- a/srcpkgs/chromium/patches/no-getcontext.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc.orig	2015-12-06 09:59:55.554536646 +0100
-+++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc	2015-12-06 10:01:16.818238035 +0100
-@@ -477,7 +477,9 @@ bool ExceptionHandler::SimulateSignalDel
-   siginfo.si_code = SI_USER;
-   siginfo.si_pid = getpid();
-   ucontext_t context;
-+#if defined(__GLIBC__)
-   getcontext(&context);
-+#endif
-   return HandleSignal(sig, &siginfo, &context);
- }
- 
-@@ -647,9 +649,14 @@ bool ExceptionHandler::WriteMinidump() {
-   sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- 
-   CrashContext context;
-+
-+#if defined(__GLIBC__)
-   int getcontext_result = getcontext(&context.context);
-   if (getcontext_result)
-     return false;
-+#else
-+  return false;
-+#endif
- 
- #if defined(__i386__)
-   // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved
diff --git a/srcpkgs/chromium/patches/no-std-time.patch b/srcpkgs/chromium/patches/no-std-time.patch
new file mode 100644
index 00000000000..7f35c22f081
--- /dev/null
+++ b/srcpkgs/chromium/patches/no-std-time.patch
@@ -0,0 +1,11 @@
+--- ui/accessibility/ax_tree_serializer.h.orig	2021-03-02 18:46:00.000000000 +0100
++++ ui/accessibility/ax_tree_serializer.h	2021-03-03 14:03:43.926160333 +0100
+@@ -746,7 +746,7 @@
+ #endif  // defined(AX_FAIL_FAST_BUILD)
+         static bool has_sent_dupe_id_err = false;
+         if (!has_sent_dupe_id_err) {
+-          std::srand(std::time(nullptr));  // use current time as seed.
++          std::srand(time(nullptr));  // use current time as seed.
+           if (std::rand() % 50 == 0) {     // Roughly 2% of the time.
+             base::debug::DumpWithoutCrashing();
+             has_sent_dupe_id_err = true;  // Only send once.
diff --git a/srcpkgs/chromium/patches/sandbox-membarrier.patch b/srcpkgs/chromium/patches/sandbox-membarrier.patch
index a31a9f6a5e9..b30bbc02cb6 100644
--- a/srcpkgs/chromium/patches/sandbox-membarrier.patch
+++ b/srcpkgs/chromium/patches/sandbox-membarrier.patch
@@ -1,56 +1,6 @@
---- sandbox/linux/system_headers/arm64_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm64_linux_syscalls.h
-@@ -1063,4 +1063,8 @@
- #define __NR_memfd_create 279
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 283
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM64_LINUX_SYSCALLS_H_
-
---- sandbox/linux/system_headers/arm_linux_syscalls.h
-+++ sandbox/linux/system_headers/arm_linux_syscalls.h
-@@ -1385,6 +1385,10 @@
- #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier (__NR_SYSCALL_BASE+389)
-+#endif
-+
- // ARM private syscalls.
- #if !defined(__ARM_NR_BASE)
- #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
-
---- sandbox/linux/system_headers/x86_32_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_32_linux_syscalls.h
-@@ -1422,5 +1422,9 @@
- #define __NR_memfd_create 356
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 375
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/system_headers/x86_64_linux_syscalls.h
-+++ sandbox/linux/system_headers/x86_64_linux_syscalls.h
-@@ -1290,5 +1290,9 @@
- #define __NR_memfd_create 319
- #endif
- 
-+#if !defined(__NR_membarrier)
-+#define __NR_membarrier 324
-+#endif
-+
- #endif  // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
- 
---- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-+++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-@@ -370,6 +370,7 @@
+--- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc.orig	2021-03-03 18:04:45.167674791 +0100
++++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc	2021-03-03 18:13:17.036547592 +0100
+@@ -394,11 +394,12 @@
    switch (sysno) {
      case __NR_exit:
      case __NR_exit_group:
@@ -58,3 +8,8 @@
      case __NR_wait4:
      case __NR_waitid:
  #if defined(__i386__)
+     case __NR_waitpid:
+ #endif
+       return true;
+     case __NR_clone:  // Should be parameter-restricted.
+     case __NR_setns:  // Privileged.
diff --git a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
index 805755c2125..bbcfbad34e5 100644
--- a/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
+++ b/srcpkgs/chromium/patches/xxx-ppc64le-support.patch
@@ -1,6 +1,6 @@
-commit e7944c162ca13b2c30b180c06f917f45643b8cca
-Author: q66 <daniel@octaforge.org>
-Date:   Tue Aug 4 19:57:48 2020 +0200
+commit 2c013a317b1114ef67cdbbc30824b28907b9ea94
+Author: Daniel Kolesa <daniel@octaforge.org>
+Date:   Wed Mar 3 19:08:29 2021 +0100
 
     ppc64le support
 
@@ -20,10 +20,10 @@ index 286a92a27..ec36a85d3 100755
    src_dir = os.path.dirname(script_dir)
    nacl_dir = os.path.join(src_dir, 'native_client')
 diff --git chrome/installer/linux/BUILD.gn chrome/installer/linux/BUILD.gn
-index b101b0cb2..9fd5a7617 100644
+index 35f01d0a4..28f2e7475 100644
 --- chrome/installer/linux/BUILD.gn
 +++ chrome/installer/linux/BUILD.gn
-@@ -92,8 +92,6 @@ packaging_files = packaging_files_binaries + [
+@@ -94,8 +94,6 @@ packaging_files = packaging_files_binaries + [
                      "$root_out_dir/xdg-mime",
                      "$root_out_dir/xdg-settings",
                      "$root_out_dir/locales/en-US.pak",
@@ -32,7 +32,7 @@ index b101b0cb2..9fd5a7617 100644
                    ]
  
  action_foreach("calculate_deb_dependencies") {
-@@ -329,7 +327,6 @@ group("installer_deps") {
+@@ -315,7 +313,6 @@ group("installer_deps") {
      ":theme_files",
      "//chrome",
      "//chrome:packed_resources",
@@ -41,11 +41,11 @@ index b101b0cb2..9fd5a7617 100644
      "//third_party/crashpad/crashpad/handler:crashpad_handler",
    ]
 diff --git sandbox/features.gni sandbox/features.gni
-index 09280d35f..42514157f 100644
+index db30ae6d6..9dc09bf53 100644
 --- sandbox/features.gni
 +++ sandbox/features.gni
-@@ -11,6 +11,7 @@ import("//build/config/nacl/config.gni")
- use_seccomp_bpf = (is_linux || is_android) &&
+@@ -11,7 +11,8 @@ import("//build/config/nacl/config.gni")
+ use_seccomp_bpf = (is_linux || is_chromeos || is_android) &&
                    (current_cpu == "x86" || current_cpu == "x64" ||
                     current_cpu == "arm" || current_cpu == "arm64" ||
 -                   current_cpu == "mipsel" || current_cpu == "mips64el")
@@ -53,11 +53,12 @@ index 09280d35f..42514157f 100644
 +                   current_cpu == "ppc64")
  
  use_seccomp_bpf = use_seccomp_bpf || is_nacl_nonsfi
+ 
 diff --git sandbox/linux/BUILD.gn sandbox/linux/BUILD.gn
-index c27351f9a..9141e1239 100644
+index e9a94b461..cca1a5da5 100644
 --- sandbox/linux/BUILD.gn
 +++ sandbox/linux/BUILD.gn
-@@ -407,6 +407,8 @@ component("sandbox_services") {
+@@ -427,6 +427,8 @@ component("sandbox_services") {
  
  source_set("sandbox_services_headers") {
    sources = [
@@ -151,7 +152,7 @@ index 1a407b952..a6aec544e 100644
  #error Unsupported target platform
  
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
-index a6d2c0dfb..37fdc179a 100644
+index 6a1ec2389..f20c582dd 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
 @@ -88,7 +88,8 @@ bool IsBaselinePolicyWatched(int sysno) {
@@ -164,7 +165,7 @@ index a6d2c0dfb..37fdc179a 100644
           SyscallSets::IsSocketCall(sysno) ||
  #endif
  #if defined(__arm__)
-@@ -210,7 +211,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -227,7 +228,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -173,7 +174,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_mmap)
      return RestrictMmapFlags();
  #endif
-@@ -228,7 +229,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -245,7 +246,7 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
      return RestrictPrctl();
  
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -182,7 +183,7 @@ index a6d2c0dfb..37fdc179a 100644
    if (sysno == __NR_socketpair) {
      // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen.
      static_assert(AF_UNIX == PF_UNIX,
-@@ -268,7 +269,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
+@@ -285,7 +286,8 @@ ResultExpr EvaluateSyscallImpl(int fs_denied_errno,
    }
  
  #if defined(__i386__) || \
@@ -193,22 +194,20 @@ index a6d2c0dfb..37fdc179a 100644
      return RestrictSocketcallCommand();
  #endif
 diff --git sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-index fc36187c9..1affc9189 100644
+index 01c046dda..7e5a6be82 100644
 --- sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
 +++ sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
-@@ -291,8 +291,10 @@ TEST_BASELINE_SIGSYS(__NR_timer_create)
- #if !defined(__aarch64__)
+@@ -302,7 +302,7 @@ TEST_BASELINE_SIGSYS(__NR_sysinfo)
+ TEST_BASELINE_SIGSYS(__NR_syslog)
+ TEST_BASELINE_SIGSYS(__NR_timer_create)
+ 
+-#if !defined(__aarch64__)
++#if !defined(__aarch64__) && !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_eventfd)
  TEST_BASELINE_SIGSYS(__NR_inotify_init)
-+#if !defined(__powerpc64__)
  TEST_BASELINE_SIGSYS(__NR_vserver)
- #endif
-+#endif
- 
- #if defined(LIBC_GLIBC) && !defined(OS_CHROMEOS)
- BPF_TEST_C(BaselinePolicy, FutexEINVAL, BaselinePolicy) {
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
-index f51915edc..ca2f4f106 100644
+index 2a97d3916..8e81aa6cf 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc
 @@ -40,7 +40,8 @@
@@ -233,7 +232,7 @@ index f51915edc..ca2f4f106 100644
  #if defined(OS_ANDROID)
  
  #if !defined(F_DUPFD_CLOEXEC)
-@@ -98,6 +104,15 @@
+@@ -98,6 +104,15 @@ inline bool IsArchitectureMips() {
  #endif
  }
  
@@ -249,7 +248,7 @@ index f51915edc..ca2f4f106 100644
  // Ubuntu's version of glibc has a race condition in sem_post that can cause
  // it to call futex(2) with bogus op arguments. To workaround this, we need
  // to allow those futex(2) calls to fail with EINVAL, instead of crashing the
-@@ -239,6 +254,8 @@
+@@ -239,6 +254,8 @@ ResultExpr RestrictFcntlCommands() {
    uint64_t kOLargeFileFlag = O_LARGEFILE;
    if (IsArchitectureX86_64() || IsArchitectureI386() || IsArchitectureMips())
      kOLargeFileFlag = 0100000;
@@ -258,7 +257,7 @@ index f51915edc..ca2f4f106 100644
  
    const Arg<int> cmd(1);
    const Arg<long> long_arg(2);
-@@ -253,14 +270,23 @@
+@@ -253,14 +270,23 @@ ResultExpr RestrictFcntlCommands() {
                F_SETLKW,
                F_GETLK,
                F_DUPFD,
@@ -285,7 +284,7 @@ index f51915edc..ca2f4f106 100644
  ResultExpr RestrictSocketcallCommand() {
    // Unfortunately, we are unable to restrict the first parameter to
    // socketpair(2). Whilst initially sounding bad, it's noteworthy that very
-@@ -413,7 +439,7 @@
+@@ -413,7 +439,7 @@ ResultExpr RestrictPtrace() {
  #endif
    return Switch(request)
        .CASES((
@@ -294,7 +293,6 @@ index f51915edc..ca2f4f106 100644
                   PTRACE_GETREGS, PTRACE_GETFPREGS, PTRACE_GET_THREAD_AREA,
                   PTRACE_GETREGSET,
  #endif
-
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
 index ba4289f05..9a4d5ab2d 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h
@@ -309,7 +307,7 @@ index ba4289f05..9a4d5ab2d 100644
  // sendto(2), recvfrom(2), shutdown(2), sendmsg(2) and recvmsg(2).
  SANDBOX_EXPORT bpf_dsl::ResultExpr RestrictSocketcallCommand();
 diff --git sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
-index d3693fd78..d492cf94b 100644
+index 642df7207..34f47eb73 100644
 --- sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 +++ sandbox/linux/seccomp-bpf-helpers/syscall_sets.cc
 @@ -29,7 +29,8 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
@@ -322,7 +320,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_time:
  #endif
        return true;
-@@ -41,12 +42,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
+@@ -45,12 +46,14 @@ bool SyscallSets::IsAllowedGettime(int sysno) {
      case __NR_clock_nanosleep:  // Parameters filtered by RestrictClockID().
      case __NR_clock_settime:    // Privileged.
  #if defined(__i386__) || \
@@ -339,7 +337,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_stime:
  #endif
      default:
-@@ -112,7 +115,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -116,7 +119,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_faccessat:  // EPERM not a valid errno.
      case __NR_fchmodat:
      case __NR_fchownat:  // Should be called chownat ?
@@ -348,7 +346,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_newfstatat:  // fstatat(). EPERM not a valid errno.
  #elif defined(__i386__) || defined(__arm__) || \
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS))
-@@ -131,7 +134,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -135,7 +138,7 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_memfd_create:
      case __NR_mkdirat:
      case __NR_mknodat:
@@ -357,7 +355,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldlstat:
      case __NR_oldstat:
  #endif
-@@ -145,7 +148,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -149,7 +152,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
  #endif
      case __NR_statfs:  // EPERM not a valid errno.
  #if defined(__i386__) || defined(__arm__) || \
@@ -367,7 +365,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_statfs64:
  #endif
      case __NR_symlinkat:
-@@ -155,7 +159,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
+@@ -159,7 +163,8 @@ bool SyscallSets::IsFileSystem(int sysno) {
      case __NR_truncate64:
  #endif
      case __NR_unlinkat:
@@ -377,7 +375,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_utime:
  #endif
      case __NR_utimensat:  // New.
-@@ -174,7 +179,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -181,7 +186,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
  #endif
        return true;
  // TODO(jln): these should be denied gracefully as well (moved below).
@@ -387,7 +385,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_fadvise64:  // EPERM not a valid errno.
  #endif
  #if defined(__i386__)
-@@ -187,11 +193,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -194,11 +200,12 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_flock:      // EPERM not a valid errno.
      case __NR_fstatfs:    // Give information about the whole filesystem.
  #if defined(__i386__) || defined(__arm__) || \
@@ -402,7 +400,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_oldfstat:
  #endif
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
-@@ -199,6 +206,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
+@@ -206,6 +213,8 @@ bool SyscallSets::IsAllowedFileSystemAccessViaFd(int sysno) {
      case __NR_sync_file_range:  // EPERM not a valid errno.
  #elif defined(__arm__)
      case __NR_arm_sync_file_range:  // EPERM not a valid errno.
@@ -411,7 +409,7 @@ index d3693fd78..d492cf94b 100644
  #endif
      default:
        return false;
-@@ -224,7 +233,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
+@@ -231,7 +240,8 @@ bool SyscallSets::IsDeniedFileSystemAccessViaFd(int sysno) {
  #endif
      case __NR_getdents64:  // EPERM not a valid errno.
  #if defined(__i386__) || \
@@ -421,7 +419,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_readdir:
  #endif
        return true;
-@@ -265,7 +275,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
+@@ -272,7 +282,7 @@ bool SyscallSets::IsGetSimpleId(int sysno) {
  bool SyscallSets::IsProcessPrivilegeChange(int sysno) {
    switch (sysno) {
      case __NR_capset:
@@ -430,7 +428,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ioperm:  // Intel privilege.
      case __NR_iopl:    // Intel privilege.
  #endif
-@@ -316,7 +326,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -323,7 +333,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
      case __NR_rt_sigreturn:
      case __NR_rt_sigtimedwait:
  #if defined(__i386__) || defined(__arm__) || \
@@ -440,7 +438,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigaction:
      case __NR_sigprocmask:
      case __NR_sigreturn:
-@@ -332,7 +343,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
+@@ -339,7 +350,8 @@ bool SyscallSets::IsAllowedSignalHandling(int sysno) {
  #endif
      case __NR_signalfd4:
  #if defined(__i386__) || defined(__arm__) || \
@@ -450,7 +448,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sigpending:
      case __NR_sigsuspend:
  #endif
-@@ -356,7 +368,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
+@@ -363,7 +375,7 @@ bool SyscallSets::IsAllowedOperationOnFd(int sysno) {
  #endif
      case __NR_dup3:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -459,7 +457,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_shutdown:
  #endif
        return true;
-@@ -390,7 +402,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -397,7 +409,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
      case __NR_membarrier:
      case __NR_wait4:
      case __NR_waitid:
@@ -468,7 +466,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_waitpid:
  #endif
        return true;
-@@ -407,7 +419,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
+@@ -414,7 +426,7 @@ bool SyscallSets::IsAllowedProcessStartOrDeath(int sysno) {
  #endif
      case __NR_set_tid_address:
      case __NR_unshare:
@@ -477,7 +475,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_vfork:
  #endif
      default:
-@@ -456,7 +468,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -463,7 +475,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
        return true;
      default:
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -486,7 +484,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_socketpair:  // We will want to inspect its argument.
  #endif
        return false;
-@@ -466,7 +478,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
+@@ -473,7 +485,7 @@ bool SyscallSets::IsAllowedGetOrModifySocket(int sysno) {
  bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
    switch (sysno) {
  #if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \
@@ -495,7 +493,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_accept:
      case __NR_accept4:
      case __NR_bind:
-@@ -481,7 +493,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
+@@ -488,7 +500,8 @@ bool SyscallSets::IsDeniedGetOrModifySocket(int sysno) {
  }
  
  #if defined(__i386__) || \
@@ -505,7 +503,7 @@ index d3693fd78..d492cf94b 100644
  // Big multiplexing system call for sockets.
  bool SyscallSets::IsSocketCall(int sysno) {
    switch (sysno) {
-@@ -495,7 +508,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
+@@ -502,7 +515,8 @@ bool SyscallSets::IsSocketCall(int sysno) {
  }
  #endif
  
@@ -515,7 +513,7 @@ index d3693fd78..d492cf94b 100644
  bool SyscallSets::IsNetworkSocketInformation(int sysno) {
    switch (sysno) {
      case __NR_getpeername:
-@@ -520,7 +534,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
+@@ -527,7 +541,7 @@ bool SyscallSets::IsAllowedAddressSpaceAccess(int sysno) {
      case __NR_mincore:
      case __NR_mlockall:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -524,7 +522,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_mmap:
  #endif
  #if defined(__i386__) || defined(__arm__) || \
-@@ -550,7 +564,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -557,7 +571,8 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
    switch (sysno) {
      case __NR_lseek:
  #if defined(__i386__) || defined(__arm__) || \
@@ -534,7 +532,7 @@ index d3693fd78..d492cf94b 100644
      case __NR__llseek:
  #endif
  #if !defined(__aarch64__)
-@@ -562,26 +577,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
+@@ -569,26 +584,28 @@ bool SyscallSets::IsAllowedGeneralIo(int sysno) {
      case __NR_readv:
      case __NR_pread64:
  #if defined(__arm__) || \
@@ -569,7 +567,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_sendmsg:  // Could specify destination.
      case __NR_sendto:   // Could specify destination.
  #endif
-@@ -638,7 +655,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -645,7 +662,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
        return true;
      case __NR_getpriority:
  #if defined(__i386__) || defined(__arm__) || \
@@ -579,7 +577,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_nice:
  #endif
      case __NR_setpriority:
-@@ -650,7 +668,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
+@@ -657,7 +675,8 @@ bool SyscallSets::IsAllowedBasicScheduler(int sysno) {
  bool SyscallSets::IsAdminOperation(int sysno) {
    switch (sysno) {
  #if defined(__i386__) || defined(__arm__) || \
@@ -589,7 +587,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_bdflush:
  #endif
      case __NR_kexec_load:
-@@ -666,7 +685,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
+@@ -673,7 +692,8 @@ bool SyscallSets::IsAdminOperation(int sysno) {
  
  bool SyscallSets::IsKernelModule(int sysno) {
    switch (sysno) {
@@ -599,7 +597,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_create_module:
      case __NR_get_kernel_syms:  // Should ENOSYS.
      case __NR_query_module:
-@@ -699,7 +719,8 @@ bool SyscallSets::IsFsControl(int sysno) {
+@@ -706,7 +726,8 @@ bool SyscallSets::IsFsControl(int sysno) {
      case __NR_swapoff:
      case __NR_swapon:
  #if defined(__i386__) || \
@@ -609,7 +607,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_umount:
  #endif
      case __NR_umount2:
-@@ -715,7 +736,7 @@ bool SyscallSets::IsNuma(int sysno) {
+@@ -722,7 +743,7 @@ bool SyscallSets::IsNuma(int sysno) {
      case __NR_getcpu:
      case __NR_mbind:
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -618,7 +616,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_migrate_pages:
  #endif
      case __NR_move_pages:
-@@ -744,14 +765,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
+@@ -751,14 +772,15 @@ bool SyscallSets::IsGlobalProcessEnvironment(int sysno) {
    switch (sysno) {
      case __NR_acct:  // Privileged.
  #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
@@ -637,7 +635,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_ulimit:
  #endif
      case __NR_getrusage:
-@@ -785,7 +807,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
+@@ -792,7 +814,7 @@ bool SyscallSets::IsGlobalSystemStatus(int sysno) {
  #endif
      case __NR_sysinfo:
      case __NR_uname:
@@ -646,7 +644,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_olduname:
      case __NR_oldolduname:
  #endif
-@@ -847,8 +869,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
+@@ -854,8 +876,16 @@ bool SyscallSets::IsSystemVSemaphores(int sysno) {
  }
  #endif
  
@@ -664,7 +662,7 @@ index d3693fd78..d492cf94b 100644
      (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_64_BITS))
  // These give a lot of ambient authority and bypass the setuid sandbox.
  bool SyscallSets::IsSystemVSharedMemory(int sysno) {
-@@ -880,7 +910,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
+@@ -887,7 +917,8 @@ bool SyscallSets::IsSystemVMessageQueue(int sysno) {
  #endif
  
  #if defined(__i386__) || \
@@ -674,7 +672,7 @@ index d3693fd78..d492cf94b 100644
  // Big system V multiplexing system call.
  bool SyscallSets::IsSystemVIpc(int sysno) {
    switch (sysno) {
-@@ -900,7 +931,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
+@@ -907,7 +938,8 @@ bool SyscallSets::IsAnySystemV(int sysno) {
    return IsSystemVMessageQueue(sysno) || IsSystemVSemaphores(sysno) ||
           IsSystemVSharedMemory(sysno);
  #elif defined(__i386__) || \
@@ -684,7 +682,7 @@ index d3693fd78..d492cf94b 100644
    return IsSystemVIpc(sysno);
  #endif
  }
-@@ -953,7 +985,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
+@@ -960,7 +992,8 @@ bool SyscallSets::IsFaNotify(int sysno) {
  bool SyscallSets::IsTimer(int sysno) {
    switch (sysno) {
      case __NR_getitimer:
@@ -694,7 +692,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_alarm:
  #endif
      case __NR_setitimer:
-@@ -1012,18 +1045,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1019,18 +1052,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_syncfs:
      case __NR_vhangup:
  // The system calls below are not implemented.
@@ -721,7 +719,7 @@ index d3693fd78..d492cf94b 100644
      case __NR_gtty:
      case __NR_idle:
      case __NR_lock:
-@@ -1031,20 +1068,22 @@ bool SyscallSets::IsMisc(int sysno) {
+@@ -1038,20 +1075,22 @@ bool SyscallSets::IsMisc(int sysno) {
      case __NR_prof:
      case __NR_profil:
  #endif
@@ -889,7 +887,7 @@ index e47e98bf5..d53a7ff56 100644
    SECCOMP_RESULT(ctx) = static_cast<greg_t>(ret_val);
  }
 diff --git sandbox/linux/seccomp-bpf/trap.cc sandbox/linux/seccomp-bpf/trap.cc
-index 9884be8bb..98e4371aa 100644
+index f5b86a73a..5e6c4a068 100644
 --- sandbox/linux/seccomp-bpf/trap.cc
 +++ sandbox/linux/seccomp-bpf/trap.cc
 @@ -232,6 +232,20 @@ void Trap::SigSys(int nr, LinuxSigInfo* info, ucontext_t* ctx) {
@@ -940,23 +938,23 @@ index fcfd2aa12..f6eb32fb7 100644
    return syscall(__NR_clone, flags, child_stack, ptid, tls, ctid);
  #endif
 diff --git sandbox/linux/syscall_broker/broker_process.cc sandbox/linux/syscall_broker/broker_process.cc
-index 8321d2379..7e5ad1de3 100644
+index d72c9d238..77f1d95f5 100644
 --- sandbox/linux/syscall_broker/broker_process.cc
 +++ sandbox/linux/syscall_broker/broker_process.cc
-@@ -157,7 +157,7 @@ bool BrokerProcess::IsSyscallAllowed(int sysno) const {
- #if defined(__NR_fstatat)
-     case __NR_fstatat:
+@@ -169,7 +169,7 @@ bool BrokerProcess::IsSyscallBrokerable(int sysno, bool fast_check) const {
+ #if defined(__NR_fstatat64)
+     case __NR_fstatat64:
  #endif
 -#if defined(__x86_64__) || defined(__aarch64__)
 +#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
      case __NR_newfstatat:
  #endif
-       return !fast_check_in_client_ || allowed_command_set_.test(COMMAND_STAT);
+       return !fast_check || allowed_command_set_.test(COMMAND_STAT);
 diff --git sandbox/linux/system_headers/linux_seccomp.h sandbox/linux/system_headers/linux_seccomp.h
-index a60fe2ad3..9dccdb51d 100644
+index 1fa47ed09..39cc9ab53 100644
 --- sandbox/linux/system_headers/linux_seccomp.h
 +++ sandbox/linux/system_headers/linux_seccomp.h
-@@ -29,6 +29,9 @@
+@@ -41,6 +41,9 @@
  #ifndef EM_AARCH64
  #define EM_AARCH64 183
  #endif
@@ -966,7 +964,7 @@ index a60fe2ad3..9dccdb51d 100644
  
  #ifndef __AUDIT_ARCH_64BIT
  #define __AUDIT_ARCH_64BIT 0x80000000
-@@ -54,6 +57,12 @@
+@@ -73,6 +76,12 @@
  #ifndef AUDIT_ARCH_AARCH64
  #define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
  #endif
@@ -1055,13 +1053,13 @@ index 000000000..07728e087
 +//TODO: is it necessary to redefine ucontext on PPC64?
 +
 +#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_PPC64_LINUX_UCONTEXT_H_
-diff --git services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc services/service_manager/sandbox/linux/bpf_renderer_policy_linux.cc
-index fb89b3356..1e984731e 100644
+diff --git sandbox/policy/linux/bpf_renderer_policy_linux.cc sandbox/policy/linux/bpf_renderer_policy_linux.cc
+index 2588fc792..d455c4601 100644
 --- sandbox/policy/linux/bpf_renderer_policy_linux.cc
 +++ sandbox/policy/linux/bpf_renderer_policy_linux.cc
 @@ -15,6 +15,11 @@
  #include "sandbox/linux/system_headers/linux_syscalls.h"
- #include "services/service_manager/sandbox/linux/sandbox_linux.h"
+ #include "sandbox/policy/linux/sandbox_linux.h"
  
 +// On PPC64, TCGETS is defined in terms of struct termios, so we must include termios.h
 +#ifdef __powerpc64__
@@ -1072,7 +1070,7 @@ index fb89b3356..1e984731e 100644
  // <linux/dma-buf.h> once kernel version 4.6 becomes widely used.
  #include <linux/types.h>
 diff --git third_party/angle/src/compiler/translator/InfoSink.h third_party/angle/src/compiler/translator/InfoSink.h
-index 3a807e1e..5258617a 100644
+index 3a807e1e3..5258617a7 100644
 --- third_party/angle/src/compiler/translator/InfoSink.h
 +++ third_party/angle/src/compiler/translator/InfoSink.h
 @@ -92,7 +92,16 @@ class TInfoSinkBase
@@ -1094,7 +1092,7 @@ index 3a807e1e..5258617a 100644
      }
      // Write boolean values as their names instead of integral value.
 diff --git third_party/angle/src/libANGLE/Constants.h third_party/angle/src/libANGLE/Constants.h
-index 42964cc1..6607deeb 100644
+index fcbc9246a..39ae66148 100644
 --- third_party/angle/src/libANGLE/Constants.h
 +++ third_party/angle/src/libANGLE/Constants.h
 @@ -9,6 +9,7 @@
@@ -1106,10 +1104,10 @@ index 42964cc1..6607deeb 100644
  
  #include <stdint.h>
 diff --git third_party/boringssl/BUILD.gn third_party/boringssl/BUILD.gn
-index b435499f4..ac8a84b6d 100644
+index 17cf9cda9..8ce96bd32 100644
 --- third_party/boringssl/BUILD.gn
 +++ third_party/boringssl/BUILD.gn
-@@ -101,6 +101,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
+@@ -103,6 +103,13 @@ if (is_win && !is_msan && current_cpu != "arm64") {
        } else {
          public_configs = [ ":no_asm_config" ]
        }
@@ -1124,10 +1122,10 @@ index b435499f4..ac8a84b6d 100644
        public_configs = [ ":no_asm_config" ]
      }
 diff --git third_party/breakpad/BUILD.gn third_party/breakpad/BUILD.gn
-index 5617de88..dc8bc176 100644
+index 4af3d7bbf..adbf54159 100644
 --- third_party/breakpad/BUILD.gn
 +++ third_party/breakpad/BUILD.gn
-@@ -598,7 +598,6 @@ if (is_linux || is_android) {
+@@ -596,7 +596,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/minidump_file_writer.h",
        "breakpad/src/common/convert_UTF.cc",
        "breakpad/src/common/convert_UTF.h",
@@ -1135,7 +1133,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/elf_core_dump.cc",
        "breakpad/src/common/linux/elf_core_dump.h",
        "breakpad/src/common/linux/elfutils.cc",
-@@ -636,6 +635,14 @@ if (is_linux || is_android) {
+@@ -634,6 +633,14 @@ if (is_linux || is_chromeos || is_android) {
  
      libs = [ "dl" ]
  
@@ -1150,7 +1148,7 @@ index 5617de88..dc8bc176 100644
      include_dirs = [
        ".",
        "breakpad/src",
-@@ -686,7 +693,6 @@ if (is_linux || is_android) {
+@@ -682,7 +689,6 @@ if (is_linux || is_chromeos || is_android) {
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc",
        "breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc",
        "breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc",
@@ -1159,7 +1157,7 @@ index 5617de88..dc8bc176 100644
        "breakpad/src/common/linux/file_id_unittest.cc",
        "breakpad/src/common/linux/linux_libc_support_unittest.cc",
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
-index 07d9171a..9aed4cb3 100644
+index 07d9171a0..9aed4cb36 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/raw_context_cpu.h
 @@ -44,6 +44,8 @@ typedef MDRawContextARM RawContextCPU;
@@ -1172,7 +1170,7 @@ index 07d9171a..9aed4cb3 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
-index aae1dc13..03afec7a 100644
+index aae1dc13b..03afec7a5 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.cc
 @@ -270,7 +270,42 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
@@ -1258,7 +1256,7 @@ index aae1dc13..03afec7a 100644
 +
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
-index fb216fa6..593aac82 100644
+index fb216fa6d..593aac822 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/thread_info.h
 @@ -68,6 +68,10 @@ struct ThreadInfo {
@@ -1285,10 +1283,10 @@ index fb216fa6..593aac82 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-index ee515c41..1090470f 100644
+index 6eec1be24..741983a1a 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc
-@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+@@ -254,6 +254,48 @@ void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) {
    out->float_save.fir = uc->uc_mcontext.fpc_eir;  // Unused.
  #endif
  }
@@ -1338,21 +1336,21 @@ index ee515c41..1090470f 100644
  
  }  // namespace google_breakpad
 diff --git third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
-index 8e74a8a5..7cb667a7 100644
+index 7d4100881..c122ac92e 100644
 --- third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 +++ third_party/breakpad/breakpad/src/client/linux/dump_writer_common/ucontext_reader.h
 @@ -55,6 +55,9 @@ struct UContextReader {
  #elif defined(__aarch64__)
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc,
                               const struct fpsimd_context* fpregs);
 +#elif defined(__powerpc64__)
 +  static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
 +                             const vrregset_t* vregs);
  #else
-   static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
+   static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc);
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
-index c65feaa1..5a7ab50c 100644
+index a6cb5f984..ae16b64d9 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
 @@ -461,9 +461,16 @@ bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) {
@@ -1373,7 +1371,7 @@ index c65feaa1..5a7ab50c 100644
    // and 'float_state' is not a member of CrashContext.
    ucontext_t* uc_ptr = (ucontext_t*)uc;
    if (uc_ptr->uc_mcontext.fpregs) {
-@@ -701,11 +708,19 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -708,11 +715,19 @@ bool ExceptionHandler::WriteMinidump() {
    }
  #endif
  
@@ -1394,7 +1392,7 @@ index c65feaa1..5a7ab50c 100644
    context.tid = sys_gettid();
  
    // Add an exception stream to the minidump for better reporting.
-@@ -726,6 +741,9 @@ bool ExceptionHandler::WriteMinidump() {
+@@ -733,6 +748,9 @@ bool ExceptionHandler::WriteMinidump() {
  #elif defined(__mips__)
    context.siginfo.si_addr =
        reinterpret_cast<void*>(context.context.uc_mcontext.pc);
@@ -1405,7 +1403,7 @@ index c65feaa1..5a7ab50c 100644
  #error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
-index f44483ff..36ce6d6c 100644
+index f80843ea7..260dd10f7 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.h
 @@ -192,7 +192,11 @@ class ExceptionHandler {
@@ -1422,7 +1420,7 @@ index f44483ff..36ce6d6c 100644
      // In case of MIPS Linux FP state is already part of ucontext_t so
      // 'float_state' is not required.
 diff --git third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
-index 8d8809fa..e2eb031e 100644
+index 35dcbfd4d..7934370fd 100644
 --- third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/handler/exception_handler_unittest.cc
 @@ -307,7 +307,7 @@ TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) {
@@ -1457,7 +1455,7 @@ index 8d8809fa..e2eb031e 100644
  
    const pid_t child = fork();
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
-index fa3c1713..6ce709e2 100644
+index fa3c1713a..6ce709e2f 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer.cc
 @@ -138,7 +138,9 @@ class MicrodumpWriter {
@@ -1503,7 +1501,7 @@ index fa3c1713..6ce709e2 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
-index 6339ac0c..291af106 100644
+index 6339ac0cd..291af106b 100644
 --- third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc
 @@ -279,10 +279,19 @@ TEST(MicrodumpWriterTest, BasicWithMappings) {
@@ -1530,7 +1528,7 @@ index 6339ac0c..291af106 100644
    ASSERT_NE(std::string::npos,
              buf.find("M 00001000 0000002A 00001000 "
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
-index 41506898..b93e4afc 100644
+index 415068983..b93e4afcf 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc
 @@ -112,6 +112,9 @@ bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {
@@ -1556,7 +1554,7 @@ index 41506898..b93e4afc 100644
          for (int i = EF_R0; i <= EF_R31; i++)
            info.mcontext.gregs[i - EF_R0] = status->pr_reg[i];
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
-index 1112035b..8523dad6 100644
+index 7fd6532ad..199cbfffd 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.cc
 @@ -765,7 +765,9 @@ bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
@@ -1571,7 +1569,7 @@ index 1112035b..8523dad6 100644
    const MappingInfo* mapping = FindMapping(stack_pointer);
    if (!mapping)
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
-index f4a75d90..020981f5 100644
+index 7bee160f1..07bb2b81a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper.h
 @@ -63,7 +63,8 @@ namespace google_breakpad {
@@ -1585,7 +1583,7 @@ index f4a75d90..020981f5 100644
  #endif
  
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
-index 3ad48e50..1688c365 100644
+index 331f4bb34..3f722947f 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
 @@ -51,6 +51,8 @@
@@ -1598,7 +1596,7 @@ index 3ad48e50..1688c365 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
-index e3ddb81a..fa28575e 100644
+index e3ddb81a6..fa28575ef 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc
 @@ -149,19 +149,27 @@ bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,
@@ -1644,7 +1642,7 @@ index e3ddb81a..fa28575e 100644
  #error "This code hasn't been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
-index ea6b9a12..9b318fe0 100644
+index da71e15dc..12bfb317a 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
 @@ -462,6 +462,9 @@ TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {
@@ -1667,7 +1665,7 @@ index ea6b9a12..9b318fe0 100644
  #error This test has not been ported to this platform.
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
-index f8cdf2a1..cb808c15 100644
+index 32634ef00..2a56948de 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.cc
 @@ -136,7 +136,9 @@ class MinidumpWriter {
@@ -1724,7 +1722,7 @@ index f8cdf2a1..cb808c15 100644
  #endif
    LinuxDumper* dumper_;
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
-index e3b0b16d..ccd8aa0a 100644
+index e3b0b16da..ccd8aa0a4 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer.h
 @@ -48,6 +48,8 @@ class ExceptionHandler;
@@ -1737,7 +1735,7 @@ index e3b0b16d..ccd8aa0a 100644
  typedef std::remove_pointer<fpregset_t>::type fpstate_t;
  #endif
 diff --git third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
-index 3017a49a..364efd79 100644
+index d192e5cbb..fc1bfa8d7 100644
 --- third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 +++ third_party/breakpad/breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
 @@ -715,6 +715,9 @@ TEST(MinidumpWriterTest, InvalidStackPointer) {
@@ -1751,7 +1749,7 @@ index 3017a49a..364efd79 100644
  # error "This code has not been ported to your platform yet."
  #endif
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
-index 4e938269..f0ff15d9 100644
+index 99362945c..c54ba7145 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file.cc
 @@ -65,8 +65,7 @@ bool MemoryMappedFile::Map(const char* path, size_t offset) {
@@ -1765,7 +1763,7 @@ index 4e938269..f0ff15d9 100644
    if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {
  #else
 diff --git third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
-index fad59f40..616496d6 100644
+index fad59f40c..616496d67 100644
 --- third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/linux/memory_mapped_file_unittest.cc
 @@ -176,9 +176,10 @@ TEST_F(MemoryMappedFileTest, RemapAfterMap) {
@@ -1783,10 +1781,10 @@ index fad59f40..616496d6 100644
      data1[i] = i & 0x7f;
    }
 diff --git third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-index 43c86314..27325b81 100644
+index 5803b90d5..2a1cf14f0 100644
 --- third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
 +++ third_party/breakpad/breakpad/src/common/memory_allocator_unittest.cc
-@@ -57,8 +57,9 @@
+@@ -57,8 +57,9 @@ TEST(PageAllocatorTest, LargeObject) {
  
    EXPECT_EQ(0U, allocator.pages_allocated());
    uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
@@ -1798,7 +1796,7 @@ index 43c86314..27325b81 100644
      uint8_t* p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
      ASSERT_FALSE(p == NULL);
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_linux.cc third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
-index ccc9f145..debaed4d 100644
+index 798056dfa..22bd81fff 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_linux.cc
 @@ -202,12 +202,14 @@ bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) {
@@ -1817,7 +1815,7 @@ index ccc9f145..debaed4d 100644
        // Unsupported architecture. Note that ARM architectures are not
        // supported because objdump does not support ARM.
 diff --git third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
-index 528ee5f2..72764d6c 100644
+index 528ee5f21..72764d6c1 100644
 --- third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 +++ third_party/breakpad/breakpad/src/processor/exploitability_unittest.cc
 @@ -104,6 +104,8 @@ ExploitabilityFor(const string& filename) {
@@ -1875,7 +1873,7 @@ index 528ee5f2..72764d6c 100644
  
  }  // namespace
 diff --git third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
-index a60be323..35b11b6d 100644
+index aade82c99..195aa73f3 100644
 --- third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 +++ third_party/breakpad/breakpad/src/tools/linux/md2core/minidump-2-core.cc
 @@ -77,6 +77,8 @@
@@ -1959,7 +1957,7 @@ index a60be323..35b11b6d 100644
  #error "This code has not been ported to your platform yet"
  #endif
 diff --git third_party/crashpad/crashpad/CONTRIBUTORS third_party/crashpad/crashpad/CONTRIBUTORS
-index 8724b7f3..8e29424e 100644
+index 8724b7f32..8e29424ef 100644
 --- third_party/crashpad/crashpad/CONTRIBUTORS
 +++ third_party/crashpad/crashpad/CONTRIBUTORS
 @@ -13,3 +13,4 @@ Mark Mentovai <mark@chromium.org>
@@ -1968,7 +1966,7 @@ index 8724b7f3..8e29424e 100644
  Joshua Peraza <jperaza@chromium.org>
 +Shawn Anastasio <shawn@anastas.io>
 diff --git third_party/crashpad/crashpad/compat/linux/sys/user.h third_party/crashpad/crashpad/compat/linux/sys/user.h
-index 6ed77a98..1fd83469 100644
+index 6ed77a98e..1fd83469a 100644
 --- third_party/crashpad/crashpad/compat/linux/sys/user.h
 +++ third_party/crashpad/crashpad/compat/linux/sys/user.h
 @@ -15,6 +15,7 @@
@@ -1980,7 +1978,7 @@ index 6ed77a98..1fd83469 100644
  
  #include <features.h>
 diff --git third_party/crashpad/crashpad/minidump/minidump_context.h third_party/crashpad/crashpad/minidump/minidump_context.h
-index 3a3e603c..3118d9e9 100644
+index 3a3e603cb..3118d9e9f 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context.h
 @@ -592,6 +592,70 @@ struct MinidumpContextMIPS64 {
@@ -2055,7 +2053,7 @@ index 3a3e603c..3118d9e9 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.cc third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
-index d7e53a49..d89eb9e0 100644
+index d7e53a493..d89eb9e01 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.cc
 @@ -101,6 +101,13 @@ MinidumpContextWriter::CreateFromSnapshot(const CPUContext* context_snapshot) {
@@ -2121,7 +2119,7 @@ index d7e53a49..d89eb9e0 100644
 +
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer.h third_party/crashpad/crashpad/minidump/minidump_context_writer.h
-index d4ab936e..1d22fc59 100644
+index d4ab936ee..1d22fc59c 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer.h
 @@ -315,6 +315,45 @@ class MinidumpContextMIPS64Writer final : public MinidumpContextWriter {
@@ -2171,7 +2169,7 @@ index d4ab936e..1d22fc59 100644
  
  #endif  // CRASHPAD_MINIDUMP_MINIDUMP_CONTEXT_WRITER_H_
 diff --git third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
-index 3216a906..a9fcbe9d 100644
+index 3216a906b..a9fcbe9d8 100644
 --- third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_context_writer_test.cc
 @@ -213,6 +213,21 @@ TEST(MinidumpContextWriter, MIPS64_FromSnapshot) {
@@ -2197,10 +2195,10 @@ index 3216a906..a9fcbe9d 100644
  }  // namespace test
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-index a1340760..95dc9252 100644
+index 0974e3ddf..b71ec5880 100644
 --- third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
 +++ third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
-@@ -126,6 +126,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
+@@ -135,6 +135,8 @@ std::string MinidumpMiscInfoDebugBuildString() {
    static constexpr char kCPU[] = "mips";
  #elif defined(ARCH_CPU_MIPS64EL)
    static constexpr char kCPU[] = "mips64";
@@ -2210,10 +2208,10 @@ index a1340760..95dc9252 100644
  #error define kCPU for this CPU
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/capture_memory.cc third_party/crashpad/crashpad/snapshot/capture_memory.cc
-index a51626cc..61e0b20a 100644
+index 7a1b2763c..beda8da9e 100644
 --- third_party/crashpad/crashpad/snapshot/capture_memory.cc
 +++ third_party/crashpad/crashpad/snapshot/capture_memory.cc
-@@ -111,6 +111,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
+@@ -112,6 +112,11 @@ void CaptureMemory::PointedToByContext(const CPUContext& context,
    for (size_t i = 0; i < base::size(context.mipsel->regs); ++i) {
      MaybeCaptureMemoryAround(delegate, context.mipsel->regs[i]);
    }
@@ -2226,7 +2224,7 @@ index a51626cc..61e0b20a 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/cpu_architecture.h third_party/crashpad/crashpad/snapshot/cpu_architecture.h
-index 811a7209..f4f83981 100644
+index 811a72095..f4f83981d 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_architecture.h
 @@ -43,7 +43,10 @@ enum CPUArchitecture {
@@ -2242,7 +2240,7 @@ index 811a7209..f4f83981 100644
  
  }  // namespace crashpad
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.cc third_party/crashpad/crashpad/snapshot/cpu_context.cc
-index 6fb8d7e7..b01f7cad 100644
+index c75b5555e..aeade577a 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.cc
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.cc
 @@ -169,6 +169,8 @@ uint64_t CPUContext::InstructionPointer() const {
@@ -2272,7 +2270,7 @@ index 6fb8d7e7..b01f7cad 100644
      case kCPUArchitectureX86:
      case kCPUArchitectureARM:
 diff --git third_party/crashpad/crashpad/snapshot/cpu_context.h third_party/crashpad/crashpad/snapshot/cpu_context.h
-index fb23c467..eebede63 100644
+index fb23c4679..eebede63c 100644
 --- third_party/crashpad/crashpad/snapshot/cpu_context.h
 +++ third_party/crashpad/crashpad/snapshot/cpu_context.h
 @@ -352,6 +352,24 @@ struct CPUContextMIPS64 {
@@ -2309,7 +2307,7 @@ index fb23c467..eebede63 100644
  };
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
-index 9f46a489..aa677c4e 100644
+index 9f46a4897..aa677c4eb 100644
 --- third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/cpu_context_linux.h
 @@ -15,6 +15,7 @@
@@ -2400,24 +2398,20 @@ index 9f46a489..aa677c4e 100644
  }  // namespace crashpad
  
 diff --git third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-index be22c903..c5df23d1 100644
+index d32bd1937..2dd538c2b 100644
 --- third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/debug_rendezvous_test.cc
-@@ -159,9 +159,11 @@ void TestAgainstTarget(PtraceConnection* connection) {
-           const bool is_vdso_mapping =
+@@ -192,6 +192,8 @@ void TestAgainstTarget(PtraceConnection* connection) {
                device == 0 && inode == 0 && mapping_name == "[vdso]";
+ #if defined(ARCH_CPU_X86)
+           static constexpr char kPrefix[] = "linux-gate.so.";
++#elif defined(ARCH_CPU_PPC64)
++          static constexpr char kPrefix[] = "linux-vdso64.so.";
+ #else
            static constexpr char kPrefix[] = "linux-vdso.so.";
-+          static constexpr char kPrefix64[] = "linux-vdso64.so.";
-           return is_vdso_mapping ==
-                  (module_name.empty() ||
--                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0);
-+                  module_name.compare(0, strlen(kPrefix), kPrefix) == 0 ||
-+                  module_name.compare(0, strlen(kPrefix64), kPrefix64) == 0);
-         },
-         module_mapping->name,
-         module_mapping->device,
+ #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
-index cd40b3b1..6bcf23b6 100644
+index cd40b3b12..6bcf23b6f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.cc
 @@ -323,6 +323,69 @@ bool ExceptionSnapshotLinux::ReadContext<ContextTraits64>(
@@ -2491,7 +2485,7 @@ index cd40b3b1..6bcf23b6 100644
  
  bool ExceptionSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
-index ea0cd210..e42df520 100644
+index ea0cd2106..e42df520f 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux.h
 @@ -84,6 +84,8 @@ class ExceptionSnapshotLinux final : public ExceptionSnapshot {
@@ -2504,7 +2498,7 @@ index ea0cd210..e42df520 100644
    } context_union_;
    CPUContext context_;
 diff --git third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
-index e4ff1ab7..25534dd0 100644
+index c17170b43..b6a714cc6 100644
 --- third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
 @@ -296,7 +296,28 @@ void ExpectContext(const CPUContext& actual, const NativeCPUContext& expected) {
@@ -2537,7 +2531,7 @@ index e4ff1ab7..25534dd0 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
-index b96abfe7..df12ca56 100644
+index ee246e8bc..9555dce04 100644
 --- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux.cc
 @@ -108,6 +108,8 @@ void ProcessReaderLinux::Thread::InitializeStack(ProcessReaderLinux* reader) {
@@ -2549,21 +2543,8 @@ index b96abfe7..df12ca56 100644
  #else
  #error Port.
  #endif
-diff --git third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-index 5b572361..049c3285 100644
---- third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-+++ third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
-@@ -612,6 +612,8 @@ bool WriteTestModule(const base::FilePath& module_path) {
-   module.ehdr.e_machine = EM_AARCH64;
- #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
-   module.ehdr.e_machine = EM_MIPS;
-+#elif defined(ARCH_CPU_PPC64)
-+  module.ehdr.e_machine = EM_PPC64;
- #endif
- 
-   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/signal_context.h third_party/crashpad/crashpad/snapshot/linux/signal_context.h
-index 11002468..8e335a09 100644
+index 110024680..a1f2da259 100644
 --- third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 +++ third_party/crashpad/crashpad/snapshot/linux/signal_context.h
 @@ -422,6 +422,89 @@ static_assert(offsetof(UContext<ContextTraits64>, mcontext.fpregs) ==
@@ -2657,10 +2638,10 @@ index 11002468..8e335a09 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-index 8564d3d4..b690ecd4 100644
+index a99da3e4b..03b973083 100644
 --- third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/system_snapshot_linux.cc
-@@ -203,6 +203,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
+@@ -204,6 +204,8 @@ CPUArchitecture SystemSnapshotLinux::GetCPUArchitecture() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return process_reader_->Is64Bit() ? kCPUArchitectureMIPS64EL
                                      : kCPUArchitectureMIPSEL;
@@ -2669,7 +2650,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -218,6 +220,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
+@@ -219,6 +221,9 @@ uint32_t SystemSnapshotLinux::CPURevision() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return 0;
@@ -2679,7 +2660,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -238,6 +243,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
+@@ -239,6 +244,9 @@ std::string SystemSnapshotLinux::CPUVendor() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return std::string();
@@ -2689,7 +2670,7 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error port to your architecture
  #endif
-@@ -371,6 +379,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
+@@ -372,6 +380,9 @@ bool SystemSnapshotLinux::NXEnabled() const {
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    // Not implementable on MIPS
    return false;
@@ -2699,8 +2680,21 @@ index 8564d3d4..b690ecd4 100644
  #else
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
+diff --git third_party/crashpad/crashpad/snapshot/linux/test_modules.cc third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+index b2450c206..7ba78b2ae 100644
+--- third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
++++ third_party/crashpad/crashpad/snapshot/linux/test_modules.cc
+@@ -110,6 +110,8 @@ bool WriteTestModule(const base::FilePath& module_path,
+   module.ehdr.e_machine = EM_AARCH64;
+ #elif defined(ARCH_CPU_MIPSEL) || defined(ARCH_CPU_MIPS64EL)
+   module.ehdr.e_machine = EM_MIPS;
++#elif defined(ARCH_CPU_PPC64)
++  module.ehdr.e_machine = EM_PPC64;
+ #endif
+ 
+   module.ehdr.e_version = EV_CURRENT;
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
-index e3e2bebd..8ef43752 100644
+index e3e2bebdd..8ef43752e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.cc
 @@ -186,6 +186,14 @@ bool ThreadSnapshotLinux::Initialize(ProcessReaderLinux* process_reader,
@@ -2719,7 +2713,7 @@ index e3e2bebd..8ef43752 100644
  #error Port.
  #endif
 diff --git third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
-index 44cc6f6d..d4136461 100644
+index 44cc6f6d9..d4136461e 100644
 --- third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 +++ third_party/crashpad/crashpad/snapshot/linux/thread_snapshot_linux.h
 @@ -68,6 +68,8 @@ class ThreadSnapshotLinux final : public ThreadSnapshot {
@@ -2732,7 +2726,7 @@ index 44cc6f6d..d4136461 100644
  #error Port.
  #endif  // ARCH_CPU_X86_FAMILY
 diff --git third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
-index d3d5ebdf..3fd730cb 100644
+index d3d5ebdfb..3fd730cb5 100644
 --- third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 +++ third_party/crashpad/crashpad/util/linux/auxiliary_vector.cc
 @@ -56,6 +56,11 @@ bool AuxiliaryVector::Read(PtraceConnection* connection) {
@@ -2747,23 +2741,8 @@ index d3d5ebdf..3fd730cb 100644
      if (!MapInsertOrReplace(&values_, type, value, nullptr)) {
        LOG(ERROR) << "duplicate auxv entry";
        return false;
-diff --git third_party/crashpad/crashpad/util/linux/ptrace_broker.cc third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-index 155a1e0c..5e50ceb5 100644
---- third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-+++ third_party/crashpad/crashpad/util/linux/ptrace_broker.cc
-@@ -94,8 +94,8 @@ int PtraceBroker::Run() {
- }
- 
- bool PtraceBroker::AllocateAttachments() {
--  constexpr size_t page_size = 4096;
--  constexpr size_t alloc_size =
-+  static size_t page_size = getpagesize();
-+  size_t alloc_size =
-       (sizeof(ScopedPtraceAttach) + page_size - 1) & ~(page_size - 1);
-   void* alloc = sbrk(alloc_size);
-   if (reinterpret_cast<intptr_t>(alloc) == -1) {
 diff --git third_party/crashpad/crashpad/util/linux/ptracer.cc third_party/crashpad/crashpad/util/linux/ptracer.cc
-index 557e0d36..08ae434b 100644
+index 557e0d363..08ae434b8 100644
 --- third_party/crashpad/crashpad/util/linux/ptracer.cc
 +++ third_party/crashpad/crashpad/util/linux/ptracer.cc
 @@ -398,6 +398,64 @@ bool GetThreadArea64(pid_t tid,
@@ -2842,7 +2821,7 @@ index 557e0d36..08ae434b 100644
                             info->thread_context,
                             &info->thread_specific_data_address,
 diff --git third_party/crashpad/crashpad/util/linux/thread_info.h third_party/crashpad/crashpad/util/linux/thread_info.h
-index 5b55c24a..dea0d1f3 100644
+index 5b55c24a7..dea0d1f39 100644
 --- third_party/crashpad/crashpad/util/linux/thread_info.h
 +++ third_party/crashpad/crashpad/util/linux/thread_info.h
 @@ -28,6 +28,10 @@
@@ -2964,10 +2943,10 @@ index 5b55c24a..dea0d1f3 100644
    LinuxVMAddress thread_specific_data_address;
  };
 diff --git third_party/crashpad/crashpad/util/misc/capture_context.h third_party/crashpad/crashpad/util/misc/capture_context.h
-index 3ff71184..3e82f4b9 100644
+index d21a24f19..acc325349 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context.h
 +++ third_party/crashpad/crashpad/util/misc/capture_context.h
-@@ -68,6 +68,7 @@ using NativeCPUContext = ucontext_t;
+@@ -69,6 +69,7 @@ using NativeCPUContext = ucontext_t;
  //!     macOS/Linux/Fuchsia | x86_64       | `%%rdi`
  //!     Linux               | ARM/ARM64    | `r0`/`x0`
  //!     Linux               | MIPS/MIPS64  | `$a0`
@@ -2976,7 +2955,7 @@ index 3ff71184..3e82f4b9 100644
  //!     Additionally, the value `LR` on ARM/ARM64 will be the return address of
  //!     this function.
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_linux.S third_party/crashpad/crashpad/util/misc/capture_context_linux.S
-index 52215ee5..b3e4a3ec 100644
+index 52215ee5d..b3e4a3ec7 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 +++ third_party/crashpad/crashpad/util/misc/capture_context_linux.S
 @@ -32,7 +32,7 @@
@@ -3204,7 +3183,7 @@ index 52215ee5..b3e4a3ec 100644
 +  blr
  #endif  // __i386__
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test.cc third_party/crashpad/crashpad/util/misc/capture_context_test.cc
-index cf23c2de..5f264bc9 100644
+index cf23c2def..5f264bc92 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test.cc
 @@ -57,7 +57,7 @@ void TestCaptureContext() {
@@ -3217,10 +3196,10 @@ index cf23c2de..5f264bc9 100644
    // likely fail.
    const uintptr_t kReferencePC =
 diff --git third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-index 9fc5db28..5f69f8dc 100644
+index 30a2ab21d..60509f21d 100644
 --- third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
 +++ third_party/crashpad/crashpad/util/misc/capture_context_test_util_linux.cc
-@@ -36,6 +36,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
+@@ -35,6 +35,8 @@ void SanityCheckContext(const NativeCPUContext& context) {
    EXPECT_EQ(context.uc_mcontext.regs[0], FromPointerCast<uintptr_t>(&context));
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    EXPECT_EQ(context.uc_mcontext.gregs[4], FromPointerCast<uintptr_t>(&context));
@@ -3229,7 +3208,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -50,6 +52,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
+@@ -49,6 +51,8 @@ uintptr_t ProgramCounterFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.pc;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.pc;
@@ -3238,7 +3217,7 @@ index 9fc5db28..5f69f8dc 100644
  #endif
  }
  
-@@ -64,6 +68,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
+@@ -63,6 +67,8 @@ uintptr_t StackPointerFromContext(const NativeCPUContext& context) {
    return context.uc_mcontext.sp;
  #elif defined(ARCH_CPU_MIPS_FAMILY)
    return context.uc_mcontext.gregs[29];
@@ -3248,10 +3227,10 @@ index 9fc5db28..5f69f8dc 100644
  }
  
 diff --git third_party/crashpad/crashpad/util/posix/signals_test.cc third_party/crashpad/crashpad/util/posix/signals_test.cc
-index 58bfa8f8..8fc37c46 100644
---- third_party/crashpad/crashpad/util/posix/signals_test.cc.orig	2020-11-17 13:39:47.000000000 -0500
-+++ third_party/crashpad/crashpad/util/posix/signals_test.cc	2020-11-18 21:06:33.433408623 -0500
-@@ -46,9 +46,9 @@
+index 54cc2f19f..298b5c993 100644
+--- third_party/crashpad/crashpad/util/posix/signals_test.cc
++++ third_party/crashpad/crashpad/util/posix/signals_test.cc
+@@ -46,9 +46,9 @@ bool CanCauseSignal(int sig) {
    return sig == SIGABRT ||
           sig == SIGALRM ||
           sig == SIGBUS ||
@@ -3263,7 +3242,7 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
           sig == SIGILL ||
  #endif  // defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
-@@ -117,9 +117,11 @@
+@@ -117,9 +117,11 @@ void CauseSignal(int sig) {
        break;
      }
  
@@ -3276,7 +3255,7 @@ index 58bfa8f8..8fc37c46 100644
      case SIGFPE: {
        // Optimization makes this tricky, so get zero from a system call likely
        // to succeed, and try to do something with the result.
-@@ -137,7 +139,7 @@
+@@ -137,7 +139,7 @@ void CauseSignal(int sig) {
        fstat(quotient, &stat_buf);
        break;
      }
@@ -3286,10 +3265,10 @@ index 58bfa8f8..8fc37c46 100644
  #if defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARMEL)
      case SIGILL: {
 diff --git third_party/dav1d/BUILD.gn third_party/dav1d/BUILD.gn
-index 788dc6cf..5fd7e8fd 100644
+index 6b4566fc3..c07f732ad 100644
 --- third_party/dav1d/BUILD.gn
 +++ third_party/dav1d/BUILD.gn
-@@ -182,6 +182,8 @@ static_library("dav1d_8bit") {
+@@ -184,6 +184,8 @@ static_library("dav1d_8bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3298,7 +3277,7 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -210,6 +212,8 @@ static_library("dav1d_10bit") {
+@@ -212,6 +214,8 @@ static_library("dav1d_10bit") {
      sources += arm_template_sources
    } else if (current_cpu == "arm64") {
      sources += arm_template_sources
@@ -3307,9 +3286,9 @@ index 788dc6cf..5fd7e8fd 100644
    }
  
    cflags = dav1d_copts
-@@ -256,6 +260,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
-       ":dav1d_config",
-     ]
+@@ -263,6 +267,21 @@ if (current_cpu == "x86" || current_cpu == "x64") {
+       defines = [ "PREFIX" ]
+     }
  
 +    cflags = dav1d_copts
 +  }
@@ -3329,7 +3308,7 @@ index 788dc6cf..5fd7e8fd 100644
      cflags = dav1d_copts
    }
  }
-@@ -285,5 +304,7 @@ static_library("dav1d") {
+@@ -292,5 +311,7 @@ static_library("dav1d") {
      }
    } else if (current_cpu == "arm" || current_cpu == "arm64") {
      deps += [ ":dav1d_arm" ]
@@ -3339,7 +3318,7 @@ index 788dc6cf..5fd7e8fd 100644
  }
 diff --git third_party/dav1d/config/linux/ppc64/config.h third_party/dav1d/config/linux/ppc64/config.h
 new file mode 100644
-index 00000000..f6ca57f7
+index 000000000..9fbbf75cc
 --- /dev/null
 +++ third_party/dav1d/config/linux/ppc64/config.h
 @@ -0,0 +1,39 @@
@@ -3383,10 +3362,10 @@ index 00000000..f6ca57f7
 +#define HAVE_UNISTD_H 1
 +
 diff --git third_party/dav1d/dav1d_generated.gni third_party/dav1d/dav1d_generated.gni
-index 8becac02..d5f4fcac 100644
+index c59cb0821..3060284a8 100644
 --- third_party/dav1d/dav1d_generated.gni
 +++ third_party/dav1d/dav1d_generated.gni
-@@ -71,6 +71,11 @@ arm_template_sources = [
+@@ -82,6 +82,11 @@ arm_template_sources = [
    "libdav1d/src/arm/mc_init_tmpl.c",
  ]
  
@@ -3399,7 +3378,7 @@ index 8becac02..d5f4fcac 100644
    "libdav1d/src/cdef_apply_tmpl.c",
    "libdav1d/src/cdef_tmpl.c",
 diff --git third_party/dav1d/generate_source.py third_party/dav1d/generate_source.py
-index 9ab5e00b..ad3feffe 100755
+index 9ab5e00b8..ad3feffee 100755
 --- third_party/dav1d/generate_source.py
 +++ third_party/dav1d/generate_source.py
 @@ -50,7 +50,8 @@ def WriteGn(fd):
@@ -3413,7 +3392,7 @@ index 9ab5e00b..ad3feffe 100755
    WriteArray(fd, "template_sources", template_sources)
  
 diff --git third_party/dav1d/libdav1d/src/ppc/types.h third_party/dav1d/libdav1d/src/ppc/types.h
-index 0b4bd72f..a0caa5e7 100644
+index 0b4bd72f0..a0caa5e71 100644
 --- third_party/dav1d/libdav1d/src/ppc/types.h
 +++ third_party/dav1d/libdav1d/src/ppc/types.h
 @@ -51,4 +51,19 @@
@@ -3437,10 +3416,10 @@ index 0b4bd72f..a0caa5e7 100644
 +
  #endif /* DAV1D_SRC_PPC_TYPES_H */
 diff --git third_party/lss/linux_syscall_support.h third_party/lss/linux_syscall_support.h
-index d2baee9d..9955ce44 100644
+index e4ac22644..1c57015db 100644
 --- third_party/lss/linux_syscall_support.h
 +++ third_party/lss/linux_syscall_support.h
-@@ -3922,7 +3922,7 @@ struct kernel_statfs {
+@@ -3947,7 +3947,7 @@ struct kernel_statfs {
        LSS_REG(2, buf);
        LSS_BODY(void*, mmap2, "0"(__r2));
      }
@@ -3449,7 +3428,7 @@ index d2baee9d..9955ce44 100644
      #define __NR__mmap2 __NR_mmap2
      LSS_INLINE _syscall6(void*, _mmap2,            void*, s,
                           size_t,                   l, int,               p,
-@@ -4033,7 +4033,7 @@ struct kernel_statfs {
+@@ -4058,7 +4058,7 @@ struct kernel_statfs {
    #if defined(__i386__) ||                                                    \
        defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) ||                     \
       (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) ||                   \
@@ -3471,10 +3450,10 @@ index bdac4d784..51e0f2cac 100644
  #  define SIMD_SZ 4
  #  define VZERO() ((vector float) vec_splat_u8(0))
 diff --git third_party/skia/src/sksl/SkSLString.cpp third_party/skia/src/sksl/SkSLString.cpp
-index 88eb1c7d..4be33fa5 100644
+index ec3e56964..4cf8999a2 100644
 --- third_party/skia/src/sksl/SkSLString.cpp
 +++ third_party/skia/src/sksl/SkSLString.cpp
-@@ -240,7 +240,12 @@ String to_string(double value) {
+@@ -234,7 +234,12 @@ String to_string(double value) {
      if (needsDotZero) {
          buffer << ".0";
      }
@@ -3487,12 +3466,12 @@ index 88eb1c7d..4be33fa5 100644
 +    return String(ret.c_str());
  }
  
- SKSL_INT stoi(const String& s) {
+ bool stod(const StringFragment& s, SKSL_FLOAT* value) {
 diff --git third_party/sqlite/src/amalgamation/sqlite3.c third_party/sqlite/src/amalgamation/sqlite3.c
-index 1b2c2ec7..7593dba1 100644
+index 6b4a7899d..b8c7fe414 100644
 --- third_party/sqlite/src/amalgamation/sqlite3.c
 +++ third_party/sqlite/src/amalgamation/sqlite3.c
-@@ -14400,7 +14400,8 @@ typedef INT16_TYPE LogEst;
+@@ -14474,7 +14474,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3503,10 +3482,10 @@ index 1b2c2ec7..7593dba1 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/amalgamation_dev/sqlite3.c third_party/sqlite/src/amalgamation_dev/sqlite3.c
-index 19c87689..c7ab039e 100644
+index d30c9b7de..cf75a69d9 100644
 --- third_party/sqlite/src/amalgamation_dev/sqlite3.c
 +++ third_party/sqlite/src/amalgamation_dev/sqlite3.c
-@@ -14413,7 +14413,8 @@ typedef INT16_TYPE LogEst;
+@@ -14487,7 +14487,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3517,10 +3496,10 @@ index 19c87689..c7ab039e 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/sqlite/src/ext/rtree/rtree.c third_party/sqlite/src/ext/rtree/rtree.c
-index efaef813..4cd57d55 100644
+index f5b57a5e2..80a2d0ad8 100644
 --- third_party/sqlite/src/ext/rtree/rtree.c
 +++ third_party/sqlite/src/ext/rtree/rtree.c
-@@ -432,7 +432,7 @@ struct RtreeMatchArg {
+@@ -450,7 +450,7 @@ struct RtreeMatchArg {
  #if defined(i386)     || defined(__i386__)   || defined(_M_IX86) ||    \
      defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)  ||    \
      defined(_M_AMD64) || defined(_M_ARM)     || defined(__x86)   ||    \
@@ -3530,10 +3509,10 @@ index efaef813..4cd57d55 100644
  #elif defined(sparc)    || defined(__ppc__)
  # define SQLITE_BYTEORDER    4321
 diff --git third_party/sqlite/src/src/sqliteInt.h third_party/sqlite/src/src/sqliteInt.h
-index 122e26ad..ec21dcb5 100644
+index 245070d4f..b25164e95 100644
 --- third_party/sqlite/src/src/sqliteInt.h
 +++ third_party/sqlite/src/src/sqliteInt.h
-@@ -868,7 +868,8 @@ typedef INT16_TYPE LogEst;
+@@ -877,7 +877,8 @@ typedef INT16_TYPE LogEst;
  # if defined(i386)      || defined(__i386__)      || defined(_M_IX86) ||    \
       defined(__x86_64)  || defined(__x86_64__)    || defined(_M_X64)  ||    \
       defined(_M_AMD64)  || defined(_M_ARM)        || defined(__x86)   ||    \
@@ -3544,10 +3523,10 @@ index 122e26ad..ec21dcb5 100644
  # elif defined(sparc)     || defined(__ppc__) || \
         defined(__ARMEB__) || defined(__AARCH64EB__)
 diff --git third_party/webrtc/modules/desktop_capture/differ_block.cc third_party/webrtc/modules/desktop_capture/differ_block.cc
-index dd9ab457..c005d959 100644
---- third_party/webrtc/modules/desktop_capture/differ_block.cc.orig	2020-11-17 13:42:02.000000000 -0500
-+++ third_party/webrtc/modules/desktop_capture/differ_block.cc	2020-11-18 21:11:03.039905360 -0500
-@@ -30,11 +30,7 @@
+index 4f0c5430c..54ee0829e 100644
+--- third_party/webrtc/modules/desktop_capture/differ_block.cc
++++ third_party/webrtc/modules/desktop_capture/differ_block.cc
+@@ -30,11 +30,7 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
    static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
  
    if (!diff_proc) {
@@ -3560,7 +3539,7 @@ index dd9ab457..c005d959 100644
      bool have_sse2 = GetCPUInfo(kSSE2) != 0;
      // For x86 processors, check if SSE2 is supported.
      if (have_sse2 && kBlockSize == 32) {
-@@ -44,6 +40,10 @@
+@@ -44,6 +40,10 @@ bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
      } else {
        diff_proc = &VectorDifference_C;
      }
@@ -3572,10 +3551,10 @@ index dd9ab457..c005d959 100644
    }
  
 diff --git third_party/webrtc/rtc_base/system/arch.h third_party/webrtc/rtc_base/system/arch.h
-index ed216e66..25d36c07 100644
+index be2367b85..be4ee4233 100644
 --- third_party/webrtc/rtc_base/system/arch.h
 +++ third_party/webrtc/rtc_base/system/arch.h
-@@ -50,6 +50,18 @@
+@@ -79,6 +79,18 @@
  #elif defined(__EMSCRIPTEN__)
  #define WEBRTC_ARCH_32_BITS
  #define WEBRTC_ARCH_LITTLE_ENDIAN
@@ -3594,15 +3573,15 @@ index ed216e66..25d36c07 100644
  #else
  #error Please add support for your architecture in rtc_base/system/arch.h
  #endif
- diff --git v8/BUILD.gn v8/BUILD.gn
-index 167e63503..125c445ea 100644
+diff --git v8/BUILD.gn v8/BUILD.gn
+index f39529a3a..e84fc449e 100644
 --- v8/BUILD.gn
 +++ v8/BUILD.gn
-@@ -696,6 +696,12 @@ config("toolchain") {
+@@ -850,6 +850,12 @@ config("toolchain") {
      }
      if (host_byteorder == "little") {
        defines += [ "V8_TARGET_ARCH_PPC_LE" ]
-+        cflags += [
++      cflags += [
 +        # Enable usage of AltiVec, VSX, and other POWER8 and higher features
 +        "-mcpu=power8",
 +        "-maltivec",
@@ -3611,24 +3590,12 @@ index 167e63503..125c445ea 100644
      } else if (host_byteorder == "big") {
        defines += [ "V8_TARGET_ARCH_PPC_BE" ]
        if (current_os == "aix") {
-diff --git ui/gl/features.gni ui/gl/features.gni
-index cb2c98649..5e09bc1f7 100644
---- ui/gl/features.gni
-+++ ui/gl/features.gni
-@@ -25,5 +25,6 @@ declare_args() {
-                         is_chromeos || is_fuchsia) &&
-                        (target_cpu == "x86" || target_cpu == "x64" ||
-                         target_cpu == "arm" || target_cpu == "arm64" ||
--                        target_cpu == "mipsel" || target_cpu == "mips64el")
-+                        target_cpu == "mipsel" || target_cpu == "mips64el" ||
-+                        target_cpu == "ppc64")
- }
 diff --git v8/test/BUILD.gn v8/test/BUILD.gn
-index f6d30537a..287b27080 100644
+index fb872ad39..45fc585dd 100644
 --- v8/test/BUILD.gn
 +++ v8/test/BUILD.gn
-@@ -31,7 +31,7 @@ group("gn_all") {
-     deps += [
+@@ -36,7 +36,7 @@ group("gn_all") {
+       "benchmarks/cpp:gn_all",
        "cctest:cctest",
        "cctest:generate-bytecode-expectations",
 -      "unittests:unittests",
@@ -3636,7 +3603,7 @@ index f6d30537a..287b27080 100644
      ]
    }
  }
-@@ -73,7 +73,7 @@ group("v8_bot_default") {
+@@ -78,7 +78,7 @@ group("v8_bot_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
@@ -3645,7 +3612,7 @@ index f6d30537a..287b27080 100644
      "wasm-api-tests:wasm_api_tests",
      "wasm-js:v8_wasm_js",
      "wasm-spec-tests:v8_wasm_spec_tests",
-@@ -93,7 +93,7 @@ group("v8_default") {
+@@ -98,7 +98,7 @@ group("v8_default") {
      "message:v8_message",
      "mjsunit:v8_mjsunit",
      "mkgrokdump:mkgrokdump",
diff --git a/srcpkgs/chromium/template b/srcpkgs/chromium/template
index 098cb904da9..c08c9a6004d 100644
--- a/srcpkgs/chromium/template
+++ b/srcpkgs/chromium/template
@@ -1,7 +1,7 @@
 # Template file for 'chromium'
 pkgname=chromium
 # See http://www.chromium.org/developers/calendar for the latest version
-version=88.0.4324.182
+version=89.0.4389.72
 revision=1
 archs="i686* x86_64* aarch64* armv7l* ppc64le*"
 short_desc="Google's attempt at creating a safer, faster, and more stable browser"
@@ -9,7 +9,7 @@ maintainer="Enno Boland <gottox@voidlinux.org>"
 license="BSD-3-Clause"
 homepage="https://www.chromium.org/"
 distfiles="https://commondatastorage.googleapis.com/chromium-browser-official/${pkgname}-${version}.tar.xz"
-checksum=30411fc3ec2d33df4c5cad41f21affa3823c80f7dbd394f6d68f9a1e81015b81
+checksum=946a0b65aad10e0f77a539103892099b7238310c733f25b41d58b76f6ac0bc4f
 nocross=yes
 
 lib32disabled=yes
@@ -34,7 +34,7 @@ makedepends="libpng-devel gtk+-devel gtk+3-devel nss-devel pciutils-devel
  libXcursor-devel libflac-devel speex-devel libmtp-devel libwebp-devel
  libjpeg-turbo-devel libevent-devel json-c-devel harfbuzz-devel
  minizip-devel jsoncpp-devel zlib-devel libcap-devel libXdamage-devel
- re2-devel fontconfig-devel freetype-devel opus-devel
+ re2-devel fontconfig-devel freetype-devel
  ffmpeg-devel libva-devel python-setuptools xcb-proto
  $(vopt_if pipewire libpipewire0.2-devel) $(vopt_if sndio sndio-devel)"
 depends="libexif hwids desktop-file-utils hicolor-icon-theme xdg-utils"
@@ -119,6 +119,7 @@ do_configure() {
 	# use_system_v8=1
 	# use_system_zlib=1
 	# bzip2 jsoncpp minizip xdg_utils speex
+	# opus fails because the generated shim header opus.h tries to include <opus.h>
 	system="
 		ffmpeg
 		flac
@@ -132,7 +133,6 @@ do_configure() {
 		libwebp
 		libxml
 		libxslt
-		opus
 		re2
 		snappy
 	"

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PR PATCH] [Closed]: [WIP] chromium: update to 89.0.4389.72
  2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
                   ` (24 preceding siblings ...)
  2021-03-07 12:06 ` pullmoll
@ 2021-03-11 19:11 ` q66
  25 siblings, 0 replies; 27+ messages in thread
From: q66 @ 2021-03-11 19:11 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 701 bytes --]

There's a closed pull request on the void-packages repository

[WIP] chromium: update to 89.0.4389.72
https://github.com/void-linux/void-packages/pull/29205

Description:
CVE-2021-21166

+ x86_64 patch set updated, built, tested very cursory and seems to work
+ i686 patch applies w/o change, built, cursory test in a VM
+ x86_64-musl patch set updated, built, works but can crash, see comments below
+ system opus disabled because the generated shim header opus.h tries to include <opus.h> and fails
+ not sure if libc_malloc.patch is ok, i.e. simply use malloc() instead of __libc_malloc().
+ more to do

[ci skip]

If you don't want to build yourself my repo has the update for testing.

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2021-03-11 19:11 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-03 14:20 [PR PATCH] [WIP] chromium: update to 89.0.4389.72 pullmoll
2021-03-03 15:15 ` [PR PATCH] [Updated] " pullmoll
2021-03-03 15:40 ` pullmoll
2021-03-03 15:49 ` pullmoll
2021-03-03 16:49 ` pullmoll
2021-03-03 17:00 ` pullmoll
2021-03-03 17:06 ` pullmoll
2021-03-03 17:20 ` pullmoll
2021-03-03 17:20 ` ericonr
2021-03-03 17:21 ` ericonr
2021-03-03 17:23 ` pullmoll
2021-03-03 17:23 ` pullmoll
2021-03-03 17:24 ` pullmoll
2021-03-03 17:25 ` pullmoll
2021-03-03 17:27 ` [PR PATCH] [Updated] " pullmoll
2021-03-03 17:30 ` pullmoll
2021-03-03 18:13 ` pullmoll
2021-03-03 18:13 ` q66
2021-03-03 18:15 ` pullmoll
2021-03-03 18:25 ` [PR PATCH] [Updated] " pullmoll
2021-03-03 18:27 ` pullmoll
2021-03-03 18:30 ` pullmoll
2021-03-03 18:32 ` pullmoll
2021-03-03 18:42 ` q66
2021-03-03 19:56 ` [PR PATCH] [Updated] " pullmoll
2021-03-07 12:06 ` pullmoll
2021-03-11 19:11 ` [PR PATCH] [Closed]: " q66

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).