MachException.h revision 311128
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#include "lldb/Host/Debug.h" 21#include "lldb/lldb-private-forward.h" 22#include "lldb/lldb-types.h" 23 24namespace lldb_private { 25namespace process_darwin { 26 27typedef union MachMessageTag { 28 mach_msg_header_t hdr; 29 char data[1024]; 30} MachMessage; 31 32class MachException { 33public: 34 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; 42 43 Error Save(task_t task); 44 45 Error Restore(task_t task); 46 }; 47 48 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() {} 56 57 void Clear() { 58 task_port = TASK_NULL; 59 thread_port = THREAD_NULL; 60 exc_type = 0; 61 exc_data.clear(); 62 } 63 64 bool IsValid() const { 65 return task_port != TASK_NULL && thread_port != THREAD_NULL && 66 exc_type != 0; 67 } 68 69 // 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 } 77 78 bool IsBreakpoint() const { 79 return (exc_type == EXC_BREAKPOINT || 80 ((exc_type == EXC_SOFTWARE) && exc_data[0] == 1)); 81 } 82 83 bool GetStopInfo(ThreadStopInfo *stop_info, const UnixSignals &signals, 84 Stream &stream) const; 85 }; 86 87 struct Message { 88 MachMessage exc_msg; 89 MachMessage reply_msg; 90 Data state; 91 92 Message() : state() { 93 memset(&exc_msg, 0, sizeof(exc_msg)); 94 memset(&reply_msg, 0, sizeof(reply_msg)); 95 } 96 97 bool CatchExceptionRaise(task_t task); 98 99 Error Reply(::pid_t inferior_pid, task_t inferior_task, int signal); 100 101 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); 104 105 void Dump(Stream &stream) const; 106 107 typedef std::vector<Message> collection; 108 typedef collection::iterator iterator; 109 typedef collection::const_iterator const_iterator; 110 }; 111 112 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 }; 133 134 static const char *Name(exception_type_t exc_type); 135}; 136 137} // namespace process_darwin 138} // namespace lldb_private 139 140#endif 141