URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [librdbg/] [src/] [remdeb.x] - Rev 1765
Compare with Previous | Blame | View Log
/*
**********************************************************************
*
* Component: RDBG servers
* Module: remdeb.x
*
* Synopsis: XDR definitions for remote debug server RPC calls.
* XDR definitions for RPCGEN to build remote debug server.
*
* remdeb.x,v 1.4 2002/02/01 17:00:01 joel Exp
*
**********************************************************************
*/
#ifdef RPC_SVC
%/*HEADER_START*/
#endif
%#define RTEMS_PORT 2071
%#define RTEMS_BACK_PORT 2073
#ifdef RPC_HDR
%#ifndef REMDEB_H
%#define RPCGENSRVNAME(a) a
#endif
enum rpc_type {
SUNRPC = 0,
BADRPCTYPE = 25
};
const NET_SAFE = 1400; /* this is safe for UDP messages */
struct UDP_MSG
{ /* format of UDP messages (should be in .h) */
unsigned char type; /* type of message (BMSG_xx) */
unsigned char msg_num; /* ringed number for resend detect */
unsigned short spec; /* specific information for type */
long pid; /* process this affects */
unsigned long context; /* specific information to request */
};
/* First we support the overhead structures and types needed for RPC
requests. Then, we have all RPC routines input/output args. */
%/*
% * Sun request values for the remote ptrace system call
% */
%
enum ptracereq
{ /* these match PTRACE_xxx numbers */
RPT_TRACEME = 0, /* 0, by tracee to begin tracing */
RPT_CHILDDONE = 0, /* 0, tracee is done with his half */
RPT_PEEKTEXT, /* 1, read word from text segment */
RPT_PEEKDATA, /* 2, read word from data segment */
RPT_PEEKUSER, /* 3, read word from user struct */
RPT_POKETEXT, /* 4, write word into text segment */
RPT_POKEDATA, /* 5, write word into data segment */
RPT_POKEUSER, /* 6, write word into user struct */
RPT_CONT, /* 7, continue process */
RPT_KILL, /* 8, terminate process */
RPT_SINGLESTEP, /* 9, single step process */
RPT_ATTACH, /* 10, attach to an existing process (returns 2 if not primary)*/
RPT_DETACH, /* 11, detach from a process */
RPT_GETREGS, /* 12, get all registers */
RPT_SETREGS, /* 13, set all registers */
RPT_GETFPREGS, /* 14, get all floating point regs */
RPT_SETFPREGS, /* 15, set all floating point regs */
RPT_READDATA, /* 16, read data segment */
RPT_WRITEDATA, /* 17, write data segment */
RPT_READTEXT, /* 18, read text segment */
RPT_WRITETEXT, /* 19, write text segment */
RPT_GETFPAREGS, /* 20, get all fpa regs */
RPT_SETFPAREGS, /* 21, set all fpa regs */
RPT_22, /* 22, filler */
RPT_23, /* 23, filler */
RPT_SYSCALL, /* 24, trap next sys call */
RPT_DUMPCORE, /* 25, dump process core */
RPT_26, /* 26, filler */
RPT_27, /* 27, filler */
RPT_28, /* 28, filler */
RPT_GETUCODE, /* 29, get u.u_code */
/* Begin specific ptrace options */
RPT_GETTARGETTHREAD = 50, /* get PM target thread identifier */
RPT_SETTARGETTHREAD = 51, /* set PM target thread identifier */
RPT_THREADSUSPEND = 52, /* suspend a thread */
RPT_THREADRESUME = 53, /* resume a thread */
RPT_THREADLIST = 54, /* get list of process's threads */
RPT_GETTHREADNAME = 55, /* get the name of the thread */
RPT_SETTHREADNAME = 56, /* set the name of the thread */
RPT_SETTHREADREGS = 57, /* set all registers for a specific thread*/
RPT_GETTHREADREGS = 58, /* get all registers for a specific thread*/
/* Begin extended ptrace options for remote debug server */
RPT_STEPRANGE = 75, /* step while in range (addr=start, data=len) */
RPT_CONTTO = 76, /* cont from PC to temp break in addr */
RPT_SETBREAK = 77, /* set a breakpoint (addr=break) */
RPT_CLRBREAK = 78, /* clear a breakpoint (data=handle or 0 for all) */
RPT_GETBREAK = 79, /* get breakpoint (data=handle, addr=buffer to
fill). Returns next break. If data=0,
returns number of breaks. */
RPT_GETNAME = 80, /* get name of process (data 0=name, 1=path
as started, 2=fullpath). Return in addr
as mem) */
RPT_STOP = 81, /* (C-actors) Stop the C-actor */
RPT_PGETREGS = 82, /* portable version */
RPT_PSETREGS = 83, /* portable version */
RPT_PSETTHREADREGS = 84, /* portable version */
RPT_PGETTHREADREGS = 85 /* portable version */
};
#include FRONTEND
const MAXDEBUGGEE= 150;
const NAMEMAX = 17;
% /*
% * Memory data for read/write text or data. The size is in data. The target
% * addr is in the addr field.
% * Be careful before modifying because this value goes into internal
% * pipes and is allocated on stack too. Pipes and/or the stack could
% * become too small if this value gets incremented.
% */
const MEM_DATA_MAX = 256;
#ifndef RPC_XDR
struct xdr_mem {
u_long addr;
u_int dataNb;
unsigned char data[MEM_DATA_MAX];
};
#else
/* manually define best XDR function for this */
%bool_t xdr_xdr_mem(xdrs, objp)
% XDR *xdrs;
% struct xdr_mem *objp;
%{
% if (!xdr_u_long(xdrs, &objp->addr)) {
% return (FALSE);
% }
% if (!xdr_u_int(xdrs, &objp->dataNb)) {
% return(FALSE);
% }
% return (xdr_opaque(xdrs, objp->data, objp->dataNb));
%}
#endif
/* Breakpoint structure maps to same structure on host. Do not change one
without changing the other. */
enum break_type
{ /* types of breakpoints */
BRKT_NONE, /* unused entry */
BRKT_INSTR, /* general instruction break */
BRKT_READ, /* read break */
BRKT_WRITE, /* write breakpoint */
BRKT_ACCESS, /* read-or-write break */
BRKT_EXEC, /* execution HW breakpoint */
BRKT_OS_CALL, /* break on OS call, addr is call number */
BRKT_OS_SWITCH, /* dispatch breakpoint */
BRKT_STEPEMUL /* emulate hardware single-step */
};
const MAX_THRD_BRK = 4; /* enough for 128 threads per process */
struct xdr_break
{ /* one per process local breakpoint */
u_char type; /* BRKT_xxx type of break */
u_char thread_spec; /* 0=all, else count of threads it affects */
u_short handle; /* handle of breakpoint returned */
u_long ee_loc; /* address of start */
u_long ee_type; /* type/method of address */
u_short length; /* length of break if range, else 0 */
u_char pass_count; /* pass count to initialize to (0=none) */
u_char curr_pass; /* pass count current value */
u_long thread_list[MAX_THRD_BRK]; /* bit map for thread list */
}; /* 20 bytes+4 per thread_list (4x4=16) = 36 */
const UTHREAD_MAX = 64;
const THREADNAMEMAX = 16;
typedef string thread_name <THREADNAMEMAX>;
struct KernThread {
unsigned int threadLi;
};
#ifndef RPC_XDR
#ifdef RPC_HDR
%typedef KernThread *ptThreadList;
#endif
struct thread_list {
unsigned int nbThread;
ptThreadList threads;
};
#else /* RPC_XDR */
/* must write this function by hand */
%bool_t xdr_thread_list(xdrs, objp)
% XDR *xdrs;
% struct thread_list *objp;
%{
% return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread,
% UTHREAD_MAX, sizeof(KernThread), xdr_KernThread));
%}
#endif /* not RPC_XDR */
union ptrace_addr_data_in switch (ptracereq req) {
/*
* due to rpcgen poor features, we cannot put RPC_SETREGS
* AND RPC_SETTHREADREGS in the case list. So we use a hack (FIX rpcgen).
*/
#ifndef RPC_HDR
case RPT_SETTHREADREGS :
xdr_regs regs;
#endif
case RPT_SETREGS:
xdr_regs regs;
#ifndef RPC_HDR
case RPT_PSETTHREADREGS:
u_int pregs<>;
#endif
case RPT_PSETREGS:
u_int pregs<>;
#ifdef LATER
case RPT_SETFPREGS:
xdr_fp_status fpregs;
#endif
case RPT_SETTHREADNAME:
thread_name name;
#ifndef RPC_HDR
case RPT_WRITETEXT:
xdr_mem mem;
#endif
case RPT_WRITEDATA:
xdr_mem mem;
case RPT_SETBREAK:
xdr_break breakp;
default:
u_int address;
};
union ptrace_addr_data_out switch (ptracereq req) {
case RPT_GETREGS:
xdr_regs regs;
#ifndef RPC_HDR
case RPT_GETTHREADREGS:
xdr_regs regs;
#endif
case RPT_PGETREGS:
u_int pregs<>;
#ifndef RPC_HDR
case RPT_PGETTHREADREGS:
u_int pregs<>;
#endif
#ifdef LATER
case RPT_GETFPREGS:
xdr_fp_status fpregs;
#endif
case RPT_THREADLIST:
thread_list threads;
case RPT_GETTHREADNAME:
thread_name name;
#ifndef RPC_HDR
case RPT_READTEXT:
xdr_mem mem;
case RPT_GETNAME:
xdr_mem mem;
#endif
case RPT_READDATA:
xdr_mem mem;
case RPT_GETBREAK:
xdr_break breakp;
default:
u_int addr;
};
typedef opaque CHAR_DATA <NET_SAFE>; /* variable sized data */
typedef string one_arg <NET_SAFE>;
% /* now open_connex() routine which establishes a connection to server */
enum debug_type
{ /* type of connection requested */
DEBTYP_PROCESS = 0, /* process connection */
DEBTYP_C_ACTOR = 1, /* C-Actor connection */
DEBTYP_KERNEL = 2, /* kernel debug connection */
DEBTYP_OTHER = 3 /* other subsystem */
};
%#define DEBUGGER_IS_GDB 0x2 /* */
struct open_in
{ /* input args to open a connection */
u_char back_port[16]; /* opaque NET address format */
u_short debug_type; /* type of process DEBTYP_xxx */
u_short flags; /* connection information OPNFLG_xxx */
u_char destination[16];/* opaque address if to router */
one_arg user_name; /* name of user on host */
};
struct open_out
{ /* return from open_connex */
u_long port; /* connection number to server or -1 if error */
u_int pad[4]; /* Planned to be KnIpcDest. Never used */
u_int fp; /* True if floating point processor. If error,
set to errno for open error. */
u_char cmd_table_num; /* command table used */
u_char cmd_table_vers; /* version of command table */
u_short server_vers; /* version number of server itself */
};
% /* now close_connex() routine which detaches from server */
enum close_control
{ /* choice of how to handle owned processes */
CLOSE_IGNORE = 0, /* ignore all controlled pids on close */
CLOSE_KILL = 1, /* kill all controlled pids on close */
CLOSE_DETACH = 2 /* detach free running all controlled pids */
};
struct close_in
{ /* arg to close connection */
close_control control; /* shutdown of owned processes control */
};
% /* now send_signal() routine which sends signals to processes like kill(2) */
struct signal_in
{ /* input to send_signal */
int pid; /* process/actor to send signal to */
int sig; /* signal to send (from /usr/include/signal.h) */
};
struct signal_out
{ /* return from send_signal */
int kill_return; /* return code from kill(2) call */
int errNo; /* error code if failed */
};
% /* now wait_info() routine which returns results of polling the wait status
% of a process/actor. It may return 0 if running, else pid or -1 */
enum stop_code
{ /* stop code information */
STOP_ERROR = 0, /* error, errno set */
STOP_NONE = 1, /* not stopped */
STOP_UNKNOWN = 2, /* unknown stop reason */
STOP_BREAK = 3, /* stopped on breakpoint */
STOP_STEP = 4, /* stopped on step */
STOP_SIGNAL = 5, /* stopped on signal receieve */
STOP_TERM_EXIT = 6, /* terminated normally */
STOP_TERM_SIG = 7, /* terminated by signal */
STOP_DETACHED = 8, /* detached from server */
STOP_KILLED = 9, /* killed by ptrace KILL */
STOP_SPAWN_FAILED = 10 /* spawn failed in exec part, handle=errno */
};
struct wait_in
{ /* input arg to wait is process */
int pid; /* process/actor id */
};
struct wait_out
{ /* result of wait_info call */
int wait_return; /* -1=error,0=running,pid=stopped */
int errNo; /* error code if error */
int status; /* wait(2) status if stopped */
stop_code reason; /* reason in more abstracted terms */
int handle; /* handle of break if stopped on break,
or signal number or exit code */
u_long PC; /* program counter if stopped */
u_long SP; /* stack pointer if stopped */
u_long FP; /* frame pointer if stopped */
u_long thread; /* thread that stopped if applies (else -1) */
};
% /* now ptrace() routine. This matches the Sun UNIX ptrace as well as
% some additions */
const PTRFLG_FORCE = 1; /* when set and process running, forces process
to stop, make the request, then start again.
This is used for breakpoints and the like */
const PTRFLG_NON_OWNER = 2; /* do request even if not primary owner (will
notify all owners including caller if owns) */
const PTRFLG_FREE = 4; /* free pid_list after KILL/DETACH */
const PTRDET_UNOWN = 0x100; /* data value in RPT_DETACH just disconnects
caller as an owner of process. */
struct ptrace_in
{ /* input args matches ptrace but for XDR */
int pid; /* process to act on */
ptrace_addr_data_in addr; /* mappings for addr and addr2 */
u_int data; /* simple data arg of ptrace */
u_int flags; /* mask of PTRFLG_xxx flags. */
};
struct ptrace_out
{ /* return information from ptrace */
ptrace_addr_data_out addr; /* return through addr/addr2 */
int result; /* result of ptrace call (return value) */
int errNo; /* error code if error */
};
/* Data for GET_GLOBAL_SYMBOLS */
struct one_symbol { /* Must match common/src/lib/ctx/ctx.h */
string symbolName<>;
long symbolValue;
};
typedef one_symbol all_symbols<>;
struct get_global_symbols_out {
all_symbols symbols;
};
/* Data for GET_TEXT_DATA */
struct get_text_data_in {
int pid; /* process/actor id if non-zero */
string actorName<16>; /* actor name for system mode */
};
struct get_text_data_out {
int result;
int errNo;
u_long textStart;
u_long textSize;
u_long dataStart;
u_long dataSize;
};
/* Data for GET_SIGNAL_NAMES */
struct one_signal {
u_int number;
string name<>;
};
typedef one_signal all_signals<>;
struct get_signal_names_out {
all_signals signals;
};
% /* now define the actual calls we support */
program REMOTEDEB {
version REMOTEVERS {
/* open a connection to server or router */
open_out
OPEN_CONNEX(open_in) = 1;
/* send a signal to a process */
signal_out
SEND_SIGNAL(signal_in) = 2;
/* all routines below require a connection first */
/* close the connection to the server */
void
CLOSE_CONNEX(close_in) = 10;
/* process ptrace request */
ptrace_out
PTRACE(ptrace_in) = 11;
/* poll for status of process */
wait_out
WAIT_INFO(wait_in) = 13;
get_signal_names_out
GET_SIGNAL_NAMES(void) = 17;
} = 2; /* now version 2 */
} = 0x20000fff;
#ifdef RPC_HDR
%#define REMDEB_H
%#endif
#endif
#ifdef RPC_SVC
%const char* names [] = {
% "NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
% "name4", "name5", "name6", "name7",
% "name8", "name9", "CLOSE_CONNEX", "PTRACE",
% "name12", "WAIT_INFO", "name14", "name15",
% "name16", "GET_SIGNAL_NAMES", "name18"
%};
%
%/*HEADER_END*/
#endif