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