]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/debugserver/source/MacOSX/MachException.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / tools / debugserver / source / MacOSX / MachException.h
1 //===-- MachException.h -----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  Created by Greg Clayton on 6/18/07.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef __MachException_h__
15 #define __MachException_h__
16
17 #include <mach/mach.h>
18 #include <vector>
19
20 class MachProcess;
21 class PThreadMutex;
22
23 typedef union MachMessageTag {
24   mach_msg_header_t hdr;
25   char data[1024];
26 } MachMessage;
27
28 class MachException {
29 public:
30   struct PortInfo {
31     exception_mask_t mask; // the exception mask for this device which may be a
32                            // subset of EXC_MASK_ALL...
33     exception_mask_t masks[EXC_TYPES_COUNT];
34     mach_port_t ports[EXC_TYPES_COUNT];
35     exception_behavior_t behaviors[EXC_TYPES_COUNT];
36     thread_state_flavor_t flavors[EXC_TYPES_COUNT];
37     mach_msg_type_number_t count;
38
39     kern_return_t Save(task_t task);
40     kern_return_t Restore(task_t task);
41   };
42
43   struct Data {
44     task_t task_port;
45     thread_t thread_port;
46     exception_type_t exc_type;
47     std::vector<mach_exception_data_type_t> exc_data;
48     Data()
49         : task_port(TASK_NULL), thread_port(THREAD_NULL), exc_type(0),
50           exc_data() {}
51
52     void Clear() {
53       task_port = TASK_NULL;
54       thread_port = THREAD_NULL;
55       exc_type = 0;
56       exc_data.clear();
57     }
58     bool IsValid() const {
59       return task_port != TASK_NULL && thread_port != THREAD_NULL &&
60              exc_type != 0;
61     }
62     // Return the SoftSignal for this MachException data, or zero if there is
63     // none
64     int SoftSignal() const {
65       if (exc_type == EXC_SOFTWARE && exc_data.size() == 2 &&
66           exc_data[0] == EXC_SOFT_SIGNAL)
67         return static_cast<int>(exc_data[1]);
68       return 0;
69     }
70     bool IsBreakpoint() const {
71       return (exc_type == EXC_BREAKPOINT ||
72               ((exc_type == EXC_SOFTWARE) && exc_data[0] == 1));
73     }
74     void Dump() const;
75     void DumpStopReason() const;
76     bool GetStopInfo(struct DNBThreadStopInfo *stop_info) const;
77   };
78
79   struct Message {
80     MachMessage exc_msg;
81     MachMessage reply_msg;
82     Data state;
83
84     Message() : state() {
85       memset(&exc_msg, 0, sizeof(exc_msg));
86       memset(&reply_msg, 0, sizeof(reply_msg));
87     }
88     bool CatchExceptionRaise(task_t task);
89     void Dump() const;
90     kern_return_t Reply(MachProcess *process, int signal);
91     kern_return_t Receive(mach_port_t receive_port, mach_msg_option_t options,
92                           mach_msg_timeout_t timeout,
93                           mach_port_t notify_port = MACH_PORT_NULL);
94
95     typedef std::vector<Message> collection;
96     typedef collection::iterator iterator;
97     typedef collection::const_iterator const_iterator;
98   };
99
100   enum {
101     e_actionForward, // Forward signal to inferior process
102     e_actionStop,    // Stop when this signal is received
103   };
104   struct Action {
105     task_t task_port;          // Set to TASK_NULL for any TASK
106     thread_t thread_port;      // Set to THREAD_NULL for any thread
107     exception_type_t exc_mask; // Mach exception mask to watch for
108     std::vector<mach_exception_data_type_t> exc_data_mask; // Mask to apply to
109                                                            // exception data, or
110                                                            // empty to ignore
111                                                            // exc_data value for
112                                                            // exception
113     std::vector<mach_exception_data_type_t> exc_data_value; // Value to compare
114                                                             // to exception data
115                                                             // after masking, or
116                                                             // empty to ignore
117                                                             // exc_data value
118                                                             // for exception
119     uint8_t flags; // Action flags describing what to do with the exception
120   };
121   static const char *Name(exception_type_t exc_type);
122 };
123
124 #endif