1 /* Default child (native) target interface, for GDB when running under
4 Copyright (C) 1988-1996, 1998-2002, 2004-2005, 2007-2012 Free
5 Software Foundation, Inc.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
28 #include "gdb_string.h"
29 #include "inf-child.h"
30 #include "gdb/fileio.h"
32 #include <sys/types.h>
37 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
41 inf_child_fetch_inferior_registers (struct target_ops
*ops
,
42 struct regcache
*regcache
, int regnum
)
47 regnum
< gdbarch_num_regs (get_regcache_arch (regcache
));
49 regcache_raw_supply (regcache
, regnum
, NULL
);
52 regcache_raw_supply (regcache
, regnum
, NULL
);
55 /* Store register REGNUM back into the inferior. If REGNUM is -1, do
56 this for all registers (including the floating point registers). */
59 inf_child_store_inferior_registers (struct target_ops
*ops
,
60 struct regcache
*regcache
, int regnum
)
65 inf_child_post_attach (int pid
)
67 /* This version of Unix doesn't require a meaningful "post attach"
68 operation by a debugger. */
71 /* Get ready to modify the registers array. On machines which store
72 individual registers, this doesn't need to do anything. On
73 machines which store all the registers in one fell swoop, this
74 makes sure that registers contains all the registers from the
75 program being debugged. */
78 inf_child_prepare_to_store (struct regcache
*regcache
)
83 inf_child_open (char *arg
, int from_tty
)
85 error (_("Use the \"run\" command to start a Unix child process."));
89 inf_child_post_startup_inferior (ptid_t ptid
)
91 /* This version of Unix doesn't require a meaningful "post startup
92 inferior" operation by a debugger. */
96 inf_child_follow_fork (struct target_ops
*ops
, int follow_child
)
98 /* This version of Unix doesn't support following fork or vfork
104 inf_child_can_run (void)
110 inf_child_pid_to_exec_file (int pid
)
112 /* This version of Unix doesn't support translation of a process ID
113 to the filename of the executable file. */
118 /* Target file operations. */
121 inf_child_fileio_open_flags_to_host (int fileio_open_flags
, int *open_flags_p
)
125 if (fileio_open_flags
& ~FILEIO_O_SUPPORTED
)
128 if (fileio_open_flags
& FILEIO_O_CREAT
)
129 open_flags
|= O_CREAT
;
130 if (fileio_open_flags
& FILEIO_O_EXCL
)
131 open_flags
|= O_EXCL
;
132 if (fileio_open_flags
& FILEIO_O_TRUNC
)
133 open_flags
|= O_TRUNC
;
134 if (fileio_open_flags
& FILEIO_O_APPEND
)
135 open_flags
|= O_APPEND
;
136 if (fileio_open_flags
& FILEIO_O_RDONLY
)
137 open_flags
|= O_RDONLY
;
138 if (fileio_open_flags
& FILEIO_O_WRONLY
)
139 open_flags
|= O_WRONLY
;
140 if (fileio_open_flags
& FILEIO_O_RDWR
)
141 open_flags
|= O_RDWR
;
142 /* On systems supporting binary and text mode, always open files in
145 open_flags
|= O_BINARY
;
148 *open_flags_p
= open_flags
;
153 inf_child_errno_to_fileio_error (int errnum
)
160 return FILEIO_ENOENT
;
168 return FILEIO_EACCES
;
170 return FILEIO_EFAULT
;
174 return FILEIO_EEXIST
;
176 return FILEIO_ENODEV
;
178 return FILEIO_ENOTDIR
;
180 return FILEIO_EISDIR
;
182 return FILEIO_EINVAL
;
184 return FILEIO_ENFILE
;
186 return FILEIO_EMFILE
;
190 return FILEIO_ENOSPC
;
192 return FILEIO_ESPIPE
;
196 return FILEIO_ENOSYS
;
198 return FILEIO_ENAMETOOLONG
;
200 return FILEIO_EUNKNOWN
;
203 /* Open FILENAME on the target, using FLAGS and MODE. Return a
204 target file descriptor, or -1 if an error occurs (and set
207 inf_child_fileio_open (const char *filename
, int flags
, int mode
,
213 if (inf_child_fileio_open_flags_to_host (flags
, &nat_flags
) == -1)
215 *target_errno
= FILEIO_EINVAL
;
219 /* We do not need to convert MODE, since the fileio protocol uses
220 the standard values. */
221 fd
= open (filename
, nat_flags
, mode
);
223 *target_errno
= inf_child_errno_to_fileio_error (errno
);
228 /* Write up to LEN bytes from WRITE_BUF to FD on the target.
229 Return the number of bytes written, or -1 if an error occurs
230 (and set *TARGET_ERRNO). */
232 inf_child_fileio_pwrite (int fd
, const gdb_byte
*write_buf
, int len
,
233 ULONGEST offset
, int *target_errno
)
238 ret
= pwrite (fd
, write_buf
, len
, (long) offset
);
240 ret
= lseek (fd
, (long) offset
, SEEK_SET
);
242 ret
= write (fd
, write_buf
, len
);
246 *target_errno
= inf_child_errno_to_fileio_error (errno
);
251 /* Read up to LEN bytes FD on the target into READ_BUF.
252 Return the number of bytes read, or -1 if an error occurs
253 (and set *TARGET_ERRNO). */
255 inf_child_fileio_pread (int fd
, gdb_byte
*read_buf
, int len
,
256 ULONGEST offset
, int *target_errno
)
261 ret
= pread (fd
, read_buf
, len
, (long) offset
);
263 ret
= lseek (fd
, (long) offset
, SEEK_SET
);
265 ret
= read (fd
, read_buf
, len
);
269 *target_errno
= inf_child_errno_to_fileio_error (errno
);
274 /* Close FD on the target. Return 0, or -1 if an error occurs
275 (and set *TARGET_ERRNO). */
277 inf_child_fileio_close (int fd
, int *target_errno
)
283 *target_errno
= inf_child_errno_to_fileio_error (errno
);
288 /* Unlink FILENAME on the target. Return 0, or -1 if an error
289 occurs (and set *TARGET_ERRNO). */
291 inf_child_fileio_unlink (const char *filename
, int *target_errno
)
295 ret
= unlink (filename
);
297 *target_errno
= inf_child_errno_to_fileio_error (errno
);
304 inf_child_target (void)
306 struct target_ops
*t
= XZALLOC (struct target_ops
);
308 t
->to_shortname
= "child";
309 t
->to_longname
= "Unix child process";
310 t
->to_doc
= "Unix child process (started by the \"run\" command).";
311 t
->to_open
= inf_child_open
;
312 t
->to_post_attach
= inf_child_post_attach
;
313 t
->to_fetch_registers
= inf_child_fetch_inferior_registers
;
314 t
->to_store_registers
= inf_child_store_inferior_registers
;
315 t
->to_prepare_to_store
= inf_child_prepare_to_store
;
316 t
->to_insert_breakpoint
= memory_insert_breakpoint
;
317 t
->to_remove_breakpoint
= memory_remove_breakpoint
;
318 t
->to_terminal_init
= terminal_init_inferior
;
319 t
->to_terminal_inferior
= terminal_inferior
;
320 t
->to_terminal_ours_for_output
= terminal_ours_for_output
;
321 t
->to_terminal_save_ours
= terminal_save_ours
;
322 t
->to_terminal_ours
= terminal_ours
;
323 t
->to_terminal_info
= child_terminal_info
;
324 t
->to_post_startup_inferior
= inf_child_post_startup_inferior
;
325 t
->to_follow_fork
= inf_child_follow_fork
;
326 t
->to_can_run
= inf_child_can_run
;
327 t
->to_pid_to_exec_file
= inf_child_pid_to_exec_file
;
328 t
->to_stratum
= process_stratum
;
329 t
->to_has_all_memory
= default_child_has_all_memory
;
330 t
->to_has_memory
= default_child_has_memory
;
331 t
->to_has_stack
= default_child_has_stack
;
332 t
->to_has_registers
= default_child_has_registers
;
333 t
->to_has_execution
= default_child_has_execution
;
334 t
->to_fileio_open
= inf_child_fileio_open
;
335 t
->to_fileio_pwrite
= inf_child_fileio_pwrite
;
336 t
->to_fileio_pread
= inf_child_fileio_pread
;
337 t
->to_fileio_close
= inf_child_fileio_close
;
338 t
->to_fileio_unlink
= inf_child_fileio_unlink
;
339 t
->to_magic
= OPS_MAGIC
;