Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MachCore] Report arm64 thread exception state
A MachO userspace corefile may contain LC_THREAD commands which specify thread exception state. For arm64* only (for now), report a human-readable version of this state as the thread stop reason, instead of 'SIGSTOP'. As a follow-up, similar functionality can be implemented for x86 cores by translating the trapno/err exception registers. rdar://82898146 Differential Revision: https://reviews.llvm.org/D109795
- Loading branch information
Showing
8 changed files
with
226 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/*===-- AppleArm64ExceptionClass.def ---------------------------*- 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 | ||
|* | ||
\*===----------------------------------------------------------------------===*/ | ||
|
||
// Defines ESR exception classes for Apple arm64* targets. | ||
// These largely map 1:1 to the exception classes defined in ARM's architecture | ||
// reference manual, but there are some Apple-specific additions. | ||
|
||
#ifndef APPLE_ARM64_EXCEPTION_CLASS | ||
#error "APPLE_ARM64_EXCEPTION_CLASS(Name, Code) not defined." | ||
#endif | ||
|
||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_UNCATEGORIZED, 0x00) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_WFI_WFE, 0x01) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_MCR_MRC_CP15_TRAP, 0x03) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_MCRR_MRRC_CP15_TRAP, 0x04) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_MCR_MRC_CP14_TRAP, 0x05) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_LDC_STC_CP14_TRAP, 0x06) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_TRAP_SIMD_FP, 0x07) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_PTRAUTH_INSTR_TRAP, 0x09) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_MCRR_MRRC_CP14_TRAP, 0x0c) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_ILLEGAL_INSTR_SET, 0x0e) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SVC_32, 0x11) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SVC_64, 0x15) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_MSR_TRAP, 0x18) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_PAC_FAIL, 0x1C) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_IABORT_EL0, 0x20) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_IABORT_EL1, 0x21) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_PC_ALIGN, 0x22) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_DABORT_EL0, 0x24) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_DABORT_EL1, 0x25) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SP_ALIGN, 0x26) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_FLOATING_POINT_32, 0x28) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_FLOATING_POINT_64, 0x2C) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SERROR_INTERRUPT, 0x2F) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_BKPT_REG_MATCH_EL0, 0x30) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_BKPT_REG_MATCH_EL1, 0x31) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SW_STEP_DEBUG_EL0, 0x32) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_SW_STEP_DEBUG_EL1, 0x33) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_WATCHPT_MATCH_EL0, 0x34) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_WATCHPT_MATCH_EL1, 0x35) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_BKPT_AARCH32, 0x38) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_BRK_AARCH64, 0x3C) | ||
APPLE_ARM64_EXCEPTION_CLASS(ESR_EC_PRIV, 0x3F) | ||
|
||
#undef APPLE_ARM64_EXCEPTION_CLASS |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
//===-- AppleArm64ExceptionClass.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_TARGET_APPLEARM64EXCEPTIONCLASS_H | ||
#define LLDB_TARGET_APPLEARM64EXCEPTIONCLASS_H | ||
|
||
#include <cstdint> | ||
|
||
namespace lldb_private { | ||
|
||
enum class AppleArm64ExceptionClass : unsigned { | ||
#define APPLE_ARM64_EXCEPTION_CLASS(Name, Code) Name = Code, | ||
#include "AppleArm64ExceptionClass.def" | ||
}; | ||
|
||
/// Get the Apple ARM64 exception class encoded within \p esr. | ||
inline AppleArm64ExceptionClass getAppleArm64ExceptionClass(uint32_t esr) { | ||
/* | ||
* Exception Syndrome Register | ||
* | ||
* 31 26 25 24 0 | ||
* +------+--+------------------+ | ||
* | EC |IL| ISS | | ||
* +------+--+------------------+ | ||
* | ||
* EC - Exception Class | ||
* IL - Instruction Length | ||
* ISS - Instruction Specific Syndrome | ||
*/ | ||
return static_cast<AppleArm64ExceptionClass>(esr >> 26); | ||
} | ||
|
||
inline const char *toString(AppleArm64ExceptionClass EC) { | ||
switch (EC) { | ||
#define APPLE_ARM64_EXCEPTION_CLASS(Name, Code) \ | ||
case AppleArm64ExceptionClass::Name: \ | ||
return #Name; | ||
#include "AppleArm64ExceptionClass.def" | ||
} | ||
return "Unknown Exception Class"; | ||
} | ||
|
||
} // namespace lldb_private | ||
|
||
#endif // LLDB_TARGET_APPLEARM64EXCEPTIONCLASS_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
CXX_SOURCES = main.cpp | ||
|
||
include Makefile.rules |
43 changes: 43 additions & 0 deletions
43
lldb/test/API/macosx/corefile-exception-reason/TestCorefileExceptionReason.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
"""Test that lldb can report the exception reason for threads in a corefile.""" | ||
|
||
import os | ||
import re | ||
import subprocess | ||
|
||
import lldb | ||
from lldbsuite.test.decorators import * | ||
from lldbsuite.test.lldbtest import * | ||
from lldbsuite.test import lldbutil | ||
|
||
class TestCorefileExceptionReason(TestBase): | ||
|
||
mydir = TestBase.compute_mydir(__file__) | ||
|
||
@skipIfOutOfTreeDebugserver # newer debugserver required for these qMemoryRegionInfo types | ||
@no_debug_info_test | ||
@skipUnlessDarwin | ||
@skipIf(archs=no_match(['arm64','arm64e'])) | ||
def test(self): | ||
|
||
corefile = self.getBuildArtifact("process.core") | ||
self.build() | ||
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | ||
self, "// break here", lldb.SBFileSpec("main.cpp")) | ||
|
||
self.runCmd("continue") | ||
|
||
self.runCmd("process save-core -s stack " + corefile) | ||
process.Kill() | ||
self.dbg.DeleteTarget(target) | ||
|
||
# Now load the corefile | ||
target = self.dbg.CreateTarget('') | ||
process = target.LoadCore(corefile) | ||
thread = process.GetSelectedThread() | ||
self.assertTrue(process.GetSelectedThread().IsValid()) | ||
if self.TraceOn(): | ||
self.runCmd("image list") | ||
self.runCmd("bt") | ||
self.runCmd("fr v") | ||
|
||
self.assertTrue(thread.GetStopDescription(256) == "ESR_EC_DABORT_EL0 (fault address: 0x0)") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#include <stdlib.h> | ||
#include <thread> | ||
#include <unistd.h> | ||
#include <vector> | ||
|
||
void *sleep_worker(void *in) { | ||
sleep(30); | ||
sleep(30); | ||
return nullptr; | ||
} | ||
|
||
void *crash_worker(void *in) { | ||
sleep(1); | ||
volatile int *p = nullptr; // break here | ||
return (void *)*p; | ||
} | ||
|
||
int main() { | ||
std::vector<std::thread> threads; | ||
threads.push_back(std::move(std::thread(crash_worker, nullptr))); | ||
for (int i = 0; i < 15; i++) | ||
threads.push_back(std::move(std::thread(sleep_worker, nullptr))); | ||
sleep(10); | ||
} |