1 /* Fault handler information. MacOSX version.
2 Copyright (C) 1993-1999, 2002-2003 Bruno Haible <clisp.org at bruno>
3 Copyright (C) 2003 Paolo Bonzini <gnu.org at bonzini>
5 Used under BSD license with permission from Paolo Bonzini and Bruno Haible,
8 http://sourceforge.net/mailarchive/message.php?msg_name=200503102200.32002.bruno%40clisp.org
10 Modified for Factor by Slava Pestov */
16 #include <mach/mach.h>
17 #include <mach/mach_error.h>
18 #include <mach/thread_status.h>
19 #include <mach/exception.h>
20 #include <mach/task.h>
23 /* The exception port on which our thread listens. */
24 mach_port_t our_exception_port
;
26 /* This is not defined in any header, although documented. */
28 /* http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/exc_server.html says:
29 The exc_server function is the MIG generated server handling function
30 to handle messages from the kernel relating to the occurrence of an
31 exception in a thread. Such messages are delivered to the exception port
32 set via thread_set_exception_ports or task_set_exception_ports. When an
33 exception occurs in a thread, the thread sends an exception message to its
34 exception port, blocking in the kernel waiting for the receipt of a reply.
35 The exc_server function performs all necessary argument handling for this
36 kernel message and calls catch_exception_raise, catch_exception_raise_state
37 or catch_exception_raise_state_identity, which should handle the exception.
38 If the called routine returns KERN_SUCCESS, a reply message will be sent,
39 allowing the thread to continue from the point of the exception; otherwise,
40 no reply message is sent and the called routine must have dealt with the
41 exception thread directly. */
43 exc_server (mach_msg_header_t
*request_msg
,
44 mach_msg_header_t
*reply_msg
);
47 /* http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/catch_exception_raise.html
48 These functions are defined in this file, and called by exc_server.
49 FIXME: What needs to be done when this code is put into a shared library? */
51 catch_exception_raise (mach_port_t exception_port
,
54 exception_type_t exception
,
55 exception_data_t code
,
56 mach_msg_type_number_t code_count
);
58 catch_exception_raise_state (mach_port_t exception_port
,
59 exception_type_t exception
,
60 exception_data_t code
,
61 mach_msg_type_number_t code_count
,
62 thread_state_flavor_t
*flavor
,
63 thread_state_t in_state
,
64 mach_msg_type_number_t in_state_count
,
65 thread_state_t out_state
,
66 mach_msg_type_number_t
*out_state_count
);
68 catch_exception_raise_state_identity (mach_port_t exception_port
,
71 exception_type_t exception
,
72 exception_data_t code
,
73 mach_msg_type_number_t codeCnt
,
74 thread_state_flavor_t
*flavor
,
75 thread_state_t in_state
,
76 mach_msg_type_number_t in_state_count
,
77 thread_state_t out_state
,
78 mach_msg_type_number_t
*out_state_count
);
80 void mach_initialize (void);