diff options
author | Valentina Giusti <valentina.giusti@intel.com> | 2016-10-06 18:05:12 +0000 |
---|---|---|
committer | Valentina Giusti <valentina.giusti@intel.com> | 2016-10-06 18:05:12 +0000 |
commit | 6f8c1f8da7640438bb19a2d40b6b75742a161b9b (patch) | |
tree | ab13270b5211014569f04fb3af86c42714413074 /lldb/source/Plugins/Process/POSIX/CrashReason.cpp | |
parent | d0a4db76324e40e38a23429c07eda76f9f26a153 (diff) | |
download | bcm5719-llvm-6f8c1f8da7640438bb19a2d40b6b75742a161b9b.tar.gz bcm5719-llvm-6f8c1f8da7640438bb19a2d40b6b75742a161b9b.zip |
Add bound violation handling for Intel(R) Memory Protection Extensions (Intel(R) MPX)
Summary:
This patch adds support for handling the SIGSEGV signal with 'si_code ==
SEGV_BNDERR', which is thrown when a bound violation is caught by the
Intel(R) MPX technology.
Differential Revision: https://reviews.llvm.org/D25329
llvm-svn: 283474
Diffstat (limited to 'lldb/source/Plugins/Process/POSIX/CrashReason.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/POSIX/CrashReason.cpp | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/POSIX/CrashReason.cpp b/lldb/source/Plugins/Process/POSIX/CrashReason.cpp index c567b4a9655..a7d36fc998e 100644 --- a/lldb/source/Plugins/Process/POSIX/CrashReason.cpp +++ b/lldb/source/Plugins/Process/POSIX/CrashReason.cpp @@ -9,6 +9,8 @@ #include "CrashReason.h" +#include "llvm/Support/raw_ostream.h" + #include <sstream> namespace { @@ -19,6 +21,23 @@ void AppendFaultAddr(std::string &str, lldb::addr_t addr) { str += ss.str(); } +void AppendBounds(std::string &str, lldb::addr_t lower_bound, + lldb::addr_t upper_bound, lldb::addr_t addr) { + llvm::raw_string_ostream stream(str); + if ((unsigned long)addr < lower_bound) + stream << ": lower bound violation "; + else + stream << ": upper bound violation "; + stream << "(fault address: 0x"; + stream.write_hex(addr); + stream << ", lower bound: 0x"; + stream.write_hex(lower_bound); + stream << ", upper bound: 0x"; + stream.write_hex(upper_bound); + stream << ")"; + stream.flush(); +} + CrashReason GetCrashReasonForSIGSEGV(const siginfo_t &info) { assert(info.si_signo == SIGSEGV); @@ -34,6 +53,11 @@ CrashReason GetCrashReasonForSIGSEGV(const siginfo_t &info) { return CrashReason::eInvalidAddress; case SEGV_ACCERR: return CrashReason::ePrivilegedAddress; +#ifndef SEGV_BNDERR +#define SEGV_BNDERR 3 +#endif + case SEGV_BNDERR: + return CrashReason::eBoundViolation; } assert(false && "unexpected si_code for SIGSEGV"); @@ -109,7 +133,7 @@ CrashReason GetCrashReasonForSIGBUS(const siginfo_t &info) { } } -std::string GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr) { +std::string GetCrashReasonString(CrashReason reason, const siginfo_t &info) { std::string str; switch (reason) { @@ -119,11 +143,20 @@ std::string GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr) { case CrashReason::eInvalidAddress: str = "signal SIGSEGV: invalid address"; - AppendFaultAddr(str, fault_addr); + AppendFaultAddr(str, reinterpret_cast<lldb::addr_t>(info.si_addr)); break; case CrashReason::ePrivilegedAddress: str = "signal SIGSEGV: address access protected"; - AppendFaultAddr(str, fault_addr); + AppendFaultAddr(str, reinterpret_cast<lldb::addr_t>(info.si_addr)); + break; + case CrashReason::eBoundViolation: + str = "signal SIGSEGV"; +// Make sure that siginfo_t has the bound fields available. +#if defined(si_lower) && defined(si_upper) + AppendBounds(str, reinterpret_cast<lldb::addr_t>(info.si_lower), + reinterpret_cast<lldb::addr_t>(info.si_upper), + reinterpret_cast<lldb::addr_t>(info.si_addr)); +#endif break; case CrashReason::eIllegalOpcode: str = "signal SIGILL: illegal instruction"; @@ -207,6 +240,9 @@ const char *CrashReasonAsString(CrashReason reason) { case CrashReason::ePrivilegedAddress: str = "ePrivilegedAddress"; break; + case CrashReason::eBoundViolation: + str = "eBoundViolation"; + break; // SIGILL crash reasons. case CrashReason::eIllegalOpcode: |