2001-10-04 Frank Ch. Eigler <fche@redhat.com>
[binutils-gdb.git] / gdb / target.h
index d007bbab4786dfe3eaf4a1a4d5785de2d98f0107..7c97ba619d3465e2985e2f533a0b6c2f11ffd6ef 100644 (file)
@@ -1,5 +1,6 @@
 /* Interface between GDB and target environments, including files and processes
 /* Interface between GDB and target environments, including files and processes
-   Copyright 1990-1994, 1999, 2000, 2001 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+   2000, 2001 Free Software Foundation, Inc.
    Contributed by Cygnus Support.  Written by John Gilmore.
 
    This file is part of GDB.
    Contributed by Cygnus Support.  Written by John Gilmore.
 
    This file is part of GDB.
@@ -123,149 +124,6 @@ enum target_waitkind
     TARGET_WAITKIND_IGNORE
   };
 
     TARGET_WAITKIND_IGNORE
   };
 
-/* The numbering of these signals is chosen to match traditional unix
-   signals (insofar as various unices use the same numbers, anyway).
-   It is also the numbering of the GDB remote protocol.  Other remote
-   protocols, if they use a different numbering, should make sure to
-   translate appropriately.
-
-   Since these numbers have actually made it out into other software
-   (stubs, etc.), you mustn't disturb the assigned numbering.  If you
-   need to add new signals here, add them to the end of the explicitly
-   numbered signals.
-
-   This is based strongly on Unix/POSIX signals for several reasons:
-   (1) This set of signals represents a widely-accepted attempt to
-   represent events of this sort in a portable fashion, (2) we want a
-   signal to make it from wait to child_wait to the user intact, (3) many
-   remote protocols use a similar encoding.  However, it is
-   recognized that this set of signals has limitations (such as not
-   distinguishing between various kinds of SIGSEGV, or not
-   distinguishing hitting a breakpoint from finishing a single step).
-   So in the future we may get around this either by adding additional
-   signals for breakpoint, single-step, etc., or by adding signal
-   codes; the latter seems more in the spirit of what BSD, System V,
-   etc. are doing to address these issues.  */
-
-/* For an explanation of what each signal means, see
-   target_signal_to_string.  */
-
-enum target_signal
-  {
-    /* Used some places (e.g. stop_signal) to record the concept that
-       there is no signal.  */
-    TARGET_SIGNAL_0 = 0,
-    TARGET_SIGNAL_FIRST = 0,
-    TARGET_SIGNAL_HUP = 1,
-    TARGET_SIGNAL_INT = 2,
-    TARGET_SIGNAL_QUIT = 3,
-    TARGET_SIGNAL_ILL = 4,
-    TARGET_SIGNAL_TRAP = 5,
-    TARGET_SIGNAL_ABRT = 6,
-    TARGET_SIGNAL_EMT = 7,
-    TARGET_SIGNAL_FPE = 8,
-    TARGET_SIGNAL_KILL = 9,
-    TARGET_SIGNAL_BUS = 10,
-    TARGET_SIGNAL_SEGV = 11,
-    TARGET_SIGNAL_SYS = 12,
-    TARGET_SIGNAL_PIPE = 13,
-    TARGET_SIGNAL_ALRM = 14,
-    TARGET_SIGNAL_TERM = 15,
-    TARGET_SIGNAL_URG = 16,
-    TARGET_SIGNAL_STOP = 17,
-    TARGET_SIGNAL_TSTP = 18,
-    TARGET_SIGNAL_CONT = 19,
-    TARGET_SIGNAL_CHLD = 20,
-    TARGET_SIGNAL_TTIN = 21,
-    TARGET_SIGNAL_TTOU = 22,
-    TARGET_SIGNAL_IO = 23,
-    TARGET_SIGNAL_XCPU = 24,
-    TARGET_SIGNAL_XFSZ = 25,
-    TARGET_SIGNAL_VTALRM = 26,
-    TARGET_SIGNAL_PROF = 27,
-    TARGET_SIGNAL_WINCH = 28,
-    TARGET_SIGNAL_LOST = 29,
-    TARGET_SIGNAL_USR1 = 30,
-    TARGET_SIGNAL_USR2 = 31,
-    TARGET_SIGNAL_PWR = 32,
-    /* Similar to SIGIO.  Perhaps they should have the same number.  */
-    TARGET_SIGNAL_POLL = 33,
-    TARGET_SIGNAL_WIND = 34,
-    TARGET_SIGNAL_PHONE = 35,
-    TARGET_SIGNAL_WAITING = 36,
-    TARGET_SIGNAL_LWP = 37,
-    TARGET_SIGNAL_DANGER = 38,
-    TARGET_SIGNAL_GRANT = 39,
-    TARGET_SIGNAL_RETRACT = 40,
-    TARGET_SIGNAL_MSG = 41,
-    TARGET_SIGNAL_SOUND = 42,
-    TARGET_SIGNAL_SAK = 43,
-    TARGET_SIGNAL_PRIO = 44,
-    TARGET_SIGNAL_REALTIME_33 = 45,
-    TARGET_SIGNAL_REALTIME_34 = 46,
-    TARGET_SIGNAL_REALTIME_35 = 47,
-    TARGET_SIGNAL_REALTIME_36 = 48,
-    TARGET_SIGNAL_REALTIME_37 = 49,
-    TARGET_SIGNAL_REALTIME_38 = 50,
-    TARGET_SIGNAL_REALTIME_39 = 51,
-    TARGET_SIGNAL_REALTIME_40 = 52,
-    TARGET_SIGNAL_REALTIME_41 = 53,
-    TARGET_SIGNAL_REALTIME_42 = 54,
-    TARGET_SIGNAL_REALTIME_43 = 55,
-    TARGET_SIGNAL_REALTIME_44 = 56,
-    TARGET_SIGNAL_REALTIME_45 = 57,
-    TARGET_SIGNAL_REALTIME_46 = 58,
-    TARGET_SIGNAL_REALTIME_47 = 59,
-    TARGET_SIGNAL_REALTIME_48 = 60,
-    TARGET_SIGNAL_REALTIME_49 = 61,
-    TARGET_SIGNAL_REALTIME_50 = 62,
-    TARGET_SIGNAL_REALTIME_51 = 63,
-    TARGET_SIGNAL_REALTIME_52 = 64,
-    TARGET_SIGNAL_REALTIME_53 = 65,
-    TARGET_SIGNAL_REALTIME_54 = 66,
-    TARGET_SIGNAL_REALTIME_55 = 67,
-    TARGET_SIGNAL_REALTIME_56 = 68,
-    TARGET_SIGNAL_REALTIME_57 = 69,
-    TARGET_SIGNAL_REALTIME_58 = 70,
-    TARGET_SIGNAL_REALTIME_59 = 71,
-    TARGET_SIGNAL_REALTIME_60 = 72,
-    TARGET_SIGNAL_REALTIME_61 = 73,
-    TARGET_SIGNAL_REALTIME_62 = 74,
-    TARGET_SIGNAL_REALTIME_63 = 75,
-
-    /* Used internally by Solaris threads.  See signal(5) on Solaris.  */
-    TARGET_SIGNAL_CANCEL = 76,
-
-    /* Yes, this pains me, too.  But LynxOS didn't have SIG32, and now
-       Linux does, and we can't disturb the numbering, since it's part
-       of the protocol.  Note that in some GDB's TARGET_SIGNAL_REALTIME_32
-       is number 76.  */
-    TARGET_SIGNAL_REALTIME_32,
-    /* Yet another pain, IRIX 6 has SIG64.  */
-    TARGET_SIGNAL_REALTIME_64,
-
-#if defined(MACH) || defined(__MACH__)
-    /* Mach exceptions */
-    TARGET_EXC_BAD_ACCESS,
-    TARGET_EXC_BAD_INSTRUCTION,
-    TARGET_EXC_ARITHMETIC,
-    TARGET_EXC_EMULATION,
-    TARGET_EXC_SOFTWARE,
-    TARGET_EXC_BREAKPOINT,
-#endif
-    TARGET_SIGNAL_INFO,
-
-    /* Some signal we don't know about.  */
-    TARGET_SIGNAL_UNKNOWN,
-
-    /* Use whatever signal we use when one is not specifically specified
-       (for passing to proceed and so on).  */
-    TARGET_SIGNAL_DEFAULT,
-
-    /* Last and unused enum value, for sizing arrays, etc.  */
-    TARGET_SIGNAL_LAST
-  };
-
 struct target_waitstatus
   {
     enum target_waitkind kind;
 struct target_waitstatus
   {
     enum target_waitkind kind;
@@ -338,9 +196,9 @@ struct target_ops
     void (*to_require_attach) (char *, int);
     void (*to_detach) (char *, int);
     void (*to_require_detach) (int, char *, int);
     void (*to_require_attach) (char *, int);
     void (*to_detach) (char *, int);
     void (*to_require_detach) (int, char *, int);
-    void (*to_resume) (int, int, enum target_signal);
-    int (*to_wait) (int, struct target_waitstatus *);
-    void (*to_post_wait) (int, int);
+    void (*to_resume) (ptid_t, int, enum target_signal);
+    ptid_t (*to_wait) (ptid_t, struct target_waitstatus *);
+    void (*to_post_wait) (ptid_t, int);
     void (*to_fetch_registers) (int);
     void (*to_store_registers) (int);
     void (*to_prepare_to_store) (void);
     void (*to_fetch_registers) (int);
     void (*to_store_registers) (int);
     void (*to_prepare_to_store) (void);
@@ -403,7 +261,7 @@ struct target_ops
     void (*to_load) (char *, int);
     int (*to_lookup_symbol) (char *, CORE_ADDR *);
     void (*to_create_inferior) (char *, char *, char **);
     void (*to_load) (char *, int);
     int (*to_lookup_symbol) (char *, CORE_ADDR *);
     void (*to_create_inferior) (char *, char *, char **);
-    void (*to_post_startup_inferior) (int);
+    void (*to_post_startup_inferior) (ptid_t);
     void (*to_acknowledge_created_inferior) (int);
     void (*to_clone_and_follow_inferior) (int, int *);
     void (*to_post_follow_inferior_by_clone) (void);
     void (*to_acknowledge_created_inferior) (int);
     void (*to_clone_and_follow_inferior) (int, int *);
     void (*to_post_follow_inferior_by_clone) (void);
@@ -423,10 +281,10 @@ struct target_ops
     int (*to_has_exited) (int, int, int *);
     void (*to_mourn_inferior) (void);
     int (*to_can_run) (void);
     int (*to_has_exited) (int, int, int *);
     void (*to_mourn_inferior) (void);
     int (*to_can_run) (void);
-    void (*to_notice_signals) (int pid);
-    int (*to_thread_alive) (int pid);
+    void (*to_notice_signals) (ptid_t ptid);
+    int (*to_thread_alive) (ptid_t ptid);
     void (*to_find_new_threads) (void);
     void (*to_find_new_threads) (void);
-    char *(*to_pid_to_str) (int);
+    char *(*to_pid_to_str) (ptid_t);
     char *(*to_extra_thread_info) (struct thread_info *);
     void (*to_stop) (void);
     int (*to_query) (int /*char */ , char *, char *, int *);
     char *(*to_extra_thread_info) (struct thread_info *);
     void (*to_stop) (void);
     int (*to_query) (int /*char */ , char *, char *, int *);
@@ -436,7 +294,6 @@ struct target_ops
                                                             int);
     struct exception_event_record *(*to_get_current_exception_event) (void);
     char *(*to_pid_to_exec_file) (int pid);
                                                             int);
     struct exception_event_record *(*to_get_current_exception_event) (void);
     char *(*to_pid_to_exec_file) (int pid);
-    char *(*to_core_file_to_sym_file) (char *);
     enum strata to_stratum;
     struct target_ops
      *DONT_USE;                        /* formerly to_next */
     enum strata to_stratum;
     struct target_ops
      *DONT_USE;                        /* formerly to_next */
@@ -564,18 +421,18 @@ extern void target_detach (char *, int);
 #define target_require_detach(pid, args, from_tty)     \
      (*current_target.to_require_detach) (pid, args, from_tty)
 
 #define target_require_detach(pid, args, from_tty)     \
      (*current_target.to_require_detach) (pid, args, from_tty)
 
-/* Resume execution of the target process PID.  STEP says whether to
+/* Resume execution of the target process PTID.  STEP says whether to
    single-step or to run free; SIGGNAL is the signal to be given to
    the target, or TARGET_SIGNAL_0 for no signal.  The caller may not
    pass TARGET_SIGNAL_DEFAULT.  */
 
    single-step or to run free; SIGGNAL is the signal to be given to
    the target, or TARGET_SIGNAL_0 for no signal.  The caller may not
    pass TARGET_SIGNAL_DEFAULT.  */
 
-#define        target_resume(pid, step, siggnal)                               \
+#define        target_resume(ptid, step, siggnal)                              \
   do {                                                                 \
     dcache_invalidate(target_dcache);                                  \
   do {                                                                 \
     dcache_invalidate(target_dcache);                                  \
-    (*current_target.to_resume) (pid, step, siggnal);                  \
+    (*current_target.to_resume) (ptid, step, siggnal);                 \
   } while (0)
 
   } while (0)
 
-/* Wait for process pid to do something.  Pid = -1 to wait for any pid
+/* Wait for process pid to do something.  PTID = -1 to wait for any pid
    to do something.  Return pid of child, or -1 in case of error;
    store status through argument pointer STATUS.  Note that it is
    *not* OK to return_to_top_level out of target_wait without popping
    to do something.  Return pid of child, or -1 in case of error;
    store status through argument pointer STATUS.  Note that it is
    *not* OK to return_to_top_level out of target_wait without popping
@@ -583,8 +440,8 @@ extern void target_detach (char *, int);
    to the prompt with a debugging target but without the frame cache,
    stop_pc, etc., set up.  */
 
    to the prompt with a debugging target but without the frame cache,
    stop_pc, etc., set up.  */
 
-#define        target_wait(pid, status)                \
-     (*current_target.to_wait) (pid, status)
+#define        target_wait(ptid, status)               \
+     (*current_target.to_wait) (ptid, status)
 
 /* The target_wait operation waits for a process event to occur, and
    thereby stop the process.
 
 /* The target_wait operation waits for a process event to occur, and
    thereby stop the process.
@@ -596,10 +453,10 @@ extern void target_detach (char *, int);
    This operation provides a target-specific hook that allows the
    necessary bookkeeping to be performed to track such sequences.  */
 
    This operation provides a target-specific hook that allows the
    necessary bookkeeping to be performed to track such sequences.  */
 
-#define target_post_wait(pid, status) \
-     (*current_target.to_post_wait) (pid, status)
+#define target_post_wait(ptid, status) \
+     (*current_target.to_post_wait) (ptid, status)
 
 
-/* Fetch register REGNO, or all regs if regno == -1.  No result.  */
+/* Fetch at least register REGNO, or all regs if regno == -1.  No result.  */
 
 #define        target_fetch_registers(regno)   \
      (*current_target.to_fetch_registers) (regno)
 
 #define        target_fetch_registers(regno)   \
      (*current_target.to_fetch_registers) (regno)
@@ -657,9 +514,9 @@ extern char *child_core_file_to_sym_file (char *);
 extern void child_post_attach (int);
 #endif
 
 extern void child_post_attach (int);
 #endif
 
-extern void child_post_wait (int, int);
+extern void child_post_wait (ptid_t, int);
 
 
-extern void child_post_startup_inferior (int);
+extern void child_post_startup_inferior (ptid_t);
 
 extern void child_acknowledge_created_inferior (int);
 
 
 extern void child_acknowledge_created_inferior (int);
 
@@ -697,7 +554,7 @@ extern int child_has_syscall_event (int, enum target_waitkind *, int *);
 
 extern int child_has_exited (int, int, int *);
 
 
 extern int child_has_exited (int, int, int *);
 
-extern int child_thread_alive (int);
+extern int child_thread_alive (ptid_t);
 
 /* From exec.c */
 
 
 /* From exec.c */
 
@@ -783,7 +640,7 @@ extern void target_load (char *arg, int from_tty);
 #define target_lookup_symbol(name, addrp) \
      (*current_target.to_lookup_symbol) (name, addrp)
 
 #define target_lookup_symbol(name, addrp) \
      (*current_target.to_lookup_symbol) (name, addrp)
 
-/* Start an inferior process and set inferior_pid to its pid.
+/* Start an inferior process and set inferior_ptid to its pid.
    EXEC_FILE is the file to run.
    ALLARGS is a string containing the arguments to the program.
    ENV is the environment vector to pass.  Errors reported with error().
    EXEC_FILE is the file to run.
    ALLARGS is a string containing the arguments to the program.
    ENV is the environment vector to pass.  Errors reported with error().
@@ -803,8 +660,8 @@ extern void target_load (char *arg, int from_tty);
 
    Such targets will supply an appropriate definition for this function.  */
 
 
    Such targets will supply an appropriate definition for this function.  */
 
-#define target_post_startup_inferior(pid) \
-     (*current_target.to_post_startup_inferior) (pid)
+#define target_post_startup_inferior(ptid) \
+     (*current_target.to_post_startup_inferior) (ptid)
 
 /* On some targets, the sequence of starting up an inferior requires
    some synchronization between gdb and the new inferior process, PID.  */
 
 /* On some targets, the sequence of starting up an inferior requires
    some synchronization between gdb and the new inferior process, PID.  */
@@ -946,13 +803,13 @@ extern void target_load (char *arg, int from_tty);
 
 /* post process changes to signal handling in the inferior.  */
 
 
 /* post process changes to signal handling in the inferior.  */
 
-#define target_notice_signals(pid) \
-     (*current_target.to_notice_signals) (pid)
+#define target_notice_signals(ptid) \
+     (*current_target.to_notice_signals) (ptid)
 
 /* Check to see if a thread is still alive.  */
 
 
 /* Check to see if a thread is still alive.  */
 
-#define target_thread_alive(pid) \
-     (*current_target.to_thread_alive) (pid)
+#define target_thread_alive(ptid) \
+     (*current_target.to_thread_alive) (ptid)
 
 /* Query for new threads and add them to the thread list.  */
 
 
 /* Query for new threads and add them to the thread list.  */
 
@@ -1087,7 +944,7 @@ extern void target_link (char *, CORE_ADDR *);
 #ifndef target_tid_to_str
 #define target_tid_to_str(PID) \
      target_pid_to_str (PID)
 #ifndef target_tid_to_str
 #define target_tid_to_str(PID) \
      target_pid_to_str (PID)
-extern char *normal_pid_to_str (int pid);
+extern char *normal_pid_to_str (ptid_t ptid);
 #endif
 
 /* Return a short string describing extra information about PID,
 #endif
 
 /* Return a short string describing extra information about PID,
@@ -1393,21 +1250,7 @@ extern void push_remote_target (char *name, int from_tty);
 \f
 /* Imported from machine dependent code */
 
 \f
 /* Imported from machine dependent code */
 
-#ifndef SOFTWARE_SINGLE_STEP_P
-#define SOFTWARE_SINGLE_STEP_P 0
-#define SOFTWARE_SINGLE_STEP(sig,bp_p) \
-     (internal_error ("SOFTWARE_SINGLE_STEP"), 0)
-#endif /* SOFTWARE_SINGLE_STEP_P */
-
 /* Blank target vector entries are initialized to target_ignore. */
 void target_ignore (void);
 
 /* Blank target vector entries are initialized to target_ignore. */
 void target_ignore (void);
 
-/* Macro for getting target's idea of a frame pointer.
-   FIXME: GDB's whole scheme for dealing with "frames" and
-   "frame pointers" needs a serious shakedown.  */
-#ifndef TARGET_VIRTUAL_FRAME_POINTER
-#define TARGET_VIRTUAL_FRAME_POINTER(ADDR, REGP, OFFP) \
-   do { *(REGP) = FP_REGNUM; *(OFFP) =  0; } while (0)
-#endif /* TARGET_VIRTUAL_FRAME_POINTER */
-
 #endif /* !defined (TARGET_H) */
 #endif /* !defined (TARGET_H) */