justincohen updated this revision to Diff 332374.
justincohen edited the summary of this revision.
justincohen added a comment.

Fix length of crashpad structure / use ulittleXX


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D98886/new/

https://reviews.llvm.org/D98886

Files:
  lldb/include/lldb/Target/Process.h
  lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp
  lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h
  lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
  lldb/source/Plugins/Process/minidump/MinidumpParser.h
  lldb/source/Plugins/Process/minidump/MinidumpTypes.h
  lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
  lldb/source/Target/Process.cpp
  lldb/source/Target/TargetProperties.td
  llvm/include/llvm/BinaryFormat/MinidumpConstants.def

Index: llvm/include/llvm/BinaryFormat/MinidumpConstants.def
===================================================================
--- llvm/include/llvm/BinaryFormat/MinidumpConstants.def
+++ llvm/include/llvm/BinaryFormat/MinidumpConstants.def
@@ -56,6 +56,8 @@
 HANDLE_MDMP_STREAM_TYPE(0x0014, JavascriptData)
 HANDLE_MDMP_STREAM_TYPE(0x0015, SystemMemoryInfo)
 HANDLE_MDMP_STREAM_TYPE(0x0016, ProcessVMCounters)
+// Crashpad extension types.  0x4350 = "CP"
+HANDLE_MDMP_STREAM_TYPE(0x43500001, CrashpadInfo)
 // Breakpad extension types.  0x4767 = "Gg"
 HANDLE_MDMP_STREAM_TYPE(0x47670001, BreakpadInfo)
 HANDLE_MDMP_STREAM_TYPE(0x47670002, AssertionInfo)
Index: lldb/source/Target/TargetProperties.td
===================================================================
--- lldb/source/Target/TargetProperties.td
+++ lldb/source/Target/TargetProperties.td
@@ -199,6 +199,9 @@
     Global,
     DefaultTrue,
     Desc<"If true, errors in expression evaluation will unwind the stack back to the state before the call.">;
+  def PointerAuthenticationAddressMask: Property<"pointer-authentication-address-mask", "UInt64">,
+    DefaultUnsignedValue<0>,
+    Desc<"The mask to strip pointer authentication codes. `AND` this mask with the pointer to recover an address. The default value of 0 means unspecified.">;
   def PythonOSPluginPath: Property<"python-os-plugin-path", "FileSpec">,
     DefaultUnsignedValue<1>,
     Desc<"A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class.">;
Index: lldb/source/Target/Process.cpp
===================================================================
--- lldb/source/Target/Process.cpp
+++ lldb/source/Target/Process.cpp
@@ -195,6 +195,18 @@
   m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
 }
 
+uint64_t ProcessProperties::GetPointerAuthenticationAddressMask() const {
+  const uint32_t idx = ePropertyPointerAuthenticationAddressMask;
+  return m_collection_sp->GetPropertyAtIndexAsUInt64(
+      nullptr, idx, g_process_properties[idx].default_uint_value);
+}
+
+void ProcessProperties::SetPointerAuthenticationAddressMask(
+    const uint64_t mask) {
+  const uint32_t idx = ePropertyPointerAuthenticationAddressMask;
+  m_collection_sp->SetPropertyAtIndexAsUInt64(nullptr, idx, mask);
+}
+
 FileSpec ProcessProperties::GetPythonOSPluginPath() const {
   const uint32_t idx = ePropertyPythonOSPluginPath;
   return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
Index: lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
===================================================================
--- lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -302,6 +302,12 @@
   }
   SetID(pid.getValue());
 
+  llvm::Optional<uint64_t> mask =
+      m_minidump_parser->GetPointerAuthenticationAddressMask();
+  if (mask) {
+    SetPointerAuthenticationAddressMask(mask.getValue());
+  }
+
   return error;
 }
 
Index: lldb/source/Plugins/Process/minidump/MinidumpTypes.h
===================================================================
--- lldb/source/Plugins/Process/minidump/MinidumpTypes.h
+++ lldb/source/Plugins/Process/minidump/MinidumpTypes.h
@@ -102,6 +102,24 @@
   LinuxProcStatus() = default;
 };
 
+struct GUID {
+  llvm::support::ulittle32_t data1;
+  llvm::support::ulittle16_t data2;
+  llvm::support::ulittle16_t data3;
+  uint8_t data4[8];
+};
+static_assert(sizeof(GUID) == 16, "");
+
+struct CrashpadInfo {
+  llvm::support::ulittle32_t version;
+  GUID report_id;
+  GUID client_id;
+  LocationDescriptor simple_annotations;
+  LocationDescriptor module_list;
+  llvm::support::ulittle64_t pointer_authentication_address_mask;
+};
+static_assert(sizeof(CrashpadInfo) == 60, "");
+
 } // namespace minidump
 } // namespace lldb_private
 #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_MINIDUMPTYPES_H
Index: lldb/source/Plugins/Process/minidump/MinidumpParser.h
===================================================================
--- lldb/source/Plugins/Process/minidump/MinidumpParser.h
+++ lldb/source/Plugins/Process/minidump/MinidumpParser.h
@@ -71,6 +71,7 @@
   const MinidumpMiscInfo *GetMiscInfo();
 
   llvm::Optional<LinuxProcStatus> GetLinuxProcStatus();
+  llvm::Optional<uint64_t> GetPointerAuthenticationAddressMask();
 
   llvm::Optional<lldb::pid_t> GetPid();
 
Index: lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
===================================================================
--- lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
+++ lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
@@ -232,6 +232,19 @@
   return LinuxProcStatus::Parse(data);
 }
 
+llvm::Optional<uint64_t> MinidumpParser::GetPointerAuthenticationAddressMask() {
+  llvm::ArrayRef<uint8_t> data = GetStream(StreamType::CrashpadInfo);
+
+  if (data.size() == 0 || data.size() < sizeof(CrashpadInfo))
+    return llvm::None;
+
+  const CrashpadInfo *crashpad_info =
+      reinterpret_cast<const CrashpadInfo *>(data.data());
+
+  return static_cast<uint64_t>(
+      crashpad_info->pointer_authentication_address_mask);
+}
+
 llvm::Optional<lldb::pid_t> MinidumpParser::GetPid() {
   const MinidumpMiscInfo *misc_info = GetMiscInfo();
   if (misc_info != nullptr) {
@@ -660,6 +673,7 @@
     ENUM_TO_CSTR(ProcessVMCounters);
     ENUM_TO_CSTR(LastReserved);
     ENUM_TO_CSTR(BreakpadInfo);
+    ENUM_TO_CSTR(CrashpadInfo);
     ENUM_TO_CSTR(AssertionInfo);
     ENUM_TO_CSTR(LinuxCPUInfo);
     ENUM_TO_CSTR(LinuxProcStatus);
Index: lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h
===================================================================
--- lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h
+++ lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h
@@ -62,6 +62,8 @@
     return true;
   }
 
+  lldb::addr_t FixCodeAddress(lldb::addr_t pc) override;
+
   // Static Functions
 
   static void Initialize();
Index: lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp
===================================================================
--- lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp
+++ lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp
@@ -815,6 +815,11 @@
   return return_valobj_sp;
 }
 
+lldb::addr_t ABIMacOSX_arm64::FixCodeAddress(lldb::addr_t pc) {
+  uint64_t mask = GetProcessSP()->GetPointerAuthenticationAddressMask();
+  return mask ? pc & mask : pc;
+}
+
 void ABIMacOSX_arm64::Initialize() {
   PluginManager::RegisterPlugin(GetPluginNameStatic(), pluginDesc,
                                 CreateInstance);
Index: lldb/include/lldb/Target/Process.h
===================================================================
--- lldb/include/lldb/Target/Process.h
+++ lldb/include/lldb/Target/Process.h
@@ -76,6 +76,8 @@
   uint64_t GetMemoryCacheLineSize() const;
   Args GetExtraStartupCommands() const;
   void SetExtraStartupCommands(const Args &args);
+  uint64_t GetPointerAuthenticationAddressMask() const;
+  void SetPointerAuthenticationAddressMask(const uint64_t mask);
   FileSpec GetPythonOSPluginPath() const;
   void SetPythonOSPluginPath(const FileSpec &file);
   bool GetIgnoreBreakpointsInExpressions() const;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to