X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flinux-nat.h;h=5aba089eaf3d20a703b0f7db9ed8607a0b3d375e;hb=b7a8b4ef6b4203072015422e0601440f60f29adb;hp=78312d71b31ebeec988af395ccf233c0664f0fda;hpb=0274a8cedbd446865a1e5fdec8057f4a327e19aa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h index 78312d71b3..5aba089eaf 100644 --- a/gdb/linux-nat.h +++ b/gdb/linux-nat.h @@ -1,11 +1,13 @@ /* Native debugging support for GNU/Linux (LWP layer). - Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, + 2010 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -14,11 +16,15 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ + +#include "target.h" -/* Structure describing an LWP. */ +#include + +/* Structure describing an LWP. This is public only for the purposes + of ALL_LWPS; target-specific code should generally not access it + directly. */ struct lwp_info { @@ -52,19 +58,114 @@ struct lwp_info /* 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; + /* Next LWP in list. */ struct lwp_info *next; }; -/* Read/write to target memory via Linux's "proc file system". */ -struct mem_attrib; -extern int linux_proc_xfer_memory (CORE_ADDR addr, char *myaddr, int len, - int write, struct mem_attrib *attrib, - struct target_ops *target); +/* The global list of LWPs, for ALL_LWPS. Unlike the threads list, + there is always at least one LWP on the list while the GNU/Linux + 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; \ + (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) + +/* Attempt to initialize libthread_db. */ +void check_for_thread_db (void); -extern void linux_record_stopped_pid (int pid); +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 TGID of LWPID from /proc/pid/status. Returns -1 if not + found. */ +extern int linux_proc_get_tgid (int lwpid); + +/* linux-nat functions for handling fork events. */ +extern void linux_enable_event_reporting (ptid_t ptid); + +extern int lin_lwp_attach_lwp (ptid_t ptid); /* 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); + +/* Create a prototype generic GNU/Linux target. The client can + override it with local methods. */ +struct target_ops * linux_target (void); + +/* Create a generic GNU/Linux target using traditional + ptrace register access. */ +struct target_ops * +linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int)); + +/* Register the customized GNU/Linux target. This should be used + instead of calling add_target directly. */ +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)); + +/* 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 (*) (struct siginfo *, + gdb_byte *, + int)); + +/* 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); + +/* Compute and return the processor core of a given thread. */ +int linux_nat_core_of_thread_1 (ptid_t ptid);