X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flinux-nat.h;h=0aa83770c2e7f0451eec19a5770c8075aebe0924;hb=2117c711ae07700adb57ea5b5ca61e4c32d7e3d2;hp=f3386f76da8e689fc149ef3a0d6738c773f7a211;hpb=4c28f408dfc2ab71b7995f061cc725d3f217ec9c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h index f3386f76da..0aa83770c2 100644 --- a/gdb/linux-nat.h +++ b/gdb/linux-nat.h @@ -1,7 +1,6 @@ /* Native debugging support for GNU/Linux (LWP layer). - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 - Free Software Foundation, Inc. + Copyright (C) 2000-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +21,8 @@ #include +struct arch_lwp_info; + /* Structure describing an LWP. This is public only for the purposes of ALL_LWPS; target-specific code should generally not access it directly. */ @@ -52,21 +53,48 @@ struct lwp_info didn't try to let the LWP run. */ int resumed; + /* The last resume GDB requested on this thread. */ + enum resume_kind last_resume_kind; + /* If non-zero, a pending wait status. */ int status; /* Non-zero if we were stepping this LWP. */ int step; - /* Non-zero si_signo if this LWP stopped with a trap. si_addr may - be the address of a hardware watchpoint. */ - struct siginfo siginfo; + /* STOPPED_BY_WATCHPOINT is non-zero if this LWP stopped with a data + watchpoint trap. */ + int stopped_by_watchpoint; + + /* On architectures where it is possible to know the data address of + a triggered watchpoint, STOPPED_DATA_ADDRESS_P is non-zero, and + STOPPED_DATA_ADDRESS contains such data address. Otherwise, + STOPPED_DATA_ADDRESS_P is false, and STOPPED_DATA_ADDRESS is + undefined. Only valid if STOPPED_BY_WATCHPOINT is true. */ + int stopped_data_address_p; + CORE_ADDR stopped_data_address; + + /* Non-zero if we expect a duplicated SIGINT. */ + int ignore_sigint; /* If WAITSTATUS->KIND != TARGET_WAITKIND_SPURIOUS, the waitstatus for this LWP's last event. This may correspond to STATUS above, or to a local variable in lin_lwp_wait. */ struct target_waitstatus waitstatus; + /* Signal wether we are in a SYSCALL_ENTRY or + in a SYSCALL_RETURN event. + Values: + - TARGET_WAITKIND_SYSCALL_ENTRY + - TARGET_WAITKIND_SYSCALL_RETURN */ + int syscall_state; + + /* The processor core this LWP was last seen on. */ + int core; + + /* Arch-specific additions. */ + struct arch_lwp_info *arch_private; + /* Next LWP in list. */ struct lwp_info *next; }; @@ -76,36 +104,31 @@ struct lwp_info native target is active. */ extern struct lwp_info *lwp_list; -/* Iterate over the PTID each active thread (light-weight process). There - must be at least one. */ -#define ALL_LWPS(LP, PTID) \ - for ((LP) = lwp_list, (PTID) = (LP)->ptid; \ +/* Iterate over each active thread (light-weight process). */ +#define ALL_LWPS(LP) \ + for ((LP) = lwp_list; \ (LP) != NULL; \ - (LP) = (LP)->next, (PTID) = (LP) ? (LP)->ptid : (PTID)) - -#define GET_LWP(ptid) ptid_get_lwp (ptid) -#define GET_PID(ptid) ptid_get_pid (ptid) -#define is_lwp(ptid) (GET_LWP (ptid) != 0) -#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0) + (LP) = (LP)->next) /* Attempt to initialize libthread_db. */ void check_for_thread_db (void); -/* Tell the thread_db layer what native target operations to use. */ -void thread_db_init (struct target_ops *); - int thread_db_attach_lwp (ptid_t ptid); -/* Find process PID's pending signal set from /proc/pid/status. */ -void linux_proc_pending_signals (int pid, sigset_t *pending, sigset_t *blocked, sigset_t *ignored); +/* Return the set of signals used by the threads library. */ +extern void lin_thread_get_thread_signals (sigset_t *mask); -/* linux-nat functions for handling fork events. */ -extern void linux_enable_event_reporting (ptid_t ptid); +/* Find process PID's pending signal set from /proc/pid/status. */ +void linux_proc_pending_signals (int pid, sigset_t *pending, + sigset_t *blocked, sigset_t *ignored); extern int lin_lwp_attach_lwp (ptid_t ptid); +extern void linux_stop_lwp (struct lwp_info *lwp); + /* Iterator function for lin-lwp's lwp list. */ -struct lwp_info *iterate_over_lwps (int (*callback) (struct lwp_info *, +struct lwp_info *iterate_over_lwps (ptid_t filter, + int (*callback) (struct lwp_info *, void *), void *data); @@ -123,11 +146,47 @@ linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int)); void linux_nat_add_target (struct target_ops *); /* Register a method to call whenever a new thread is attached. */ -void linux_nat_set_new_thread (struct target_ops *, void (*) (ptid_t)); +void linux_nat_set_new_thread (struct target_ops *, void (*) (struct lwp_info *)); + + +/* Register a method to call whenever a new fork is attached. */ +typedef void (linux_nat_new_fork_ftype) (struct lwp_info *parent, + pid_t child_pid); +void linux_nat_set_new_fork (struct target_ops *ops, + linux_nat_new_fork_ftype *fn); + +/* Register a method to call whenever a process is killed or + detached. */ +typedef void (linux_nat_forget_process_ftype) (pid_t pid); +void linux_nat_set_forget_process (struct target_ops *ops, + linux_nat_forget_process_ftype *fn); + +/* Call the method registered with the function above. PID is the + process to forget about. */ +void linux_nat_forget_process (pid_t pid); + +/* Register a method that converts a siginfo object between the layout + that ptrace returns, and the layout in the architecture of the + inferior. */ +void linux_nat_set_siginfo_fixup (struct target_ops *, + int (*) (siginfo_t *, + gdb_byte *, + int)); + +/* Register a method to call prior to resuming a thread. */ + +void linux_nat_set_prepare_to_resume (struct target_ops *, + void (*) (struct lwp_info *)); /* Update linux-nat internal state when changing from one fork to another. */ void linux_nat_switch_fork (ptid_t new_ptid); -/* Return the saved siginfo associated with PTID. */ -struct siginfo *linux_nat_get_siginfo (ptid_t ptid); +/* Store the saved siginfo associated with PTID in *SIGINFO. + Return 1 if it was retrieved successfully, 0 otherwise (*SIGINFO is + uninitialized in such case). */ +int linux_nat_get_siginfo (ptid_t ptid, siginfo_t *siginfo); + +/* Set alternative SIGTRAP-like events recognizer. */ +void linux_nat_set_status_is_event (struct target_ops *t, + int (*status_is_event) (int status));