1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/* Mach 3.0 common definitions and global vars.
Copyright (C) 1992 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef _OS_MACH3_H_
#define _OS_MACH3_H
#include <mach.h>
/* Mach3 doesn't declare errno in <errno.h>. */
extern int errno;
/* Task port of our debugged inferior. */
extern task_t inferior_task;
/* Thread port of the current thread in the inferior. */
extern thread_t current_thread;
/* If nonzero, we must suspend/abort && resume threads
* when setting or getting the state.
*/
extern int must_suspend_thread;
/* Get relevant ports when creating a new inferior */
#define CREATE_INFERIOR_HOOK(pid) mach_create_inferior_hook(pid)
/* wait for the inferior to change state */
#define INFERIOR_WAIT_HOOK(w) mach_really_wait(w)
/* After fork() call this before exec() in the inferior task */
#define PREPARE_INFERIOR prepare_inferior_task
/* Startup the inferior task and suspend it after the correct code is loaded */
#define STARTUP_INFERIOR(x) intercept_exec_calls(x)
#define PREPARE_TO_PROCEED(select_it) mach3_prepare_to_proceed(select_it)
/* Try to get the privileged host port for authentication to machid
*
* If you can get this, you may debug anything on this host.
*
* If you can't, gdb gives it's own task port as the
* authentication port
*/
#define mach_privileged_host_port() task_by_pid(-1)
/*
* This is the MIG ID number of the emulator/server bsd_execve() RPC call.
*
* It SHOULD never change, but if it does, gdb `run'
* command won't work until you fix this define.
*
*/
#define MIG_EXEC_SYSCALL_ID 101000
/* If our_message_port gets a msg with this ID,
* GDB suspends it's inferior and enters command level.
* (Useful at least if ^C does not work)
*/
#define GDB_MESSAGE_ID_STOP 0x41151
/* wait3 WNOHANG is defined in <sys/wait.h> but
* for some reason gdb does not want to include
* that file.
*
* If your system defines WNOHANG differently, this has to be changed.
*/
#define WNOHANG 1
/* Before storing, we need to read all the registers. */
#define CHILD_PREPARE_TO_STORE() read_register_bytes (0, NULL, REGISTER_BYTES)
/* Check if the inferior exists */
#define MACH_ERROR_NO_INFERIOR \
do if (!MACH_PORT_VALID (inferior_task)) \
error ("Inferior task does not exist."); while(0)
/* Error handler for mach calls */
#define CHK(str,ret) \
do if (ret != KERN_SUCCESS) \
error ("Gdb %s [%d] %s : %s\n",__FILE__,__LINE__,str, \
mach_error_string(ret)); while(0)
/* This is from POE9 emulator/emul_stack.h
*/
/*
* Top of emulator stack holds link and reply port.
*/
struct emul_stack_top {
struct emul_stack_top *link;
mach_port_t reply_port;
};
#define EMULATOR_STACK_SIZE (4096*4)
#define THREAD_ALLOWED_TO_BREAK(mid) mach_thread_for_breakpoint (mid)
#define THREAD_PARSE_ID(arg) mach_thread_parse_id (arg)
#define THREAD_OUTPUT_ID(mid) mach_thread_output_id (mid)
#define ATTACH_TO_THREAD attach_to_thread
/* Do Mach 3 dependent operations when ^C or a STOP is requested */
#define DO_QUIT() mach3_quit ()
/* If in mach_msg() and ^C is typed set immediate_quit */
#define REQUEST_QUIT() mach3_request_quit ()
#endif /* _OS_MACH3_H_ */
|