1 /* Native support for HPPA-RISC machine running HPUX, for GDB. 2 Copyright 1991, 1992, 1994, 1996, 1998, 1999, 2000, 2002 3 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, 20 Boston, MA 02111-1307, USA. */ 21 22 struct target_ops; 23 24 #define U_REGS_OFFSET 0 25 26 #define KERNEL_U_ADDR 0 27 28 /* What a coincidence! */ 29 #define REGISTER_U_ADDR(addr, blockend, regno) \ 30 { addr = (int)(blockend) + DEPRECATED_REGISTER_BYTE (regno);} 31 32 /* This isn't really correct, because ptrace is actually a 32-bit 33 interface. However, the modern HP-UX targets all really use 34 ttrace, which is a 64-bit interface --- a debugger running in 35 either 32- or 64-bit mode can debug a 64-bit process. BUT, the 36 code doesn't use ttrace directly --- it calls call_ptrace instead, 37 which is supposed to be drop-in substitute for ptrace. In other 38 words, they access a 64-bit system call (ttrace) through a 39 compatibility layer which is allegedly a 32-bit interface. 40 41 So I don't feel the least bit guilty about this. */ 42 #define PTRACE_ARG3_TYPE CORE_ADDR 43 44 /* We need to figure out where the text region is so that we use the 45 appropriate ptrace operator to manipulate text. Simply 46 reading/writing user space will crap out HPUX. */ 47 #define DEPRECATED_HPUX_TEXT_END deprecated_hpux_text_end 48 extern void deprecated_hpux_text_end (struct target_ops *exec_ops); 49 50 /* In hppah-nat.c: */ 51 #define FETCH_INFERIOR_REGISTERS 52 #define CHILD_XFER_MEMORY 53 #define CHILD_FOLLOW_FORK 54 55 /* In infptrace.c or infttrace.c: */ 56 #define CHILD_PID_TO_EXEC_FILE 57 #define CHILD_POST_STARTUP_INFERIOR 58 #define CHILD_ACKNOWLEDGE_CREATED_INFERIOR 59 #define CHILD_INSERT_FORK_CATCHPOINT 60 #define CHILD_REMOVE_FORK_CATCHPOINT 61 #define CHILD_INSERT_VFORK_CATCHPOINT 62 #define CHILD_REMOVE_VFORK_CATCHPOINT 63 #define CHILD_INSERT_EXEC_CATCHPOINT 64 #define CHILD_REMOVE_EXEC_CATCHPOINT 65 #define CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL 66 #define CHILD_POST_ATTACH 67 #define CHILD_THREAD_ALIVE 68 #define CHILD_PID_TO_STR 69 #define CHILD_WAIT 70 struct target_waitstatus; 71 extern ptid_t child_wait (ptid_t, struct target_waitstatus *); 72 73 extern int hppa_require_attach (int); 74 extern int hppa_require_detach (int, int); 75 76 /* So we can cleanly use code in infptrace.c. */ 77 #define PT_KILL PT_EXIT 78 #define PT_STEP PT_SINGLE 79 #define PT_CONTINUE PT_CONTIN 80 81 /* FIXME HP MERGE : Previously, PT_RDUAREA. this is actually fixed 82 in gdb-hp-snapshot-980509 */ 83 #define PT_READ_U PT_RUAREA 84 #define PT_WRITE_U PT_WUAREA 85 #define PT_READ_I PT_RIUSER 86 #define PT_READ_D PT_RDUSER 87 #define PT_WRITE_I PT_WIUSER 88 #define PT_WRITE_D PT_WDUSER 89 90 /* In infptrace or infttrace.c: */ 91 92 /* Starting with HP-UX 10.30, support is provided (in the form of 93 ttrace requests) for memory-protection-based hardware watchpoints. 94 95 The 10.30 implementation of these functions reside in infttrace.c. 96 97 Stubs of these functions will be provided in infptrace.c, so that 98 10.20 will at least link. However, the "can I use a fast watchpoint?" 99 query will always return "No" for 10.20. */ 100 101 /* The PA can watch any number of locations (generic routines already check 102 that all intermediates are in watchable memory locations). */ 103 extern int hppa_can_use_hw_watchpoint (int type, int cnt, int ot); 104 #define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) \ 105 hppa_can_use_hw_watchpoint(type, cnt, ot) 106 107 /* The PA can also watch memory regions of arbitrary size, since we're 108 using a page-protection scheme. (On some targets, apparently watch 109 registers are used, which can only accomodate regions of 110 DEPRECATED_REGISTER_SIZE.) */ 111 #define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(byte_count) \ 112 (1) 113 114 /* On HP-UX, we're using page-protection to implement hardware watchpoints. 115 When an instruction attempts to write to a write-protected memory page, 116 a SIGBUS is raised. At that point, the write has not actually occurred. 117 118 We must therefore remove page-protections; single-step the inferior (to 119 allow the write to happen); restore page-protections; and check whether 120 any watchpoint triggered. 121 122 If none did, then the write was to a "nearby" location that just happens 123 to fall on the same page as a watched location, and so can be ignored. 124 125 The only intended client of this macro is wait_for_inferior(), in infrun.c. 126 When HAVE_NONSTEPPABLE_WATCHPOINT is true, that function will take care 127 of the stepping & etc. */ 128 129 #define STOPPED_BY_WATCHPOINT(W) \ 130 ((W.kind == TARGET_WAITKIND_STOPPED) && \ 131 (stop_signal == TARGET_SIGNAL_BUS) && \ 132 ! stepped_after_stopped_by_watchpoint && \ 133 bpstat_have_active_hw_watchpoints ()) 134 135 /* Our implementation of "hardware" watchpoints uses memory page-protection 136 faults. However, HP-UX has unfortunate interactions between these and 137 system calls; basically, it's unsafe to have page protections on when a 138 syscall is running. Therefore, we also ask for notification of syscall 139 entries and returns. When the inferior enters a syscall, we disable 140 h/w watchpoints. When the inferior returns from a syscall, we reenable 141 h/w watchpoints. 142 143 infptrace.c supplies dummy versions of these; infttrace.c is where the 144 meaningful implementations are. 145 */ 146 #define TARGET_ENABLE_HW_WATCHPOINTS(pid) \ 147 hppa_enable_page_protection_events (pid) 148 extern void hppa_enable_page_protection_events (int); 149 150 #define TARGET_DISABLE_HW_WATCHPOINTS(pid) \ 151 hppa_disable_page_protection_events (pid) 152 extern void hppa_disable_page_protection_events (int); 153 154 /* Use these macros for watchpoint insertion/deletion. */ 155 extern int hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, 156 int type); 157 #define target_insert_watchpoint(addr, len, type) \ 158 hppa_insert_hw_watchpoint (PIDGET (inferior_ptid), addr, (LONGEST)(len), type) 159 160 extern int hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, 161 int type); 162 #define target_remove_watchpoint(addr, len, type) \ 163 hppa_remove_hw_watchpoint (PIDGET (inferior_ptid), addr, (LONGEST)(len), type) 164 165 /* We call our k-thread processes "threads", rather 166 * than processes. So we need a new way to print 167 * the string. Code is in hppah-nat.c. 168 */ 169 170 extern char *child_pid_to_str (ptid_t); 171 172 #define target_tid_to_str( ptid ) \ 173 hppa_tid_to_str( ptid ) 174 extern char *hppa_tid_to_str (ptid_t); 175 176 /* For this, ID can be either a process or thread ID, and the function 177 will describe it appropriately, returning the description as a printable 178 string. 179 180 The function that implements this macro is defined in infptrace.c and 181 infttrace.c. 182 */ 183 #define target_pid_or_tid_to_str(ID) \ 184 hppa_pid_or_tid_to_str (ID) 185 extern char *hppa_pid_or_tid_to_str (ptid_t); 186 187 /* This is used when handling events caused by a call to vfork(). On ptrace- 188 based HP-UXs, when you resume the vforked child, the parent automagically 189 begins running again. To prevent this runaway, this function is used. 190 191 Note that for vfork on HP-UX, we receive three events of interest: 192 193 1. the vfork event for the new child process 194 2. the exit or exec event of the new child process (actually, you get 195 two exec events on ptrace-based HP-UXs) 196 3. the vfork event for the original parent process 197 198 The first is always received first. The other two may be received in any 199 order; HP-UX doesn't guarantee an order. 200 */ 201 #define ENSURE_VFORKING_PARENT_REMAINS_STOPPED(PID) \ 202 hppa_ensure_vforking_parent_remains_stopped (PID) 203 extern void hppa_ensure_vforking_parent_remains_stopped (int); 204 205 /* This is used when handling events caused by a call to vfork(). 206 207 On ttrace-based HP-UXs, the parent vfork and child exec arrive more or less 208 together. That is, you could do two wait()s without resuming either parent 209 or child, and get both events. 210 211 On ptrace-based HP-UXs, you must resume the child after its exec event is 212 delivered or you won't get the parent's vfork. I.e., you can't just wait() 213 and get the parent vfork, after receiving the child exec. 214 */ 215 #define RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK() \ 216 hppa_resume_execd_vforking_child_to_get_parent_vfork () 217 extern int hppa_resume_execd_vforking_child_to_get_parent_vfork (void); 218 219 #define HPUXHPPA 220 221 #define MAY_FOLLOW_EXEC (1) 222 223 #include "infttrace.h" /* For parent_attach_all. */ 224