1 /* Native-dependent code for FreeBSD.
3 Copyright (C) 2004-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
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 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "inf-ptrace.h"
26 #include <osreldate.h>
29 /* FreeBSD kernels 11.3 and later report valid si_code values for
30 SIGTRAP on all architectures. Older FreeBSD kernels that supported
31 TRAP_BRKPT did not report valid values for MIPS and sparc64. Even
32 older kernels without TRAP_BRKPT support did not report valid
33 values on any architecture. */
34 #if (__FreeBSD_kernel_version >= 1102502) || (__FreeBSD_version >= 1102502)
35 # define USE_SIGTRAP_SIGINFO
36 #elif defined(TRAP_BRKPT)
37 # if !defined(__mips__) && !defined(__sparc64__)
38 # define USE_SIGTRAP_SIGINFO
42 /* A prototype FreeBSD target. */
44 class fbsd_nat_target
: public inf_ptrace_target
47 const char *pid_to_exec_file (int pid
) override
;
49 int find_memory_regions (find_memory_region_ftype func
, void *data
) override
;
51 bool info_proc (const char *, enum info_proc_what
) override
;
53 enum target_xfer_status
xfer_partial (enum target_object object
,
56 const gdb_byte
*writebuf
,
57 ULONGEST offset
, ULONGEST len
,
58 ULONGEST
*xfered_len
) override
;
60 bool thread_alive (ptid_t ptid
) override
;
61 std::string
pid_to_str (ptid_t
) override
;
63 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME
64 const char *thread_name (struct thread_info
*) override
;
67 void update_thread_list () override
;
69 bool can_async_p () override
;
71 void async (bool) override
;
73 thread_control_capabilities
get_thread_control_capabilities () override
74 { return tc_schedlock
; }
76 void create_inferior (const char *, const std::string
&,
77 char **, int) override
;
79 void resume (ptid_t
, int, enum gdb_signal
) override
;
81 ptid_t
wait (ptid_t
, struct target_waitstatus
*, target_wait_flags
) override
;
83 void post_attach (int) override
;
85 #ifdef USE_SIGTRAP_SIGINFO
86 bool supports_stopped_by_sw_breakpoint () override
;
87 bool stopped_by_sw_breakpoint () override
;
91 void follow_fork (inferior
*, ptid_t
, target_waitkind
, bool, bool) override
;
93 int insert_fork_catchpoint (int) override
;
94 int remove_fork_catchpoint (int) override
;
96 int insert_vfork_catchpoint (int) override
;
97 int remove_vfork_catchpoint (int) override
;
100 int insert_exec_catchpoint (int) override
;
101 int remove_exec_catchpoint (int) override
;
103 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
104 int set_syscall_catchpoint (int, bool, int, gdb::array_view
<const int>)
108 bool supports_multi_process () override
;
110 bool supports_disable_randomization () override
;
112 /* Methods meant to be overridden by arch-specific target
115 virtual void low_new_fork (ptid_t parent
, pid_t child
)
118 /* The method to call, if any, when a thread is destroyed. */
119 virtual void low_delete_thread (thread_info
*)
122 /* Hook to call prior to resuming a thread. */
123 virtual void low_prepare_to_resume (thread_info
*)
128 void post_startup_inferior (ptid_t
) override
;
131 ptid_t
wait_1 (ptid_t
, struct target_waitstatus
*, target_wait_flags
);
133 /* Helper routines for use in fetch_registers and store_registers in
134 subclasses. These routines fetch and store a single set of
135 registers described by REGSET. The REGSET's 'regmap' field must
136 point to an array of 'struct regcache_map_entry'.
138 FETCH_OP is a ptrace operation to fetch the set of registers from
139 a native thread. STORE_OP is a ptrace operation to store the set
140 of registers to a native thread.
142 The caller must provide storage for the set of registers in REGS,
143 and SIZE is the size of the storage.
145 Returns true if the register set was transferred due to a
148 bool fetch_register_set (struct regcache
*regcache
, int regnum
, int fetch_op
,
149 const struct regset
*regset
, void *regs
, size_t size
);
151 bool store_register_set (struct regcache
*regcache
, int regnum
, int fetch_op
,
152 int store_op
, const struct regset
*regset
,
153 void *regs
, size_t size
);
155 /* Helper routines which use PT_GETREGSET and PT_SETREGSET for the
156 specified NOTE instead of regset-specific fetch and store
159 bool fetch_regset (struct regcache
*regcache
, int regnum
, int note
,
160 const struct regset
*regset
, void *regs
, size_t size
);
162 bool store_regset (struct regcache
*regcache
, int regnum
, int note
,
163 const struct regset
*regset
, void *regs
, size_t size
);
166 /* Wrapper versions of the above helpers which accept a register set
167 type such as 'struct reg' or 'struct fpreg'. */
169 template <class Regset
>
170 bool fetch_register_set (struct regcache
*regcache
, int regnum
, int fetch_op
,
171 const struct regset
*regset
)
174 return fetch_register_set (regcache
, regnum
, fetch_op
, regset
, ®s
,
178 template <class Regset
>
179 bool store_register_set (struct regcache
*regcache
, int regnum
, int fetch_op
,
180 int store_op
, const struct regset
*regset
)
183 return store_register_set (regcache
, regnum
, fetch_op
, store_op
, regset
,
184 ®s
, sizeof (regs
));
187 /* Helper routine for use in read_description in subclasses. This
188 routine checks if the register set for the specified NOTE is
189 present for a given PTID. If the register set is present, the
190 the size of the register set is returned. If the register set is
191 not present, zero is returned. */
193 size_t have_regset (ptid_t ptid
, int note
);
195 /* Wrapper versions of the PT_GETREGSET and PT_REGSET helpers which
196 accept a register set type. */
198 template <class Regset
>
199 bool fetch_regset (struct regcache
*regcache
, int regnum
, int note
,
200 const struct regset
*regset
)
203 return fetch_regset (regcache
, regnum
, note
, regset
, ®s
, sizeof (regs
));
206 template <class Regset
>
207 bool store_regset (struct regcache
*regcache
, int regnum
, int note
,
208 const struct regset
*regset
)
211 return store_regset (regcache
, regnum
, note
, regset
, ®s
, sizeof (regs
));
215 /* Fetch the signal information for PTID and store it in *SIGINFO.
216 Return true if successful. */
217 bool fbsd_nat_get_siginfo (ptid_t ptid
, siginfo_t
*siginfo
);
219 #endif /* fbsd-nat.h */