llvm-project/lldb/source/Plugins/Process/Utility/StopInfoMachException.h
Jonas Devlieghere def2020485
[lldb] Recognize MTE fault Mach exceptions (#159117)
Recognize an MTE tag fault Mach exception. A tag fault is an error
reported by Arm's Memory Tagging Extension (MTE) when a memory access
attempts to use a pointer with a tag that doesn't match the tag stored
with the memory. LLDB will print the tag and address to make the issue
easier to diagnose.

This was hand tested by debugging an MTE enabled binary on an iPhone 17
running iOS 26.

rdar://113575216
2025-09-17 11:20:52 -07:00

79 lines
2.7 KiB
C++

//===-- StopInfoMachException.h ---------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H
#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H
#include <optional>
#include <string>
#include "lldb/Target/StopInfo.h"
#if defined(__APPLE__)
// Needed for the EXC_* defines
#include <mach/exception.h>
#endif
namespace lldb_private {
class StopInfoMachException : public StopInfo {
/// Determine the pointer-authentication related failure that caused this
/// exception. Returns true and fills out the failure description if there
/// is auth-related failure, and returns false otherwise.
bool DeterminePtrauthFailure(ExecutionContext &exe_ctx);
bool DetermineTagMismatch(ExecutionContext &exe_ctx);
public:
// Constructors and Destructors
StopInfoMachException(Thread &thread, uint32_t exc_type,
uint32_t exc_data_count, uint64_t exc_code,
uint64_t exc_subcode,
bool not_stepping_but_got_singlestep_exception)
: StopInfo(thread, exc_type), m_exc_data_count(exc_data_count),
m_exc_code(exc_code), m_exc_subcode(exc_subcode),
m_not_stepping_but_got_singlestep_exception(
not_stepping_but_got_singlestep_exception) {}
~StopInfoMachException() override = default;
lldb::StopReason GetStopReason() const override {
return lldb::eStopReasonException;
}
const char *GetDescription() override;
#if defined(__APPLE__)
struct MachException {
static const char *Name(exception_type_t exc_type);
static std::optional<exception_type_t> ExceptionCode(const char *name);
};
#endif
// Since some mach exceptions will be reported as breakpoints, signals,
// or trace, we use this static accessor which will translate the mach
// exception into the correct StopInfo.
static lldb::StopInfoSP CreateStopReasonWithMachException(
Thread &thread, uint32_t exc_type, uint32_t exc_data_count,
uint64_t exc_code, uint64_t exc_sub_code, uint64_t exc_sub_sub_code,
bool pc_already_adjusted = true, bool adjust_pc_if_needed = false);
bool WasContinueInterrupted(Thread &thread) override;
protected:
uint32_t m_exc_data_count;
uint64_t m_exc_code;
uint64_t m_exc_subcode;
bool m_not_stepping_but_got_singlestep_exception;
};
} // namespace lldb_private
#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_STOPINFOMACHEXCEPTION_H