justincohen updated this revision to Diff 333601.
justincohen added a comment.
Inverted mask.
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<"Specifies which bits need to be cleared from the pointer. To use the mask, AND with the inverse.">;
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 (pc & (1ULL << 55)) ? (pc | mask) : (pc & ~mask);
+}
+
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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits