X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gdb%2Finf-ptrace.h;h=98b5d2e09e686b0c4490f1fd442e4be61bab6a61;hb=HEAD;hp=086649defde3028e84f7c190e7ca7f0ec10bab32;hpb=0fb0cc7590113e9b459dfcc48dc71c9d419d9580;p=thirdparty%2Fbinutils-gdb.git diff --git a/gdb/inf-ptrace.h b/gdb/inf-ptrace.h index 086649defde..868bee92da8 100644 --- a/gdb/inf-ptrace.h +++ b/gdb/inf-ptrace.h @@ -1,6 +1,6 @@ /* Low level child interface to ptrace. - Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2004-2024 Free Software Foundation, Inc. This file is part of GDB. @@ -20,17 +20,97 @@ #ifndef INF_PTRACE_H #define INF_PTRACE_H -/* Create a prototype ptrace target. The client can override it with - local methods. */ +#include "gdbsupport/event-pipe.h" +#include "inf-child.h" -extern struct target_ops *inf_ptrace_target (void); +/* An abstract prototype ptrace target. The client can override it + with local methods. */ -/* Create a "traditional" ptrace target. REGISTER_U_OFFSET should be - a function returning the offset within the user area where a - particular register is stored. */ +struct inf_ptrace_target : public inf_child_target +{ + ~inf_ptrace_target () override = 0; -extern struct target_ops * - inf_ptrace_trad_target (CORE_ADDR (*register_u_offset) - (struct gdbarch *, int, int)); + void attach (const char *, int) override; + + void detach (inferior *inf, int) override; + + void close () override; + + void resume (ptid_t, int, enum gdb_signal) override; + + ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override; + + void files_info () override; + + void kill () override; + + void create_inferior (const char *, const std::string &, + char **, int) override; + + void mourn_inferior () override; + + bool thread_alive (ptid_t ptid) override; + + std::string pid_to_str (ptid_t) override; + + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + + bool is_async_p () override + { return m_event_pipe.is_open (); } + + int async_wait_fd () override + { return m_event_pipe.event_fd (); } + + /* Helper routine used from SIGCHLD handlers to signal the async + event pipe. */ + static void async_file_mark_if_open () + { + if (m_event_pipe.is_open ()) + m_event_pipe.mark (); + } + +protected: + /* Helper routines for interacting with the async event pipe. */ + bool async_file_open () + { return m_event_pipe.open_pipe (); } + void async_file_close () + { m_event_pipe.close_pipe (); } + void async_file_flush () + { m_event_pipe.flush (); } + void async_file_mark () + { m_event_pipe.mark (); } + + /* Cleanup the inferior after a successful ptrace detach. */ + void detach_success (inferior *inf); + + /* Some targets don't allow us to request notification of inferior events + such as fork and vfork immediately after the inferior is created. + (This is because of how gdb creates inferiors via invoking a shell to + do it. In such a scenario, if the shell init file has commands in it, + the shell will fork and exec for each of those commands, and we will + see each such fork event. Very bad.) + + Such targets will supply an appropriate definition for this + function. */ + virtual void post_startup_inferior (ptid_t ptid) = 0; + +private: + static event_pipe m_event_pipe; +}; + +#ifndef __NetBSD__ +/* Return which PID to pass to ptrace in order to observe/control the + tracee identified by PTID. + + Unlike most other Operating Systems, NetBSD tracks both pid and lwp + and avoids this function. */ + +extern pid_t get_ptrace_pid (ptid_t); +#endif #endif