diff --git a/src/common/mac/arch_utilities.cc b/src/common/mac/arch_utilities.cc index 972a3dae..94e3be3b 100644 --- a/src/common/mac/arch_utilities.cc +++ b/src/common/mac/arch_utilities.cc @@ -45,8 +45,27 @@ #define CPU_SUBTYPE_ARM_V7S (static_cast(11)) #endif // CPU_SUBTYPE_ARM_V7S +#ifndef CPU_TYPE_ARM64 +#define CPU_TYPE_ARM64 (static_cast(16777228)) +#endif // CPU_TYPE_ARM64 + +#ifndef CPU_SUBTYPE_ARM64_ALL +#define CPU_SUBTYPE_ARM64_ALL (static_cast(0)) +#endif // CPU_SUBTYPE_ARM64_ALL + namespace { +const NXArchInfo* ArchInfo_arm64() { + NXArchInfo* arm64 = new NXArchInfo; + *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, + CPU_SUBTYPE_ARM_V7); + arm64->name = "arm64"; + arm64->cputype = CPU_TYPE_ARM64; + arm64->cpusubtype = CPU_SUBTYPE_ARM64_ALL; + arm64->description = "arm 64"; + return arm64; +} + const NXArchInfo* ArchInfo_armv7s() { NXArchInfo* armv7s = new NXArchInfo; *armv7s = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, @@ -62,19 +81,32 @@ const NXArchInfo* ArchInfo_armv7s() { namespace google_breakpad { const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name) { + // TODO: Remove this when the OS knows about arm64. + if (!strcmp("arm64", arch_name)) + return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64, + CPU_SUBTYPE_ARM64_ALL); + // TODO: Remove this when the OS knows about armv7s. if (!strcmp("armv7s", arch_name)) return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7S); + return NXGetArchInfoFromName(arch_name); } const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + // TODO: Remove this when the OS knows about arm64. + if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_ALL) { + static const NXArchInfo* arm64 = ArchInfo_arm64(); + return arm64; + } + // TODO: Remove this when the OS knows about armv7s. if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) { static const NXArchInfo* armv7s = ArchInfo_armv7s(); return armv7s; } + return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); } diff --git a/src/common/mac/macho_reader.cc b/src/common/mac/macho_reader.cc index f1f0a179..84b595a3 100644 --- a/src/common/mac/macho_reader.cc +++ b/src/common/mac/macho_reader.cc @@ -43,6 +43,10 @@ #define CPU_TYPE_ARM 12 #endif +#if !defined(CPU_TYPE_ARM_64) +#define CPU_TYPE_ARM_64 16777228 +#endif + namespace google_breakpad { namespace mach_o { @@ -242,6 +246,7 @@ bool Reader::Read(const uint8_t *buffer, case CPU_TYPE_POWERPC: expected_magic = MH_MAGIC; break; + case CPU_TYPE_ARM_64: case CPU_TYPE_X86_64: expected_magic = MH_CIGAM_64; break;