source: rtems/c/src/librdbg/include/rdbg/servrpc.h @ df49c60

4.104.114.84.95
Last change on this file since df49c60 was 981b99f, checked in by Joel Sherrill <joel.sherrill@…>, on 08/10/99 at 16:41:44

Patch from Eric Valette <valette@…> and Emmanuel Raguet
<raguet@…>:

  • the dec21140 driver code has been hardened (various bug fixed) Emmanuel,
  • bug in the mcp750 init code have been fixed (interrupt stack/initial stack initialization), BSS correctly cleared (Eric V)
  • remote debugging over TCP/IP is nearly complete (berakpoints, backtrace, variables,...) (Eric V),
  • exception handling code has also been improved in order to fully support RDBG requirements (Eric V),
  • Property mode set to 100644
File size: 10.4 KB
RevLine 
[981b99f]1/*
2 * $Id$
3 */
[4721cf1]4
5#ifndef SERVRPC_H
6#define SERVRPC_H
7
8
9#include <rtems/system.h>
10#include <rtems/score/cpu.h>
11
12#include <signal.h>             
13#include <stdio.h>             
14#include <stdlib.h>             
15#include <string.h>             
16
17#include <rpc/types.h>         
18#include <rdbg/remdeb.h>       
19#include <rpc/rpc.h>           
20#include <rpc/svc.h>           
21
22extern int CONN_LIST_INC;
23extern int PID_LIST_INC;
24extern int TSP_RETRIES;
25extern int BackPort;
26extern char ActName[];
27extern int getId();
28
29
30#ifdef DDEBUG
31int   rdb_debug;                /* True if env var RDB_DEBUG defined */
32extern const char* PtraceNames[]; /* list of ptrace requests for debug out */
33extern const char* BmsgNames[]; /* list of BMSG_xxx names */
34extern const char* PtraceName(int req);
35
[981b99f]36#ifdef i386                     /* low-high machine such as 386 */
37#define HL_W(w)         (((UINT16)(w)>>8)+((((w)&0xFF)<<8)))
38#define HL_D(d)         (((UINT32)(d)>>24)+(((d)&0x00FF0000)>>8) \
39                       +(((d)&0xFF00)<<8)+(((d)&0xFF)<<24))
40#else
41#define HL_W(w)         w
42#define HL_D(d)         d
43#endif
44
[4721cf1]45# define DPRINTF(a)     (rdb_debug ? printk ("%d >>> ", getId()), printk a : 0)
46#else
47# define DPRINTF(a)             /* suppress */
48#endif
49
50  /* Macros for analyzing/creating process status values. Presently do
51        not need to be separated per target. Could even use WIF... */
52
53#define STS_SIGNALLED(status)   (((status) & 0xFF) == 0x7F)
54#define STS_TERMONSIG(status)   (((status) & 0xFF) && !STS_SIGNALLED(status))
55#define STS_TERMGETSIG(status)  ((status) & 0x7F)
56#define STS_MAKESIG(sig)        (((sig) << 8) | 0x7f)
57#define STS_GETSIG(status)      ((status) >> 8)
58#define STS_GETCODE(status)     ((status) >> 8)
59
60
61/* now define base types */
62#ifndef UCHAR_DEFINED
63#define UCHAR_DEFINED           /* to handle duplicate typedes */
64typedef unsigned char   UCHAR;
65typedef unsigned char   UINT8;
66typedef char            INT8;
67typedef unsigned short  UINT16;
68typedef short           INT16;
69typedef unsigned long   UINT32;
70typedef long            INT32;
71#endif                          /* UCHAR_DEFINED */
72
73typedef long            PID;    /* generalized process id */
74
75#ifndef True
76# define True   1
77# define False  0
78typedef char Boolean;           
79#endif
80
81#define MAX_FILENAME    1024    /* largest filename with path */
82#define MAX_SEND        5       /* up to 5 pended outbound messages */
83
84#define SERVER_VERS     1
85
86typedef enum
87{                               /* message types */
88  BMSG_WARM=1,                  /* warm test for network connection */
89  BMSG_WAIT,                    /* wait change (stopped/started) */
90  BMSG_BREAK,                   /* breakpoint changed */
91  BMSG_EXEC_FAIL,               /* exec failed from spawn */
92  BMSG_DETACH,                  /* process detached from server */
93  BMSG_KILLED,                  /* killed by server */
94  BMSG_NOT_PRIM,                /* no longer the primary owner */
95  BMSG_NEW_PID                  /* the process was restart with new pid (in
96                                   context). Same ownership rules.   */
97} BACK_MSG;
98
99typedef struct
100{                               /* this is the break_list[0] entry of pid */
101  UCHAR         clr_step;       /* true if step off break in last_break */
102  UCHAR         pad1;           /* Set if STEPEMUL breakpoints exist */
103  UINT16        last_break;     /* last breakpoint we stopped on (if break) */
104  UINT32        range_start;    /* start address of range */
105  UINT32        range_end;      /* end address inclusive */
106} BASE_BREAK;
107
108enum
109{                               /* last start values */
110  LAST_NONE,                    /* stopped already */
111  LAST_STEP,                    /* did a step last - do not send to prim */
112  LAST_CONT,                    /* did a continue last */
113  LAST_RANGE,                   /* in the middle of step-in-range */
114  LAST_STEPOFF,                 /* stepped off break, now need to cont */
115  LAST_KILLED,                  /* was killed by ptrace */
116  LAST_DETACHED                 /* was detached by ptrace */
117};
118#define LAST_START 0x80         /* first execed. This is to handle MiX
119                                   bug where we need to start again */
120
121typedef struct
122{                               /* one per open process */
123  PID           pid;            /* process id (or 0 if free) */
124  int           state;          /* status from last wait if stopped */
125  UCHAR         running;        /* True if running, else stopped/term */
126  /* now connection control over process */
127  UCHAR         owners;         /* count of owners for notify and term release */
128  UCHAR         primary_conn;   /* primary owner connection or 255=none */
129
130  UCHAR         filler;         /* Preserve alignment */
131
132  /* now break control and support */
133  UINT8         last_start;     /* LAST_xx start info for wait() */
134  UINT8         flags;          /* PIDFLG_xxx flags */
135  UINT16        break_alloc;    /* number of entries in break_list */
136  xdr_break     *break_list;    /* list of breakpoints ([0] is BASE_BREAK) */
137  /* now registers and other save information */
138  xdr_regs      regs;           /* saved registers when stopped */
139  int           is_step;        /* Was break or step (regs ambiguous often) */
140  int           stop_wanted;    /* Don't ignore next stop */
141  UINT32        thread;         /* current stopped thread or -1 if none */
142  char          *name;          /* full pathname or NULL if not known */
143  INT32         child;          /* child pid that manages the pid */
144  UINT32        textStart;      /* for relocating breakpoints at restart */
145} PID_LIST;
146PID_LIST        *pid_list;      /* array of processes being managed */
147int             pid_list_cnt;   /* number of entries allocated */
148UINT16          last_break;     /* unique handle generator for breaks */
149#define NO_PRIMARY ((UCHAR)-1)
150
151typedef union
152{                               /* an opaque net address */
153  unsigned long l[4];
154  unsigned char c[16];          /* corresponds to IP, enough for ChIPC */
155} NET_OPAQUE;
156
157typedef struct
158{                               /* one per connection */
159  UCHAR         in_use;         /* True if in use */
160  UCHAR         debug_type;     /* type of connection */
161  UINT16        flags;          /* flags for connection (CFLG_xxx) */
162  NET_OPAQUE    sender;         /* opaque address for transport compare */
163  NET_OPAQUE    back_port;      /* opaque address for transport event msgs */
164  NET_OPAQUE    route;          /* optional route address */
165  UINT32        pid_map[10];    /* map of pids owned relative to pid list */
166                                /* this allows up to 320 pids to be managed */
167  UCHAR         last_msg_num;   /* msg number used last to handle multi-send */
168  /* next field associated with UDP send messages */
169  UCHAR         retry;          /* count of retries. If 0, ok. If not 0, we
170                                   are in active wait for reply to an event */
171  UCHAR         send_idx;       /* current number of send's pended */
172  struct SEND_LIST
173  {                             /* holds pending msgs */
174    UCHAR       send_type;      /* BMSG_xxx type of message */
175    UCHAR       retry;          /* number of times to retry */
176    UINT16      spec;           /* spec field */
177    PID         pid;            /* pid if applies */
178    UINT32      context;        /* additional context if needed */
179  }             send_list[MAX_SEND]; /* pended list of messages being sent */
180  char          user_name[NAMEMAX]; /* name of user connecting in */
181  /* next fields are managed at runtime to handle lists, command upload, and
182     command download.                                                  */
183  enum {LST_NONE, LST_SPAWN, LST_INFO, LST_CMD_DOWN} list_type;
184  char          *list;          /* curr list we are sending/getting (malloced) */
185  UINT16        list_sz;        /* size of current list (string len) */
186  UINT16        list_num;       /* number of current list or position */
187  UINT16        list_alloc;     /* amount allocated so far */
188  UINT16        list_save;      /* used internally */
189} CONN_LIST;
190CONN_LIST       *conn_list;     /* an array of connections */
191int             conn_list_cnt;  /* number allocated */
192
193    /* Operations over the PID map. Each indexes into long and then bit */
194    /* 5 is log2 of 32, the number of bits in an int */
195#define PIDMAP_TEST(conn,idx) \
196    (conn_list [conn].pid_map [(idx) >> 5] & (1 << ((idx) & 31)))
197
198#define PIDMAP_SET(conn,idx) \
199    (conn_list [conn].pid_map [(idx) >> 5] |= 1 << ((idx) & 31))
200
201#define PIDMAP_CLEAR(conn,idx) \
202    (conn_list [conn].pid_map [(idx) >> 5] &= ~(1 << ((idx) &31)))
203
204#define PROC_TERMINATED(plst) \
205    (!(plst)->running && !STS_SIGNALLED ((plst)->state))
206
207
208/* first define the Connection routines exported from servcon.c */
209
210int ConnCreate  (struct svc_req *rqstp, open_in *in);
211void ConnDelete (int conn_idx, struct svc_req *rqstp, close_control control);
212
213void    TspInit (int rpc_io_channel);
214Boolean TspTranslateRpcAddr     (struct svc_req *rqstp, NET_OPAQUE *opaque);
215Boolean TspValidateAddr (NET_OPAQUE *opaque, NET_OPAQUE *sender);
216int     TspConnGetIndex (struct svc_req *rqstp);
217
218void    TspSendWaitChange  (int conn_idx, BACK_MSG msg, UINT16 spec, PID pid,
219                            UINT32 context, Boolean force);
220void    TspSendMessage     (int conn_idx, Boolean resend);
221void    TspMessageReceive  (int conn_idx, PID pid);
222char*   TspGetHostName     (int conn_idx);
223void    TgtCreateNew       (PID pid, int conn_idx, INT32 child,
224                            char *name, Boolean spawn);
225Boolean TgtAttach          (int conn_idx, PID pid);
226void    TgtNotifyWaitChange(PID pid, int status, Boolean exclude);
227void    TgtNotifyAll       (int pid_idx, BACK_MSG msg, UINT16 spec,
228                            UINT32 context, int exclude_conn, Boolean force);
229void    TgtDelete          (PID_LIST*, int conn_idx, BACK_MSG notify);
230int     TgtKillAndDelete   (PID_LIST *plst, struct svc_req *rqstp, Boolean term);
231void    TgtDetachCon       (int conn_idx, int pid_idx, Boolean delete);
232int     TgtThreadList      (PID_LIST*, unsigned* buf, unsigned int size);
233int     TgtGetThreadName   (PID_LIST*, unsigned thLi, char* name);
234int     TgtPtrace          (int req, PID pid, char *addr, int data, void *addr2);
235int     TgtRealPtrace      (int req, PID pid, char *addr, int data, void *addr2);
236Boolean TgtHandleChildChange(PID pid, int* status, int* unexp,
237                             CPU_Exception_frame *ctx);
238#ifdef DDEBUG
239  /* TgtDbgPtrace is a wrapper for RealPtrace() doing traces */
240int     TgtDbgPtrace       (int req, PID pid, char *addr, int data, void *addr2);
241#endif
242
243
244/* Information stored in "handle" */
245#define BKPT_INACTIVE   1       /* bkpt inactive for this execution */
246#define BKPT_ACTIVE     0       /* bkpt active for this execution */
247
248int     BreakOverwrite  (const PID_LIST* plst,const char* addr,
249                         unsigned int size);
250int     BreakSet        (PID_LIST*, int conn_idx, xdr_break*);
251int     BreakSetAt      (PID_LIST*, int conn_idx, unsigned long addr,break_type);
252int     BreakClear      (PID_LIST*, int conn_idx, int handle);
253int     BreakGetIndex   (PID_LIST*, void* addr);
254int     BreakGet        (const PID_LIST*, int data, xdr_break*);
255void    BreakHide       (const PID_LIST*, void*, int, void*);
256int     BreakStepOff    (const PID_LIST*, void** paddr2);
257void    BreakSteppedOff (PID_LIST*);
258int     BreakRespawn    (PID_LIST*);
259int     BreakIdentify   (PID_LIST*, int adjust, int thread);
260void    BreakPcChanged  (PID_LIST*);
261int     BreakStepRange  (PID_LIST*, void* addr, int len);
262void    BreaksDisable   (int pid);
263void    BreaksEnable    (int pid);
264
265int     TgtBreakRestoreOrig (int pid, void* addr, void* addr2);
266void    TgtBreakCancelStep  (PID_LIST* plst);
267
268Boolean ListAlloc       (char *buff, CONN_LIST *clst);
269int     FindPidEntry    (int pid);
270
271open_out*    RPCGENSRVNAME(open_connex_2_svc)    (open_in *in,
272                                                 struct svc_req *rqstp);
273signal_out*  RPCGENSRVNAME(send_signal_2_svc)    (signal_in *in,
274                                                 struct svc_req *rqstp);
275ptrace_out*  RPCGENSRVNAME(ptrace_2_svc)         (ptrace_in *in,
276                                                 struct svc_req *rqstp);
277wait_out*    RPCGENSRVNAME(wait_info_2_svc)      (wait_in *in,
278                                                 struct svc_req *rqstp);
279#endif /* !SERVRPC_H */
280
Note: See TracBrowser for help on using the repository browser.