This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / config / pa / nm-hppah.h
1 /* Native support for HPPA-RISC machine running HPUX, for GDB.
2 Copyright 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #define U_REGS_OFFSET 0
21
22 #define KERNEL_U_ADDR 0
23
24 /* What a coincidence! */
25 #define REGISTER_U_ADDR(addr, blockend, regno) \
26 { addr = (int)(blockend) + REGISTER_BYTE (regno);}
27
28 /* HPUX 8.0, in its infinite wisdom, has chosen to prototype ptrace
29 with five arguments, so programs written for normal ptrace lose. */
30 #define FIVE_ARG_PTRACE
31
32 /* We need to figure out where the text region is so that we use the
33 appropriate ptrace operator to manipulate text. Simply reading/writing
34 user space will crap out HPUX. */
35 #define NEED_TEXT_START_END 1
36
37 /* This macro defines the register numbers (from REGISTER_NAMES) that
38 are effectively unavailable to the user through ptrace(). It allows
39 us to include the whole register set in REGISTER_NAMES (inorder to
40 better support remote debugging). If it is used in
41 fetch/store_inferior_registers() gdb will not complain about I/O errors
42 on fetching these registers. If all registers in REGISTER_NAMES
43 are available, then return false (0). */
44
45 #define CANNOT_STORE_REGISTER(regno) \
46 ((regno) == 0) || \
47 ((regno) == PCSQ_HEAD_REGNUM) || \
48 ((regno) >= PCSQ_TAIL_REGNUM && (regno) < IPSW_REGNUM) || \
49 ((regno) > IPSW_REGNUM && (regno) < FP4_REGNUM)
50
51 /* In hppah-nat.c: */
52 #define FETCH_INFERIOR_REGISTERS
53 #define CHILD_XFER_MEMORY
54 #define CHILD_POST_FOLLOW_INFERIOR_BY_CLONE
55 #define CHILD_POST_FOLLOW_VFORK
56
57 /* While this is for use by threaded programs, it doesn't appear
58 * to hurt non-threaded ones. This is used in infrun.c: */
59 #define PREPARE_TO_PROCEED() hppa_prepare_to_proceed()
60 extern int hppa_prepare_to_proceed PARAMS(( void ));
61
62 /* In infptrace.c or infttrace.c: */
63 #define CHILD_PID_TO_EXEC_FILE
64 #define CHILD_POST_STARTUP_INFERIOR
65 #define CHILD_ACKNOWLEDGE_CREATED_INFERIOR
66 #define CHILD_INSERT_FORK_CATCHPOINT
67 #define CHILD_REMOVE_FORK_CATCHPOINT
68 #define CHILD_INSERT_VFORK_CATCHPOINT
69 #define CHILD_REMOVE_VFORK_CATCHPOINT
70 #define CHILD_HAS_FORKED
71 #define CHILD_HAS_VFORKED
72 #define CHILD_CAN_FOLLOW_VFORK_PRIOR_TO_EXEC
73 #define CHILD_INSERT_EXEC_CATCHPOINT
74 #define CHILD_REMOVE_EXEC_CATCHPOINT
75 #define CHILD_HAS_EXECD
76 #define CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL
77 #define CHILD_HAS_SYSCALL_EVENT
78 #define CHILD_POST_ATTACH
79 #define CHILD_THREAD_ALIVE
80
81 #define REQUIRE_ATTACH(pid) hppa_require_attach(pid)
82 extern int hppa_require_attach PARAMS ((int));
83
84 #define REQUIRE_DETACH(pid,signal) hppa_require_detach(pid,signal)
85 extern int hppa_require_detach PARAMS ((int,int));
86
87 /* So we can cleanly use code in infptrace.c. */
88 #define PT_KILL PT_EXIT
89 #define PT_STEP PT_SINGLE
90 #define PT_CONTINUE PT_CONTIN
91
92 /* FIXME HP MERGE : Previously, PT_RDUAREA. this is actually fixed
93 in gdb-hp-snapshot-980509 */
94 #define PT_READ_U PT_RUAREA
95 #define PT_WRITE_U PT_WUAREA
96 #define PT_READ_I PT_RIUSER
97 #define PT_READ_D PT_RDUSER
98 #define PT_WRITE_I PT_WIUSER
99 #define PT_WRITE_D PT_WDUSER
100
101 /* attach/detach works to some extent under BSD and HPUX. So long
102 as the process you're attaching to isn't blocked waiting on io,
103 blocked waiting on a signal, or in a system call things work
104 fine. (The problems in those cases are related to the fact that
105 the kernel can't provide complete register information for the
106 target process... Which really pisses off GDB.) */
107
108 #define ATTACH_DETACH
109
110 /* In infptrace or infttrace.c: */
111
112 /* Starting with HP-UX 10.30, support is provided (in the form of
113 ttrace requests) for memory-protection-based hardware watchpoints.
114
115 The 10.30 implementation of these functions reside in infttrace.c.
116
117 Stubs of these functions will be provided in infptrace.c, so that
118 10.20 will at least link. However, the "can I use a fast watchpoint?"
119 query will always return "No" for 10.20. */
120
121 #define TARGET_HAS_HARDWARE_WATCHPOINTS
122
123 /* The PA can watch any number of locations (generic routines already check
124 that all intermediates are in watchable memory locations). */
125 #define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) \
126 hppa_can_use_hw_watchpoint(type, cnt, ot)
127
128 /* The PA can also watch memory regions of arbitrary size, since we're using
129 a page-protection scheme. (On some targets, apparently watch registers
130 are used, which can only accomodate regions of REGISTER_SIZE.) */
131 #define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(byte_count) \
132 (1)
133
134 /* However, some addresses may not be profitable to use hardware to watch,
135 or may be difficult to understand when the addressed object is out of
136 scope, and hence should be unwatched. On some targets, this may have
137 severe performance penalties, such that we might as well use regular
138 watchpoints, and save (possibly precious) hardware watchpoints for other
139 locations.
140
141 On HP-UX, we choose not to watch stack-based addresses, because
142
143 [1] Our implementation relies on page protection traps. The granularity
144 of these is large and so can generate many false hits, which are expensive
145 to respond to.
146
147 [2] Watches of "*p" where we may not know the symbol that p points to,
148 make it difficult to know when the addressed object is out of scope, and
149 hence shouldn't be watched. Page protection that isn't removed when the
150 addressed object is out of scope will either degrade execution speed
151 (false hits) or give false triggers (when the address is recycled by
152 other calls).
153
154 Since either of these points results in a slow-running inferior, we might
155 as well use normal watchpoints, aka single-step & test. */
156 #define TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT(pid,start,len) \
157 hppa_range_profitable_for_hw_watchpoint(pid, start, (LONGEST)(len))
158
159 /* On HP-UX, we're using page-protection to implement hardware watchpoints.
160 When an instruction attempts to write to a write-protected memory page,
161 a SIGBUS is raised. At that point, the write has not actually occurred.
162
163 We must therefore remove page-protections; single-step the inferior (to
164 allow the write to happen); restore page-protections; and check whether
165 any watchpoint triggered.
166
167 If none did, then the write was to a "nearby" location that just happens
168 to fall on the same page as a watched location, and so can be ignored.
169
170 The only intended client of this macro is wait_for_inferior(), in infrun.c.
171 When HAVE_NONSTEPPABLE_WATCHPOINT is true, that function will take care
172 of the stepping & etc. */
173
174 #define STOPPED_BY_WATCHPOINT(W) \
175 ((W.kind == TARGET_WAITKIND_STOPPED) && \
176 (stop_signal == TARGET_SIGNAL_BUS) && \
177 ! stepped_after_stopped_by_watchpoint && \
178 bpstat_have_active_hw_watchpoints ())
179
180 /* When a hardware watchpoint triggers, we'll move the inferior past it
181 by removing all eventpoints; stepping past the instruction that caused
182 the trigger; reinserting eventpoints; and checking whether any watched
183 location changed. */
184 #define HAVE_NONSTEPPABLE_WATCHPOINT
185
186 /* Our implementation of "hardware" watchpoints uses memory page-protection
187 faults. However, HP-UX has unfortunate interactions between these and
188 system calls; basically, it's unsafe to have page protections on when a
189 syscall is running. Therefore, we also ask for notification of syscall
190 entries and returns. When the inferior enters a syscall, we disable
191 h/w watchpoints. When the inferior returns from a syscall, we reenable
192 h/w watchpoints.
193
194 infptrace.c supplies dummy versions of these; infttrace.c is where the
195 meaningful implementations are.
196 */
197 #define TARGET_ENABLE_HW_WATCHPOINTS(pid) \
198 hppa_enable_page_protection_events (pid)
199 extern void hppa_enable_page_protection_events PARAMS ((int));
200
201 #define TARGET_DISABLE_HW_WATCHPOINTS(pid) \
202 hppa_disable_page_protection_events (pid)
203 extern void hppa_disable_page_protection_events PARAMS ((int));
204
205 /* Use these macros for watchpoint insertion/deletion. */
206 #define target_insert_watchpoint(addr, len, type) \
207 hppa_insert_hw_watchpoint (inferior_pid, addr, (LONGEST)(len), type)
208
209 #define target_remove_watchpoint(addr, len, type) \
210 hppa_remove_hw_watchpoint (inferior_pid, addr, (LONGEST)(len), type)
211
212 /* We call our k-thread processes "threads", rather
213 * than processes. So we need a new way to print
214 * the string. Code is in hppah-nat.c.
215 */
216 #define target_pid_to_str( pid ) \
217 hppa_pid_to_str( pid )
218 extern char * hppa_pid_to_str PARAMS ((pid_t));
219
220 #define target_tid_to_str( pid ) \
221 hppa_tid_to_str( pid )
222 extern char * hppa_tid_to_str PARAMS ((pid_t));
223
224 /* For this, ID can be either a process or thread ID, and the function
225 will describe it appropriately, returning the description as a printable
226 string.
227
228 The function that implements this macro is defined in infptrace.c and
229 infttrace.c.
230 */
231 #define target_pid_or_tid_to_str(ID) \
232 hppa_pid_or_tid_to_str (ID)
233 extern char * hppa_pid_or_tid_to_str PARAMS ((pid_t));
234
235 /* This is used when handling events caused by a call to vfork(). On ptrace-
236 based HP-UXs, when you resume the vforked child, the parent automagically
237 begins running again. To prevent this runaway, this function is used.
238
239 Note that for vfork on HP-UX, we receive three events of interest:
240
241 1. the vfork event for the new child process
242 2. the exit or exec event of the new child process (actually, you get
243 two exec events on ptrace-based HP-UXs)
244 3. the vfork event for the original parent process
245
246 The first is always received first. The other two may be received in any
247 order; HP-UX doesn't guarantee an order.
248 */
249 #define ENSURE_VFORKING_PARENT_REMAINS_STOPPED(PID) \
250 hppa_ensure_vforking_parent_remains_stopped (PID)
251 extern void hppa_ensure_vforking_parent_remains_stopped PARAMS((int));
252
253 /* This is used when handling events caused by a call to vfork().
254
255 On ttrace-based HP-UXs, the parent vfork and child exec arrive more or less
256 together. That is, you could do two wait()s without resuming either parent
257 or child, and get both events.
258
259 On ptrace-based HP-UXs, you must resume the child after its exec event is
260 delivered or you won't get the parent's vfork. I.e., you can't just wait()
261 and get the parent vfork, after receiving the child exec.
262 */
263 #define RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK() \
264 hppa_resume_execd_vforking_child_to_get_parent_vfork ()
265 extern int hppa_resume_execd_vforking_child_to_get_parent_vfork PARAMS ((void));
266
267 #ifdef HAVE_HPUX_THREAD_SUPPORT
268
269 #ifdef __STDC__
270 struct objfile;
271 #endif
272
273 void hpux_thread_new_objfile PARAMS ((struct objfile *objfile));
274 #define target_new_objfile(OBJFILE) hpux_thread_new_objfile (OBJFILE)
275
276 extern char *hpux_pid_to_str PARAMS ((int pid));
277 #define target_pid_to_str(PID) hpux_pid_to_str (PID)
278
279 #endif /* HAVE_HPUX_THREAD_SUPPORT */
280
281 #define HPUXHPPA
282
283 #define MAY_SWITCH_FROM_INFERIOR_PID (1)
284
285 #define MAY_FOLLOW_EXEC (1)
286
287 #define USE_THREAD_STEP_NEEDED (1)
288
This page took 0.034917 seconds and 4 git commands to generate.