📄 remdeb.x
字号:
/* ********************************************************************** * * Component: RDBG servers * Module: remdeb.x * * Synopsis: XDR definitions for remote debug server RPC calls. * XDR definitions for RPCGEN to build remote debug server. * * $Id: 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#endifenum 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 FRONTENDconst 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_XDRstruct 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;#endifstruct 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -