mac: Crashpad for macOS on arm64, phase 2: build tests

This gets all tests building. They don’t all pass, and there aren’t any
guarantees that anything else works yet, either.

This is mostly a lot of CPU context shuffling.

Bug: crashpad:345
Change-Id: I70bb327ebd2d205498ac06420ba41cad08793522
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2285962
Reviewed-by: Robert Sesek <rsesek@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
GitOrigin-RevId: 0c3f50c8e14ab78b9d953a0a2584b21b0a5322c9
diff --git a/client/simulate_crash_mac_test.cc b/client/simulate_crash_mac_test.cc
index c2f4c20..dde298d 100644
--- a/client/simulate_crash_mac_test.cc
+++ b/client/simulate_crash_mac_test.cc
@@ -200,6 +200,28 @@
         case x86_DEBUG_STATE64:
           EXPECT_EQ(old_state_count, x86_DEBUG_STATE64_COUNT);
           break;
+#elif defined(ARCH_CPU_ARM64)
+        case ARM_UNIFIED_THREAD_STATE: {
+          EXPECT_EQ(old_state_count, ARM_UNIFIED_THREAD_STATE_COUNT);
+          const arm_unified_thread_state* state =
+              reinterpret_cast<const arm_unified_thread_state*>(old_state);
+          EXPECT_EQ(state->ash.flavor,
+                    implicit_cast<uint32_t>(ARM_THREAD_STATE64));
+          if (state->ash.flavor == ARM_THREAD_STATE64) {
+            EXPECT_EQ(state->ash.count,
+                      implicit_cast<uint32_t>(ARM_THREAD_STATE64_COUNT));
+          }
+          break;
+        }
+        case ARM_THREAD_STATE64:
+          EXPECT_EQ(old_state_count, ARM_THREAD_STATE64_COUNT);
+          break;
+        case ARM_NEON_STATE64:
+          EXPECT_EQ(old_state_count, ARM_NEON_STATE64_COUNT);
+          break;
+        case ARM_DEBUG_STATE64:
+          EXPECT_EQ(old_state_count, ARM_DEBUG_STATE64_COUNT);
+          break;
 #else
 #error Port to your CPU architecture
 #endif
@@ -326,18 +348,23 @@
 
   static constexpr thread_state_flavor_t kFlavors[] = {
 #if defined(ARCH_CPU_X86_FAMILY)
-      x86_THREAD_STATE,
-      x86_FLOAT_STATE,
-      x86_DEBUG_STATE,
+    x86_THREAD_STATE,
+    x86_FLOAT_STATE,
+    x86_DEBUG_STATE,
 #if defined(ARCH_CPU_X86)
-      x86_THREAD_STATE32,
-      x86_FLOAT_STATE32,
-      x86_DEBUG_STATE32,
+    x86_THREAD_STATE32,
+    x86_FLOAT_STATE32,
+    x86_DEBUG_STATE32,
 #elif defined(ARCH_CPU_X86_64)
-      x86_THREAD_STATE64,
-      x86_FLOAT_STATE64,
-      x86_DEBUG_STATE64,
+    x86_THREAD_STATE64,
+    x86_FLOAT_STATE64,
+    x86_DEBUG_STATE64,
 #endif
+#elif defined(ARCH_CPU_ARM64)
+    ARM_UNIFIED_THREAD_STATE,
+    ARM_THREAD_STATE64,
+    ARM_NEON_STATE64,
+    ARM_DEBUG_STATE64,
 #else
 #error Port to your CPU architecture
 #endif
diff --git a/snapshot/mac/mach_o_image_reader_test.cc b/snapshot/mac/mach_o_image_reader_test.cc
index 625f8a7..53826bf 100644
--- a/snapshot/mac/mach_o_image_reader_test.cc
+++ b/snapshot/mac/mach_o_image_reader_test.cc
@@ -68,6 +68,8 @@
 constexpr int kCPUType = CPU_TYPE_X86_64;
 #elif defined(ARCH_CPU_X86)
 constexpr int kCPUType = CPU_TYPE_X86;
+#elif defined(ARCH_CPU_ARM64)
+constexpr int kCPUType = CPU_TYPE_ARM64;
 #endif
 
 // Verifies that |expect_section| and |actual_section| agree.
diff --git a/snapshot/mac/system_snapshot_mac_test.cc b/snapshot/mac/system_snapshot_mac_test.cc
index 2b66592..e13c9af 100644
--- a/snapshot/mac/system_snapshot_mac_test.cc
+++ b/snapshot/mac/system_snapshot_mac_test.cc
@@ -69,6 +69,8 @@
   EXPECT_EQ(cpu_architecture, kCPUArchitectureX86);
 #elif defined(ARCH_CPU_X86_64)
   EXPECT_EQ(cpu_architecture, kCPUArchitectureX86_64);
+#elif defined(ARCH_CPU_ARM64)
+  EXPECT_EQ(cpu_architecture, kCPUArchitectureARM64);
 #else
 #error port to your architecture
 #endif
@@ -87,6 +89,8 @@
   if (cpu_vendor != "GenuineIntel" && cpu_vendor != "AuthenticAMD") {
     FAIL() << "cpu_vendor " << cpu_vendor;
   }
+#elif defined(ARCH_CPU_ARM64)
+  EXPECT_EQ(cpu_vendor, "Apple processor");
 #else
 #error port to your architecture
 #endif
diff --git a/util/mach/exc_server_variants_test.cc b/util/mach/exc_server_variants_test.cc
index 553661e..227ddfd 100644
--- a/util/mach/exc_server_variants_test.cc
+++ b/util/mach/exc_server_variants_test.cc
@@ -1143,43 +1143,47 @@
     mach_msg_type_number_t count;
   } test_data[] = {
 #if defined(ARCH_CPU_X86_FAMILY)
-      // For the x86 family, exception handlers can only properly receive the
-      // thread, float, and exception state flavors. There’s a bug in the kernel
-      // that causes it to call thread_getstatus() (a wrapper for the more
-      // familiar thread_get_state()) with an incorrect state buffer size
-      // parameter when delivering an exception. 10.9.4
-      // xnu-2422.110.17/osfmk/kern/exception.c exception_deliver() uses the
-      // _MachineStateCount[] array indexed by the flavor number to obtain the
-      // buffer size. 10.9.4 xnu-2422.110.17/osfmk/i386/pcb.c contains the
-      // definition of this array for the x86 family. The slots corresponding to
-      // thread, float, and exception state flavors in both native-width (32-
-      // and 64-bit) and universal are correct, but the remaining elements in
-      // the array are not. This includes elements that would correspond to
-      // debug and AVX state flavors, so these cannot be tested here.
-      //
-      // When machine_thread_get_state() (the machine-specific implementation of
-      // thread_get_state()) encounters an undersized buffer as reported by the
-      // buffer size parameter, it returns KERN_INVALID_ARGUMENT, which causes
-      // exception_deliver() to not actually deliver the exception and instead
-      // return that error code to exception_triage() as well.
-      //
-      // This bug is filed as radar 18312067.
-      //
-      // Additionaly, the AVX state flavors are also not tested because they’re
-      // not available on all CPUs and OS versions.
+    // For the x86 family, exception handlers can only properly receive the
+    // thread, float, and exception state flavors. There’s a bug in the kernel
+    // that causes it to call thread_getstatus() (a wrapper for the more
+    // familiar thread_get_state()) with an incorrect state buffer size
+    // parameter when delivering an exception. 10.9.4
+    // xnu-2422.110.17/osfmk/kern/exception.c exception_deliver() uses the
+    // _MachineStateCount[] array indexed by the flavor number to obtain the
+    // buffer size. 10.9.4 xnu-2422.110.17/osfmk/i386/pcb.c contains the
+    // definition of this array for the x86 family. The slots corresponding to
+    // thread, float, and exception state flavors in both native-width (32- and
+    // 64-bit) and universal are correct, but the remaining elements in the
+    // array are not. This includes elements that would correspond to debug and
+    // AVX state flavors, so these cannot be tested here.
+    //
+    // When machine_thread_get_state() (the machine-specific implementation of
+    // thread_get_state()) encounters an undersized buffer as reported by the
+    // buffer size parameter, it returns KERN_INVALID_ARGUMENT, which causes
+    // exception_deliver() to not actually deliver the exception and instead
+    // return that error code to exception_triage() as well.
+    //
+    // This bug is filed as radar 18312067.
+    //
+    // Additionaly, the AVX state flavors are also not tested because they’re
+    // not available on all CPUs and OS versions.
+    {x86_THREAD_STATE, x86_THREAD_STATE_COUNT},
+    {x86_FLOAT_STATE, x86_FLOAT_STATE_COUNT},
+    {x86_EXCEPTION_STATE, x86_EXCEPTION_STATE_COUNT},
 #if defined(ARCH_CPU_X86)
-      {x86_THREAD_STATE32, x86_THREAD_STATE32_COUNT},
-      {x86_FLOAT_STATE32, x86_FLOAT_STATE32_COUNT},
-      {x86_EXCEPTION_STATE32, x86_EXCEPTION_STATE32_COUNT},
+    {x86_THREAD_STATE32, x86_THREAD_STATE32_COUNT},
+    {x86_FLOAT_STATE32, x86_FLOAT_STATE32_COUNT},
+    {x86_EXCEPTION_STATE32, x86_EXCEPTION_STATE32_COUNT},
+#elif defined(ARCH_CPU_X86_64)
+    {x86_THREAD_STATE64, x86_THREAD_STATE64_COUNT},
+    {x86_FLOAT_STATE64, x86_FLOAT_STATE64_COUNT},
+    {x86_EXCEPTION_STATE64, x86_EXCEPTION_STATE64_COUNT},
 #endif
-#if defined(ARCH_CPU_X86_64)
-      {x86_THREAD_STATE64, x86_THREAD_STATE64_COUNT},
-      {x86_FLOAT_STATE64, x86_FLOAT_STATE64_COUNT},
-      {x86_EXCEPTION_STATE64, x86_EXCEPTION_STATE64_COUNT},
-#endif
-      {x86_THREAD_STATE, x86_THREAD_STATE_COUNT},
-      {x86_FLOAT_STATE, x86_FLOAT_STATE_COUNT},
-      {x86_EXCEPTION_STATE, x86_EXCEPTION_STATE_COUNT},
+#elif defined(ARCH_CPU_ARM64)
+    {ARM_UNIFIED_THREAD_STATE, ARM_UNIFIED_THREAD_STATE_COUNT},
+    {ARM_THREAD_STATE64, ARM_THREAD_STATE64_COUNT},
+    {ARM_NEON_STATE64, ARM_NEON_STATE64_COUNT},
+    {ARM_EXCEPTION_STATE64, ARM_EXCEPTION_STATE64_COUNT},
 #else
 #error Port this test to your CPU architecture.
 #endif
diff --git a/util/mach/exception_types_test.cc b/util/mach/exception_types_test.cc
index da2c822..3da22a0 100644
--- a/util/mach/exception_types_test.cc
+++ b/util/mach/exception_types_test.cc
@@ -37,34 +37,37 @@
     mach_exception_code_t original_code_0;
     int signal;
   } kTestData[] = {
-      {0xb100001, EXC_BAD_ACCESS, KERN_INVALID_ADDRESS, SIGSEGV},
-      {0xb100002, EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE, SIGSEGV},
-      {0xa100002, EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE, SIGBUS},
-      {0xa100005, EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE, SIGBUS},
-      {0xa10000d, EXC_BAD_ACCESS, EXC_I386_GPFLT, SIGBUS},
-      {0x9100032, EXC_BAD_ACCESS, KERN_CODESIGN_ERROR, SIGKILL},
-      {0x4200001, EXC_BAD_INSTRUCTION, EXC_I386_INVOP, SIGILL},
-      {0x420000b, EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT, SIGILL},
-      {0x420000c, EXC_BAD_INSTRUCTION, EXC_I386_STKFLT, SIGILL},
-      {0x8300001, EXC_ARITHMETIC, EXC_I386_DIV, SIGFPE},
-      {0x8300002, EXC_ARITHMETIC, EXC_I386_INTO, SIGFPE},
-      {0x8300005, EXC_ARITHMETIC, EXC_I386_EXTERR, SIGFPE},
-      {0x8300008, EXC_ARITHMETIC, EXC_I386_SSEEXTERR, SIGFPE},
-      {0x5500007, EXC_SOFTWARE, EXC_I386_BOUND, SIGTRAP},
-      {0x5600001, EXC_BREAKPOINT, EXC_I386_SGL, SIGTRAP},
-      {0x5600002, EXC_BREAKPOINT, EXC_I386_BPT, SIGTRAP},
-      {0x0700080, EXC_SYSCALL, 128, 0},
-      {0x0706000, EXC_SYSCALL, 0x6000, 0},
-      {0x3000000, 0, 0, SIGQUIT},
-      {0x4000000, 0, 0, SIGILL},
-      {0x5000000, 0, 0, SIGTRAP},
-      {0x6000000, 0, 0, SIGABRT},
-      {0x7000000, 0, 0, SIGEMT},
-      {0x8000000, 0, 0, SIGFPE},
-      {0xa000000, 0, 0, SIGBUS},
-      {0xb000000, 0, 0, SIGSEGV},
-      {0xc000000, 0, 0, SIGSYS},
-      {0, 0, 0, 0},
+    {0xb100001, EXC_BAD_ACCESS, KERN_INVALID_ADDRESS, SIGSEGV},
+    {0xb100002, EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE, SIGSEGV},
+    {0xa100002, EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE, SIGBUS},
+    {0xa100005, EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE, SIGBUS},
+    {0x9100032, EXC_BAD_ACCESS, KERN_CODESIGN_ERROR, SIGKILL},
+    {0x0700080, EXC_SYSCALL, 128, 0},
+    {0x0706000, EXC_SYSCALL, 0x6000, 0},
+    {0x3000000, 0, 0, SIGQUIT},
+    {0x4000000, 0, 0, SIGILL},
+    {0x5000000, 0, 0, SIGTRAP},
+    {0x6000000, 0, 0, SIGABRT},
+    {0x7000000, 0, 0, SIGEMT},
+    {0x8000000, 0, 0, SIGFPE},
+    {0xa000000, 0, 0, SIGBUS},
+    {0xb000000, 0, 0, SIGSEGV},
+    {0xc000000, 0, 0, SIGSYS},
+    {0, 0, 0, 0},
+#if defined(ARCH_CPU_X86_FAMILY)
+    {0xa10000d, EXC_BAD_ACCESS, EXC_I386_GPFLT, SIGBUS},
+    {0x4200001, EXC_BAD_INSTRUCTION, EXC_I386_INVOP, SIGILL},
+    {0x420000b, EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT, SIGILL},
+    {0x420000c, EXC_BAD_INSTRUCTION, EXC_I386_STKFLT, SIGILL},
+    {0x8300001, EXC_ARITHMETIC, EXC_I386_DIV, SIGFPE},
+    {0x8300002, EXC_ARITHMETIC, EXC_I386_INTO, SIGFPE},
+    {0x8300005, EXC_ARITHMETIC, EXC_I386_EXTERR, SIGFPE},
+    {0x8300008, EXC_ARITHMETIC, EXC_I386_SSEEXTERR, SIGFPE},
+    {0x5500007, EXC_SOFTWARE, EXC_I386_BOUND, SIGTRAP},
+    {0x5600001, EXC_BREAKPOINT, EXC_I386_SGL, SIGTRAP},
+    {0x5600002, EXC_BREAKPOINT, EXC_I386_BPT, SIGTRAP},
+#endif
+    // TODO(macos_arm64): Add arm64 test data.
   };
 
   for (size_t index = 0; index < base::size(kTestData); ++index) {
@@ -139,23 +142,26 @@
   } kTestData[] = {
 #define ENCODE_EXC(type, code_0) \
   { (type), (code_0), ((type) << 16) | (code_0) }
-      ENCODE_EXC(EXC_BAD_ACCESS, KERN_INVALID_ADDRESS),
-      ENCODE_EXC(EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE),
-      ENCODE_EXC(EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE),
-      ENCODE_EXC(EXC_BAD_ACCESS, EXC_I386_GPFLT),
-      ENCODE_EXC(EXC_BAD_ACCESS, KERN_CODESIGN_ERROR),
-      ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_INVOP),
-      ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT),
-      ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_STKFLT),
-      ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_DIV),
-      ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_INTO),
-      ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_EXTERR),
-      ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_SSEEXTERR),
-      ENCODE_EXC(EXC_SOFTWARE, EXC_I386_BOUND),
-      ENCODE_EXC(EXC_BREAKPOINT, EXC_I386_SGL),
-      ENCODE_EXC(EXC_BREAKPOINT, EXC_I386_BPT),
-      ENCODE_EXC(EXC_SYSCALL, 128),
-      ENCODE_EXC(EXC_SYSCALL, 0x6000),
+    ENCODE_EXC(EXC_BAD_ACCESS, KERN_INVALID_ADDRESS),
+    ENCODE_EXC(EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE),
+    ENCODE_EXC(EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE),
+    ENCODE_EXC(EXC_BAD_ACCESS, KERN_CODESIGN_ERROR),
+    ENCODE_EXC(EXC_SYSCALL, 128),
+    ENCODE_EXC(EXC_SYSCALL, 0x6000),
+#if defined(ARCH_CPU_X86_FAMILY)
+    ENCODE_EXC(EXC_BAD_ACCESS, EXC_I386_GPFLT),
+    ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_INVOP),
+    ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT),
+    ENCODE_EXC(EXC_BAD_INSTRUCTION, EXC_I386_STKFLT),
+    ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_DIV),
+    ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_INTO),
+    ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_EXTERR),
+    ENCODE_EXC(EXC_ARITHMETIC, EXC_I386_SSEEXTERR),
+    ENCODE_EXC(EXC_SOFTWARE, EXC_I386_BOUND),
+    ENCODE_EXC(EXC_BREAKPOINT, EXC_I386_SGL),
+    ENCODE_EXC(EXC_BREAKPOINT, EXC_I386_BPT),
+#endif
+    // TODO(macos_arm64): Add arm64 test data.
 #undef ENCODE_EXC
 
 #define ENCODE_EXC_CRASH(type, code_0)                        \
@@ -163,36 +169,39 @@
     EXC_CRASH, (((type) & 0xf) << 20) | ((code_0) & 0xfffff), \
         ((type) << 16) | (code_0)                             \
   }
-      ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_INVALID_ADDRESS),
-      ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE),
-      ENCODE_EXC_CRASH(EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE),
-      ENCODE_EXC_CRASH(EXC_BAD_ACCESS, EXC_I386_GPFLT),
-      ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_CODESIGN_ERROR),
-      ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_INVOP),
-      ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT),
-      ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_STKFLT),
-      ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_DIV),
-      ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_INTO),
-      ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_EXTERR),
-      ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_SSEEXTERR),
-      ENCODE_EXC_CRASH(EXC_SOFTWARE, EXC_I386_BOUND),
-      ENCODE_EXC_CRASH(EXC_BREAKPOINT, EXC_I386_SGL),
-      ENCODE_EXC_CRASH(EXC_BREAKPOINT, EXC_I386_BPT),
-      ENCODE_EXC_CRASH(EXC_SYSCALL, 128),
-      ENCODE_EXC_CRASH(EXC_SYSCALL, 0x6000),
+    ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_INVALID_ADDRESS),
+    ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_PROTECTION_FAILURE),
+    ENCODE_EXC_CRASH(EXC_BAD_ACCESS, VM_PROT_READ | VM_PROT_EXECUTE),
+    ENCODE_EXC_CRASH(EXC_BAD_ACCESS, KERN_CODESIGN_ERROR),
+    ENCODE_EXC_CRASH(EXC_SYSCALL, 128),
+    ENCODE_EXC_CRASH(EXC_SYSCALL, 0x6000),
+#if defined(ARCH_CPU_X86_FAMILY)
+    ENCODE_EXC_CRASH(EXC_BAD_ACCESS, EXC_I386_GPFLT),
+    ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_INVOP),
+    ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_SEGNPFLT),
+    ENCODE_EXC_CRASH(EXC_BAD_INSTRUCTION, EXC_I386_STKFLT),
+    ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_DIV),
+    ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_INTO),
+    ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_EXTERR),
+    ENCODE_EXC_CRASH(EXC_ARITHMETIC, EXC_I386_SSEEXTERR),
+    ENCODE_EXC_CRASH(EXC_SOFTWARE, EXC_I386_BOUND),
+    ENCODE_EXC_CRASH(EXC_BREAKPOINT, EXC_I386_SGL),
+    ENCODE_EXC_CRASH(EXC_BREAKPOINT, EXC_I386_BPT),
+#endif
+    // TODO(macos_arm64): Add arm64 test data.
 #undef ENCODE_EXC_CRASH
 
 #define ENCODE_EXC_CRASH_SIGNAL(signal) \
   { EXC_CRASH, (((signal) & 0xff) << 24), (EXC_CRASH << 16) | (signal) }
-      ENCODE_EXC_CRASH_SIGNAL(SIGQUIT),
-      ENCODE_EXC_CRASH_SIGNAL(SIGILL),
-      ENCODE_EXC_CRASH_SIGNAL(SIGTRAP),
-      ENCODE_EXC_CRASH_SIGNAL(SIGABRT),
-      ENCODE_EXC_CRASH_SIGNAL(SIGEMT),
-      ENCODE_EXC_CRASH_SIGNAL(SIGFPE),
-      ENCODE_EXC_CRASH_SIGNAL(SIGBUS),
-      ENCODE_EXC_CRASH_SIGNAL(SIGSEGV),
-      ENCODE_EXC_CRASH_SIGNAL(SIGSYS),
+    ENCODE_EXC_CRASH_SIGNAL(SIGQUIT),
+    ENCODE_EXC_CRASH_SIGNAL(SIGILL),
+    ENCODE_EXC_CRASH_SIGNAL(SIGTRAP),
+    ENCODE_EXC_CRASH_SIGNAL(SIGABRT),
+    ENCODE_EXC_CRASH_SIGNAL(SIGEMT),
+    ENCODE_EXC_CRASH_SIGNAL(SIGFPE),
+    ENCODE_EXC_CRASH_SIGNAL(SIGBUS),
+    ENCODE_EXC_CRASH_SIGNAL(SIGSEGV),
+    ENCODE_EXC_CRASH_SIGNAL(SIGSYS),
 #undef ENCODE_EXC_CRASH_SIGNAL
 
 #define ENCODE_EXC_RESOURCE(type, flavor)                            \
@@ -200,12 +209,12 @@
     EXC_RESOURCE, EXC_RESOURCE_ENCODE_TYPE_FLAVOR((type), (flavor)), \
         (EXC_RESOURCE << 16) | ((type) << 8) | (flavor)              \
   }
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_CPU, FLAVOR_CPU_MONITOR),
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_CPU, FLAVOR_CPU_MONITOR_FATAL),
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_WAKEUPS, FLAVOR_WAKEUPS_MONITOR),
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_MEMORY, FLAVOR_HIGH_WATERMARK),
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_IO, FLAVOR_IO_PHYSICAL_WRITES),
-      ENCODE_EXC_RESOURCE(RESOURCE_TYPE_IO, FLAVOR_IO_LOGICAL_WRITES),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_CPU, FLAVOR_CPU_MONITOR),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_CPU, FLAVOR_CPU_MONITOR_FATAL),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_WAKEUPS, FLAVOR_WAKEUPS_MONITOR),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_MEMORY, FLAVOR_HIGH_WATERMARK),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_IO, FLAVOR_IO_PHYSICAL_WRITES),
+    ENCODE_EXC_RESOURCE(RESOURCE_TYPE_IO, FLAVOR_IO_LOGICAL_WRITES),
 #undef ENCODE_EXC_RESOURCE
 
 #define ENCODE_EXC_GUARD(type, flavor)                                         \
@@ -216,26 +225,26 @@
             (static_cast<uint64_t>((1 << (flavor)) & 0x1ffffffff) << 32),      \
         (EXC_GUARD << 16) | ((type) << 8) | (flavor)                           \
   }
-      ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 0),  // kGUARD_EXC_DESTROY
-      ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 1),  // kGUARD_EXC_MOD_REFS
-      ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 2),  // kGUARD_EXC_SET_CONTEXT
-      ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 3),  // kGUARD_EXC_UNGUARDED
-      ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 4),  // kGUARD_EXC_INCORRECT_GUARD
+    ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 0),  // kGUARD_EXC_DESTROY
+    ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 1),  // kGUARD_EXC_MOD_REFS
+    ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 2),  // kGUARD_EXC_SET_CONTEXT
+    ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 3),  // kGUARD_EXC_UNGUARDED
+    ENCODE_EXC_GUARD(GUARD_TYPE_MACH_PORT, 4),  // kGUARD_EXC_INCORRECT_GUARD
 
-      // 2 is GUARD_TYPE_FD from 10.12.2 xnu-3789.31.2/bsd/sys/guarded.h.
-      ENCODE_EXC_GUARD(2, 0),  // kGUARD_EXC_CLOSE
-      ENCODE_EXC_GUARD(2, 1),  // kGUARD_EXC_DUP
-      ENCODE_EXC_GUARD(2, 2),  // kGUARD_EXC_NOCLOEXEC
-      ENCODE_EXC_GUARD(2, 3),  // kGUARD_EXC_SOCKET_IPC
-      ENCODE_EXC_GUARD(2, 4),  // kGUARD_EXC_FILEPORT
-      ENCODE_EXC_GUARD(2, 5),  // kGUARD_EXC_MISMATCH
-      ENCODE_EXC_GUARD(2, 6),  // kGUARD_EXC_WRITE
+    // 2 is GUARD_TYPE_FD from 10.12.2 xnu-3789.31.2/bsd/sys/guarded.h.
+    ENCODE_EXC_GUARD(2, 0),  // kGUARD_EXC_CLOSE
+    ENCODE_EXC_GUARD(2, 1),  // kGUARD_EXC_DUP
+    ENCODE_EXC_GUARD(2, 2),  // kGUARD_EXC_NOCLOEXEC
+    ENCODE_EXC_GUARD(2, 3),  // kGUARD_EXC_SOCKET_IPC
+    ENCODE_EXC_GUARD(2, 4),  // kGUARD_EXC_FILEPORT
+    ENCODE_EXC_GUARD(2, 5),  // kGUARD_EXC_MISMATCH
+    ENCODE_EXC_GUARD(2, 6),  // kGUARD_EXC_WRITE
 #undef ENCODE_EXC_GUARD
 
-      // Test that overflow saturates.
-      {0x00010000, 0x00001000, static_cast<int32_t>(0xffff1000)},
-      {0x00001000, 0x00010000, 0x1000ffff},
-      {0x00010000, 0x00010000, static_cast<int32_t>(0xffffffff)},
+    // Test that overflow saturates.
+    {0x00010000, 0x00001000, static_cast<int32_t>(0xffff1000)},
+    {0x00001000, 0x00010000, 0x1000ffff},
+    {0x00010000, 0x00010000, static_cast<int32_t>(0xffffffff)},
   };
 
   for (size_t index = 0; index < base::size(kTestData); ++index) {
diff --git a/util/mach/mach_message_server_test.cc b/util/mach/mach_message_server_test.cc
index e3a3f94..a7198da 100644
--- a/util/mach/mach_message_server_test.cc
+++ b/util/mach/mach_message_server_test.cc
@@ -309,7 +309,7 @@
   // ensure that whatever buffer was allocated to receive a RequestMessage is
   // not large enough to receive a LargeRequestMessage.
   struct LargeRequestMessage : public RequestMessage {
-    uint8_t data[4 * PAGE_SIZE];
+    uint8_t data[4 * PAGE_MAX_SIZE];
   };
 
   struct ReplyMessage : public mig_reply_error_t {
diff --git a/util/process/process_memory_mac_test.cc b/util/process/process_memory_mac_test.cc
index d801bb1..6cb6fae 100644
--- a/util/process/process_memory_mac_test.cc
+++ b/util/process/process_memory_mac_test.cc
@@ -33,7 +33,7 @@
 
 TEST(ProcessMemoryMac, ReadMappedSelf) {
   vm_address_t address = 0;
-  constexpr vm_size_t kSize = 4 * PAGE_SIZE;
+  const vm_size_t kSize = 4 * PAGE_SIZE;
   kern_return_t kr =
       vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE);
   ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate");
@@ -88,7 +88,7 @@
 
 TEST(ProcessMemoryMac, ReadSelfUnmapped) {
   vm_address_t address = 0;
-  constexpr vm_size_t kSize = 2 * PAGE_SIZE;
+  const vm_size_t kSize = 2 * PAGE_SIZE;
   kern_return_t kr =
       vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE);
   ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate");
@@ -150,7 +150,7 @@
 
 TEST(ProcessMemoryMac, ReadCStringSelfUnmapped) {
   vm_address_t address = 0;
-  constexpr vm_size_t kSize = 2 * PAGE_SIZE;
+  const vm_size_t kSize = 2 * PAGE_SIZE;
   kern_return_t kr =
       vm_allocate(mach_task_self(), &address, kSize, VM_FLAGS_ANYWHERE);
   ASSERT_EQ(kr, KERN_SUCCESS) << MachErrorMessage(kr, "vm_allocate");
@@ -259,7 +259,7 @@
   // This is the same but with a big buffer that’s definitely larger than a
   // single page. This makes sure that the whole mapped region winds up being
   // deallocated.
-  constexpr size_t kBigSize = 4 * PAGE_SIZE;
+  const size_t kBigSize = 4 * PAGE_SIZE;
   std::unique_ptr<char[]> big_buffer(new char[kBigSize]);
   test_address = FromPointerCast<mach_vm_address_t>(&big_buffer[0]);
   ASSERT_TRUE((mapped = memory.ReadMapped(test_address, kBigSize)));