blob: ac8cd7030c55625a81a7bc749d70fbcdf57fc35a [file] [log] [blame]
Todd Fialae77fce02016-09-04 00:18:56 +00001//===-- 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
Todd Fialae77fce02016-09-04 00:18:56 +000014#ifndef __MachException_h__
15#define __MachException_h__
16
17#include <mach/mach.h>
18#include <vector>
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020#include "lldb/Host/Debug.h"
Todd Fialae77fce02016-09-04 00:18:56 +000021#include "lldb/lldb-private-forward.h"
22#include "lldb/lldb-types.h"
Todd Fialae77fce02016-09-04 00:18:56 +000023
Kate Stoneb9c1b512016-09-06 20:57:50 +000024namespace lldb_private {
25namespace process_darwin {
Todd Fialae77fce02016-09-04 00:18:56 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027typedef union MachMessageTag {
28 mach_msg_header_t hdr;
29 char data[1024];
Todd Fialae77fce02016-09-04 00:18:56 +000030} MachMessage;
31
Kate Stoneb9c1b512016-09-06 20:57:50 +000032class MachException {
Todd Fialae77fce02016-09-04 00:18:56 +000033public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 struct PortInfo {
35 exception_mask_t mask; // the exception mask for this device which may be a
36 // subset of EXC_MASK_ALL...
37 exception_mask_t masks[EXC_TYPES_COUNT];
38 mach_port_t ports[EXC_TYPES_COUNT];
39 exception_behavior_t behaviors[EXC_TYPES_COUNT];
40 thread_state_flavor_t flavors[EXC_TYPES_COUNT];
41 mach_msg_type_number_t count;
Todd Fialae77fce02016-09-04 00:18:56 +000042
Kate Stoneb9c1b512016-09-06 20:57:50 +000043 Error Save(task_t task);
Todd Fialae77fce02016-09-04 00:18:56 +000044
Kate Stoneb9c1b512016-09-06 20:57:50 +000045 Error Restore(task_t task);
46 };
Todd Fialae77fce02016-09-04 00:18:56 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 struct Data {
49 task_t task_port;
50 thread_t thread_port;
51 exception_type_t exc_type;
52 std::vector<mach_exception_data_type_t> exc_data;
53 Data()
54 : task_port(TASK_NULL), thread_port(THREAD_NULL), exc_type(0),
55 exc_data() {}
Todd Fialae77fce02016-09-04 00:18:56 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 void Clear() {
58 task_port = TASK_NULL;
59 thread_port = THREAD_NULL;
60 exc_type = 0;
61 exc_data.clear();
62 }
Todd Fialae77fce02016-09-04 00:18:56 +000063
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 bool IsValid() const {
65 return task_port != TASK_NULL && thread_port != THREAD_NULL &&
66 exc_type != 0;
67 }
Todd Fialae77fce02016-09-04 00:18:56 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 // Return the SoftSignal for this MachException data, or zero if there is
70 // none
71 int SoftSignal() const {
72 if (exc_type == EXC_SOFTWARE && exc_data.size() == 2 &&
73 exc_data[0] == EXC_SOFT_SIGNAL)
74 return static_cast<int>(exc_data[1]);
75 return 0;
76 }
Todd Fialae77fce02016-09-04 00:18:56 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 bool IsBreakpoint() const {
79 return (exc_type == EXC_BREAKPOINT ||
80 ((exc_type == EXC_SOFTWARE) && exc_data[0] == 1));
81 }
Todd Fialae77fce02016-09-04 00:18:56 +000082
Kate Stoneb9c1b512016-09-06 20:57:50 +000083 bool GetStopInfo(ThreadStopInfo *stop_info, const UnixSignals &signals,
84 Stream &stream) const;
85 };
Todd Fialae77fce02016-09-04 00:18:56 +000086
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 struct Message {
88 MachMessage exc_msg;
89 MachMessage reply_msg;
90 Data state;
Todd Fialae77fce02016-09-04 00:18:56 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 Message() : state() {
93 memset(&exc_msg, 0, sizeof(exc_msg));
94 memset(&reply_msg, 0, sizeof(reply_msg));
95 }
Todd Fialae77fce02016-09-04 00:18:56 +000096
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 bool CatchExceptionRaise(task_t task);
Todd Fialae77fce02016-09-04 00:18:56 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 Error Reply(::pid_t inferior_pid, task_t inferior_task, int signal);
Todd Fialae77fce02016-09-04 00:18:56 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 Error Receive(mach_port_t receive_port, mach_msg_option_t options,
102 mach_msg_timeout_t timeout,
103 mach_port_t notify_port = MACH_PORT_NULL);
Todd Fialae77fce02016-09-04 00:18:56 +0000104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105 void Dump(Stream &stream) const;
Todd Fialae77fce02016-09-04 00:18:56 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 typedef std::vector<Message> collection;
108 typedef collection::iterator iterator;
109 typedef collection::const_iterator const_iterator;
110 };
Todd Fialae77fce02016-09-04 00:18:56 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 enum {
113 e_actionForward, // Forward signal to inferior process
114 e_actionStop, // Stop when this signal is received
115 };
116 struct Action {
117 task_t task_port; // Set to TASK_NULL for any TASK
118 thread_t thread_port; // Set to THREAD_NULL for any thread
119 exception_type_t exc_mask; // Mach exception mask to watch for
120 std::vector<mach_exception_data_type_t> exc_data_mask; // Mask to apply to
121 // exception data, or
122 // empty to ignore
123 // exc_data value for
124 // exception
125 std::vector<mach_exception_data_type_t> exc_data_value; // Value to compare
126 // to exception data
127 // after masking, or
128 // empty to ignore
129 // exc_data value
130 // for exception
131 uint8_t flags; // Action flags describing what to do with the exception
132 };
Todd Fialae77fce02016-09-04 00:18:56 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 static const char *Name(exception_type_t exc_type);
Todd Fialae77fce02016-09-04 00:18:56 +0000135};
136
137} // namespace process_darwin
138} // namespace lldb_private
139
140#endif