xref: /openbsd-src/gnu/usr.bin/binutils/gdb/gdbserver/linux-low.h (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis /* Internal interfaces for the GNU/Linux specific target code for gdbserver.
2*b725ae77Skettenis    Copyright 2002, 2004 Free Software Foundation, Inc.
3*b725ae77Skettenis 
4*b725ae77Skettenis    This file is part of GDB.
5*b725ae77Skettenis 
6*b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
7*b725ae77Skettenis    it under the terms of the GNU General Public License as published by
8*b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
9*b725ae77Skettenis    (at your option) any later version.
10*b725ae77Skettenis 
11*b725ae77Skettenis    This program is distributed in the hope that it will be useful,
12*b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*b725ae77Skettenis    GNU General Public License for more details.
15*b725ae77Skettenis 
16*b725ae77Skettenis    You should have received a copy of the GNU General Public License
17*b725ae77Skettenis    along with this program; if not, write to the Free Software
18*b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
19*b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
20*b725ae77Skettenis 
21*b725ae77Skettenis #ifdef HAVE_LINUX_REGSETS
22*b725ae77Skettenis typedef void (*regset_fill_func) (void *);
23*b725ae77Skettenis typedef void (*regset_store_func) (const void *);
24*b725ae77Skettenis enum regset_type {
25*b725ae77Skettenis   GENERAL_REGS,
26*b725ae77Skettenis   FP_REGS,
27*b725ae77Skettenis   EXTENDED_REGS,
28*b725ae77Skettenis };
29*b725ae77Skettenis 
30*b725ae77Skettenis struct regset_info
31*b725ae77Skettenis {
32*b725ae77Skettenis   int get_request, set_request;
33*b725ae77Skettenis   int size;
34*b725ae77Skettenis   enum regset_type type;
35*b725ae77Skettenis   regset_fill_func fill_function;
36*b725ae77Skettenis   regset_store_func store_function;
37*b725ae77Skettenis };
38*b725ae77Skettenis extern struct regset_info target_regsets[];
39*b725ae77Skettenis #endif
40*b725ae77Skettenis 
41*b725ae77Skettenis struct linux_target_ops
42*b725ae77Skettenis {
43*b725ae77Skettenis   int num_regs;
44*b725ae77Skettenis   int *regmap;
45*b725ae77Skettenis   int (*cannot_fetch_register) (int);
46*b725ae77Skettenis 
47*b725ae77Skettenis   /* Returns 0 if we can store the register, 1 if we can not
48*b725ae77Skettenis      store the register, and 2 if failure to store the register
49*b725ae77Skettenis      is acceptable.  */
50*b725ae77Skettenis   int (*cannot_store_register) (int);
51*b725ae77Skettenis   CORE_ADDR (*get_pc) (void);
52*b725ae77Skettenis   void (*set_pc) (CORE_ADDR newpc);
53*b725ae77Skettenis   const char *breakpoint;
54*b725ae77Skettenis   int breakpoint_len;
55*b725ae77Skettenis   CORE_ADDR (*breakpoint_reinsert_addr) (void);
56*b725ae77Skettenis 
57*b725ae77Skettenis 
58*b725ae77Skettenis   int decr_pc_after_break;
59*b725ae77Skettenis   int (*breakpoint_at) (CORE_ADDR pc);
60*b725ae77Skettenis };
61*b725ae77Skettenis 
62*b725ae77Skettenis extern struct linux_target_ops the_low_target;
63*b725ae77Skettenis 
64*b725ae77Skettenis #define get_process(inf) ((struct process_info *)(inf))
65*b725ae77Skettenis #define get_thread_process(thr) (get_process (inferior_target_data (thr)))
66*b725ae77Skettenis #define get_process_thread(proc) ((struct thread_info *) \
67*b725ae77Skettenis 				  find_inferior_id (&all_threads, \
68*b725ae77Skettenis 				  get_process (proc)->tid))
69*b725ae77Skettenis 
70*b725ae77Skettenis struct process_info
71*b725ae77Skettenis {
72*b725ae77Skettenis   struct inferior_list_entry head;
73*b725ae77Skettenis   int thread_known;
74*b725ae77Skettenis   int lwpid;
75*b725ae77Skettenis   int tid;
76*b725ae77Skettenis 
77*b725ae77Skettenis   /* If this flag is set, the next SIGSTOP will be ignored (the process will
78*b725ae77Skettenis      be immediately resumed).  */
79*b725ae77Skettenis   int stop_expected;
80*b725ae77Skettenis 
81*b725ae77Skettenis   /* If this flag is set, the process is known to be stopped right now (stop
82*b725ae77Skettenis      event already received in a wait()).  */
83*b725ae77Skettenis   int stopped;
84*b725ae77Skettenis 
85*b725ae77Skettenis   /* If this flag is set, we have sent a SIGSTOP to this process and are
86*b725ae77Skettenis      waiting for it to stop.  */
87*b725ae77Skettenis   int sigstop_sent;
88*b725ae77Skettenis 
89*b725ae77Skettenis   /* If this flag is set, STATUS_PENDING is a waitstatus that has not yet
90*b725ae77Skettenis      been reported.  */
91*b725ae77Skettenis   int status_pending_p;
92*b725ae77Skettenis   int status_pending;
93*b725ae77Skettenis 
94*b725ae77Skettenis   /* If this flag is set, the pending status is a (GDB-placed) breakpoint.  */
95*b725ae77Skettenis   int pending_is_breakpoint;
96*b725ae77Skettenis   CORE_ADDR pending_stop_pc;
97*b725ae77Skettenis 
98*b725ae77Skettenis   /* If this is non-zero, it is a breakpoint to be reinserted at our next
99*b725ae77Skettenis      stop (SIGTRAP stops only).  */
100*b725ae77Skettenis   CORE_ADDR bp_reinsert;
101*b725ae77Skettenis 
102*b725ae77Skettenis   /* If this flag is set, the last continue operation on this process
103*b725ae77Skettenis      was a single-step.  */
104*b725ae77Skettenis   int stepping;
105*b725ae77Skettenis 
106*b725ae77Skettenis   /* If this is non-zero, it points to a chain of signals which need to
107*b725ae77Skettenis      be delivered to this process.  */
108*b725ae77Skettenis   struct pending_signals *pending_signals;
109*b725ae77Skettenis 
110*b725ae77Skettenis   /* A link used when resuming.  It is initialized from the resume request,
111*b725ae77Skettenis      and then processed and cleared in linux_resume_one_process.  */
112*b725ae77Skettenis 
113*b725ae77Skettenis   struct thread_resume *resume;
114*b725ae77Skettenis };
115*b725ae77Skettenis 
116*b725ae77Skettenis extern struct inferior_list all_processes;
117*b725ae77Skettenis 
118*b725ae77Skettenis void linux_attach_lwp (int pid, int tid);
119*b725ae77Skettenis 
120*b725ae77Skettenis int thread_db_init (void);
121