From 40cf43eab4e4121a92ec95bc1366cc5b3bad4e27 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 1 Feb 2002 17:00:01 +0000 Subject: * So many patches have been posted recently on the mailing list and because we were unable to find correct solution to compile on various linux distros (due to rpcgen incompatibilities), and because the coding style of rdbg was rather inconsistant among various pieces of code, I decided to: 1) make some cleaning regarding global coding style (using indent + manual edits), 2) incorporate/review the paches send by various people (S. Holford, T. Strauman), 3) Fix the bug due to varying rpcgen code generation in remdeb_svc.c, 4) Remove some dead code, 5) Apply a patches enabling to call enterRdbg imediately after rdbg initialization is done, NB : the paches is huge but it is mainly due to coding styke chnages. Only few lines of codes have been really changed and they do not impact rdbg functionnality (AFAIKT). * include/rdbg/servrpc.h, include/rdbg/i386/rdbg_f.h, include/rdbg/m68k/rdbg_f.h, include/rdbg/powerpc/rdbg_f.h, src/_servtgt.c, src/awk.svc, src/excep.c, src/ptrace.c, src/rdbg.c, src/remdeb.x, src/servbkpt.c, src/servcon.c, src/servrpc.c, src/servtgt.c, src/servtsp.c, src/servutil.c, src/i386/excep_f.c, src/i386/rdbg_f.c, src/i386/any/Makefile.am, src/i386/any/remdeb.h, src/i386/any/remdeb_svc.c, src/i386/any/remdeb_xdr.c, src/m68k/excep_f.c, src/m68k/rdbg_f.c, src/m68k/any/Makefile.am, src/m68k/any/remdeb.h, src/m68k/any/remdeb_svc.c, src/m68k/any/remdeb_xdr.c, src/powerpc/excep_f.c, src/powerpc/rdbg_f.c, src/powerpc/new_exception_processing/Makefile.am, src/powerpc/new_exception_processing/remdeb.h, src/powerpc/new_exception_processing/remdeb_svc.c, src/powerpc/new_exception_processing/remdeb_xdr.c: Modified. --- c/src/librdbg/ChangeLog | 35 + c/src/librdbg/include/rdbg/i386/rdbg_f.h | 1 + c/src/librdbg/include/rdbg/m68k/rdbg_f.h | 1 + c/src/librdbg/include/rdbg/powerpc/rdbg_f.h | 2 + c/src/librdbg/include/rdbg/servrpc.h | 2 +- c/src/librdbg/src/_servtgt.c | 334 ++-- c/src/librdbg/src/awk.svc | 2 +- c/src/librdbg/src/excep.c | 98 +- c/src/librdbg/src/i386/any/Makefile.am | 2 + c/src/librdbg/src/i386/any/remdeb.h | 918 +++++----- c/src/librdbg/src/i386/any/remdeb_svc.c | 179 +- c/src/librdbg/src/i386/any/remdeb_xdr.c | 1732 +++++++++--------- c/src/librdbg/src/i386/excep_f.c | 163 +- c/src/librdbg/src/i386/rdbg_f.c | 213 +-- c/src/librdbg/src/m68k/any/Makefile.am | 2 + c/src/librdbg/src/m68k/any/remdeb.h | 924 +++++----- c/src/librdbg/src/m68k/any/remdeb_svc.c | 179 +- c/src/librdbg/src/m68k/any/remdeb_xdr.c | 1850 ++++++++++---------- c/src/librdbg/src/m68k/excep_f.c | 265 +-- c/src/librdbg/src/m68k/rdbg_f.c | 150 +- c/src/librdbg/src/powerpc/excep_f.c | 233 ++- .../powerpc/new_exception_processing/Makefile.am | 2 + .../src/powerpc/new_exception_processing/remdeb.h | 155 +- .../powerpc/new_exception_processing/remdeb_svc.c | 34 +- .../powerpc/new_exception_processing/remdeb_xdr.c | 103 +- c/src/librdbg/src/powerpc/rdbg_f.c | 216 +-- c/src/librdbg/src/ptrace.c | 537 +++--- c/src/librdbg/src/rdbg.c | 175 +- c/src/librdbg/src/remdeb.x | 35 - c/src/librdbg/src/servbkpt.c | 853 ++++----- c/src/librdbg/src/servcon.c | 219 +-- c/src/librdbg/src/servrpc.c | 1103 ++++++------ c/src/librdbg/src/servtgt.c | 708 ++++---- c/src/librdbg/src/servtsp.c | 468 ++--- c/src/librdbg/src/servutil.c | 147 +- 35 files changed, 6155 insertions(+), 5885 deletions(-) (limited to 'c') diff --git a/c/src/librdbg/ChangeLog b/c/src/librdbg/ChangeLog index ec9bd89597..60dc73c9a4 100644 --- a/c/src/librdbg/ChangeLog +++ b/c/src/librdbg/ChangeLog @@ -1,3 +1,38 @@ + + * So many patches have been posted recently on the mailing list and + because we were unable to find correct solution to compile on various + linux distros (due to rpcgen incompatibilities), and because the coding + style of rdbg was rather inconsistant among various pieces of code, I + decided to: + 1) make some cleaning regarding global coding style (using + indent + manual edits), + 2) incorporate/review the paches send by various people + (S. Holford, T. Strauman), + 3) Fix the bug due to varying rpcgen code generation + in remdeb_svc.c, + 4) Remove some dead code, + 5) Apply a patches enabling to call enterRdbg imediately + after rdbg initialization is done, + + NB : the paches is huge but it is mainly due to coding styke chnages. + Only few lines of codes have been really changed and they do not impact + rdbg functionnality (AFAIKT). + + * include/rdbg/servrpc.h, include/rdbg/i386/rdbg_f.h, + include/rdbg/m68k/rdbg_f.h, include/rdbg/powerpc/rdbg_f.h, + src/_servtgt.c, src/awk.svc, src/excep.c, src/ptrace.c, src/rdbg.c, + src/remdeb.x, src/servbkpt.c, src/servcon.c, src/servrpc.c, + src/servtgt.c, src/servtsp.c, src/servutil.c, src/i386/excep_f.c, + src/i386/rdbg_f.c, src/i386/any/Makefile.am, src/i386/any/remdeb.h, + src/i386/any/remdeb_svc.c, src/i386/any/remdeb_xdr.c, + src/m68k/excep_f.c, src/m68k/rdbg_f.c, src/m68k/any/Makefile.am, + src/m68k/any/remdeb.h, src/m68k/any/remdeb_svc.c, + src/m68k/any/remdeb_xdr.c, src/powerpc/excep_f.c, src/powerpc/rdbg_f.c, + src/powerpc/new_exception_processing/Makefile.am, + src/powerpc/new_exception_processing/remdeb.h, + src/powerpc/new_exception_processing/remdeb_svc.c, + src/powerpc/new_exception_processing/remdeb_xdr.c: Modified. + 2002-01-18 Till Straumann * src/powerpc/excep_f.c: This patch addresses the following issues: diff --git a/c/src/librdbg/include/rdbg/i386/rdbg_f.h b/c/src/librdbg/include/rdbg/i386/rdbg_f.h index c75cecc7bc..14335c4bcb 100644 --- a/c/src/librdbg/include/rdbg/i386/rdbg_f.h +++ b/c/src/librdbg/include/rdbg/i386/rdbg_f.h @@ -34,6 +34,7 @@ static inline int getExcNum(Exception_context *ctx) } extern void connect_rdbg_exception(); +extern void disconnect_rdbg_exception(); #endif diff --git a/c/src/librdbg/include/rdbg/m68k/rdbg_f.h b/c/src/librdbg/include/rdbg/m68k/rdbg_f.h index e51d995c2f..3f0af41a55 100644 --- a/c/src/librdbg/include/rdbg/m68k/rdbg_f.h +++ b/c/src/librdbg/include/rdbg/m68k/rdbg_f.h @@ -32,6 +32,7 @@ static inline int getExcNum(Exception_context *ctx) } extern void connect_rdbg_exception(); +extern void disconnect_rdbg_exception(); #endif diff --git a/c/src/librdbg/include/rdbg/powerpc/rdbg_f.h b/c/src/librdbg/include/rdbg/powerpc/rdbg_f.h index 521595407e..a90cc6a448 100644 --- a/c/src/librdbg/include/rdbg/powerpc/rdbg_f.h +++ b/c/src/librdbg/include/rdbg/powerpc/rdbg_f.h @@ -21,6 +21,7 @@ static inline int isRdbgException(Exception_context *ctx) { if ( ctx->ctx->_EXC_number != ASM_SYS_VECTOR && + ctx->ctx->_EXC_number != ASM_PROG_VECTOR && ctx->ctx->_EXC_number != ASM_TRACE_VECTOR ) return 0; else return 1; @@ -31,6 +32,7 @@ static inline int getExcNum(Exception_context *ctx) } extern void connect_rdbg_exception(); +extern void disconnect_rdbg_exception(); #endif diff --git a/c/src/librdbg/include/rdbg/servrpc.h b/c/src/librdbg/include/rdbg/servrpc.h index e183e1af7d..7e82f56ac1 100644 --- a/c/src/librdbg/include/rdbg/servrpc.h +++ b/c/src/librdbg/include/rdbg/servrpc.h @@ -23,7 +23,7 @@ extern int CONN_LIST_INC; extern int PID_LIST_INC; extern int TSP_RETRIES; extern int BackPort; -extern char ActName[]; +extern char taskName[]; extern int getId(); diff --git a/c/src/librdbg/src/_servtgt.c b/c/src/librdbg/src/_servtgt.c index 02e14a0ff2..1ae011542b 100644 --- a/c/src/librdbg/src/_servtgt.c +++ b/c/src/librdbg/src/_servtgt.c @@ -5,16 +5,15 @@ ============================================================================ */ - -#include +#include #include #include #include #include -#include +#include #include -#include +#include #include #include @@ -29,6 +28,7 @@ extern int errno; rtems_id eventTaskId; rtems_id serializeSemId; rtems_id wakeupEventSemId; +rtems_id debugId; CPU_Exception_frame Idle_frame; @@ -36,59 +36,56 @@ CPU_Exception_frame Idle_frame; TgtRealPtrace - lowest level ptrace() wrapper ----------------------------------------------------------------- */ - int -TgtRealPtrace(int req, PID aid, char* addr, int d, void* addr2) + int +TgtRealPtrace (int req, PID aid, char *addr, int d, void *addr2) { - return ptrace(req, aid, addr, d, addr2); + return ptrace (req, aid, addr, d, addr2); } - - /* ----------------------------------------------------------------------- TgtChange() is called when the system stops. It informs the generic layers must be informed of that fact. ----------------------------------------------------------------------- */ - static int -TgtChange (PID pid, CPU_Exception_frame* ctx, int status) + static int +TgtChange (PID pid, CPU_Exception_frame * ctx, int status) { - if (TgtHandleChildChange (pid, &status, NULL, ctx)) { - TgtNotifyWaitChange (pid, status, -1); - } + if (TgtHandleChildChange (pid, &status, NULL, ctx)) { + TgtNotifyWaitChange (pid, status, -1); + } - return 0; + return 0; } /* ----------------------------------------------------------------------- eventTask ----------------------------------------------------------------------- */ -rtems_task eventTask( rtems_task_argument pid) + rtems_task +eventTask (rtems_task_argument pid) { Exception_context *ctx; DPRINTF (("event task: pid %d\n", pid)); - /* * we spend all our time waiting for a semaphore. * If wait change, we send info */ - - for (;;){ + + for (;;) { DPRINTF (("Event Task: wait event\n")); - rtems_semaphore_obtain(wakeupEventSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_semaphore_obtain (wakeupEventSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); DPRINTF (("Event Task: wake up !!!!!!!!!!!!!\n")); - + errno = 0; - ctx = GetExceptCtx(currentTargetThread); + ctx = GetExceptCtx (currentTargetThread); - CheckForSingleStep(ctx->ctx); + CheckForSingleStep (ctx->ctx); - TgtChange(pid, ctx->ctx,STS_MAKESIG(ExcepToSig(ctx))); - + TgtChange (pid, ctx->ctx, STS_MAKESIG (ExcepToSig (ctx))); } } @@ -100,10 +97,11 @@ rtems_task eventTask( rtems_task_argument pid) only to push a first valid context in the list ---------------------------------------------------------------------*/ -rtems_task MyThreadIdle(rtems_task_argument argument) + rtems_task +MyThreadIdle (rtems_task_argument argument) { - enterRdbg(); - rtems_task_delete( RTEMS_SELF ); + enterRdbg (); + rtems_task_delete (RTEMS_SELF); } /* ----------------------------------------------------------------------- @@ -114,192 +112,206 @@ rtems_task MyThreadIdle(rtems_task_argument argument) process that we do not control now). ----------------------------------------------------------------------- */ -Boolean TgtAttach( - int conn_idx, /* client that is requesting */ - PID pid) /* process to attach to */ -{ + Boolean +TgtAttach (int conn_idx, /* client that is requesting */ + PID pid) +{ /* process to attach to */ rtems_name task_name; rtems_status_code status; - rtems_id debugId; - + errno = 0; - DPRINTF (("TgtAttach pid=%d\n",pid)); - - Ptrace(RPT_ATTACH, pid, NULL, 0, NULL); + DPRINTF (("TgtAttach pid=%d\n", pid)); + + Ptrace (RPT_ATTACH, pid, NULL, 0, NULL); if (errno) - return(False); /* failed */ + return (False); /* failed */ - TgtCreateNew(pid, conn_idx, 0, NULL, False); + TgtCreateNew (pid, conn_idx, 0, NULL, False); + connect_rdbg_exception (); - connect_rdbg_exception(); - /* - * Create the attach debuger task + * Search for and remove debugging tasks / semaphores left over from + * a previous attach without a detach. */ - task_name = rtems_build_name( 'E', 'v', 'n', 't' ); - if ((status = rtems_task_create( task_name, 10, 24576, - RTEMS_INTERRUPT_LEVEL(0), - RTEMS_DEFAULT_ATTRIBUTES | RTEMS_SYSTEM_TASK, - &eventTaskId )) - != RTEMS_SUCCESSFUL){ - printf("status = %d\n",status); + + if (rtems_task_ident (rtems_build_name ('E', 'v', 'n', 't'), + RTEMS_SEARCH_ALL_NODES, + &eventTaskId) == RTEMS_SUCCESSFUL) + rtems_task_delete (eventTaskId); + + if (rtems_semaphore_ident (rtems_build_name ('D', 'B', 'G', 's'), + RTEMS_SEARCH_ALL_NODES, + &serializeSemId) == RTEMS_SUCCESSFUL) + rtems_semaphore_delete (serializeSemId); + + if (rtems_semaphore_ident (rtems_build_name ('D', 'B', 'G', 'w'), + RTEMS_SEARCH_ALL_NODES, + &wakeupEventSemId) == RTEMS_SUCCESSFUL) + rtems_semaphore_delete (wakeupEventSemId); + + /* + * Create the attach debugger task + */ + task_name = rtems_build_name ('E', 'v', 'n', 't'); + if ((status = rtems_task_create (task_name, 10, 24576, + RTEMS_INTERRUPT_LEVEL (0), + RTEMS_DEFAULT_ATTRIBUTES | + RTEMS_SYSTEM_TASK, &eventTaskId)) + != RTEMS_SUCCESSFUL) { + printf ("status = %d\n", status); rtems_panic ("Can't create task.\n"); } - - status = rtems_task_start(eventTaskId, eventTask, pid); - - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 's'), - 1, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &serializeSemId); + + status = rtems_task_start (eventTaskId, eventTask, pid); + + status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 's'), + 1, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, 0, &serializeSemId); if (status != RTEMS_SUCCESSFUL) - rtems_panic ("Can't create serialize semaphore: `%s'\n",rtems_status_text(status)); - - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'w'), - 0, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &wakeupEventSemId); + rtems_panic ("Can't create serialize semaphore: `%s'\n", + rtems_status_text (status)); + + status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'w'), + 0, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, 0, &wakeupEventSemId); if (status != RTEMS_SUCCESSFUL) - rtems_panic ("Can't create wakeup semaphore: `%s'\n",rtems_status_text(status)); + rtems_panic ("Can't create wakeup semaphore: `%s'\n", + rtems_status_text (status)); /* * Create the MyThreadIdle task to init Exception mechanism */ - task_name = rtems_build_name( 'R', 'i', 'n', 'i' ); - if ((status = rtems_task_create( task_name, 10, 24576, - RTEMS_INTERRUPT_LEVEL(0), - RTEMS_DEFAULT_ATTRIBUTES, - &debugId )) - != RTEMS_SUCCESSFUL){ - printf("status = %d (%s)\n",status,rtems_status_text(status)); + task_name = rtems_build_name ('R', 'i', 'n', 'i'); + if ((status = rtems_task_create (task_name, 10, 24576, + RTEMS_INTERRUPT_LEVEL (0), + RTEMS_DEFAULT_ATTRIBUTES, &debugId)) + != RTEMS_SUCCESSFUL) { + printf ("status = %d (%s)\n", status, rtems_status_text (status)); rtems_panic ("Can't create task.\n"); } - status = rtems_task_start(debugId, MyThreadIdle, pid); + status = rtems_task_start (debugId, MyThreadIdle, pid); - return(True); + return (True); } /* ----------------------------------------------------------------------- TgtPtrace - handle ptrace requests for server. ----------------------------------------------------------------------- */ -int TgtPtrace( - int req, - PID pid, - char *addr, - int data, - void *addr2) +int +TgtPtrace (int req, PID pid, char *addr, int data, void *addr2) { if ((req == RPT_SINGLESTEP || req == RPT_CONT) - && addr2) /* clear then step */ - { /* addr2 is the old value */ - int ret; + && addr2) { /* clear then step *//* addr2 is the old value */ + + int ret; errno = 0; TgtBreakRestoreOrig (pid, addr, addr2); - ret = Ptrace(RPT_SINGLESTEP, pid, addr, data, NULL); /* step over */ - if (ret) /* error, cannot single-step */ - { + ret = Ptrace (RPT_SINGLESTEP, pid, addr, data, NULL); /* step over */ + if (ret) { /* error, cannot single-step */ int pid_idx = FindPidEntry (pid); - TgtBreakCancelStep (&pid_list [pid_idx]); + TgtBreakCancelStep (&pid_list[pid_idx]); } - return(ret); /* failed or done */ - } - else - return(Ptrace(req, pid, addr, data, addr2)); /* normal call */ + return (ret); /* failed or done */ + } else + return (Ptrace (req, pid, addr, data, addr2)); /* normal call */ } /* ----------------------------------------------------------------- TgtGetThreadName - get thread name --------------------------------------------------------------- */ -int TgtGetThreadName ( - PID_LIST *plst, /* Process entry */ - unsigned Id, /* Thread ID */ - char *ThrName) /* Thread name */ -{ - int index; - unsigned name; - - if ( Id <_Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id && - Id >_Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) { - - index = Id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; - name = *(unsigned*)(_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index]->name); - ThrName[0] = (char)((name >> 24) & 0xFF ); - ThrName[1] = (char)((name >> 16) & 0xFF ); - ThrName[2] = (char)((name >> 8) & 0xFF ); - ThrName[3] = (char)( name & 0xFF ); - ThrName[4] = 0x0; - return 0; - } - - if ( Id <_Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id && - Id >_Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) { - - index = Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; - name = *(unsigned*)(_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index]->name); - ThrName[0] = (char)((name >> 24) & 0xFF ); - ThrName[1] = (char)((name >> 16) & 0xFF ); - ThrName[2] = (char)((name >> 8) & 0xFF ); - ThrName[3] = (char)( name & 0xFF ); - ThrName[4] = 0x0; - return 0; - } - - - return -1; + int +TgtGetThreadName (PID_LIST * plst, /* Process entry */ + unsigned Id, /* Thread ID */ + char *ThrName) +{ /* Thread name */ + int index; + unsigned name; + + if (Id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id && + Id > _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) { + + index = Id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; + name = + *(unsigned *) (_Objects_Information_table[OBJECTS_RTEMS_TASKS]-> + local_table[1 + index]->name); + ThrName[0] = (char) ((name >> 24) & 0xFF); + ThrName[1] = (char) ((name >> 16) & 0xFF); + ThrName[2] = (char) ((name >> 8) & 0xFF); + ThrName[3] = (char) (name & 0xFF); + ThrName[4] = 0x0; + return 0; + } + + if (Id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id && + Id > _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) { + + index = + Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; + name = + *(unsigned *) (_Objects_Information_table[OBJECTS_POSIX_THREADS]-> + local_table[1 + index]->name); + ThrName[0] = (char) ((name >> 24) & 0xFF); + ThrName[1] = (char) ((name >> 16) & 0xFF); + ThrName[2] = (char) ((name >> 8) & 0xFF); + ThrName[3] = (char) (name & 0xFF); + ThrName[4] = 0x0; + return 0; + } + return -1; } /* ----------------------------------------------------------------- TgtThreadList - return all the threads in the system ----------------------------------------------------------------- */ - int -TgtThreadList ( - PID_LIST* plst, /* Process entry */ - unsigned* threads, /* Output buffer */ - unsigned size) /* Output buffer size */ -{ - int curr = 0; - Objects_Id id; - unsigned index; - - id = _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; - - while (id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id){ - index = id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; - if ( _Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index] != NULL){ + int +TgtThreadList (PID_LIST * plst, /* Process entry */ + unsigned *threads, /* Output buffer */ + unsigned size) +{ /* Output buffer size */ + int curr = 0; + Objects_Id id; + unsigned index; + + id = _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; + + while (id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id) { + index = id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; + if (_Objects_Information_table[OBJECTS_RTEMS_TASKS]-> + local_table[1 + index] != NULL) { threads[curr] = (unsigned) id; curr++; - } - id ++; } - - id = _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; + id++; + } + + id = _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; - while (id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id){ - index = id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; - if ( _Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index] != NULL){ + while (id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id) { + index = + id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; + if (_Objects_Information_table[OBJECTS_POSIX_THREADS]-> + local_table[1 + index] != NULL) { threads[curr] = (unsigned) id; curr++; - } - id ++; } - - return curr; + id++; + } + + return curr; } diff --git a/c/src/librdbg/src/awk.svc b/c/src/librdbg/src/awk.svc index c557a41639..61e0bf68a2 100644 --- a/c/src/librdbg/src/awk.svc +++ b/c/src/librdbg/src/awk.svc @@ -26,7 +26,7 @@ $1 ~ /^\/\*HEADER_START\*\/$/ { printf("#include \n"); printf("#include \n"); printf("#include \n", THEPROG); - printf("#define fprintf(a,b) printf(b)\n"); + printf("#define fprintf(a,b,c) printf(b,c)\n"); } $1 ~ /^\/\*HEADER_END\*\/$/ { diff --git a/c/src/librdbg/src/excep.c b/c/src/librdbg/src/excep.c index d3183e24e2..c8ce6d7415 100644 --- a/c/src/librdbg/src/excep.c +++ b/c/src/librdbg/src/excep.c @@ -24,30 +24,32 @@ Exception_context *LastCtx = NULL; CPU_Exception_frame SavedContext; +/* + * Save an exception context at the end of a list + */ -/********* Save an exception context at the end of a list *****/ - -int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) { + int +PushExceptCtx (Objects_Id Id, Objects_Id semId, CPU_Exception_frame * ctx) +{ Exception_context *SaveCtx; - SaveCtx = (Exception_context *)malloc(sizeof(Exception_context)); + SaveCtx = (Exception_context *) malloc (sizeof (Exception_context)); if (SaveCtx == NULL) - rtems_panic("Can't allocate memory to save Exception context"); - + rtems_panic ("Can't allocate memory to save Exception context"); + SaveCtx->id = Id; SaveCtx->ctx = ctx; SaveCtx->semaphoreId = semId; SaveCtx->previous = NULL; SaveCtx->next = NULL; - - if (FirstCtx == NULL){ /* initialization */ + + if (FirstCtx == NULL) { /* initialization */ FirstCtx = SaveCtx; - LastCtx = SaveCtx; + LastCtx = SaveCtx; NbExceptCtx = 1; - } - else { - NbExceptCtx ++; + } else { + NbExceptCtx++; LastCtx->next = SaveCtx; SaveCtx->previous = LastCtx; LastCtx = SaveCtx; @@ -55,36 +57,41 @@ int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) return 0; } -/********* Save an temporary exception context in a ******/ -/********* global variable ******/ - -int PushSavedExceptCtx ( Objects_Id Id, CPU_Exception_frame *ctx ) { +/* + * Save an temporary exception context in a global variable + */ - memcpy (&(SavedContext), ctx, sizeof(CPU_Exception_frame)); + int +PushSavedExceptCtx (Objects_Id Id, CPU_Exception_frame * ctx) +{ + memcpy (&(SavedContext), ctx, sizeof (CPU_Exception_frame)); return 0; } +/* + * Remove the context of the specified Id thread. + * If Id = -1, then return the first context + */ -/****** Remove the context of the specified Id thread *********/ -/****** If Id = -1, then return the first context *********/ + int +PopExceptCtx (Objects_Id Id) +{ + Exception_context *ExtractCtx; -int PopExceptCtx ( Objects_Id Id ) { + if (FirstCtx == NULL) + return -1; - Exception_context *ExtractCtx; - - if (FirstCtx == NULL) return -1; - - if (Id == -1) { + if (Id == -1) { ExtractCtx = LastCtx; LastCtx = LastCtx->previous; - free(ExtractCtx); - NbExceptCtx --; + free (ExtractCtx); + NbExceptCtx--; return 0; } - + ExtractCtx = LastCtx; - + while (ExtractCtx->id != Id && ExtractCtx != NULL) { ExtractCtx = ExtractCtx->previous; } @@ -92,37 +99,40 @@ int PopExceptCtx ( Objects_Id Id ) { if (ExtractCtx == NULL) return -1; - if ( ExtractCtx->previous != NULL) + if (ExtractCtx->previous != NULL) (ExtractCtx->previous)->next = ExtractCtx->next; - if ( ExtractCtx->next != NULL) + if (ExtractCtx->next != NULL) (ExtractCtx->next)->previous = ExtractCtx->previous; if (ExtractCtx == FirstCtx) FirstCtx = FirstCtx->next; - else - if (ExtractCtx == LastCtx) + else if (ExtractCtx == LastCtx) LastCtx = LastCtx->previous; - - free(ExtractCtx); - NbExceptCtx --; + + free (ExtractCtx); + NbExceptCtx--; return 0; } - -/****** Return the context of the specified Id thread *********/ -/****** If Id = -1, then return the first context *********/ +/* + * Return the context of the specified Id thread. + * If Id = -1, then return the first context. + */ -Exception_context *GetExceptCtx ( Objects_Id Id ) { + Exception_context * +GetExceptCtx (Objects_Id Id) +{ Exception_context *ExtractCtx; - if (FirstCtx == NULL) return NULL; - - if (Id == -1) { + if (FirstCtx == NULL) + return NULL; + + if (Id == -1) { return LastCtx; } - + ExtractCtx = LastCtx; while (ExtractCtx->id != Id && ExtractCtx != NULL) { diff --git a/c/src/librdbg/src/i386/any/Makefile.am b/c/src/librdbg/src/i386/any/Makefile.am index 303c562d67..01c42b8f7e 100644 --- a/c/src/librdbg/src/i386/any/Makefile.am +++ b/c/src/librdbg/src/i386/any/Makefile.am @@ -71,6 +71,8 @@ if RPCTOOLS -o i386/any/tmpSvc.c remdeb.x; \ $(AWK) -f ./awk.svc THEPROG="remdeb.h" i386/any/tmpSvc.c \ > i386/any/remdeb_svc.c; \ + $(SED) -e 's/fprintf.*,/printf(/' i386/any/remdeb_svc.c > i386/any/remdeb_svc.tmp; \ + mv i386/any/remdeb_svc.tmp i386/any/remdeb_svc.c; \ rm -f i386/any/tmpSvc.c ) endif diff --git a/c/src/librdbg/src/i386/any/remdeb.h b/c/src/librdbg/src/i386/any/remdeb.h index 27738774c7..5054a706aa 100644 --- a/c/src/librdbg/src/i386/any/remdeb.h +++ b/c/src/librdbg/src/i386/any/remdeb.h @@ -8,7 +8,6 @@ #include - #ifdef __cplusplus extern "C" { #endif @@ -18,85 +17,84 @@ extern "C" { #ifndef REMDEB_H #define RPCGENSRVNAME(a) a -enum rpc_type { - SUNRPC = 0, - BADRPCTYPE = 25, -}; -typedef enum rpc_type rpc_type; + enum rpc_type { + SUNRPC = 0, + BADRPCTYPE = 25, + }; + typedef enum rpc_type rpc_type; #define NET_SAFE 1400 -struct UDP_MSG { - u_char type; - u_char msg_num; - u_short spec; - long pid; - u_long context; -}; -typedef struct UDP_MSG UDP_MSG; + struct UDP_MSG { + u_char type; + u_char msg_num; + u_short spec; + long pid; + u_long context; + }; + typedef struct UDP_MSG UDP_MSG; /* * Sun request values for the remote ptrace system call */ - -enum ptracereq { - RPT_TRACEME = 0, - RPT_CHILDDONE = 0, - RPT_PEEKTEXT = 0 + 1, - RPT_PEEKDATA = 0 + 2, - RPT_PEEKUSER = 0 + 3, - RPT_POKETEXT = 0 + 4, - RPT_POKEDATA = 0 + 5, - RPT_POKEUSER = 0 + 6, - RPT_CONT = 0 + 7, - RPT_KILL = 0 + 8, - RPT_SINGLESTEP = 0 + 9, - RPT_ATTACH = 0 + 10, - RPT_DETACH = 0 + 11, - RPT_GETREGS = 0 + 12, - RPT_SETREGS = 0 + 13, - RPT_GETFPREGS = 0 + 14, - RPT_SETFPREGS = 0 + 15, - RPT_READDATA = 0 + 16, - RPT_WRITEDATA = 0 + 17, - RPT_READTEXT = 0 + 18, - RPT_WRITETEXT = 0 + 19, - RPT_GETFPAREGS = 0 + 20, - RPT_SETFPAREGS = 0 + 21, - RPT_22 = 0 + 22, - RPT_23 = 0 + 23, - RPT_SYSCALL = 0 + 24, - RPT_DUMPCORE = 0 + 25, - RPT_26 = 0 + 26, - RPT_27 = 0 + 27, - RPT_28 = 0 + 28, - RPT_GETUCODE = 0 + 29, - RPT_GETTARGETTHREAD = 50, - RPT_SETTARGETTHREAD = 51, - RPT_THREADSUSPEND = 52, - RPT_THREADRESUME = 53, - RPT_THREADLIST = 54, - RPT_GETTHREADNAME = 55, - RPT_SETTHREADNAME = 56, - RPT_SETTHREADREGS = 57, - RPT_GETTHREADREGS = 58, - RPT_STEPRANGE = 75, - RPT_CONTTO = 76, - RPT_SETBREAK = 77, - RPT_CLRBREAK = 78, - RPT_GETBREAK = 79, - RPT_GETNAME = 80, - RPT_STOP = 81, - RPT_PGETREGS = 82, - RPT_PSETREGS = 83, - RPT_PSETTHREADREGS = 84, - RPT_PGETTHREADREGS = 85, -}; -typedef enum ptracereq ptracereq; - -struct xdr_regs { - u_int tabreg[19]; -}; -typedef struct xdr_regs xdr_regs; + enum ptracereq { + RPT_TRACEME = 0, + RPT_CHILDDONE = 0, + RPT_PEEKTEXT = 0 + 1, + RPT_PEEKDATA = 0 + 2, + RPT_PEEKUSER = 0 + 3, + RPT_POKETEXT = 0 + 4, + RPT_POKEDATA = 0 + 5, + RPT_POKEUSER = 0 + 6, + RPT_CONT = 0 + 7, + RPT_KILL = 0 + 8, + RPT_SINGLESTEP = 0 + 9, + RPT_ATTACH = 0 + 10, + RPT_DETACH = 0 + 11, + RPT_GETREGS = 0 + 12, + RPT_SETREGS = 0 + 13, + RPT_GETFPREGS = 0 + 14, + RPT_SETFPREGS = 0 + 15, + RPT_READDATA = 0 + 16, + RPT_WRITEDATA = 0 + 17, + RPT_READTEXT = 0 + 18, + RPT_WRITETEXT = 0 + 19, + RPT_GETFPAREGS = 0 + 20, + RPT_SETFPAREGS = 0 + 21, + RPT_22 = 0 + 22, + RPT_23 = 0 + 23, + RPT_SYSCALL = 0 + 24, + RPT_DUMPCORE = 0 + 25, + RPT_26 = 0 + 26, + RPT_27 = 0 + 27, + RPT_28 = 0 + 28, + RPT_GETUCODE = 0 + 29, + RPT_GETTARGETTHREAD = 50, + RPT_SETTARGETTHREAD = 51, + RPT_THREADSUSPEND = 52, + RPT_THREADRESUME = 53, + RPT_THREADLIST = 54, + RPT_GETTHREADNAME = 55, + RPT_SETTHREADNAME = 56, + RPT_SETTHREADREGS = 57, + RPT_GETTHREADREGS = 58, + RPT_STEPRANGE = 75, + RPT_CONTTO = 76, + RPT_SETBREAK = 77, + RPT_CLRBREAK = 78, + RPT_GETBREAK = 79, + RPT_GETNAME = 80, + RPT_STOP = 81, + RPT_PGETREGS = 82, + RPT_PSETREGS = 83, + RPT_PSETTHREADREGS = 84, + RPT_PGETTHREADREGS = 85, + }; + typedef enum ptracereq ptracereq; + + struct xdr_regs { + u_int tabreg[19]; + }; + typedef struct xdr_regs xdr_regs; /* now define register macros to apply to xdr_reg struct */ #define GS 0 @@ -119,16 +117,16 @@ typedef struct xdr_regs xdr_regs; #define UESP 17 #define SS 18 -#define REG_PC tabreg[EIP] /* PC (eip) register offset */ -#define REG_SP tabreg[UESP] /* SP (uesp) register offset */ -#define REG_FP tabreg[EBP] /* FP (ebp) register offset */ +#define REG_PC tabreg[EIP] /* PC (eip) register offset */ +#define REG_SP tabreg[UESP] /* SP (uesp) register offset */ +#define REG_FP tabreg[EBP] /* FP (ebp) register offset */ /* now define the BREAKPOINT mask technique to a long word */ -#define SET_BREAK(l) ((l&0xFFFFFF00) | 0xCC) +#define SET_BREAK(l) ((l&0xFFFFFF00) | 0xCC) #define IS_BREAK(l) (((l) & 0xFF) == 0xCC) #define ORG_BREAK(c,p) (((c) & 0xFFFFFF00) | ((p) & 0xFF)) -#define IS_STEP(regs) (regs.tabreg[TRAPNO] == 1) /* was step and not break */ -#define BREAK_ADJ 1 /* must subtract one from address after bp */ -#define BREAK_SIZE 1 /* Breakpoint occupies one byte */ +#define IS_STEP(regs) (regs.tabreg[TRAPNO] == 1) /* was step and not break */ +#define BREAK_ADJ 1 /* must subtract one from address after bp */ +#define BREAK_SIZE 1 /* Breakpoint occupies one byte */ #define TARGET_PROC_TYPE 0 #define MAXDEBUGGEE 150 #define NAMEMAX 17 @@ -141,286 +139,298 @@ typedef struct xdr_regs xdr_regs; */ #define MEM_DATA_MAX 256 -struct xdr_mem { - u_long addr; - u_int dataNb; - u_char data[MEM_DATA_MAX]; -}; -typedef struct xdr_mem xdr_mem; - -enum break_type { - BRKT_NONE = 0, - BRKT_INSTR = 1, - BRKT_READ = 2, - BRKT_WRITE = 3, - BRKT_ACCESS = 4, - BRKT_EXEC = 5, - BRKT_OS_CALL = 6, - BRKT_OS_SWITCH = 7, - BRKT_STEPEMUL = 8, -}; -typedef enum break_type break_type; + struct xdr_mem { + u_long addr; + u_int dataNb; + u_char data[MEM_DATA_MAX]; + }; + typedef struct xdr_mem xdr_mem; + + enum break_type { + BRKT_NONE = 0, + BRKT_INSTR = 1, + BRKT_READ = 2, + BRKT_WRITE = 3, + BRKT_ACCESS = 4, + BRKT_EXEC = 5, + BRKT_OS_CALL = 6, + BRKT_OS_SWITCH = 7, + BRKT_STEPEMUL = 8, + }; + typedef enum break_type break_type; #define MAX_THRD_BRK 4 -struct xdr_break { - u_char type; - u_char thread_spec; - u_short handle; - u_long ee_loc; - u_long ee_type; - u_short length; - u_char pass_count; - u_char curr_pass; - u_long thread_list[MAX_THRD_BRK]; -}; -typedef struct xdr_break xdr_break; + struct xdr_break { + u_char type; + u_char thread_spec; + u_short handle; + u_long ee_loc; + u_long ee_type; + u_short length; + u_char pass_count; + u_char curr_pass; + u_long thread_list[MAX_THRD_BRK]; + }; + typedef struct xdr_break xdr_break; #define UTHREAD_MAX 64 #define THREADNAMEMAX 16 -typedef char *thread_name; - -struct KernThread { - u_int threadLi; -}; -typedef struct KernThread KernThread; -typedef KernThread *ptThreadList; - -struct thread_list { - u_int nbThread; - ptThreadList threads; -}; -typedef struct thread_list thread_list; - -struct ptrace_addr_data_in { - ptracereq req; - union { - xdr_regs regs; - struct { - u_int pregs_len; - u_int *pregs_val; - } pregs; - thread_name name; - xdr_mem mem; - xdr_break breakp; - u_int address; - } ptrace_addr_data_in_u; -}; -typedef struct ptrace_addr_data_in ptrace_addr_data_in; - -struct ptrace_addr_data_out { - ptracereq req; - union { - xdr_regs regs; - struct { - u_int pregs_len; - u_int *pregs_val; - } pregs; - thread_list threads; - thread_name name; - xdr_mem mem; - xdr_break breakp; - u_int addr; - } ptrace_addr_data_out_u; -}; -typedef struct ptrace_addr_data_out ptrace_addr_data_out; - -typedef struct { - u_int CHAR_DATA_len; - char *CHAR_DATA_val; -} CHAR_DATA; + typedef char *thread_name; + + struct KernThread { + u_int threadLi; + }; + typedef struct KernThread KernThread; + typedef KernThread *ptThreadList; + + struct thread_list { + u_int nbThread; + ptThreadList threads; + }; + typedef struct thread_list thread_list; + + struct ptrace_addr_data_in { + ptracereq req; + union { + xdr_regs regs; + struct { + u_int pregs_len; + u_int *pregs_val; + } pregs; + thread_name name; + xdr_mem mem; + xdr_break breakp; + u_int address; + } ptrace_addr_data_in_u; + }; + typedef struct ptrace_addr_data_in ptrace_addr_data_in; + + struct ptrace_addr_data_out { + ptracereq req; + union { + xdr_regs regs; + struct { + u_int pregs_len; + u_int *pregs_val; + } pregs; + thread_list threads; + thread_name name; + xdr_mem mem; + xdr_break breakp; + u_int addr; + } ptrace_addr_data_out_u; + }; + typedef struct ptrace_addr_data_out ptrace_addr_data_out; + + typedef struct { + u_int CHAR_DATA_len; + char *CHAR_DATA_val; + } CHAR_DATA; #define XRY_MAX_INST_BUFF 128 #define XRY_MAX_INSTANCES 16 #ifndef XRY_MAX_CMD_STR #define XRY_MAX_CMD_STR 320 -#endif /* REMDEB_H */ - -struct xry_inst { - u_char flags; - u_char type; - u_char sub_type; - u_char res_type; - u_long value; - u_long value2; -}; -typedef struct xry_inst xry_inst; - -struct instance { - struct xry_inst instances[XRY_MAX_INSTANCES]; - u_char buffer[XRY_MAX_INST_BUFF]; -}; -typedef struct instance instance; - -struct instance_union { - bool_t instances; - union { - instance inst; - char *buffer; - } instance_union_u; -}; -typedef struct instance_union instance_union; - -typedef char *one_arg; +#endif /* REMDEB_H */ + + struct xry_inst { + u_char flags; + u_char type; + u_char sub_type; + u_char res_type; + u_long value; + u_long value2; + }; + typedef struct xry_inst xry_inst; + + struct instance { + struct xry_inst instances[XRY_MAX_INSTANCES]; + u_char buffer[XRY_MAX_INST_BUFF]; + }; + typedef struct instance instance; + + struct instance_union { + bool_t instances; + union { + instance inst; + char *buffer; + } instance_union_u; + }; + typedef struct instance_union instance_union; + + typedef char *one_arg; #define XRY_MAX_OBJ_NAME 32 - /* now open_connex() routine which establishes a connection to server */ - -enum debug_type { - DEBTYP_PROCESS = 0, - DEBTYP_C_ACTOR = 1, - DEBTYP_KERNEL = 2, - DEBTYP_OTHER = 3, -}; -typedef enum debug_type debug_type; -#define DEBUGGER_IS_GDB 0x2 /* */ - -struct open_in { - u_char back_port[16]; - u_short debug_type; - u_short flags; - u_char destination[16]; - one_arg user_name; -}; -typedef struct open_in open_in; - -struct open_out { - u_long port; - u_int pad[4]; - u_int fp; - u_char cmd_table_num; - u_char cmd_table_vers; - u_short server_vers; -}; -typedef struct open_out open_out; - /* now close_connex() routine which detaches from server */ - -enum close_control { - CLOSE_IGNORE = 0, - CLOSE_KILL = 1, - CLOSE_DETACH = 2, -}; -typedef enum close_control close_control; - -struct close_in { - close_control control; -}; -typedef struct close_in close_in; - /* now send_signal() routine which sends signals to processes like kill(2) */ - -struct signal_in { - int pid; - int sig; -}; -typedef struct signal_in signal_in; - -struct signal_out { - int kill_return; - int errNo; -}; -typedef struct signal_out signal_out; - /* 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_ERROR = 0, - STOP_NONE = 1, - STOP_UNKNOWN = 2, - STOP_BREAK = 3, - STOP_STEP = 4, - STOP_SIGNAL = 5, - STOP_TERM_EXIT = 6, - STOP_TERM_SIG = 7, - STOP_DETACHED = 8, - STOP_KILLED = 9, - STOP_SPAWN_FAILED = 10, -}; -typedef enum stop_code stop_code; - -struct wait_in { - int pid; -}; -typedef struct wait_in wait_in; - -struct wait_out { - int wait_return; - int errNo; - int status; - stop_code reason; - int handle; - u_long PC; - u_long SP; - u_long FP; - u_long thread; -}; -typedef struct wait_out wait_out; - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ + /* + * now open_connex() routine which establishes a connection to server + */ + + enum debug_type { + DEBTYP_PROCESS = 0, + DEBTYP_C_ACTOR = 1, + DEBTYP_KERNEL = 2, + DEBTYP_OTHER = 3, + }; + typedef enum debug_type debug_type; +#define DEBUGGER_IS_GDB 0x2 /* */ + + struct open_in { + u_char back_port[16]; + u_short debug_type; + u_short flags; + u_char destination[16]; + one_arg user_name; + }; + typedef struct open_in open_in; + + struct open_out { + u_long port; + u_int pad[4]; + u_int fp; + u_char cmd_table_num; + u_char cmd_table_vers; + u_short server_vers; + }; + typedef struct open_out open_out; + /* + * now close_connex() routine which detaches from server + */ + + enum close_control { + CLOSE_IGNORE = 0, + CLOSE_KILL = 1, + CLOSE_DETACH = 2, + }; + typedef enum close_control close_control; + + struct close_in { + close_control control; + }; + typedef struct close_in close_in; + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ + + struct signal_in { + int pid; + int sig; + }; + typedef struct signal_in signal_in; + + struct signal_out { + int kill_return; + int errNo; + }; + typedef struct signal_out signal_out; + /* + * 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_ERROR = 0, + STOP_NONE = 1, + STOP_UNKNOWN = 2, + STOP_BREAK = 3, + STOP_STEP = 4, + STOP_SIGNAL = 5, + STOP_TERM_EXIT = 6, + STOP_TERM_SIG = 7, + STOP_DETACHED = 8, + STOP_KILLED = 9, + STOP_SPAWN_FAILED = 10, + }; + typedef enum stop_code stop_code; + + struct wait_in { + int pid; + }; + typedef struct wait_in wait_in; + + struct wait_out { + int wait_return; + int errNo; + int status; + stop_code reason; + int handle; + u_long PC; + u_long SP; + u_long FP; + u_long thread; + }; + typedef struct wait_out wait_out; + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ #define PTRFLG_FORCE 1 #define PTRFLG_NON_OWNER 2 #define PTRFLG_FREE 4 #define PTRDET_UNOWN 0x100 -struct ptrace_in { - int pid; - ptrace_addr_data_in addr; - u_int data; - u_int flags; -}; -typedef struct ptrace_in ptrace_in; - -struct ptrace_out { - ptrace_addr_data_out addr; - int result; - int errNo; -}; -typedef struct ptrace_out ptrace_out; - -struct one_symbol { - char *symbolName; - long symbolValue; -}; -typedef struct one_symbol one_symbol; - -typedef struct { - u_int all_symbols_len; - one_symbol *all_symbols_val; -} all_symbols; - -struct get_global_symbols_out { - all_symbols symbols; -}; -typedef struct get_global_symbols_out get_global_symbols_out; - -struct get_text_data_in { - int pid; - char *actorName; -}; -typedef struct get_text_data_in get_text_data_in; - -struct get_text_data_out { - int result; - int errNo; - u_long textStart; - u_long textSize; - u_long dataStart; - u_long dataSize; -}; -typedef struct get_text_data_out get_text_data_out; - -struct one_signal { - u_int number; - char *name; -}; -typedef struct one_signal one_signal; - -typedef struct { - u_int all_signals_len; - one_signal *all_signals_val; -} all_signals; - -struct get_signal_names_out { - all_signals signals; -}; -typedef struct get_signal_names_out get_signal_names_out; - /* now define the actual calls we support */ + struct ptrace_in { + int pid; + ptrace_addr_data_in addr; + u_int data; + u_int flags; + }; + typedef struct ptrace_in ptrace_in; + + struct ptrace_out { + ptrace_addr_data_out addr; + int result; + int errNo; + }; + typedef struct ptrace_out ptrace_out; + + struct one_symbol { + char *symbolName; + long symbolValue; + }; + typedef struct one_symbol one_symbol; + + typedef struct { + u_int all_symbols_len; + one_symbol *all_symbols_val; + } all_symbols; + + struct get_global_symbols_out { + all_symbols symbols; + }; + typedef struct get_global_symbols_out get_global_symbols_out; + + struct get_text_data_in { + int pid; + char *actorName; + }; + typedef struct get_text_data_in get_text_data_in; + + struct get_text_data_out { + int result; + int errNo; + u_long textStart; + u_long textSize; + u_long dataStart; + u_long dataSize; + }; + typedef struct get_text_data_out get_text_data_out; + + struct one_signal { + u_int number; + char *name; + }; + typedef struct one_signal one_signal; + + typedef struct { + u_int all_signals_len; + one_signal *all_signals_val; + } all_signals; + + struct get_signal_names_out { + all_signals signals; + }; + typedef struct get_signal_names_out get_signal_names_out; + /* + * now define the actual calls we support + */ #define REMDEB_H #endif @@ -429,131 +439,131 @@ typedef struct get_signal_names_out get_signal_names_out; #if defined(__STDC__) || defined(__cplusplus) #define OPEN_CONNEX 1 -extern open_out * open_connex_2(open_in *, CLIENT *); -extern open_out * open_connex_2_svc(open_in *, struct svc_req *); + extern open_out *open_connex_2 (open_in *, CLIENT *); + extern open_out *open_connex_2_svc (open_in *, struct svc_req *); #define SEND_SIGNAL 2 -extern signal_out * send_signal_2(signal_in *, CLIENT *); -extern signal_out * send_signal_2_svc(signal_in *, struct svc_req *); + extern signal_out *send_signal_2 (signal_in *, CLIENT *); + extern signal_out *send_signal_2_svc (signal_in *, struct svc_req *); #define CLOSE_CONNEX 10 -extern void * close_connex_2(close_in *, CLIENT *); -extern void * close_connex_2_svc(close_in *, struct svc_req *); + extern void *close_connex_2 (close_in *, CLIENT *); + extern void *close_connex_2_svc (close_in *, struct svc_req *); #define PTRACE 11 -extern ptrace_out * ptrace_2(ptrace_in *, CLIENT *); -extern ptrace_out * ptrace_2_svc(ptrace_in *, struct svc_req *); + extern ptrace_out *ptrace_2 (ptrace_in *, CLIENT *); + extern ptrace_out *ptrace_2_svc (ptrace_in *, struct svc_req *); #define WAIT_INFO 13 -extern wait_out * wait_info_2(wait_in *, CLIENT *); -extern wait_out * wait_info_2_svc(wait_in *, struct svc_req *); + extern wait_out *wait_info_2 (wait_in *, CLIENT *); + extern wait_out *wait_info_2_svc (wait_in *, struct svc_req *); #define GET_SIGNAL_NAMES 17 -extern get_signal_names_out * get_signal_names_2(void *, CLIENT *); -extern get_signal_names_out * get_signal_names_2_svc(void *, struct svc_req *); -extern int remotedeb_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t); + extern get_signal_names_out *get_signal_names_2 (void *, CLIENT *); + extern get_signal_names_out *get_signal_names_2_svc (void *, + struct svc_req *); + extern int remotedeb_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t); -#else /* K&R C */ +#else /* K&R C */ #define OPEN_CONNEX 1 -extern open_out * open_connex_2(); -extern open_out * open_connex_2_svc(); + extern open_out *open_connex_2 (); + extern open_out *open_connex_2_svc (); #define SEND_SIGNAL 2 -extern signal_out * send_signal_2(); -extern signal_out * send_signal_2_svc(); + extern signal_out *send_signal_2 (); + extern signal_out *send_signal_2_svc (); #define CLOSE_CONNEX 10 -extern void * close_connex_2(); -extern void * close_connex_2_svc(); + extern void *close_connex_2 (); + extern void *close_connex_2_svc (); #define PTRACE 11 -extern ptrace_out * ptrace_2(); -extern ptrace_out * ptrace_2_svc(); + extern ptrace_out *ptrace_2 (); + extern ptrace_out *ptrace_2_svc (); #define WAIT_INFO 13 -extern wait_out * wait_info_2(); -extern wait_out * wait_info_2_svc(); + extern wait_out *wait_info_2 (); + extern wait_out *wait_info_2_svc (); #define GET_SIGNAL_NAMES 17 -extern get_signal_names_out * get_signal_names_2(); -extern get_signal_names_out * get_signal_names_2_svc(); -extern int remotedeb_2_freeresult (); -#endif /* K&R C */ + extern get_signal_names_out *get_signal_names_2 (); + extern get_signal_names_out *get_signal_names_2_svc (); + extern int remotedeb_2_freeresult (); +#endif /* K&R C */ /* the xdr functions */ #if defined(__STDC__) || defined(__cplusplus) -extern bool_t xdr_rpc_type (XDR *, rpc_type*); -extern bool_t xdr_UDP_MSG (XDR *, UDP_MSG*); -extern bool_t xdr_ptracereq (XDR *, ptracereq*); -extern bool_t xdr_xdr_regs (XDR *, xdr_regs*); -extern bool_t xdr_xdr_mem (XDR *, xdr_mem*); -extern bool_t xdr_break_type (XDR *, break_type*); -extern bool_t xdr_xdr_break (XDR *, xdr_break*); -extern bool_t xdr_thread_name (XDR *, thread_name*); -extern bool_t xdr_KernThread (XDR *, KernThread*); -extern bool_t xdr_thread_list (XDR *, thread_list*); -extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in*); -extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out*); -extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA*); -extern bool_t xdr_xry_inst (XDR *, xry_inst*); -extern bool_t xdr_instance (XDR *, instance*); -extern bool_t xdr_instance_union (XDR *, instance_union*); -extern bool_t xdr_one_arg (XDR *, one_arg*); -extern bool_t xdr_debug_type (XDR *, debug_type*); -extern bool_t xdr_open_in (XDR *, open_in*); -extern bool_t xdr_open_out (XDR *, open_out*); -extern bool_t xdr_close_control (XDR *, close_control*); -extern bool_t xdr_close_in (XDR *, close_in*); -extern bool_t xdr_signal_in (XDR *, signal_in*); -extern bool_t xdr_signal_out (XDR *, signal_out*); -extern bool_t xdr_stop_code (XDR *, stop_code*); -extern bool_t xdr_wait_in (XDR *, wait_in*); -extern bool_t xdr_wait_out (XDR *, wait_out*); -extern bool_t xdr_ptrace_in (XDR *, ptrace_in*); -extern bool_t xdr_ptrace_out (XDR *, ptrace_out*); -extern bool_t xdr_one_symbol (XDR *, one_symbol*); -extern bool_t xdr_all_symbols (XDR *, all_symbols*); -extern bool_t xdr_get_global_symbols_out (XDR *, get_global_symbols_out*); -extern bool_t xdr_get_text_data_in (XDR *, get_text_data_in*); -extern bool_t xdr_get_text_data_out (XDR *, get_text_data_out*); -extern bool_t xdr_one_signal (XDR *, one_signal*); -extern bool_t xdr_all_signals (XDR *, all_signals*); -extern bool_t xdr_get_signal_names_out (XDR *, get_signal_names_out*); - -#else /* K&R C */ -extern bool_t xdr_rpc_type (); -extern bool_t xdr_UDP_MSG (); -extern bool_t xdr_ptracereq (); -extern bool_t xdr_xdr_regs (); -extern bool_t xdr_xdr_mem (); -extern bool_t xdr_break_type (); -extern bool_t xdr_xdr_break (); -extern bool_t xdr_thread_name (); -extern bool_t xdr_KernThread (); -extern bool_t xdr_thread_list (); -extern bool_t xdr_ptrace_addr_data_in (); -extern bool_t xdr_ptrace_addr_data_out (); -extern bool_t xdr_CHAR_DATA (); -extern bool_t xdr_xry_inst (); -extern bool_t xdr_instance (); -extern bool_t xdr_instance_union (); -extern bool_t xdr_one_arg (); -extern bool_t xdr_debug_type (); -extern bool_t xdr_open_in (); -extern bool_t xdr_open_out (); -extern bool_t xdr_close_control (); -extern bool_t xdr_close_in (); -extern bool_t xdr_signal_in (); -extern bool_t xdr_signal_out (); -extern bool_t xdr_stop_code (); -extern bool_t xdr_wait_in (); -extern bool_t xdr_wait_out (); -extern bool_t xdr_ptrace_in (); -extern bool_t xdr_ptrace_out (); -extern bool_t xdr_one_symbol (); -extern bool_t xdr_all_symbols (); -extern bool_t xdr_get_global_symbols_out (); -extern bool_t xdr_get_text_data_in (); -extern bool_t xdr_get_text_data_out (); -extern bool_t xdr_one_signal (); -extern bool_t xdr_all_signals (); -extern bool_t xdr_get_signal_names_out (); - -#endif /* K&R C */ + extern bool_t xdr_rpc_type (XDR *, rpc_type *); + extern bool_t xdr_UDP_MSG (XDR *, UDP_MSG *); + extern bool_t xdr_ptracereq (XDR *, ptracereq *); + extern bool_t xdr_xdr_regs (XDR *, xdr_regs *); + extern bool_t xdr_xdr_mem (XDR *, xdr_mem *); + extern bool_t xdr_break_type (XDR *, break_type *); + extern bool_t xdr_xdr_break (XDR *, xdr_break *); + extern bool_t xdr_thread_name (XDR *, thread_name *); + extern bool_t xdr_KernThread (XDR *, KernThread *); + extern bool_t xdr_thread_list (XDR *, thread_list *); + extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in *); + extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out *); + extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA *); + extern bool_t xdr_xry_inst (XDR *, xry_inst *); + extern bool_t xdr_instance (XDR *, instance *); + extern bool_t xdr_instance_union (XDR *, instance_union *); + extern bool_t xdr_one_arg (XDR *, one_arg *); + extern bool_t xdr_debug_type (XDR *, debug_type *); + extern bool_t xdr_open_in (XDR *, open_in *); + extern bool_t xdr_open_out (XDR *, open_out *); + extern bool_t xdr_close_control (XDR *, close_control *); + extern bool_t xdr_close_in (XDR *, close_in *); + extern bool_t xdr_signal_in (XDR *, signal_in *); + extern bool_t xdr_signal_out (XDR *, signal_out *); + extern bool_t xdr_stop_code (XDR *, stop_code *); + extern bool_t xdr_wait_in (XDR *, wait_in *); + extern bool_t xdr_wait_out (XDR *, wait_out *); + extern bool_t xdr_ptrace_in (XDR *, ptrace_in *); + extern bool_t xdr_ptrace_out (XDR *, ptrace_out *); + extern bool_t xdr_one_symbol (XDR *, one_symbol *); + extern bool_t xdr_all_symbols (XDR *, all_symbols *); + extern bool_t xdr_get_global_symbols_out (XDR *, get_global_symbols_out *); + extern bool_t xdr_get_text_data_in (XDR *, get_text_data_in *); + extern bool_t xdr_get_text_data_out (XDR *, get_text_data_out *); + extern bool_t xdr_one_signal (XDR *, one_signal *); + extern bool_t xdr_all_signals (XDR *, all_signals *); + extern bool_t xdr_get_signal_names_out (XDR *, get_signal_names_out *); + +#else /* K&R C */ + extern bool_t xdr_rpc_type (); + extern bool_t xdr_UDP_MSG (); + extern bool_t xdr_ptracereq (); + extern bool_t xdr_xdr_regs (); + extern bool_t xdr_xdr_mem (); + extern bool_t xdr_break_type (); + extern bool_t xdr_xdr_break (); + extern bool_t xdr_thread_name (); + extern bool_t xdr_KernThread (); + extern bool_t xdr_thread_list (); + extern bool_t xdr_ptrace_addr_data_in (); + extern bool_t xdr_ptrace_addr_data_out (); + extern bool_t xdr_CHAR_DATA (); + extern bool_t xdr_xry_inst (); + extern bool_t xdr_instance (); + extern bool_t xdr_instance_union (); + extern bool_t xdr_one_arg (); + extern bool_t xdr_debug_type (); + extern bool_t xdr_open_in (); + extern bool_t xdr_open_out (); + extern bool_t xdr_close_control (); + extern bool_t xdr_close_in (); + extern bool_t xdr_signal_in (); + extern bool_t xdr_signal_out (); + extern bool_t xdr_stop_code (); + extern bool_t xdr_wait_in (); + extern bool_t xdr_wait_out (); + extern bool_t xdr_ptrace_in (); + extern bool_t xdr_ptrace_out (); + extern bool_t xdr_one_symbol (); + extern bool_t xdr_all_symbols (); + extern bool_t xdr_get_global_symbols_out (); + extern bool_t xdr_get_text_data_in (); + extern bool_t xdr_get_text_data_out (); + extern bool_t xdr_one_signal (); + extern bool_t xdr_all_signals (); + extern bool_t xdr_get_signal_names_out (); + +#endif /* K&R C */ #ifdef __cplusplus } #endif - -#endif /* !_REMDEB_H_RPCGEN */ +#endif /* !_REMDEB_H_RPCGEN */ diff --git a/c/src/librdbg/src/i386/any/remdeb_svc.c b/c/src/librdbg/src/i386/any/remdeb_svc.c index 2e5b3725e4..1827a53e3c 100644 --- a/c/src/librdbg/src/i386/any/remdeb_svc.c +++ b/c/src/librdbg/src/i386/any/remdeb_svc.c @@ -22,101 +22,112 @@ * become too small if this value gets incremented. */ #ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ - /* now open_connex() routine which establishes a connection to server */ -#define DEBUGGER_IS_GDB 0x2 /* */ - /* now close_connex() routine which detaches from server */ - /* now send_signal() routine which sends signals to processes like kill(2) */ - /* 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 */ - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ - /* now define the actual calls we support */ -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" +#endif /* REMDEB_H */ + /* + * now open_connex() routine which establishes a connection to server + */ +#define DEBUGGER_IS_GDB 0x2 /* */ + /* + * now close_connex() routine which detaches from server + */ + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ + /* + * 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 + */ + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ + /* + * now define the actual calls we support + */ +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" }; void -remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp) +remotedeb_2 (struct svc_req *rqstp, register SVCXPRT * transp) { - union { - open_in open_connex_2_arg; - signal_in send_signal_2_arg; - close_in close_connex_2_arg; - ptrace_in ptrace_2_arg; - wait_in wait_info_2_arg; - } argument; - char *result; - xdrproc_t _xdr_argument, _xdr_result; - char *(*local)(char *, struct svc_req *); + union { + open_in open_connex_2_arg; + signal_in send_signal_2_arg; + close_in close_connex_2_arg; + ptrace_in ptrace_2_arg; + wait_in wait_info_2_arg; + } argument; + char *result; + xdrproc_t _xdr_argument, _xdr_result; + char *(*local) (char *, struct svc_req *); - DPRINTF (("remotedeb_2: %s (%d)\n", - (unsigned) rqstp->rq_proc < - (unsigned) (sizeof names / sizeof names[0]) ? - names [rqstp->rq_proc] : "???", - (int) rqstp->rq_proc)); + DPRINTF (("remotedeb_2: %s (%d)\n", + (unsigned) rqstp->rq_proc < + (unsigned) (sizeof names / sizeof names[0]) ? + names[rqstp->rq_proc] : "???", (int) rqstp->rq_proc)); - switch (rqstp->rq_proc) { - case NULLPROC: - (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); - return; + switch (rqstp->rq_proc) { + case NULLPROC: + (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL); + return; - case OPEN_CONNEX: - _xdr_argument = (xdrproc_t) xdr_open_in; - _xdr_result = (xdrproc_t) xdr_open_out; - local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc; - break; + case OPEN_CONNEX: + _xdr_argument = (xdrproc_t) xdr_open_in; + _xdr_result = (xdrproc_t) xdr_open_out; + local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc; + break; - case SEND_SIGNAL: - _xdr_argument = (xdrproc_t) xdr_signal_in; - _xdr_result = (xdrproc_t) xdr_signal_out; - local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc; - break; + case SEND_SIGNAL: + _xdr_argument = (xdrproc_t) xdr_signal_in; + _xdr_result = (xdrproc_t) xdr_signal_out; + local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc; + break; - case CLOSE_CONNEX: - _xdr_argument = (xdrproc_t) xdr_close_in; - _xdr_result = (xdrproc_t) xdr_void; - local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc; - break; + case CLOSE_CONNEX: + _xdr_argument = (xdrproc_t) xdr_close_in; + _xdr_result = (xdrproc_t) xdr_void; + local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc; + break; - case PTRACE: - _xdr_argument = (xdrproc_t) xdr_ptrace_in; - _xdr_result = (xdrproc_t) xdr_ptrace_out; - local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc; - break; + case PTRACE: + _xdr_argument = (xdrproc_t) xdr_ptrace_in; + _xdr_result = (xdrproc_t) xdr_ptrace_out; + local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc; + break; - case WAIT_INFO: - _xdr_argument = (xdrproc_t) xdr_wait_in; - _xdr_result = (xdrproc_t) xdr_wait_out; - local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc; - break; + case WAIT_INFO: + _xdr_argument = (xdrproc_t) xdr_wait_in; + _xdr_result = (xdrproc_t) xdr_wait_out; + local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc; + break; - case GET_SIGNAL_NAMES: - _xdr_argument = (xdrproc_t) xdr_void; - _xdr_result = (xdrproc_t) xdr_get_signal_names_out; - local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc; - break; + case GET_SIGNAL_NAMES: + _xdr_argument = (xdrproc_t) xdr_void; + _xdr_result = (xdrproc_t) xdr_get_signal_names_out; + local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc; + break; - default: - svcerr_noproc (transp); - return; - } - memset ((char *)&argument, 0, sizeof (argument)); - if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) { - svcerr_decode (transp); - return; - } - result = (*local)((char *)&argument, rqstp); - if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) { - svcerr_systemerr (transp); - } - if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) { - fprintf (stderr, "unable to free arguments"); - exit (1); - } - return; + default: + svcerr_noproc (transp); + return; + } + memset ((char *) &argument, 0, sizeof (argument)); + if (!svc_getargs (transp, _xdr_argument, (caddr_t) & argument)) { + svcerr_decode (transp); + return; + } + result = (*local) ((char *) &argument, rqstp); + if (result != NULL && !svc_sendreply (transp, _xdr_result, result)) { + svcerr_systemerr (transp); + } + if (!svc_freeargs (transp, _xdr_argument, (caddr_t) & argument)) { + fprintf (stderr, "unable to free arguments"); + exit (1); + } + return; } diff --git a/c/src/librdbg/src/i386/any/remdeb_xdr.c b/c/src/librdbg/src/i386/any/remdeb_xdr.c index d26a9544ec..b3d6cf7a02 100644 --- a/c/src/librdbg/src/i386/any/remdeb_xdr.c +++ b/c/src/librdbg/src/i386/any/remdeb_xdr.c @@ -8,95 +8,94 @@ #define RTEMS_BACK_PORT 2073 bool_t -xdr_rpc_type (XDR *xdrs, rpc_type *objp) +xdr_rpc_type (XDR * xdrs, rpc_type * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; } bool_t -xdr_UDP_MSG (XDR *xdrs, UDP_MSG *objp) +xdr_UDP_MSG (XDR * xdrs, UDP_MSG * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->msg_num)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->spec)) - return FALSE; - if (!xdr_long (xdrs, &objp->pid)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->context)) - return FALSE; - return TRUE; + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->msg_num)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->spec)) + return FALSE; + if (!xdr_long (xdrs, &objp->pid)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->context)) + return FALSE; + return TRUE; } + /* * Sun request values for the remote ptrace system call */ - bool_t -xdr_ptracereq (XDR *xdrs, ptracereq *objp) +xdr_ptracereq (XDR * xdrs, ptracereq * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; } bool_t -xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) +xdr_xdr_regs (XDR * xdrs, xdr_regs * objp) { - register int32_t *buf; + register int32_t *buf; - int i; + int i; - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs, 19 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->tabreg, 19, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - } else { - { - register u_int *genp; + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 19 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->tabreg, 19, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + } else { + { + register u_int *genp; - for (i = 0, genp = objp->tabreg; - i < 19; ++i) { - IXDR_PUT_U_LONG(buf, *genp++); - } - } - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs, 19 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->tabreg, 19, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - } else { - { - register u_int *genp; + for (i = 0, genp = objp->tabreg; i < 19; ++i) { + IXDR_PUT_U_LONG (buf, *genp++); + } + } + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 19 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->tabreg, 19, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + } else { + { + register u_int *genp; - for (i = 0, genp = objp->tabreg; - i < 19; ++i) { - *genp++ = IXDR_GET_U_LONG(buf); - } - } - } - return TRUE; - } + for (i = 0, genp = objp->tabreg; i < 19; ++i) { + *genp++ = IXDR_GET_U_LONG (buf); + } + } + } + return TRUE; + } - if (!xdr_vector (xdrs, (char *)objp->tabreg, 19, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - return TRUE; + if (!xdr_vector (xdrs, (char *) objp->tabreg, 19, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + return TRUE; } + /* * Memory data for read/write text or data. The size is in data. The target * addr is in the addr field. @@ -104,825 +103,856 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) * pipes and is allocated on stack too. Pipes and/or the stack could * become too small if this value gets incremented. */ -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)); -} - -bool_t -xdr_break_type (XDR *xdrs, break_type *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_xdr_break (XDR *xdrs, xdr_break *objp) -{ - register int32_t *buf; - - int i; - - if (xdrs->x_op == XDR_ENCODE) { - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - - } else { - IXDR_PUT_U_SHORT(buf, objp->handle); - IXDR_PUT_U_LONG(buf, objp->ee_loc); - IXDR_PUT_U_LONG(buf, objp->ee_type); - IXDR_PUT_U_SHORT(buf, objp->length); - } - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - buf = XDR_INLINE(xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - } else { - { - register u_long *genp; - - for (i = 0, genp = objp->thread_list; - i < MAX_THRD_BRK; ++i) { - IXDR_PUT_U_LONG(buf, *genp++); - } - } - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - - } else { - objp->handle = IXDR_GET_U_SHORT(buf); - objp->ee_loc = IXDR_GET_U_LONG(buf); - objp->ee_type = IXDR_GET_U_LONG(buf); - objp->length = IXDR_GET_U_SHORT(buf); - } - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - buf = XDR_INLINE(xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - } else { - { - register u_long *genp; - - for (i = 0, genp = objp->thread_list; - i < MAX_THRD_BRK; ++i) { - *genp++ = IXDR_GET_U_LONG(buf); - } - } - } - return TRUE; - } - - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - return TRUE; -} - -bool_t -xdr_thread_name (XDR *xdrs, thread_name *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, objp, THREADNAMEMAX)) - return FALSE; - return TRUE; -} - -bool_t -xdr_KernThread (XDR *xdrs, KernThread *objp) -{ - register int32_t *buf; - - if (!xdr_u_int (xdrs, &objp->threadLi)) - return FALSE; - return TRUE; -} -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)); -} - -bool_t -xdr_ptrace_addr_data_in (XDR *xdrs, ptrace_addr_data_in *objp) -{ - register int32_t *buf; - - if (!xdr_ptracereq (xdrs, &objp->req)) - return FALSE; - switch (objp->req) { - case RPT_SETTHREADREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) - return FALSE; - break; - case RPT_SETREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) - return FALSE; - break; - case RPT_PSETTHREADREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_in_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_PSETREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_in_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_SETTHREADNAME: - if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_in_u.name)) - return FALSE; - break; - case RPT_WRITETEXT: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) - return FALSE; - break; - case RPT_WRITEDATA: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) - return FALSE; - break; - case RPT_SETBREAK: - if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_in_u.breakp)) - return FALSE; - break; - default: - if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_in_u.address)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_ptrace_addr_data_out (XDR *xdrs, ptrace_addr_data_out *objp) -{ - register int32_t *buf; - - if (!xdr_ptracereq (xdrs, &objp->req)) - return FALSE; - switch (objp->req) { - case RPT_GETREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) - return FALSE; - break; - case RPT_GETTHREADREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) - return FALSE; - break; - case RPT_PGETREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_out_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_PGETTHREADREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_out_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_THREADLIST: - if (!xdr_thread_list (xdrs, &objp->ptrace_addr_data_out_u.threads)) - return FALSE; - break; - case RPT_GETTHREADNAME: - if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_out_u.name)) - return FALSE; - break; - case RPT_READTEXT: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_GETNAME: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_READDATA: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_GETBREAK: - if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_out_u.breakp)) - return FALSE; - break; - default: - if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_out_u.addr)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_CHAR_DATA (XDR *xdrs, CHAR_DATA *objp) -{ - register int32_t *buf; - - if (!xdr_bytes (xdrs, (char **)&objp->CHAR_DATA_val, (u_int *) &objp->CHAR_DATA_len, NET_SAFE)) - return FALSE; - return TRUE; +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)); +} + +bool_t +xdr_break_type (XDR * xdrs, break_type * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_xdr_break (XDR * xdrs, xdr_break * objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + + } else { + IXDR_PUT_U_SHORT (buf, objp->handle); + IXDR_PUT_U_LONG (buf, objp->ee_loc); + IXDR_PUT_U_LONG (buf, objp->ee_type); + IXDR_PUT_U_SHORT (buf, objp->length); + } + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + buf = XDR_INLINE (xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + } else { + { + register u_long *genp; + + for (i = 0, genp = objp->thread_list; i < MAX_THRD_BRK; ++i) { + IXDR_PUT_U_LONG (buf, *genp++); + } + } + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + + } else { + objp->handle = IXDR_GET_U_SHORT (buf); + objp->ee_loc = IXDR_GET_U_LONG (buf); + objp->ee_type = IXDR_GET_U_LONG (buf); + objp->length = IXDR_GET_U_SHORT (buf); + } + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + buf = XDR_INLINE (xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + } else { + { + register u_long *genp; + + for (i = 0, genp = objp->thread_list; i < MAX_THRD_BRK; ++i) { + *genp++ = IXDR_GET_U_LONG (buf); + } + } + } + return TRUE; + } + + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + return TRUE; +} + +bool_t +xdr_thread_name (XDR * xdrs, thread_name * objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, objp, THREADNAMEMAX)) + return FALSE; + return TRUE; +} + +bool_t +xdr_KernThread (XDR * xdrs, KernThread * objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->threadLi)) + return FALSE; + return TRUE; +} + +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)); +} + +bool_t +xdr_ptrace_addr_data_in (XDR * xdrs, ptrace_addr_data_in * objp) +{ + register int32_t *buf; + + if (!xdr_ptracereq (xdrs, &objp->req)) + return FALSE; + switch (objp->req) { + case RPT_SETTHREADREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) + return FALSE; + break; + case RPT_SETREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) + return FALSE; + break; + case RPT_PSETTHREADREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_in_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_PSETREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_in_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_SETTHREADNAME: + if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_in_u.name)) + return FALSE; + break; + case RPT_WRITETEXT: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) + return FALSE; + break; + case RPT_WRITEDATA: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) + return FALSE; + break; + case RPT_SETBREAK: + if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_in_u.breakp)) + return FALSE; + break; + default: + if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_in_u.address)) + return FALSE; + break; + } + return TRUE; +} + +bool_t +xdr_ptrace_addr_data_out (XDR * xdrs, ptrace_addr_data_out * objp) +{ + register int32_t *buf; + + if (!xdr_ptracereq (xdrs, &objp->req)) + return FALSE; + switch (objp->req) { + case RPT_GETREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) + return FALSE; + break; + case RPT_GETTHREADREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) + return FALSE; + break; + case RPT_PGETREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_out_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_PGETTHREADREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_out_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_THREADLIST: + if (!xdr_thread_list (xdrs, &objp->ptrace_addr_data_out_u.threads)) + return FALSE; + break; + case RPT_GETTHREADNAME: + if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_out_u.name)) + return FALSE; + break; + case RPT_READTEXT: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_GETNAME: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_READDATA: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_GETBREAK: + if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_out_u.breakp)) + return FALSE; + break; + default: + if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_out_u.addr)) + return FALSE; + break; + } + return TRUE; +} + +bool_t +xdr_CHAR_DATA (XDR * xdrs, CHAR_DATA * objp) +{ + register int32_t *buf; + + if (!xdr_bytes + (xdrs, (char **) &objp->CHAR_DATA_val, (u_int *) & objp->CHAR_DATA_len, + NET_SAFE)) + return FALSE; + return TRUE; } + #ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ +#endif /* REMDEB_H */ + +bool_t +xdr_xry_inst (XDR * xdrs, xry_inst * objp) +{ + register int32_t *buf; + + if (!xdr_u_char (xdrs, &objp->flags)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->sub_type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->res_type)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->value)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->value2)) + return FALSE; + return TRUE; +} bool_t -xdr_xry_inst (XDR *xdrs, xry_inst *objp) +xdr_instance (XDR * xdrs, instance * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_char (xdrs, &objp->flags)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->sub_type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->res_type)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value2)) - return FALSE; - return TRUE; + int i; + if (!xdr_vector (xdrs, (char *) objp->instances, XRY_MAX_INSTANCES, + sizeof (xry_inst), (xdrproc_t) xdr_xry_inst)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->buffer, XRY_MAX_INST_BUFF, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + return TRUE; } bool_t -xdr_instance (XDR *xdrs, instance *objp) +xdr_instance_union (XDR * xdrs, instance_union * objp) { - register int32_t *buf; + register int32_t *buf; - int i; - if (!xdr_vector (xdrs, (char *)objp->instances, XRY_MAX_INSTANCES, - sizeof (xry_inst), (xdrproc_t) xdr_xry_inst)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->buffer, XRY_MAX_INST_BUFF, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - return TRUE; + if (!xdr_bool (xdrs, &objp->instances)) + return FALSE; + switch (objp->instances) { + case TRUE: + if (!xdr_instance (xdrs, &objp->instance_union_u.inst)) + return FALSE; + break; + case FALSE: + if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR)) + return FALSE; + break; + default: + return FALSE; + } + return TRUE; } bool_t -xdr_instance_union (XDR *xdrs, instance_union *objp) +xdr_one_arg (XDR * xdrs, one_arg * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_bool (xdrs, &objp->instances)) - return FALSE; - switch (objp->instances) { - case TRUE: - if (!xdr_instance (xdrs, &objp->instance_union_u.inst)) - return FALSE; - break; - case FALSE: - if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR)) - return FALSE; - break; - default: - return FALSE; - } - return TRUE; + if (!xdr_string (xdrs, objp, NET_SAFE)) + return FALSE; + return TRUE; } -bool_t -xdr_one_arg (XDR *xdrs, one_arg *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, objp, NET_SAFE)) - return FALSE; - return TRUE; -} - /* now open_connex() routine which establishes a connection to server */ - -bool_t -xdr_debug_type (XDR *xdrs, debug_type *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} -#define DEBUGGER_IS_GDB 0x2 /* */ - -bool_t -xdr_open_in (XDR *xdrs, open_in *objp) -{ - register int32_t *buf; - - int i; - if (!xdr_vector (xdrs, (char *)objp->back_port, 16, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->debug_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->flags)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->destination, 16, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - if (!xdr_one_arg (xdrs, &objp->user_name)) - return FALSE; - return TRUE; -} - -bool_t -xdr_open_out (XDR *xdrs, open_out *objp) -{ - register int32_t *buf; - - int i; - - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs, (2 + ( 4 )) * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; + /* + * now open_connex() routine which establishes a connection to server + */ + +bool_t +xdr_debug_type (XDR * xdrs, debug_type * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +#define DEBUGGER_IS_GDB 0x2 /* */ + +bool_t +xdr_open_in (XDR * xdrs, open_in * objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *) objp->back_port, 16, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->debug_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->flags)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->destination, 16, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + if (!xdr_one_arg (xdrs, &objp->user_name)) + return FALSE; + return TRUE; +} + +bool_t +xdr_open_out (XDR * xdrs, open_out * objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, (2 + (4)) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + + } else { + IXDR_PUT_U_LONG (buf, objp->port); + { + register u_int *genp; + + for (i = 0, genp = objp->pad; i < 4; ++i) { + IXDR_PUT_U_LONG (buf, *genp++); + } + } + IXDR_PUT_U_LONG (buf, objp->fp); + } + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, (2 + (4)) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + + } else { + objp->port = IXDR_GET_U_LONG (buf); + { + register u_int *genp; + + for (i = 0, genp = objp->pad; i < 4; ++i) { + *genp++ = IXDR_GET_U_LONG (buf); + } + } + objp->fp = IXDR_GET_U_LONG (buf); + } + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; + } + + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; +} + + /* + * now close_connex() routine which detaches from server + */ + +bool_t +xdr_close_control (XDR * xdrs, close_control * objp) +{ + register int32_t *buf; - } else { - IXDR_PUT_U_LONG(buf, objp->port); - { - register u_int *genp; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} - for (i = 0, genp = objp->pad; - i < 4; ++i) { - IXDR_PUT_U_LONG(buf, *genp++); - } - } - IXDR_PUT_U_LONG(buf, objp->fp); - } - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs, (2 + ( 4 )) * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; +bool_t +xdr_close_in (XDR * xdrs, close_in * objp) +{ + register int32_t *buf; - } else { - objp->port = IXDR_GET_U_LONG(buf); - { - register u_int *genp; + if (!xdr_close_control (xdrs, &objp->control)) + return FALSE; + return TRUE; +} - for (i = 0, genp = objp->pad; - i < 4; ++i) { - *genp++ = IXDR_GET_U_LONG(buf); - } - } - objp->fp = IXDR_GET_U_LONG(buf); - } - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; - } + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; -} - /* now close_connex() routine which detaches from server */ - -bool_t -xdr_close_control (XDR *xdrs, close_control *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_close_in (XDR *xdrs, close_in *objp) -{ - register int32_t *buf; - - if (!xdr_close_control (xdrs, &objp->control)) - return FALSE; - return TRUE; -} - /* now send_signal() routine which sends signals to processes like kill(2) */ - -bool_t -xdr_signal_in (XDR *xdrs, signal_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_int (xdrs, &objp->sig)) - return FALSE; - return TRUE; -} - -bool_t -xdr_signal_out (XDR *xdrs, signal_out *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->kill_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - return TRUE; -} - /* 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 */ - -bool_t -xdr_stop_code (XDR *xdrs, stop_code *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_wait_in (XDR *xdrs, wait_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - return TRUE; -} - -bool_t -xdr_wait_out (XDR *xdrs, wait_out *objp) -{ - register int32_t *buf; - - - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - - } else { - IXDR_PUT_LONG(buf, objp->wait_return); - IXDR_PUT_LONG(buf, objp->errNo); - IXDR_PUT_LONG(buf, objp->status); - } - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - buf = XDR_INLINE(xdrs,5 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - } else { - IXDR_PUT_LONG(buf, objp->handle); - IXDR_PUT_U_LONG(buf, objp->PC); - IXDR_PUT_U_LONG(buf, objp->SP); - IXDR_PUT_U_LONG(buf, objp->FP); - IXDR_PUT_U_LONG(buf, objp->thread); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - - } else { - objp->wait_return = IXDR_GET_LONG(buf); - objp->errNo = IXDR_GET_LONG(buf); - objp->status = IXDR_GET_LONG(buf); - } - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - buf = XDR_INLINE(xdrs,5 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - } else { - objp->handle = IXDR_GET_LONG(buf); - objp->PC = IXDR_GET_U_LONG(buf); - objp->SP = IXDR_GET_U_LONG(buf); - objp->FP = IXDR_GET_U_LONG(buf); - objp->thread = IXDR_GET_U_LONG(buf); - } - return TRUE; - } - - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - return TRUE; -} - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ - -bool_t -xdr_ptrace_in (XDR *xdrs, ptrace_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_ptrace_addr_data_in (xdrs, &objp->addr)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->data)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->flags)) - return FALSE; - return TRUE; -} - -bool_t -xdr_ptrace_out (XDR *xdrs, ptrace_out *objp) -{ - register int32_t *buf; - - if (!xdr_ptrace_addr_data_out (xdrs, &objp->addr)) - return FALSE; - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - return TRUE; -} - -bool_t -xdr_one_symbol (XDR *xdrs, one_symbol *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, &objp->symbolName, ~0)) - return FALSE; - if (!xdr_long (xdrs, &objp->symbolValue)) - return FALSE; - return TRUE; -} - -bool_t -xdr_all_symbols (XDR *xdrs, all_symbols *objp) -{ - register int32_t *buf; - - if (!xdr_array (xdrs, (char **)&objp->all_symbols_val, (u_int *) &objp->all_symbols_len, ~0, - sizeof (one_symbol), (xdrproc_t) xdr_one_symbol)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_global_symbols_out (XDR *xdrs, get_global_symbols_out *objp) -{ - register int32_t *buf; - - if (!xdr_all_symbols (xdrs, &objp->symbols)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_text_data_in (XDR *xdrs, get_text_data_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_string (xdrs, &objp->actorName, 16)) - return FALSE; - return TRUE; +bool_t +xdr_signal_in (XDR * xdrs, signal_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_int (xdrs, &objp->sig)) + return FALSE; + return TRUE; } bool_t -xdr_get_text_data_out (XDR *xdrs, get_text_data_out *objp) +xdr_signal_out (XDR * xdrs, signal_out * objp) { - register int32_t *buf; + register int32_t *buf; + if (!xdr_int (xdrs, &objp->kill_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + return TRUE; +} - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs,6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - } else { - IXDR_PUT_LONG(buf, objp->result); - IXDR_PUT_LONG(buf, objp->errNo); - IXDR_PUT_U_LONG(buf, objp->textStart); - IXDR_PUT_U_LONG(buf, objp->textSize); - IXDR_PUT_U_LONG(buf, objp->dataStart); - IXDR_PUT_U_LONG(buf, objp->dataSize); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs,6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - } else { - objp->result = IXDR_GET_LONG(buf); - objp->errNo = IXDR_GET_LONG(buf); - objp->textStart = IXDR_GET_U_LONG(buf); - objp->textSize = IXDR_GET_U_LONG(buf); - objp->dataStart = IXDR_GET_U_LONG(buf); - objp->dataSize = IXDR_GET_U_LONG(buf); - } - return TRUE; - } + /* + * 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 + */ - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - return TRUE; +bool_t +xdr_stop_code (XDR * xdrs, stop_code * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_wait_in (XDR * xdrs, wait_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + return TRUE; +} + +bool_t +xdr_wait_out (XDR * xdrs, wait_out * objp) +{ + register int32_t *buf; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + + } else { + IXDR_PUT_LONG (buf, objp->wait_return); + IXDR_PUT_LONG (buf, objp->errNo); + IXDR_PUT_LONG (buf, objp->status); + } + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + } else { + IXDR_PUT_LONG (buf, objp->handle); + IXDR_PUT_U_LONG (buf, objp->PC); + IXDR_PUT_U_LONG (buf, objp->SP); + IXDR_PUT_U_LONG (buf, objp->FP); + IXDR_PUT_U_LONG (buf, objp->thread); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + + } else { + objp->wait_return = IXDR_GET_LONG (buf); + objp->errNo = IXDR_GET_LONG (buf); + objp->status = IXDR_GET_LONG (buf); + } + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + } else { + objp->handle = IXDR_GET_LONG (buf); + objp->PC = IXDR_GET_U_LONG (buf); + objp->SP = IXDR_GET_U_LONG (buf); + objp->FP = IXDR_GET_U_LONG (buf); + objp->thread = IXDR_GET_U_LONG (buf); + } + return TRUE; + } + + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + return TRUE; } + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ + bool_t -xdr_one_signal (XDR *xdrs, one_signal *objp) +xdr_ptrace_in (XDR * xdrs, ptrace_in * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_int (xdrs, &objp->number)) - return FALSE; - if (!xdr_string (xdrs, &objp->name, ~0)) - return FALSE; - return TRUE; -} - -bool_t -xdr_all_signals (XDR *xdrs, all_signals *objp) -{ - register int32_t *buf; - - if (!xdr_array (xdrs, (char **)&objp->all_signals_val, (u_int *) &objp->all_signals_len, ~0, - sizeof (one_signal), (xdrproc_t) xdr_one_signal)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_signal_names_out (XDR *xdrs, get_signal_names_out *objp) -{ - register int32_t *buf; - - if (!xdr_all_signals (xdrs, &objp->signals)) - return FALSE; - return TRUE; -} - /* now define the actual calls we support */ + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_ptrace_addr_data_in (xdrs, &objp->addr)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->data)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->flags)) + return FALSE; + return TRUE; +} + +bool_t +xdr_ptrace_out (XDR * xdrs, ptrace_out * objp) +{ + register int32_t *buf; + + if (!xdr_ptrace_addr_data_out (xdrs, &objp->addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + return TRUE; +} + +bool_t +xdr_one_symbol (XDR * xdrs, one_symbol * objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->symbolName, ~0)) + return FALSE; + if (!xdr_long (xdrs, &objp->symbolValue)) + return FALSE; + return TRUE; +} + +bool_t +xdr_all_symbols (XDR * xdrs, all_symbols * objp) +{ + register int32_t *buf; + + if (!xdr_array + (xdrs, (char **) &objp->all_symbols_val, + (u_int *) & objp->all_symbols_len, ~0, sizeof (one_symbol), + (xdrproc_t) xdr_one_symbol)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_global_symbols_out (XDR * xdrs, get_global_symbols_out * objp) +{ + register int32_t *buf; + + if (!xdr_all_symbols (xdrs, &objp->symbols)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_text_data_in (XDR * xdrs, get_text_data_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_string (xdrs, &objp->actorName, 16)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_text_data_out (XDR * xdrs, get_text_data_out * objp) +{ + register int32_t *buf; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + } else { + IXDR_PUT_LONG (buf, objp->result); + IXDR_PUT_LONG (buf, objp->errNo); + IXDR_PUT_U_LONG (buf, objp->textStart); + IXDR_PUT_U_LONG (buf, objp->textSize); + IXDR_PUT_U_LONG (buf, objp->dataStart); + IXDR_PUT_U_LONG (buf, objp->dataSize); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + } else { + objp->result = IXDR_GET_LONG (buf); + objp->errNo = IXDR_GET_LONG (buf); + objp->textStart = IXDR_GET_U_LONG (buf); + objp->textSize = IXDR_GET_U_LONG (buf); + objp->dataStart = IXDR_GET_U_LONG (buf); + objp->dataSize = IXDR_GET_U_LONG (buf); + } + return TRUE; + } + + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + return TRUE; +} + +bool_t +xdr_one_signal (XDR * xdrs, one_signal * objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->number)) + return FALSE; + if (!xdr_string (xdrs, &objp->name, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr_all_signals (XDR * xdrs, all_signals * objp) +{ + register int32_t *buf; + + if (!xdr_array + (xdrs, (char **) &objp->all_signals_val, + (u_int *) & objp->all_signals_len, ~0, sizeof (one_signal), + (xdrproc_t) xdr_one_signal)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_signal_names_out (XDR * xdrs, get_signal_names_out * objp) +{ + register int32_t *buf; + + if (!xdr_all_signals (xdrs, &objp->signals)) + return FALSE; + return TRUE; +} + + /* + * now define the actual calls we support + */ diff --git a/c/src/librdbg/src/i386/excep_f.c b/c/src/librdbg/src/i386/excep_f.c index 100b0d79d6..d994e4f7e5 100644 --- a/c/src/librdbg/src/i386/excep_f.c +++ b/c/src/librdbg/src/i386/excep_f.c @@ -22,43 +22,41 @@ It is identical to the one used by the PM and the AM. ----------------------------------------------------------------- */ - int -ExcepToSig (Exception_context *ctx) + int +ExcepToSig (Exception_context * ctx) { - int excep = getExcNum (ctx); - - - switch (excep) { - - case I386_EXCEPTION_MATH_COPROC_UNAVAIL: - case I386_EXCEPTION_I386_COPROC_SEG_ERR: - case I386_EXCEPTION_FLOAT_ERROR: - case I386_EXCEPTION_BOUND: - return SIGFPE; - - case I386_EXCEPTION_DEBUG: - case I386_EXCEPTION_BREAKPOINT: - case I386_EXCEPTION_ENTER_RDBG: - return SIGTRAP; - - case I386_EXCEPTION_OVERFLOW: - case I386_EXCEPTION_DIVIDE_BY_ZERO: - case I386_EXCEPTION_ILLEGAL_INSTR: - return SIGILL; - - case I386_EXCEPTION_SEGMENT_NOT_PRESENT: - case I386_EXCEPTION_STACK_SEGMENT_FAULT: - case I386_EXCEPTION_GENERAL_PROT_ERR: - case I386_EXCEPTION_PAGE_FAULT: - return SIGSEGV; + int excep = getExcNum (ctx); - default: - break; - } - return SIGKILL; + switch (excep) { + + case I386_EXCEPTION_MATH_COPROC_UNAVAIL: + case I386_EXCEPTION_I386_COPROC_SEG_ERR: + case I386_EXCEPTION_FLOAT_ERROR: + case I386_EXCEPTION_BOUND: + return SIGFPE; + + case I386_EXCEPTION_DEBUG: + case I386_EXCEPTION_BREAKPOINT: + case I386_EXCEPTION_ENTER_RDBG: + return SIGTRAP; + + case I386_EXCEPTION_OVERFLOW: + case I386_EXCEPTION_DIVIDE_BY_ZERO: + case I386_EXCEPTION_ILLEGAL_INSTR: + return SIGILL; + + case I386_EXCEPTION_SEGMENT_NOT_PRESENT: + case I386_EXCEPTION_STACK_SEGMENT_FAULT: + case I386_EXCEPTION_GENERAL_PROT_ERR: + case I386_EXCEPTION_PAGE_FAULT: + return SIGSEGV; + + default: + break; + } + return SIGKILL; } - /*----- Breakpoint Exception management -----*/ /* @@ -66,88 +64,81 @@ ExcepToSig (Exception_context *ctx) * software breakpoints. */ -void -BreakPointExcHdl(CPU_Exception_frame *ctx) + void +BreakPointExcHdl (CPU_Exception_frame * ctx) { rtems_status_code status; rtems_id continueSemId; - if ( (justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG) ) { + if ((justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG)) { PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); justSaveContext = 0; - } - else { - if (ctx->idtIndex != I386_EXCEPTION_DEBUG){ + } else { + if (ctx->idtIndex != I386_EXCEPTION_DEBUG) { NbSerializedCtx++; - rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); NbSerializedCtx--; } - + currentTargetThread = _Thread_Executing->Object.id; #ifdef DDEBUG - printk("----------------------------------------------------------\n"); - printk("Exception %d caught at PC %x by thread %d\n", - ctx->idtIndex, - ctx->eip, - _Thread_Executing->Object.id); - printk("----------------------------------------------------------\n"); - printk("Processor execution context at time of the fault was :\n"); - printk("----------------------------------------------------------\n"); - printk(" EAX = %x EBX = %x ECX = %x EDX = %x\n", - ctx->eax, ctx->ebx, ctx->ecx, ctx->edx); - printk(" ESI = %x EDI = %x EBP = %x ESP = %x\n", - ctx->esi, ctx->edi, ctx->ebp, ctx->esp0); - printk("----------------------------------------------------------\n"); - printk("Error code pushed by processor itself (if not 0) = %x\n", - ctx->faultCode); - printk("----------------------------------------------------------\n\n"); + printk ("----------------------------------------------------------\n"); + printk ("Exception %d caught at PC %x by thread %d\n", + ctx->idtIndex, ctx->eip, _Thread_Executing->Object.id); + printk ("----------------------------------------------------------\n"); + printk ("Processor execution context at time of the fault was :\n"); + printk ("----------------------------------------------------------\n"); + printk (" EAX = %x EBX = %x ECX = %x EDX = %x\n", + ctx->eax, ctx->ebx, ctx->ecx, ctx->edx); + printk (" ESI = %x EDI = %x EBP = %x ESP = %x\n", + ctx->esi, ctx->edi, ctx->ebp, ctx->esp0); + printk ("----------------------------------------------------------\n"); + printk ("Error code pushed by processor itself (if not 0) = %x\n", + ctx->faultCode); + printk ("----------------------------------------------------------\n\n"); #endif - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'), - 0, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &continueSemId); + status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'), + 0, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, 0, &continueSemId); if (status != RTEMS_SUCCESSFUL) - rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status)); + rtems_panic ("Can't create continue semaphore: `%s'\n", + rtems_status_text (status)); PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); - - switch (ctx->idtIndex){ + + switch (ctx->idtIndex) { case I386_EXCEPTION_DEBUG: - DPRINTF((" DEBUG EXCEPTION !!!\n")); + DPRINTF ((" DEBUG EXCEPTION !!!\n")); ctx->eflags &= ~EFLAGS_TF; - ExitForSingleStep-- ; - rtems_semaphore_release( wakeupEventSemId ); - break; + ExitForSingleStep--; + rtems_semaphore_release (wakeupEventSemId); + break; case I386_EXCEPTION_BREAKPOINT: - DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; + DPRINTF ((" BREAKPOINT EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); + break; case I386_EXCEPTION_ENTER_RDBG: - DPRINTF((" ENTER RDBG !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + DPRINTF ((" ENTER RDBG !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; default: - DPRINTF((" OTHER EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + DPRINTF ((" OTHER EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; } - rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - + rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + PopExceptCtx (_Thread_Executing->Object.id); - rtems_semaphore_delete(continueSemId); + rtems_semaphore_delete (continueSemId); } } - - - diff --git a/c/src/librdbg/src/i386/rdbg_f.c b/c/src/librdbg/src/i386/rdbg_f.c index b339256e70..e903309578 100644 --- a/c/src/librdbg/src/i386/rdbg_f.c +++ b/c/src/librdbg/src/i386/rdbg_f.c @@ -12,144 +12,157 @@ #include #include -#include +#include #include #include -#include -#include +#include +#include - -void -CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs) + void +CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs) { - regs->tabreg [GS] = 0; - regs->tabreg [FS] = 0; - regs->tabreg [ES] = 0; - regs->tabreg [DS] = 0; - regs->tabreg [EDI] = ctx->edi; - regs->tabreg [ESI] = ctx->esi; - regs->tabreg [EBP] = ctx->ebp; - regs->tabreg [ESP] = ctx->esp0; - regs->tabreg [EBX] = ctx->ebx; - regs->tabreg [EDX] = ctx->edx; - regs->tabreg [ECX] = ctx->ecx; - regs->tabreg [EAX] = ctx->eax; - regs->tabreg [TRAPNO] = ctx->idtIndex; - regs->tabreg [ERR] = ctx->faultCode; - regs->tabreg [EIP] = ctx->eip; - regs->tabreg [CS] = ctx->cs & 0xFFFF; - regs->tabreg [EFL] = ctx->eflags; + regs->tabreg[GS] = 0; + regs->tabreg[FS] = 0; + regs->tabreg[ES] = 0; + regs->tabreg[DS] = 0; + regs->tabreg[EDI] = ctx->edi; + regs->tabreg[ESI] = ctx->esi; + regs->tabreg[EBP] = ctx->ebp; + regs->tabreg[ESP] = ctx->esp0; + regs->tabreg[EBX] = ctx->ebx; + regs->tabreg[EDX] = ctx->edx; + regs->tabreg[ECX] = ctx->ecx; + regs->tabreg[EAX] = ctx->eax; + regs->tabreg[TRAPNO] = ctx->idtIndex; + regs->tabreg[ERR] = ctx->faultCode; + regs->tabreg[EIP] = ctx->eip; + regs->tabreg[CS] = ctx->cs & 0xFFFF; + regs->tabreg[EFL] = ctx->eflags; } - - void -RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx) + void +RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx) { - ctx->edi = regs->tabreg [EDI]; - ctx->esi = regs->tabreg [ESI]; - ctx->ebp = regs->tabreg [EBP]; - ctx->esp0 = regs->tabreg [ESP]; - ctx->ebx = regs->tabreg [EBX]; - ctx->edx = regs->tabreg [EDX]; - ctx->ecx = regs->tabreg [ECX]; - ctx->eax = regs->tabreg [EAX]; - ctx->idtIndex = regs->tabreg [TRAPNO]; - ctx->faultCode = regs->tabreg [ERR]; - ctx->eip = regs->tabreg [EIP]; - ctx->cs = regs->tabreg [CS]; - ctx->eflags = regs->tabreg [EFL]; + ctx->edi = regs->tabreg[EDI]; + ctx->esi = regs->tabreg[ESI]; + ctx->ebp = regs->tabreg[EBP]; + ctx->esp0 = regs->tabreg[ESP]; + ctx->ebx = regs->tabreg[EBX]; + ctx->edx = regs->tabreg[EDX]; + ctx->ecx = regs->tabreg[ECX]; + ctx->eax = regs->tabreg[EAX]; + ctx->idtIndex = regs->tabreg[TRAPNO]; + ctx->faultCode = regs->tabreg[ERR]; + ctx->eip = regs->tabreg[EIP]; + ctx->cs = regs->tabreg[CS]; + ctx->eflags = regs->tabreg[EFL]; } -void -get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { - ctx->edi = thread->Registers.edi; - ctx->esi = thread->Registers.esi; - ctx->ebp = (unsigned32)(thread->Registers.ebp); - ctx->esp0 = (unsigned32)(thread->Registers.esp); - ctx->ebx = thread->Registers.ebx; - ctx->edx = 0; - ctx->ecx = 0; - ctx->eax = 0; - ctx->idtIndex = 0; - ctx->faultCode = 0; - ctx->eip = *(unsigned int*)(thread->Registers.esp); - ctx->cs = 0; - ctx->eflags = thread->Registers.eflags; + ctx->edi = thread->Registers.edi; + ctx->esi = thread->Registers.esi; + ctx->ebp = (unsigned32) (thread->Registers.ebp); + ctx->esp0 = (unsigned32) (thread->Registers.esp); + ctx->ebx = thread->Registers.ebx; + ctx->edx = 0; + ctx->ecx = 0; + ctx->eax = 0; + ctx->idtIndex = 0; + ctx->faultCode = 0; + ctx->eip = *(unsigned int *) (thread->Registers.esp); + ctx->cs = 0; + ctx->eflags = thread->Registers.eflags; } -void -set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { thread->Registers.edi = ctx->edi; - thread->Registers.esi = ctx->esi; - thread->Registers.ebp = (void*)(ctx->ebp); - thread->Registers.esp = (void*)(ctx->esp0); - thread->Registers.ebx = ctx->ebx; - thread->Registers.eflags = ctx->eflags; + thread->Registers.esi = ctx->esi; + thread->Registers.ebp = (void *) (ctx->ebp); + thread->Registers.esp = (void *) (ctx->esp0); + thread->Registers.ebx = ctx->ebx; + thread->Registers.eflags = ctx->eflags; } - - -int -Single_Step(CPU_Exception_frame* ctx) + int +Single_Step (CPU_Exception_frame * ctx) { - /* Check if not already set */ - if ((ctx->eflags & EFLAGS_TF) != 0 || ExitForSingleStep != 0) { - /* Check coherency */ + /* + * Check if not already set + */ + if ((ctx->eflags & EFLAGS_TF) != 0 || ExitForSingleStep != 0) { + /* + * Check coherency + */ assert ((ctx->eflags & EFLAGS_TF) != 0); assert (ExitForSingleStep != 0); return 0; } - ctx->eflags |= EFLAGS_TF; /* eflags */ + ctx->eflags |= EFLAGS_TF; /* eflags */ ++ExitForSingleStep; - + return 0; } - int -CheckForSingleStep (CPU_Exception_frame* ctx) + int +CheckForSingleStep (CPU_Exception_frame * ctx) { - if (ExitForSingleStep) { - /* - * This functions can be called both from - * INT1 and INT3 handlers. In case it is - * called from INT3, need to clear TF. - */ - ctx->eflags &= ~EFLAGS_TF; - ExitForSingleStep = 0; - return 1; - } - return 0; + if (ExitForSingleStep) { + /* + * This functions can be called both from + * INT1 and INT3 handlers. In case it is + * called from INT3, need to clear TF. + */ + ctx->eflags &= ~EFLAGS_TF; + ExitForSingleStep = 0; + return 1; + } + return 0; } -void -CancelSingleStep (CPU_Exception_frame* ctx) + void +CancelSingleStep (CPU_Exception_frame * ctx) { - /* Cancel scheduled SS */ - ctx->eflags &= ~EFLAGS_TF; - ExitForSingleStep-- ; + /* + * Cancel scheduled SS + */ + ctx->eflags &= ~EFLAGS_TF; + ExitForSingleStep--; } -cpuExcHandlerType old_currentExcHandler; -extern void rtems_exception_prologue_50(); +static cpuExcHandlerType old_currentExcHandler; +extern void rtems_exception_prologue_50 (); -void connect_rdbg_exception() + void +connect_rdbg_exception () { - interrupt_gate_descriptor *currentIdtEntry; - unsigned limit; - unsigned level; + interrupt_gate_descriptor *currentIdtEntry; + unsigned limit; + unsigned level; /* * Connect the Exception used to debug */ i386_get_info_from_IDTR (¤tIdtEntry, &limit); - - _CPU_ISR_Disable(level); - create_interrupt_gate_descriptor (¤tIdtEntry[50], rtems_exception_prologue_50); - _CPU_ISR_Enable(level); - old_currentExcHandler = _currentExcHandler; - _currentExcHandler = BreakPointExcHdl ; + _CPU_ISR_Disable (level); + create_interrupt_gate_descriptor (¤tIdtEntry[50], + rtems_exception_prologue_50); + _CPU_ISR_Enable (level); + if (_currentExcHandler != BreakPointExcHdl) { + old_currentExcHandler = _currentExcHandler; + _currentExcHandler = BreakPointExcHdl; + } +} + + void +disconnect_rdbg_exception () +{ + if (_currentExcHandler == BreakPointExcHdl) { + _currentExcHandler = old_currentExcHandler; + } } diff --git a/c/src/librdbg/src/m68k/any/Makefile.am b/c/src/librdbg/src/m68k/any/Makefile.am index 12747ad073..f68c3841ac 100644 --- a/c/src/librdbg/src/m68k/any/Makefile.am +++ b/c/src/librdbg/src/m68k/any/Makefile.am @@ -71,6 +71,8 @@ if RPCTOOLS -o m68k/any/tmpSvc.c remdeb.x; \ $(AWK) -f ./awk.svc THEPROG="remdeb.h" m68k/any/tmpSvc.c \ > m68k/any/remdeb_svc.c; \ + $(SED) -e 's/fprintf.*,/printf(/' m68k/any/remdeb_svc.c > m68k/any/remdeb_svc.tmp; \ + mv m68k/any/remdeb_svc.tmp m68k/any/remdeb_svc.c; \ rm -f m68k/any/tmpSvc.c ) endif diff --git a/c/src/librdbg/src/m68k/any/remdeb.h b/c/src/librdbg/src/m68k/any/remdeb.h index c62db4bc7b..bfa0f04838 100644 --- a/c/src/librdbg/src/m68k/any/remdeb.h +++ b/c/src/librdbg/src/m68k/any/remdeb.h @@ -8,7 +8,6 @@ #include - #ifdef __cplusplus extern "C" { #endif @@ -18,99 +17,98 @@ extern "C" { #ifndef REMDEB_H #define RPCGENSRVNAME(a) a -enum rpc_type { - SUNRPC = 0, - BADRPCTYPE = 25, -}; -typedef enum rpc_type rpc_type; + enum rpc_type { + SUNRPC = 0, + BADRPCTYPE = 25, + }; + typedef enum rpc_type rpc_type; #define NET_SAFE 1400 -struct UDP_MSG { - u_char type; - u_char msg_num; - u_short spec; - long pid; - u_long context; -}; -typedef struct UDP_MSG UDP_MSG; + struct UDP_MSG { + u_char type; + u_char msg_num; + u_short spec; + long pid; + u_long context; + }; + typedef struct UDP_MSG UDP_MSG; /* * Sun request values for the remote ptrace system call */ - -enum ptracereq { - RPT_TRACEME = 0, - RPT_CHILDDONE = 0, - RPT_PEEKTEXT = 0 + 1, - RPT_PEEKDATA = 0 + 2, - RPT_PEEKUSER = 0 + 3, - RPT_POKETEXT = 0 + 4, - RPT_POKEDATA = 0 + 5, - RPT_POKEUSER = 0 + 6, - RPT_CONT = 0 + 7, - RPT_KILL = 0 + 8, - RPT_SINGLESTEP = 0 + 9, - RPT_ATTACH = 0 + 10, - RPT_DETACH = 0 + 11, - RPT_GETREGS = 0 + 12, - RPT_SETREGS = 0 + 13, - RPT_GETFPREGS = 0 + 14, - RPT_SETFPREGS = 0 + 15, - RPT_READDATA = 0 + 16, - RPT_WRITEDATA = 0 + 17, - RPT_READTEXT = 0 + 18, - RPT_WRITETEXT = 0 + 19, - RPT_GETFPAREGS = 0 + 20, - RPT_SETFPAREGS = 0 + 21, - RPT_22 = 0 + 22, - RPT_23 = 0 + 23, - RPT_SYSCALL = 0 + 24, - RPT_DUMPCORE = 0 + 25, - RPT_26 = 0 + 26, - RPT_27 = 0 + 27, - RPT_28 = 0 + 28, - RPT_GETUCODE = 0 + 29, - RPT_GETTARGETTHREAD = 50, - RPT_SETTARGETTHREAD = 51, - RPT_THREADSUSPEND = 52, - RPT_THREADRESUME = 53, - RPT_THREADLIST = 54, - RPT_GETTHREADNAME = 55, - RPT_SETTHREADNAME = 56, - RPT_SETTHREADREGS = 57, - RPT_GETTHREADREGS = 58, - RPT_STEPRANGE = 75, - RPT_CONTTO = 76, - RPT_SETBREAK = 77, - RPT_CLRBREAK = 78, - RPT_GETBREAK = 79, - RPT_GETNAME = 80, - RPT_STOP = 81, - RPT_PGETREGS = 82, - RPT_PSETREGS = 83, - RPT_PSETTHREADREGS = 84, - RPT_PGETTHREADREGS = 85, -}; -typedef enum ptracereq ptracereq; - -struct xdr_regs { - int r_dreg[8]; - int r_areg[8]; - int r_sr; - int r_pc; - int r_vec; -}; -typedef struct xdr_regs xdr_regs; + enum ptracereq { + RPT_TRACEME = 0, + RPT_CHILDDONE = 0, + RPT_PEEKTEXT = 0 + 1, + RPT_PEEKDATA = 0 + 2, + RPT_PEEKUSER = 0 + 3, + RPT_POKETEXT = 0 + 4, + RPT_POKEDATA = 0 + 5, + RPT_POKEUSER = 0 + 6, + RPT_CONT = 0 + 7, + RPT_KILL = 0 + 8, + RPT_SINGLESTEP = 0 + 9, + RPT_ATTACH = 0 + 10, + RPT_DETACH = 0 + 11, + RPT_GETREGS = 0 + 12, + RPT_SETREGS = 0 + 13, + RPT_GETFPREGS = 0 + 14, + RPT_SETFPREGS = 0 + 15, + RPT_READDATA = 0 + 16, + RPT_WRITEDATA = 0 + 17, + RPT_READTEXT = 0 + 18, + RPT_WRITETEXT = 0 + 19, + RPT_GETFPAREGS = 0 + 20, + RPT_SETFPAREGS = 0 + 21, + RPT_22 = 0 + 22, + RPT_23 = 0 + 23, + RPT_SYSCALL = 0 + 24, + RPT_DUMPCORE = 0 + 25, + RPT_26 = 0 + 26, + RPT_27 = 0 + 27, + RPT_28 = 0 + 28, + RPT_GETUCODE = 0 + 29, + RPT_GETTARGETTHREAD = 50, + RPT_SETTARGETTHREAD = 51, + RPT_THREADSUSPEND = 52, + RPT_THREADRESUME = 53, + RPT_THREADLIST = 54, + RPT_GETTHREADNAME = 55, + RPT_SETTHREADNAME = 56, + RPT_SETTHREADREGS = 57, + RPT_GETTHREADREGS = 58, + RPT_STEPRANGE = 75, + RPT_CONTTO = 76, + RPT_SETBREAK = 77, + RPT_CLRBREAK = 78, + RPT_GETBREAK = 79, + RPT_GETNAME = 80, + RPT_STOP = 81, + RPT_PGETREGS = 82, + RPT_PSETREGS = 83, + RPT_PSETTHREADREGS = 84, + RPT_PGETTHREADREGS = 85, + }; + typedef enum ptracereq ptracereq; + + struct xdr_regs { + int r_dreg[8]; + int r_areg[8]; + int r_sr; + int r_pc; + int r_vec; + }; + typedef struct xdr_regs xdr_regs; /* now define register macros to apply to xdr_reg struct */ -#define r_r0 r_dreg[0] /* r0 for portability */ -#define r_sp r_areg[7] /* user stack pointer */ +#define r_r0 r_dreg[0] /* r0 for portability */ +#define r_sp r_areg[7] /* user stack pointer */ #define r_ps r_sr -#define REG_PC r_pc /* PC register offset */ -#define REG_SP r_areg[7] /* SP register offset */ -#define REG_FP r_areg[6] /* FP register offset */ +#define REG_PC r_pc /* PC register offset */ +#define REG_SP r_areg[7] /* SP register offset */ +#define REG_FP r_areg[6] /* FP register offset */ /* now define the BREAKPOINT mask technique to a long word */ -#define SET_BREAK(l) ((l&0x0000FFFF) | 0x4E4F0000) /* TRAP 15 */ +#define SET_BREAK(l) ((l&0x0000FFFF) | 0x4E4F0000) /* TRAP 15 */ #define IS_BREAK(l) (((l) & 0xFFFF0000) == 0x4E4F0000) #define ORG_BREAK(c,p) (((c) & 0x0000FFFF) | ((p) & 0xFFFF0000)) #define IS_STEP(regs) ((regs).r_vec == 9) @@ -128,286 +126,298 @@ typedef struct xdr_regs xdr_regs; */ #define MEM_DATA_MAX 256 -struct xdr_mem { - u_long addr; - u_int dataNb; - u_char data[MEM_DATA_MAX]; -}; -typedef struct xdr_mem xdr_mem; - -enum break_type { - BRKT_NONE = 0, - BRKT_INSTR = 1, - BRKT_READ = 2, - BRKT_WRITE = 3, - BRKT_ACCESS = 4, - BRKT_EXEC = 5, - BRKT_OS_CALL = 6, - BRKT_OS_SWITCH = 7, - BRKT_STEPEMUL = 8, -}; -typedef enum break_type break_type; + struct xdr_mem { + u_long addr; + u_int dataNb; + u_char data[MEM_DATA_MAX]; + }; + typedef struct xdr_mem xdr_mem; + + enum break_type { + BRKT_NONE = 0, + BRKT_INSTR = 1, + BRKT_READ = 2, + BRKT_WRITE = 3, + BRKT_ACCESS = 4, + BRKT_EXEC = 5, + BRKT_OS_CALL = 6, + BRKT_OS_SWITCH = 7, + BRKT_STEPEMUL = 8, + }; + typedef enum break_type break_type; #define MAX_THRD_BRK 4 -struct xdr_break { - u_char type; - u_char thread_spec; - u_short handle; - u_long ee_loc; - u_long ee_type; - u_short length; - u_char pass_count; - u_char curr_pass; - u_long thread_list[MAX_THRD_BRK]; -}; -typedef struct xdr_break xdr_break; + struct xdr_break { + u_char type; + u_char thread_spec; + u_short handle; + u_long ee_loc; + u_long ee_type; + u_short length; + u_char pass_count; + u_char curr_pass; + u_long thread_list[MAX_THRD_BRK]; + }; + typedef struct xdr_break xdr_break; #define UTHREAD_MAX 64 #define THREADNAMEMAX 16 -typedef char *thread_name; - -struct KernThread { - u_int threadLi; -}; -typedef struct KernThread KernThread; -typedef KernThread *ptThreadList; - -struct thread_list { - u_int nbThread; - ptThreadList threads; -}; -typedef struct thread_list thread_list; - -struct ptrace_addr_data_in { - ptracereq req; - union { - xdr_regs regs; - struct { - u_int pregs_len; - u_int *pregs_val; - } pregs; - thread_name name; - xdr_mem mem; - xdr_break breakp; - u_int address; - } ptrace_addr_data_in_u; -}; -typedef struct ptrace_addr_data_in ptrace_addr_data_in; - -struct ptrace_addr_data_out { - ptracereq req; - union { - xdr_regs regs; - struct { - u_int pregs_len; - u_int *pregs_val; - } pregs; - thread_list threads; - thread_name name; - xdr_mem mem; - xdr_break breakp; - u_int addr; - } ptrace_addr_data_out_u; -}; -typedef struct ptrace_addr_data_out ptrace_addr_data_out; - -typedef struct { - u_int CHAR_DATA_len; - char *CHAR_DATA_val; -} CHAR_DATA; + typedef char *thread_name; + + struct KernThread { + u_int threadLi; + }; + typedef struct KernThread KernThread; + typedef KernThread *ptThreadList; + + struct thread_list { + u_int nbThread; + ptThreadList threads; + }; + typedef struct thread_list thread_list; + + struct ptrace_addr_data_in { + ptracereq req; + union { + xdr_regs regs; + struct { + u_int pregs_len; + u_int *pregs_val; + } pregs; + thread_name name; + xdr_mem mem; + xdr_break breakp; + u_int address; + } ptrace_addr_data_in_u; + }; + typedef struct ptrace_addr_data_in ptrace_addr_data_in; + + struct ptrace_addr_data_out { + ptracereq req; + union { + xdr_regs regs; + struct { + u_int pregs_len; + u_int *pregs_val; + } pregs; + thread_list threads; + thread_name name; + xdr_mem mem; + xdr_break breakp; + u_int addr; + } ptrace_addr_data_out_u; + }; + typedef struct ptrace_addr_data_out ptrace_addr_data_out; + + typedef struct { + u_int CHAR_DATA_len; + char *CHAR_DATA_val; + } CHAR_DATA; #define XRY_MAX_INST_BUFF 128 #define XRY_MAX_INSTANCES 16 #ifndef XRY_MAX_CMD_STR #define XRY_MAX_CMD_STR 320 -#endif /* REMDEB_H */ - -struct xry_inst { - u_char flags; - u_char type; - u_char sub_type; - u_char res_type; - u_long value; - u_long value2; -}; -typedef struct xry_inst xry_inst; - -struct instance { - struct xry_inst instances[XRY_MAX_INSTANCES]; - u_char buffer[XRY_MAX_INST_BUFF]; -}; -typedef struct instance instance; - -struct instance_union { - bool_t instances; - union { - instance inst; - char *buffer; - } instance_union_u; -}; -typedef struct instance_union instance_union; - -typedef char *one_arg; +#endif /* REMDEB_H */ + + struct xry_inst { + u_char flags; + u_char type; + u_char sub_type; + u_char res_type; + u_long value; + u_long value2; + }; + typedef struct xry_inst xry_inst; + + struct instance { + struct xry_inst instances[XRY_MAX_INSTANCES]; + u_char buffer[XRY_MAX_INST_BUFF]; + }; + typedef struct instance instance; + + struct instance_union { + bool_t instances; + union { + instance inst; + char *buffer; + } instance_union_u; + }; + typedef struct instance_union instance_union; + + typedef char *one_arg; #define XRY_MAX_OBJ_NAME 32 - /* now open_connex() routine which establishes a connection to server */ - -enum debug_type { - DEBTYP_PROCESS = 0, - DEBTYP_C_ACTOR = 1, - DEBTYP_KERNEL = 2, - DEBTYP_OTHER = 3, -}; -typedef enum debug_type debug_type; -#define DEBUGGER_IS_GDB 0x2 /* */ - -struct open_in { - u_char back_port[16]; - u_short debug_type; - u_short flags; - u_char destination[16]; - one_arg user_name; -}; -typedef struct open_in open_in; - -struct open_out { - u_long port; - u_int pad[4]; - u_int fp; - u_char cmd_table_num; - u_char cmd_table_vers; - u_short server_vers; -}; -typedef struct open_out open_out; - /* now close_connex() routine which detaches from server */ - -enum close_control { - CLOSE_IGNORE = 0, - CLOSE_KILL = 1, - CLOSE_DETACH = 2, -}; -typedef enum close_control close_control; - -struct close_in { - close_control control; -}; -typedef struct close_in close_in; - /* now send_signal() routine which sends signals to processes like kill(2) */ - -struct signal_in { - int pid; - int sig; -}; -typedef struct signal_in signal_in; - -struct signal_out { - int kill_return; - int errNo; -}; -typedef struct signal_out signal_out; - /* 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_ERROR = 0, - STOP_NONE = 1, - STOP_UNKNOWN = 2, - STOP_BREAK = 3, - STOP_STEP = 4, - STOP_SIGNAL = 5, - STOP_TERM_EXIT = 6, - STOP_TERM_SIG = 7, - STOP_DETACHED = 8, - STOP_KILLED = 9, - STOP_SPAWN_FAILED = 10, -}; -typedef enum stop_code stop_code; - -struct wait_in { - int pid; -}; -typedef struct wait_in wait_in; - -struct wait_out { - int wait_return; - int errNo; - int status; - stop_code reason; - int handle; - u_long PC; - u_long SP; - u_long FP; - u_long thread; -}; -typedef struct wait_out wait_out; - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ + /* + * now open_connex() routine which establishes a connection to server + */ + + enum debug_type { + DEBTYP_PROCESS = 0, + DEBTYP_C_ACTOR = 1, + DEBTYP_KERNEL = 2, + DEBTYP_OTHER = 3, + }; + typedef enum debug_type debug_type; +#define DEBUGGER_IS_GDB 0x2 /* */ + + struct open_in { + u_char back_port[16]; + u_short debug_type; + u_short flags; + u_char destination[16]; + one_arg user_name; + }; + typedef struct open_in open_in; + + struct open_out { + u_long port; + u_int pad[4]; + u_int fp; + u_char cmd_table_num; + u_char cmd_table_vers; + u_short server_vers; + }; + typedef struct open_out open_out; + /* + * now close_connex() routine which detaches from server + */ + + enum close_control { + CLOSE_IGNORE = 0, + CLOSE_KILL = 1, + CLOSE_DETACH = 2, + }; + typedef enum close_control close_control; + + struct close_in { + close_control control; + }; + typedef struct close_in close_in; + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ + + struct signal_in { + int pid; + int sig; + }; + typedef struct signal_in signal_in; + + struct signal_out { + int kill_return; + int errNo; + }; + typedef struct signal_out signal_out; + /* + * 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_ERROR = 0, + STOP_NONE = 1, + STOP_UNKNOWN = 2, + STOP_BREAK = 3, + STOP_STEP = 4, + STOP_SIGNAL = 5, + STOP_TERM_EXIT = 6, + STOP_TERM_SIG = 7, + STOP_DETACHED = 8, + STOP_KILLED = 9, + STOP_SPAWN_FAILED = 10, + }; + typedef enum stop_code stop_code; + + struct wait_in { + int pid; + }; + typedef struct wait_in wait_in; + + struct wait_out { + int wait_return; + int errNo; + int status; + stop_code reason; + int handle; + u_long PC; + u_long SP; + u_long FP; + u_long thread; + }; + typedef struct wait_out wait_out; + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ #define PTRFLG_FORCE 1 #define PTRFLG_NON_OWNER 2 #define PTRFLG_FREE 4 #define PTRDET_UNOWN 0x100 -struct ptrace_in { - int pid; - ptrace_addr_data_in addr; - u_int data; - u_int flags; -}; -typedef struct ptrace_in ptrace_in; - -struct ptrace_out { - ptrace_addr_data_out addr; - int result; - int errNo; -}; -typedef struct ptrace_out ptrace_out; - -struct one_symbol { - char *symbolName; - long symbolValue; -}; -typedef struct one_symbol one_symbol; - -typedef struct { - u_int all_symbols_len; - one_symbol *all_symbols_val; -} all_symbols; - -struct get_global_symbols_out { - all_symbols symbols; -}; -typedef struct get_global_symbols_out get_global_symbols_out; - -struct get_text_data_in { - int pid; - char *actorName; -}; -typedef struct get_text_data_in get_text_data_in; - -struct get_text_data_out { - int result; - int errNo; - u_long textStart; - u_long textSize; - u_long dataStart; - u_long dataSize; -}; -typedef struct get_text_data_out get_text_data_out; - -struct one_signal { - u_int number; - char *name; -}; -typedef struct one_signal one_signal; - -typedef struct { - u_int all_signals_len; - one_signal *all_signals_val; -} all_signals; - -struct get_signal_names_out { - all_signals signals; -}; -typedef struct get_signal_names_out get_signal_names_out; - /* now define the actual calls we support */ + struct ptrace_in { + int pid; + ptrace_addr_data_in addr; + u_int data; + u_int flags; + }; + typedef struct ptrace_in ptrace_in; + + struct ptrace_out { + ptrace_addr_data_out addr; + int result; + int errNo; + }; + typedef struct ptrace_out ptrace_out; + + struct one_symbol { + char *symbolName; + long symbolValue; + }; + typedef struct one_symbol one_symbol; + + typedef struct { + u_int all_symbols_len; + one_symbol *all_symbols_val; + } all_symbols; + + struct get_global_symbols_out { + all_symbols symbols; + }; + typedef struct get_global_symbols_out get_global_symbols_out; + + struct get_text_data_in { + int pid; + char *actorName; + }; + typedef struct get_text_data_in get_text_data_in; + + struct get_text_data_out { + int result; + int errNo; + u_long textStart; + u_long textSize; + u_long dataStart; + u_long dataSize; + }; + typedef struct get_text_data_out get_text_data_out; + + struct one_signal { + u_int number; + char *name; + }; + typedef struct one_signal one_signal; + + typedef struct { + u_int all_signals_len; + one_signal *all_signals_val; + } all_signals; + + struct get_signal_names_out { + all_signals signals; + }; + typedef struct get_signal_names_out get_signal_names_out; + /* + * now define the actual calls we support + */ #define REMDEB_H #endif @@ -416,131 +426,131 @@ typedef struct get_signal_names_out get_signal_names_out; #if defined(__STDC__) || defined(__cplusplus) #define OPEN_CONNEX 1 -extern open_out * open_connex_2(open_in *, CLIENT *); -extern open_out * open_connex_2_svc(open_in *, struct svc_req *); + extern open_out *open_connex_2 (open_in *, CLIENT *); + extern open_out *open_connex_2_svc (open_in *, struct svc_req *); #define SEND_SIGNAL 2 -extern signal_out * send_signal_2(signal_in *, CLIENT *); -extern signal_out * send_signal_2_svc(signal_in *, struct svc_req *); + extern signal_out *send_signal_2 (signal_in *, CLIENT *); + extern signal_out *send_signal_2_svc (signal_in *, struct svc_req *); #define CLOSE_CONNEX 10 -extern void * close_connex_2(close_in *, CLIENT *); -extern void * close_connex_2_svc(close_in *, struct svc_req *); + extern void *close_connex_2 (close_in *, CLIENT *); + extern void *close_connex_2_svc (close_in *, struct svc_req *); #define PTRACE 11 -extern ptrace_out * ptrace_2(ptrace_in *, CLIENT *); -extern ptrace_out * ptrace_2_svc(ptrace_in *, struct svc_req *); + extern ptrace_out *ptrace_2 (ptrace_in *, CLIENT *); + extern ptrace_out *ptrace_2_svc (ptrace_in *, struct svc_req *); #define WAIT_INFO 13 -extern wait_out * wait_info_2(wait_in *, CLIENT *); -extern wait_out * wait_info_2_svc(wait_in *, struct svc_req *); + extern wait_out *wait_info_2 (wait_in *, CLIENT *); + extern wait_out *wait_info_2_svc (wait_in *, struct svc_req *); #define GET_SIGNAL_NAMES 17 -extern get_signal_names_out * get_signal_names_2(void *, CLIENT *); -extern get_signal_names_out * get_signal_names_2_svc(void *, struct svc_req *); -extern int remotedeb_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t); + extern get_signal_names_out *get_signal_names_2 (void *, CLIENT *); + extern get_signal_names_out *get_signal_names_2_svc (void *, + struct svc_req *); + extern int remotedeb_2_freeresult (SVCXPRT *, xdrproc_t, caddr_t); -#else /* K&R C */ +#else /* K&R C */ #define OPEN_CONNEX 1 -extern open_out * open_connex_2(); -extern open_out * open_connex_2_svc(); + extern open_out *open_connex_2 (); + extern open_out *open_connex_2_svc (); #define SEND_SIGNAL 2 -extern signal_out * send_signal_2(); -extern signal_out * send_signal_2_svc(); + extern signal_out *send_signal_2 (); + extern signal_out *send_signal_2_svc (); #define CLOSE_CONNEX 10 -extern void * close_connex_2(); -extern void * close_connex_2_svc(); + extern void *close_connex_2 (); + extern void *close_connex_2_svc (); #define PTRACE 11 -extern ptrace_out * ptrace_2(); -extern ptrace_out * ptrace_2_svc(); + extern ptrace_out *ptrace_2 (); + extern ptrace_out *ptrace_2_svc (); #define WAIT_INFO 13 -extern wait_out * wait_info_2(); -extern wait_out * wait_info_2_svc(); + extern wait_out *wait_info_2 (); + extern wait_out *wait_info_2_svc (); #define GET_SIGNAL_NAMES 17 -extern get_signal_names_out * get_signal_names_2(); -extern get_signal_names_out * get_signal_names_2_svc(); -extern int remotedeb_2_freeresult (); -#endif /* K&R C */ + extern get_signal_names_out *get_signal_names_2 (); + extern get_signal_names_out *get_signal_names_2_svc (); + extern int remotedeb_2_freeresult (); +#endif /* K&R C */ /* the xdr functions */ #if defined(__STDC__) || defined(__cplusplus) -extern bool_t xdr_rpc_type (XDR *, rpc_type*); -extern bool_t xdr_UDP_MSG (XDR *, UDP_MSG*); -extern bool_t xdr_ptracereq (XDR *, ptracereq*); -extern bool_t xdr_xdr_regs (XDR *, xdr_regs*); -extern bool_t xdr_xdr_mem (XDR *, xdr_mem*); -extern bool_t xdr_break_type (XDR *, break_type*); -extern bool_t xdr_xdr_break (XDR *, xdr_break*); -extern bool_t xdr_thread_name (XDR *, thread_name*); -extern bool_t xdr_KernThread (XDR *, KernThread*); -extern bool_t xdr_thread_list (XDR *, thread_list*); -extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in*); -extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out*); -extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA*); -extern bool_t xdr_xry_inst (XDR *, xry_inst*); -extern bool_t xdr_instance (XDR *, instance*); -extern bool_t xdr_instance_union (XDR *, instance_union*); -extern bool_t xdr_one_arg (XDR *, one_arg*); -extern bool_t xdr_debug_type (XDR *, debug_type*); -extern bool_t xdr_open_in (XDR *, open_in*); -extern bool_t xdr_open_out (XDR *, open_out*); -extern bool_t xdr_close_control (XDR *, close_control*); -extern bool_t xdr_close_in (XDR *, close_in*); -extern bool_t xdr_signal_in (XDR *, signal_in*); -extern bool_t xdr_signal_out (XDR *, signal_out*); -extern bool_t xdr_stop_code (XDR *, stop_code*); -extern bool_t xdr_wait_in (XDR *, wait_in*); -extern bool_t xdr_wait_out (XDR *, wait_out*); -extern bool_t xdr_ptrace_in (XDR *, ptrace_in*); -extern bool_t xdr_ptrace_out (XDR *, ptrace_out*); -extern bool_t xdr_one_symbol (XDR *, one_symbol*); -extern bool_t xdr_all_symbols (XDR *, all_symbols*); -extern bool_t xdr_get_global_symbols_out (XDR *, get_global_symbols_out*); -extern bool_t xdr_get_text_data_in (XDR *, get_text_data_in*); -extern bool_t xdr_get_text_data_out (XDR *, get_text_data_out*); -extern bool_t xdr_one_signal (XDR *, one_signal*); -extern bool_t xdr_all_signals (XDR *, all_signals*); -extern bool_t xdr_get_signal_names_out (XDR *, get_signal_names_out*); - -#else /* K&R C */ -extern bool_t xdr_rpc_type (); -extern bool_t xdr_UDP_MSG (); -extern bool_t xdr_ptracereq (); -extern bool_t xdr_xdr_regs (); -extern bool_t xdr_xdr_mem (); -extern bool_t xdr_break_type (); -extern bool_t xdr_xdr_break (); -extern bool_t xdr_thread_name (); -extern bool_t xdr_KernThread (); -extern bool_t xdr_thread_list (); -extern bool_t xdr_ptrace_addr_data_in (); -extern bool_t xdr_ptrace_addr_data_out (); -extern bool_t xdr_CHAR_DATA (); -extern bool_t xdr_xry_inst (); -extern bool_t xdr_instance (); -extern bool_t xdr_instance_union (); -extern bool_t xdr_one_arg (); -extern bool_t xdr_debug_type (); -extern bool_t xdr_open_in (); -extern bool_t xdr_open_out (); -extern bool_t xdr_close_control (); -extern bool_t xdr_close_in (); -extern bool_t xdr_signal_in (); -extern bool_t xdr_signal_out (); -extern bool_t xdr_stop_code (); -extern bool_t xdr_wait_in (); -extern bool_t xdr_wait_out (); -extern bool_t xdr_ptrace_in (); -extern bool_t xdr_ptrace_out (); -extern bool_t xdr_one_symbol (); -extern bool_t xdr_all_symbols (); -extern bool_t xdr_get_global_symbols_out (); -extern bool_t xdr_get_text_data_in (); -extern bool_t xdr_get_text_data_out (); -extern bool_t xdr_one_signal (); -extern bool_t xdr_all_signals (); -extern bool_t xdr_get_signal_names_out (); - -#endif /* K&R C */ + extern bool_t xdr_rpc_type (XDR *, rpc_type *); + extern bool_t xdr_UDP_MSG (XDR *, UDP_MSG *); + extern bool_t xdr_ptracereq (XDR *, ptracereq *); + extern bool_t xdr_xdr_regs (XDR *, xdr_regs *); + extern bool_t xdr_xdr_mem (XDR *, xdr_mem *); + extern bool_t xdr_break_type (XDR *, break_type *); + extern bool_t xdr_xdr_break (XDR *, xdr_break *); + extern bool_t xdr_thread_name (XDR *, thread_name *); + extern bool_t xdr_KernThread (XDR *, KernThread *); + extern bool_t xdr_thread_list (XDR *, thread_list *); + extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in *); + extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out *); + extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA *); + extern bool_t xdr_xry_inst (XDR *, xry_inst *); + extern bool_t xdr_instance (XDR *, instance *); + extern bool_t xdr_instance_union (XDR *, instance_union *); + extern bool_t xdr_one_arg (XDR *, one_arg *); + extern bool_t xdr_debug_type (XDR *, debug_type *); + extern bool_t xdr_open_in (XDR *, open_in *); + extern bool_t xdr_open_out (XDR *, open_out *); + extern bool_t xdr_close_control (XDR *, close_control *); + extern bool_t xdr_close_in (XDR *, close_in *); + extern bool_t xdr_signal_in (XDR *, signal_in *); + extern bool_t xdr_signal_out (XDR *, signal_out *); + extern bool_t xdr_stop_code (XDR *, stop_code *); + extern bool_t xdr_wait_in (XDR *, wait_in *); + extern bool_t xdr_wait_out (XDR *, wait_out *); + extern bool_t xdr_ptrace_in (XDR *, ptrace_in *); + extern bool_t xdr_ptrace_out (XDR *, ptrace_out *); + extern bool_t xdr_one_symbol (XDR *, one_symbol *); + extern bool_t xdr_all_symbols (XDR *, all_symbols *); + extern bool_t xdr_get_global_symbols_out (XDR *, get_global_symbols_out *); + extern bool_t xdr_get_text_data_in (XDR *, get_text_data_in *); + extern bool_t xdr_get_text_data_out (XDR *, get_text_data_out *); + extern bool_t xdr_one_signal (XDR *, one_signal *); + extern bool_t xdr_all_signals (XDR *, all_signals *); + extern bool_t xdr_get_signal_names_out (XDR *, get_signal_names_out *); + +#else /* K&R C */ + extern bool_t xdr_rpc_type (); + extern bool_t xdr_UDP_MSG (); + extern bool_t xdr_ptracereq (); + extern bool_t xdr_xdr_regs (); + extern bool_t xdr_xdr_mem (); + extern bool_t xdr_break_type (); + extern bool_t xdr_xdr_break (); + extern bool_t xdr_thread_name (); + extern bool_t xdr_KernThread (); + extern bool_t xdr_thread_list (); + extern bool_t xdr_ptrace_addr_data_in (); + extern bool_t xdr_ptrace_addr_data_out (); + extern bool_t xdr_CHAR_DATA (); + extern bool_t xdr_xry_inst (); + extern bool_t xdr_instance (); + extern bool_t xdr_instance_union (); + extern bool_t xdr_one_arg (); + extern bool_t xdr_debug_type (); + extern bool_t xdr_open_in (); + extern bool_t xdr_open_out (); + extern bool_t xdr_close_control (); + extern bool_t xdr_close_in (); + extern bool_t xdr_signal_in (); + extern bool_t xdr_signal_out (); + extern bool_t xdr_stop_code (); + extern bool_t xdr_wait_in (); + extern bool_t xdr_wait_out (); + extern bool_t xdr_ptrace_in (); + extern bool_t xdr_ptrace_out (); + extern bool_t xdr_one_symbol (); + extern bool_t xdr_all_symbols (); + extern bool_t xdr_get_global_symbols_out (); + extern bool_t xdr_get_text_data_in (); + extern bool_t xdr_get_text_data_out (); + extern bool_t xdr_one_signal (); + extern bool_t xdr_all_signals (); + extern bool_t xdr_get_signal_names_out (); + +#endif /* K&R C */ #ifdef __cplusplus } #endif - -#endif /* !_REMDEB_H_RPCGEN */ +#endif /* !_REMDEB_H_RPCGEN */ diff --git a/c/src/librdbg/src/m68k/any/remdeb_svc.c b/c/src/librdbg/src/m68k/any/remdeb_svc.c index 2e5b3725e4..1827a53e3c 100644 --- a/c/src/librdbg/src/m68k/any/remdeb_svc.c +++ b/c/src/librdbg/src/m68k/any/remdeb_svc.c @@ -22,101 +22,112 @@ * become too small if this value gets incremented. */ #ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ - /* now open_connex() routine which establishes a connection to server */ -#define DEBUGGER_IS_GDB 0x2 /* */ - /* now close_connex() routine which detaches from server */ - /* now send_signal() routine which sends signals to processes like kill(2) */ - /* 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 */ - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ - /* now define the actual calls we support */ -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" +#endif /* REMDEB_H */ + /* + * now open_connex() routine which establishes a connection to server + */ +#define DEBUGGER_IS_GDB 0x2 /* */ + /* + * now close_connex() routine which detaches from server + */ + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ + /* + * 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 + */ + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ + /* + * now define the actual calls we support + */ +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" }; void -remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp) +remotedeb_2 (struct svc_req *rqstp, register SVCXPRT * transp) { - union { - open_in open_connex_2_arg; - signal_in send_signal_2_arg; - close_in close_connex_2_arg; - ptrace_in ptrace_2_arg; - wait_in wait_info_2_arg; - } argument; - char *result; - xdrproc_t _xdr_argument, _xdr_result; - char *(*local)(char *, struct svc_req *); + union { + open_in open_connex_2_arg; + signal_in send_signal_2_arg; + close_in close_connex_2_arg; + ptrace_in ptrace_2_arg; + wait_in wait_info_2_arg; + } argument; + char *result; + xdrproc_t _xdr_argument, _xdr_result; + char *(*local) (char *, struct svc_req *); - DPRINTF (("remotedeb_2: %s (%d)\n", - (unsigned) rqstp->rq_proc < - (unsigned) (sizeof names / sizeof names[0]) ? - names [rqstp->rq_proc] : "???", - (int) rqstp->rq_proc)); + DPRINTF (("remotedeb_2: %s (%d)\n", + (unsigned) rqstp->rq_proc < + (unsigned) (sizeof names / sizeof names[0]) ? + names[rqstp->rq_proc] : "???", (int) rqstp->rq_proc)); - switch (rqstp->rq_proc) { - case NULLPROC: - (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); - return; + switch (rqstp->rq_proc) { + case NULLPROC: + (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL); + return; - case OPEN_CONNEX: - _xdr_argument = (xdrproc_t) xdr_open_in; - _xdr_result = (xdrproc_t) xdr_open_out; - local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc; - break; + case OPEN_CONNEX: + _xdr_argument = (xdrproc_t) xdr_open_in; + _xdr_result = (xdrproc_t) xdr_open_out; + local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc; + break; - case SEND_SIGNAL: - _xdr_argument = (xdrproc_t) xdr_signal_in; - _xdr_result = (xdrproc_t) xdr_signal_out; - local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc; - break; + case SEND_SIGNAL: + _xdr_argument = (xdrproc_t) xdr_signal_in; + _xdr_result = (xdrproc_t) xdr_signal_out; + local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc; + break; - case CLOSE_CONNEX: - _xdr_argument = (xdrproc_t) xdr_close_in; - _xdr_result = (xdrproc_t) xdr_void; - local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc; - break; + case CLOSE_CONNEX: + _xdr_argument = (xdrproc_t) xdr_close_in; + _xdr_result = (xdrproc_t) xdr_void; + local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc; + break; - case PTRACE: - _xdr_argument = (xdrproc_t) xdr_ptrace_in; - _xdr_result = (xdrproc_t) xdr_ptrace_out; - local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc; - break; + case PTRACE: + _xdr_argument = (xdrproc_t) xdr_ptrace_in; + _xdr_result = (xdrproc_t) xdr_ptrace_out; + local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc; + break; - case WAIT_INFO: - _xdr_argument = (xdrproc_t) xdr_wait_in; - _xdr_result = (xdrproc_t) xdr_wait_out; - local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc; - break; + case WAIT_INFO: + _xdr_argument = (xdrproc_t) xdr_wait_in; + _xdr_result = (xdrproc_t) xdr_wait_out; + local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc; + break; - case GET_SIGNAL_NAMES: - _xdr_argument = (xdrproc_t) xdr_void; - _xdr_result = (xdrproc_t) xdr_get_signal_names_out; - local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc; - break; + case GET_SIGNAL_NAMES: + _xdr_argument = (xdrproc_t) xdr_void; + _xdr_result = (xdrproc_t) xdr_get_signal_names_out; + local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc; + break; - default: - svcerr_noproc (transp); - return; - } - memset ((char *)&argument, 0, sizeof (argument)); - if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) { - svcerr_decode (transp); - return; - } - result = (*local)((char *)&argument, rqstp); - if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) { - svcerr_systemerr (transp); - } - if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) { - fprintf (stderr, "unable to free arguments"); - exit (1); - } - return; + default: + svcerr_noproc (transp); + return; + } + memset ((char *) &argument, 0, sizeof (argument)); + if (!svc_getargs (transp, _xdr_argument, (caddr_t) & argument)) { + svcerr_decode (transp); + return; + } + result = (*local) ((char *) &argument, rqstp); + if (result != NULL && !svc_sendreply (transp, _xdr_result, result)) { + svcerr_systemerr (transp); + } + if (!svc_freeargs (transp, _xdr_argument, (caddr_t) & argument)) { + fprintf (stderr, "unable to free arguments"); + exit (1); + } + return; } diff --git a/c/src/librdbg/src/m68k/any/remdeb_xdr.c b/c/src/librdbg/src/m68k/any/remdeb_xdr.c index 44e3bd68f3..9a7652590f 100644 --- a/c/src/librdbg/src/m68k/any/remdeb_xdr.c +++ b/c/src/librdbg/src/m68k/any/remdeb_xdr.c @@ -8,144 +8,141 @@ #define RTEMS_BACK_PORT 2073 bool_t -xdr_rpc_type (XDR *xdrs, rpc_type *objp) +xdr_rpc_type (XDR * xdrs, rpc_type * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; } bool_t -xdr_UDP_MSG (XDR *xdrs, UDP_MSG *objp) +xdr_UDP_MSG (XDR * xdrs, UDP_MSG * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->msg_num)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->spec)) - return FALSE; - if (!xdr_long (xdrs, &objp->pid)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->context)) - return FALSE; - return TRUE; + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->msg_num)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->spec)) + return FALSE; + if (!xdr_long (xdrs, &objp->pid)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->context)) + return FALSE; + return TRUE; } + /* * Sun request values for the remote ptrace system call */ - bool_t -xdr_ptracereq (XDR *xdrs, ptracereq *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) -{ - register int32_t *buf; - - int i; - - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs,(3 + 8 + 8 )* BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->r_dreg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->r_areg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_sr)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_pc)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_vec)) - return FALSE; - } else { - { - register int *genp; - - for (i = 0, genp = objp->r_dreg; - i < 8; ++i) { - IXDR_PUT_LONG(buf, *genp++); - } - } - { - register int *genp; - - for (i = 0, genp = objp->r_areg; - i < 8; ++i) { - IXDR_PUT_LONG(buf, *genp++); - } - } - IXDR_PUT_LONG(buf, objp->r_sr); - IXDR_PUT_LONG(buf, objp->r_pc); - IXDR_PUT_LONG(buf, objp->r_vec); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs,(3 + 8 + 8 )* BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->r_dreg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->r_areg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_sr)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_pc)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_vec)) - return FALSE; - } else { - { - register int *genp; - - for (i = 0, genp = objp->r_dreg; - i < 8; ++i) { - *genp++ = IXDR_GET_LONG(buf); - } - } - { - register int *genp; - - for (i = 0, genp = objp->r_areg; - i < 8; ++i) { - *genp++ = IXDR_GET_LONG(buf); - } - } - objp->r_sr = IXDR_GET_LONG(buf); - objp->r_pc = IXDR_GET_LONG(buf); - objp->r_vec = IXDR_GET_LONG(buf); - } - return TRUE; - } - - if (!xdr_vector (xdrs, (char *)objp->r_dreg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->r_areg, 8, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_sr)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_pc)) - return FALSE; - if (!xdr_int (xdrs, &objp->r_vec)) - return FALSE; - return TRUE; +xdr_ptracereq (XDR * xdrs, ptracereq * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_xdr_regs (XDR * xdrs, xdr_regs * objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, (3 + 8 + 8) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->r_dreg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->r_areg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_sr)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_pc)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_vec)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->r_dreg; i < 8; ++i) { + IXDR_PUT_LONG (buf, *genp++); + } + } + { + register int *genp; + + for (i = 0, genp = objp->r_areg; i < 8; ++i) { + IXDR_PUT_LONG (buf, *genp++); + } + } + IXDR_PUT_LONG (buf, objp->r_sr); + IXDR_PUT_LONG (buf, objp->r_pc); + IXDR_PUT_LONG (buf, objp->r_vec); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, (3 + 8 + 8) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->r_dreg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->r_areg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_sr)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_pc)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_vec)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->r_dreg; i < 8; ++i) { + *genp++ = IXDR_GET_LONG (buf); + } + } + { + register int *genp; + + for (i = 0, genp = objp->r_areg; i < 8; ++i) { + *genp++ = IXDR_GET_LONG (buf); + } + } + objp->r_sr = IXDR_GET_LONG (buf); + objp->r_pc = IXDR_GET_LONG (buf); + objp->r_vec = IXDR_GET_LONG (buf); + } + return TRUE; + } + + if (!xdr_vector (xdrs, (char *) objp->r_dreg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->r_areg, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_sr)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_pc)) + return FALSE; + if (!xdr_int (xdrs, &objp->r_vec)) + return FALSE; + return TRUE; } + /* * Memory data for read/write text or data. The size is in data. The target * addr is in the addr field. @@ -153,825 +150,856 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) * pipes and is allocated on stack too. Pipes and/or the stack could * become too small if this value gets incremented. */ -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)); -} - -bool_t -xdr_break_type (XDR *xdrs, break_type *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_xdr_break (XDR *xdrs, xdr_break *objp) -{ - register int32_t *buf; - - int i; - - if (xdrs->x_op == XDR_ENCODE) { - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - - } else { - IXDR_PUT_U_SHORT(buf, objp->handle); - IXDR_PUT_U_LONG(buf, objp->ee_loc); - IXDR_PUT_U_LONG(buf, objp->ee_type); - IXDR_PUT_U_SHORT(buf, objp->length); - } - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - buf = XDR_INLINE(xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - } else { - { - register u_long *genp; - - for (i = 0, genp = objp->thread_list; - i < MAX_THRD_BRK; ++i) { - IXDR_PUT_U_LONG(buf, *genp++); - } - } - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - - } else { - objp->handle = IXDR_GET_U_SHORT(buf); - objp->ee_loc = IXDR_GET_U_LONG(buf); - objp->ee_type = IXDR_GET_U_LONG(buf); - objp->length = IXDR_GET_U_SHORT(buf); - } - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - buf = XDR_INLINE(xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - } else { - { - register u_long *genp; - - for (i = 0, genp = objp->thread_list; - i < MAX_THRD_BRK; ++i) { - *genp++ = IXDR_GET_U_LONG(buf); - } - } - } - return TRUE; - } - - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->thread_spec)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_loc)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->ee_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->length)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->pass_count)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->curr_pass)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->thread_list, MAX_THRD_BRK, - sizeof (u_long), (xdrproc_t) xdr_u_long)) - return FALSE; - return TRUE; -} - -bool_t -xdr_thread_name (XDR *xdrs, thread_name *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, objp, THREADNAMEMAX)) - return FALSE; - return TRUE; -} - -bool_t -xdr_KernThread (XDR *xdrs, KernThread *objp) -{ - register int32_t *buf; - - if (!xdr_u_int (xdrs, &objp->threadLi)) - return FALSE; - return TRUE; -} -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)); -} - -bool_t -xdr_ptrace_addr_data_in (XDR *xdrs, ptrace_addr_data_in *objp) -{ - register int32_t *buf; - - if (!xdr_ptracereq (xdrs, &objp->req)) - return FALSE; - switch (objp->req) { - case RPT_SETTHREADREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) - return FALSE; - break; - case RPT_SETREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) - return FALSE; - break; - case RPT_PSETTHREADREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_in_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_PSETREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_in_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_SETTHREADNAME: - if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_in_u.name)) - return FALSE; - break; - case RPT_WRITETEXT: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) - return FALSE; - break; - case RPT_WRITEDATA: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) - return FALSE; - break; - case RPT_SETBREAK: - if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_in_u.breakp)) - return FALSE; - break; - default: - if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_in_u.address)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_ptrace_addr_data_out (XDR *xdrs, ptrace_addr_data_out *objp) -{ - register int32_t *buf; - - if (!xdr_ptracereq (xdrs, &objp->req)) - return FALSE; - switch (objp->req) { - case RPT_GETREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) - return FALSE; - break; - case RPT_GETTHREADREGS: - if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) - return FALSE; - break; - case RPT_PGETREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_out_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_PGETTHREADREGS: - if (!xdr_array (xdrs, (char **)&objp->ptrace_addr_data_out_u.pregs.pregs_val, (u_int *) &objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - break; - case RPT_THREADLIST: - if (!xdr_thread_list (xdrs, &objp->ptrace_addr_data_out_u.threads)) - return FALSE; - break; - case RPT_GETTHREADNAME: - if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_out_u.name)) - return FALSE; - break; - case RPT_READTEXT: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_GETNAME: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_READDATA: - if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) - return FALSE; - break; - case RPT_GETBREAK: - if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_out_u.breakp)) - return FALSE; - break; - default: - if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_out_u.addr)) - return FALSE; - break; - } - return TRUE; -} - -bool_t -xdr_CHAR_DATA (XDR *xdrs, CHAR_DATA *objp) -{ - register int32_t *buf; - - if (!xdr_bytes (xdrs, (char **)&objp->CHAR_DATA_val, (u_int *) &objp->CHAR_DATA_len, NET_SAFE)) - return FALSE; - return TRUE; +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)); +} + +bool_t +xdr_break_type (XDR * xdrs, break_type * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_xdr_break (XDR * xdrs, xdr_break * objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + + } else { + IXDR_PUT_U_SHORT (buf, objp->handle); + IXDR_PUT_U_LONG (buf, objp->ee_loc); + IXDR_PUT_U_LONG (buf, objp->ee_type); + IXDR_PUT_U_SHORT (buf, objp->length); + } + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + buf = XDR_INLINE (xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + } else { + { + register u_long *genp; + + for (i = 0, genp = objp->thread_list; i < MAX_THRD_BRK; ++i) { + IXDR_PUT_U_LONG (buf, *genp++); + } + } + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + + } else { + objp->handle = IXDR_GET_U_SHORT (buf); + objp->ee_loc = IXDR_GET_U_LONG (buf); + objp->ee_type = IXDR_GET_U_LONG (buf); + objp->length = IXDR_GET_U_SHORT (buf); + } + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + buf = XDR_INLINE (xdrs, MAX_THRD_BRK * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + } else { + { + register u_long *genp; + + for (i = 0, genp = objp->thread_list; i < MAX_THRD_BRK; ++i) { + *genp++ = IXDR_GET_U_LONG (buf); + } + } + } + return TRUE; + } + + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->thread_spec)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_loc)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->ee_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->length)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->pass_count)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->curr_pass)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->thread_list, MAX_THRD_BRK, + sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + return TRUE; +} + +bool_t +xdr_thread_name (XDR * xdrs, thread_name * objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, objp, THREADNAMEMAX)) + return FALSE; + return TRUE; +} + +bool_t +xdr_KernThread (XDR * xdrs, KernThread * objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->threadLi)) + return FALSE; + return TRUE; +} + +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)); +} + +bool_t +xdr_ptrace_addr_data_in (XDR * xdrs, ptrace_addr_data_in * objp) +{ + register int32_t *buf; + + if (!xdr_ptracereq (xdrs, &objp->req)) + return FALSE; + switch (objp->req) { + case RPT_SETTHREADREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) + return FALSE; + break; + case RPT_SETREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_in_u.regs)) + return FALSE; + break; + case RPT_PSETTHREADREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_in_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_PSETREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_in_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_in_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_SETTHREADNAME: + if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_in_u.name)) + return FALSE; + break; + case RPT_WRITETEXT: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) + return FALSE; + break; + case RPT_WRITEDATA: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_in_u.mem)) + return FALSE; + break; + case RPT_SETBREAK: + if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_in_u.breakp)) + return FALSE; + break; + default: + if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_in_u.address)) + return FALSE; + break; + } + return TRUE; +} + +bool_t +xdr_ptrace_addr_data_out (XDR * xdrs, ptrace_addr_data_out * objp) +{ + register int32_t *buf; + + if (!xdr_ptracereq (xdrs, &objp->req)) + return FALSE; + switch (objp->req) { + case RPT_GETREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) + return FALSE; + break; + case RPT_GETTHREADREGS: + if (!xdr_xdr_regs (xdrs, &objp->ptrace_addr_data_out_u.regs)) + return FALSE; + break; + case RPT_PGETREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_out_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_PGETTHREADREGS: + if (!xdr_array + (xdrs, (char **) &objp->ptrace_addr_data_out_u.pregs.pregs_val, + (u_int *) & objp->ptrace_addr_data_out_u.pregs.pregs_len, ~0, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + break; + case RPT_THREADLIST: + if (!xdr_thread_list (xdrs, &objp->ptrace_addr_data_out_u.threads)) + return FALSE; + break; + case RPT_GETTHREADNAME: + if (!xdr_thread_name (xdrs, &objp->ptrace_addr_data_out_u.name)) + return FALSE; + break; + case RPT_READTEXT: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_GETNAME: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_READDATA: + if (!xdr_xdr_mem (xdrs, &objp->ptrace_addr_data_out_u.mem)) + return FALSE; + break; + case RPT_GETBREAK: + if (!xdr_xdr_break (xdrs, &objp->ptrace_addr_data_out_u.breakp)) + return FALSE; + break; + default: + if (!xdr_u_int (xdrs, &objp->ptrace_addr_data_out_u.addr)) + return FALSE; + break; + } + return TRUE; +} + +bool_t +xdr_CHAR_DATA (XDR * xdrs, CHAR_DATA * objp) +{ + register int32_t *buf; + + if (!xdr_bytes + (xdrs, (char **) &objp->CHAR_DATA_val, (u_int *) & objp->CHAR_DATA_len, + NET_SAFE)) + return FALSE; + return TRUE; } + #ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ +#endif /* REMDEB_H */ + +bool_t +xdr_xry_inst (XDR * xdrs, xry_inst * objp) +{ + register int32_t *buf; + + if (!xdr_u_char (xdrs, &objp->flags)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->sub_type)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->res_type)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->value)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->value2)) + return FALSE; + return TRUE; +} bool_t -xdr_xry_inst (XDR *xdrs, xry_inst *objp) +xdr_instance (XDR * xdrs, instance * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_char (xdrs, &objp->flags)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->sub_type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->res_type)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value2)) - return FALSE; - return TRUE; + int i; + if (!xdr_vector (xdrs, (char *) objp->instances, XRY_MAX_INSTANCES, + sizeof (xry_inst), (xdrproc_t) xdr_xry_inst)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->buffer, XRY_MAX_INST_BUFF, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + return TRUE; } bool_t -xdr_instance (XDR *xdrs, instance *objp) +xdr_instance_union (XDR * xdrs, instance_union * objp) { - register int32_t *buf; + register int32_t *buf; - int i; - if (!xdr_vector (xdrs, (char *)objp->instances, XRY_MAX_INSTANCES, - sizeof (xry_inst), (xdrproc_t) xdr_xry_inst)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->buffer, XRY_MAX_INST_BUFF, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - return TRUE; + if (!xdr_bool (xdrs, &objp->instances)) + return FALSE; + switch (objp->instances) { + case TRUE: + if (!xdr_instance (xdrs, &objp->instance_union_u.inst)) + return FALSE; + break; + case FALSE: + if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR)) + return FALSE; + break; + default: + return FALSE; + } + return TRUE; } bool_t -xdr_instance_union (XDR *xdrs, instance_union *objp) +xdr_one_arg (XDR * xdrs, one_arg * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_bool (xdrs, &objp->instances)) - return FALSE; - switch (objp->instances) { - case TRUE: - if (!xdr_instance (xdrs, &objp->instance_union_u.inst)) - return FALSE; - break; - case FALSE: - if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR)) - return FALSE; - break; - default: - return FALSE; - } - return TRUE; + if (!xdr_string (xdrs, objp, NET_SAFE)) + return FALSE; + return TRUE; } -bool_t -xdr_one_arg (XDR *xdrs, one_arg *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, objp, NET_SAFE)) - return FALSE; - return TRUE; -} - /* now open_connex() routine which establishes a connection to server */ - -bool_t -xdr_debug_type (XDR *xdrs, debug_type *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} -#define DEBUGGER_IS_GDB 0x2 /* */ - -bool_t -xdr_open_in (XDR *xdrs, open_in *objp) -{ - register int32_t *buf; - - int i; - if (!xdr_vector (xdrs, (char *)objp->back_port, 16, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->debug_type)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->flags)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->destination, 16, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - if (!xdr_one_arg (xdrs, &objp->user_name)) - return FALSE; - return TRUE; -} - -bool_t -xdr_open_out (XDR *xdrs, open_out *objp) -{ - register int32_t *buf; - - int i; - - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs, (2 + ( 4 )) * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; + /* + * now open_connex() routine which establishes a connection to server + */ + +bool_t +xdr_debug_type (XDR * xdrs, debug_type * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +#define DEBUGGER_IS_GDB 0x2 /* */ + +bool_t +xdr_open_in (XDR * xdrs, open_in * objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *) objp->back_port, 16, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->debug_type)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->flags)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->destination, 16, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + if (!xdr_one_arg (xdrs, &objp->user_name)) + return FALSE; + return TRUE; +} + +bool_t +xdr_open_out (XDR * xdrs, open_out * objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, (2 + (4)) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + + } else { + IXDR_PUT_U_LONG (buf, objp->port); + { + register u_int *genp; + + for (i = 0, genp = objp->pad; i < 4; ++i) { + IXDR_PUT_U_LONG (buf, *genp++); + } + } + IXDR_PUT_U_LONG (buf, objp->fp); + } + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, (2 + (4)) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + + } else { + objp->port = IXDR_GET_U_LONG (buf); + { + register u_int *genp; + + for (i = 0, genp = objp->pad; i < 4; ++i) { + *genp++ = IXDR_GET_U_LONG (buf); + } + } + objp->fp = IXDR_GET_U_LONG (buf); + } + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; + } + + if (!xdr_u_long (xdrs, &objp->port)) + return FALSE; + if (!xdr_vector (xdrs, (char *) objp->pad, 4, + sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->fp)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_num)) + return FALSE; + if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) + return FALSE; + if (!xdr_u_short (xdrs, &objp->server_vers)) + return FALSE; + return TRUE; +} + + /* + * now close_connex() routine which detaches from server + */ + +bool_t +xdr_close_control (XDR * xdrs, close_control * objp) +{ + register int32_t *buf; - } else { - IXDR_PUT_U_LONG(buf, objp->port); - { - register u_int *genp; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} - for (i = 0, genp = objp->pad; - i < 4; ++i) { - IXDR_PUT_U_LONG(buf, *genp++); - } - } - IXDR_PUT_U_LONG(buf, objp->fp); - } - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs, (2 + ( 4 )) * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; +bool_t +xdr_close_in (XDR * xdrs, close_in * objp) +{ + register int32_t *buf; - } else { - objp->port = IXDR_GET_U_LONG(buf); - { - register u_int *genp; + if (!xdr_close_control (xdrs, &objp->control)) + return FALSE; + return TRUE; +} - for (i = 0, genp = objp->pad; - i < 4; ++i) { - *genp++ = IXDR_GET_U_LONG(buf); - } - } - objp->fp = IXDR_GET_U_LONG(buf); - } - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; - } + /* + * now send_signal() routine which sends signals to processes like kill(2) + */ - if (!xdr_u_long (xdrs, &objp->port)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->pad, 4, - sizeof (u_int), (xdrproc_t) xdr_u_int)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->fp)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_num)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->cmd_table_vers)) - return FALSE; - if (!xdr_u_short (xdrs, &objp->server_vers)) - return FALSE; - return TRUE; -} - /* now close_connex() routine which detaches from server */ - -bool_t -xdr_close_control (XDR *xdrs, close_control *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_close_in (XDR *xdrs, close_in *objp) -{ - register int32_t *buf; - - if (!xdr_close_control (xdrs, &objp->control)) - return FALSE; - return TRUE; -} - /* now send_signal() routine which sends signals to processes like kill(2) */ - -bool_t -xdr_signal_in (XDR *xdrs, signal_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_int (xdrs, &objp->sig)) - return FALSE; - return TRUE; -} - -bool_t -xdr_signal_out (XDR *xdrs, signal_out *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->kill_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - return TRUE; -} - /* 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 */ - -bool_t -xdr_stop_code (XDR *xdrs, stop_code *objp) -{ - register int32_t *buf; - - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; -} - -bool_t -xdr_wait_in (XDR *xdrs, wait_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - return TRUE; -} - -bool_t -xdr_wait_out (XDR *xdrs, wait_out *objp) -{ - register int32_t *buf; - - - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - - } else { - IXDR_PUT_LONG(buf, objp->wait_return); - IXDR_PUT_LONG(buf, objp->errNo); - IXDR_PUT_LONG(buf, objp->status); - } - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - buf = XDR_INLINE(xdrs,5 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - } else { - IXDR_PUT_LONG(buf, objp->handle); - IXDR_PUT_U_LONG(buf, objp->PC); - IXDR_PUT_U_LONG(buf, objp->SP); - IXDR_PUT_U_LONG(buf, objp->FP); - IXDR_PUT_U_LONG(buf, objp->thread); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - - } else { - objp->wait_return = IXDR_GET_LONG(buf); - objp->errNo = IXDR_GET_LONG(buf); - objp->status = IXDR_GET_LONG(buf); - } - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - buf = XDR_INLINE(xdrs,5 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - } else { - objp->handle = IXDR_GET_LONG(buf); - objp->PC = IXDR_GET_U_LONG(buf); - objp->SP = IXDR_GET_U_LONG(buf); - objp->FP = IXDR_GET_U_LONG(buf); - objp->thread = IXDR_GET_U_LONG(buf); - } - return TRUE; - } - - if (!xdr_int (xdrs, &objp->wait_return)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_int (xdrs, &objp->status)) - return FALSE; - if (!xdr_stop_code (xdrs, &objp->reason)) - return FALSE; - if (!xdr_int (xdrs, &objp->handle)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->PC)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->SP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->FP)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->thread)) - return FALSE; - return TRUE; -} - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ - -bool_t -xdr_ptrace_in (XDR *xdrs, ptrace_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_ptrace_addr_data_in (xdrs, &objp->addr)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->data)) - return FALSE; - if (!xdr_u_int (xdrs, &objp->flags)) - return FALSE; - return TRUE; -} - -bool_t -xdr_ptrace_out (XDR *xdrs, ptrace_out *objp) -{ - register int32_t *buf; - - if (!xdr_ptrace_addr_data_out (xdrs, &objp->addr)) - return FALSE; - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - return TRUE; -} - -bool_t -xdr_one_symbol (XDR *xdrs, one_symbol *objp) -{ - register int32_t *buf; - - if (!xdr_string (xdrs, &objp->symbolName, ~0)) - return FALSE; - if (!xdr_long (xdrs, &objp->symbolValue)) - return FALSE; - return TRUE; -} - -bool_t -xdr_all_symbols (XDR *xdrs, all_symbols *objp) -{ - register int32_t *buf; - - if (!xdr_array (xdrs, (char **)&objp->all_symbols_val, (u_int *) &objp->all_symbols_len, ~0, - sizeof (one_symbol), (xdrproc_t) xdr_one_symbol)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_global_symbols_out (XDR *xdrs, get_global_symbols_out *objp) -{ - register int32_t *buf; - - if (!xdr_all_symbols (xdrs, &objp->symbols)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_text_data_in (XDR *xdrs, get_text_data_in *objp) -{ - register int32_t *buf; - - if (!xdr_int (xdrs, &objp->pid)) - return FALSE; - if (!xdr_string (xdrs, &objp->actorName, 16)) - return FALSE; - return TRUE; +bool_t +xdr_signal_in (XDR * xdrs, signal_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_int (xdrs, &objp->sig)) + return FALSE; + return TRUE; } bool_t -xdr_get_text_data_out (XDR *xdrs, get_text_data_out *objp) +xdr_signal_out (XDR * xdrs, signal_out * objp) { - register int32_t *buf; + register int32_t *buf; + if (!xdr_int (xdrs, &objp->kill_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + return TRUE; +} - if (xdrs->x_op == XDR_ENCODE) { - buf = XDR_INLINE(xdrs,6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - } else { - IXDR_PUT_LONG(buf, objp->result); - IXDR_PUT_LONG(buf, objp->errNo); - IXDR_PUT_U_LONG(buf, objp->textStart); - IXDR_PUT_U_LONG(buf, objp->textSize); - IXDR_PUT_U_LONG(buf, objp->dataStart); - IXDR_PUT_U_LONG(buf, objp->dataSize); - } - return TRUE; - } else if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs,6 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - } else { - objp->result = IXDR_GET_LONG(buf); - objp->errNo = IXDR_GET_LONG(buf); - objp->textStart = IXDR_GET_U_LONG(buf); - objp->textSize = IXDR_GET_U_LONG(buf); - objp->dataStart = IXDR_GET_U_LONG(buf); - objp->dataSize = IXDR_GET_U_LONG(buf); - } - return TRUE; - } + /* + * 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 + */ - if (!xdr_int (xdrs, &objp->result)) - return FALSE; - if (!xdr_int (xdrs, &objp->errNo)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->textSize)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataStart)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->dataSize)) - return FALSE; - return TRUE; +bool_t +xdr_stop_code (XDR * xdrs, stop_code * objp) +{ + register int32_t *buf; + + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; +} + +bool_t +xdr_wait_in (XDR * xdrs, wait_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + return TRUE; +} + +bool_t +xdr_wait_out (XDR * xdrs, wait_out * objp) +{ + register int32_t *buf; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + + } else { + IXDR_PUT_LONG (buf, objp->wait_return); + IXDR_PUT_LONG (buf, objp->errNo); + IXDR_PUT_LONG (buf, objp->status); + } + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + } else { + IXDR_PUT_LONG (buf, objp->handle); + IXDR_PUT_U_LONG (buf, objp->PC); + IXDR_PUT_U_LONG (buf, objp->SP); + IXDR_PUT_U_LONG (buf, objp->FP); + IXDR_PUT_U_LONG (buf, objp->thread); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + + } else { + objp->wait_return = IXDR_GET_LONG (buf); + objp->errNo = IXDR_GET_LONG (buf); + objp->status = IXDR_GET_LONG (buf); + } + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + } else { + objp->handle = IXDR_GET_LONG (buf); + objp->PC = IXDR_GET_U_LONG (buf); + objp->SP = IXDR_GET_U_LONG (buf); + objp->FP = IXDR_GET_U_LONG (buf); + objp->thread = IXDR_GET_U_LONG (buf); + } + return TRUE; + } + + if (!xdr_int (xdrs, &objp->wait_return)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_int (xdrs, &objp->status)) + return FALSE; + if (!xdr_stop_code (xdrs, &objp->reason)) + return FALSE; + if (!xdr_int (xdrs, &objp->handle)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->PC)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->SP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->FP)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->thread)) + return FALSE; + return TRUE; } + /* + * now ptrace() routine. This matches the Sun UNIX ptrace as well as + * some additions + */ + bool_t -xdr_one_signal (XDR *xdrs, one_signal *objp) +xdr_ptrace_in (XDR * xdrs, ptrace_in * objp) { - register int32_t *buf; + register int32_t *buf; - if (!xdr_u_int (xdrs, &objp->number)) - return FALSE; - if (!xdr_string (xdrs, &objp->name, ~0)) - return FALSE; - return TRUE; -} - -bool_t -xdr_all_signals (XDR *xdrs, all_signals *objp) -{ - register int32_t *buf; - - if (!xdr_array (xdrs, (char **)&objp->all_signals_val, (u_int *) &objp->all_signals_len, ~0, - sizeof (one_signal), (xdrproc_t) xdr_one_signal)) - return FALSE; - return TRUE; -} - -bool_t -xdr_get_signal_names_out (XDR *xdrs, get_signal_names_out *objp) -{ - register int32_t *buf; - - if (!xdr_all_signals (xdrs, &objp->signals)) - return FALSE; - return TRUE; -} - /* now define the actual calls we support */ + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_ptrace_addr_data_in (xdrs, &objp->addr)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->data)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->flags)) + return FALSE; + return TRUE; +} + +bool_t +xdr_ptrace_out (XDR * xdrs, ptrace_out * objp) +{ + register int32_t *buf; + + if (!xdr_ptrace_addr_data_out (xdrs, &objp->addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + return TRUE; +} + +bool_t +xdr_one_symbol (XDR * xdrs, one_symbol * objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->symbolName, ~0)) + return FALSE; + if (!xdr_long (xdrs, &objp->symbolValue)) + return FALSE; + return TRUE; +} + +bool_t +xdr_all_symbols (XDR * xdrs, all_symbols * objp) +{ + register int32_t *buf; + + if (!xdr_array + (xdrs, (char **) &objp->all_symbols_val, + (u_int *) & objp->all_symbols_len, ~0, sizeof (one_symbol), + (xdrproc_t) xdr_one_symbol)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_global_symbols_out (XDR * xdrs, get_global_symbols_out * objp) +{ + register int32_t *buf; + + if (!xdr_all_symbols (xdrs, &objp->symbols)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_text_data_in (XDR * xdrs, get_text_data_in * objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->pid)) + return FALSE; + if (!xdr_string (xdrs, &objp->actorName, 16)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_text_data_out (XDR * xdrs, get_text_data_out * objp) +{ + register int32_t *buf; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + } else { + IXDR_PUT_LONG (buf, objp->result); + IXDR_PUT_LONG (buf, objp->errNo); + IXDR_PUT_U_LONG (buf, objp->textStart); + IXDR_PUT_U_LONG (buf, objp->textSize); + IXDR_PUT_U_LONG (buf, objp->dataStart); + IXDR_PUT_U_LONG (buf, objp->dataSize); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + } else { + objp->result = IXDR_GET_LONG (buf); + objp->errNo = IXDR_GET_LONG (buf); + objp->textStart = IXDR_GET_U_LONG (buf); + objp->textSize = IXDR_GET_U_LONG (buf); + objp->dataStart = IXDR_GET_U_LONG (buf); + objp->dataSize = IXDR_GET_U_LONG (buf); + } + return TRUE; + } + + if (!xdr_int (xdrs, &objp->result)) + return FALSE; + if (!xdr_int (xdrs, &objp->errNo)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->textSize)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataStart)) + return FALSE; + if (!xdr_u_long (xdrs, &objp->dataSize)) + return FALSE; + return TRUE; +} + +bool_t +xdr_one_signal (XDR * xdrs, one_signal * objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->number)) + return FALSE; + if (!xdr_string (xdrs, &objp->name, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr_all_signals (XDR * xdrs, all_signals * objp) +{ + register int32_t *buf; + + if (!xdr_array + (xdrs, (char **) &objp->all_signals_val, + (u_int *) & objp->all_signals_len, ~0, sizeof (one_signal), + (xdrproc_t) xdr_one_signal)) + return FALSE; + return TRUE; +} + +bool_t +xdr_get_signal_names_out (XDR * xdrs, get_signal_names_out * objp) +{ + register int32_t *buf; + + if (!xdr_all_signals (xdrs, &objp->signals)) + return FALSE; + return TRUE; +} + + /* + * now define the actual calls we support + */ diff --git a/c/src/librdbg/src/m68k/excep_f.c b/c/src/librdbg/src/m68k/excep_f.c index aadf23387b..5f75f6696f 100644 --- a/c/src/librdbg/src/m68k/excep_f.c +++ b/c/src/librdbg/src/m68k/excep_f.c @@ -17,54 +17,107 @@ #include #include -int -ExcepToSig (Exception_context *ctx) + int +ExcepToSig (Exception_context * ctx) { int excep = getExcNum (ctx); - + switch (excep) { - case 2 : return 10; break; /* bus error */ - case 3 : return 10; break; /* address error */ - case 4 : return 4; break; /* illegal instruction */ - case 5 : return 8; break; /* zero divide */ - case 6 : return 8; break; /* chk instruction */ - case 7 : return 8; break; /* trapv instruction */ - case 8 : return 11; break; /* privilege violation */ - case 9 : return 5; break; /* trace trap */ - case 10: return 4; break; /* line 1010 emulator */ - case 11: return 4; break; /* line 1111 emulator */ - - /* Coprocessor protocol violation. Using a standard MMU or FPU - this cannot be triggered by software. Call it a SIGBUS. */ - case 13: return 10; break; - - case 31: return 2; break; /* interrupt */ - case 33: return 5; break; /* monitor breakpoint */ - case 34: return 2; break; /* lets use this for SCC1 interrupt */ - case 35: return 5; break; /* rdbg breakpoint */ - case 36: return 2; break; /* enter RDBG */ - /* This is a trap #8 instruction. Apparently it is someone's software - convention for some sort of SIGFPE condition. Whose? How many - people are being screwed by having this code the way it is? - Is there a clean solution? */ - case 40: return 8; break; /* floating point err */ - - case 47: return 5; break; /* rdbg breakpoint */ - - case 48: return 8; break; /* floating point err */ - case 49: return 8; break; /* floating point err */ - case 50: return 8; break; /* zero divide */ - case 51: return 8; break; /* underflow */ - case 52: return 8; break; /* operand error */ - case 53: return 8; break; /* overflow */ - case 54: return 8; break; /* NAN */ - default: - return 7; /* "software generated"*/ - } - return SIGKILL; + case 2: + return 10; + break; /* bus error */ + case 3: + return 10; + break; /* address error */ + case 4: + return 4; + break; /* illegal instruction */ + case 5: + return 8; + break; /* zero divide */ + case 6: + return 8; + break; /* chk instruction */ + case 7: + return 8; + break; /* trapv instruction */ + case 8: + return 11; + break; /* privilege violation */ + case 9: + return 5; + break; /* trace trap */ + case 10: + return 4; + break; /* line 1010 emulator */ + case 11: + return 4; + break; /* line 1111 emulator */ + + /* + * Coprocessor protocol violation. Using a standard MMU or FPU + * this cannot be triggered by software. Call it a SIGBUS. + */ + case 13: + return 10; + break; + + case 31: + return 2; + break; /* interrupt */ + case 33: + return 5; + break; /* monitor breakpoint */ + case 34: + return 2; + break; /* lets use this for SCC1 interrupt */ + case 35: + return 5; + break; /* rdbg breakpoint */ + case 36: + return 2; + break; /* enter RDBG */ + /* + * This is a trap #8 instruction. Apparently it is someone's software + * convention for some sort of SIGFPE condition. Whose? How many + * people are being screwed by having this code the way it is? + * Is there a clean solution? + */ + case 40: + return 8; + break; /* floating point err */ + + case 47: + return 5; + break; /* rdbg breakpoint */ + + case 48: + return 8; + break; /* floating point err */ + case 49: + return 8; + break; /* floating point err */ + case 50: + return 8; + break; /* zero divide */ + case 51: + return 8; + break; /* underflow */ + case 52: + return 8; + break; /* operand error */ + case 53: + return 8; + break; /* overflow */ + case 54: + return 8; + break; /* NAN */ + default: + return 7; /* "software generated" */ + } + return SIGKILL; } - /*----- Breakpoint Exception management -----*/ /* @@ -72,101 +125,93 @@ ExcepToSig (Exception_context *ctx) * software breakpoints. */ -void -BreakPointExcHdl(CPU_Exception_frame *ctx) + void +BreakPointExcHdl (CPU_Exception_frame * ctx) { rtems_status_code status; rtems_id continueSemId; - connect_rdbg_exception(); /* monitor stub changes trace vector */ - if ( (justSaveContext) && (ctx->vecnum == 47) ) { /* break */ + connect_rdbg_exception (); /* monitor stub changes trace vector */ + if ((justSaveContext) && (ctx->vecnum == 47)) { /* break */ PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); justSaveContext = 0; - } - else { - if (ctx->vecnum != 9) { /* trace */ + } else { + if (ctx->vecnum != 9) { /* trace */ NbSerializedCtx++; - rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); NbSerializedCtx--; } - + currentTargetThread = _Thread_Executing->Object.id; #ifdef DDEBUG - printk("----------------------------------------------------------\n"); - printk("Exception %d caught at PC %x by thread %d\n", - ctx->vecnum, - ctx->pc, - _Thread_Executing->Object.id); - printk("----------------------------------------------------------\n"); - printk("Processor execution context at time of the fault was :\n"); - printk("----------------------------------------------------------\n"); - printk("\t A0 = %x\n", ctx->a0); - printk("\t A1 = %x\n", ctx->a1); - printk("\t A2 = %x\n", ctx->a2); - printk("\t A3 = %x\n", ctx->a3); - printk("\t A4 = %x\n", ctx->a4); - printk("\t A5 = %x\n", ctx->a5); - printk("\t A6 = %x\n", ctx->a6); - printk("\t A7 = %x\n", ctx->a7); - printk("\t D0 = %x\n", ctx->d0); - printk("\t D1 = %x\n", ctx->d1); - printk("\t D2 = %x\n", ctx->d2); - printk("\t D3 = %x\n", ctx->d3); - printk("\t D4 = %x\n", ctx->d4); - printk("\t D5 = %x\n", ctx->d5); - printk("\t D6 = %x\n", ctx->d6); - printk("\t D7 = %x\n", ctx->d7); - printk("\t SR = %x\n", ctx->sr); + printk ("----------------------------------------------------------\n"); + printk ("Exception %d caught at PC %x by thread %d\n", + ctx->vecnum, ctx->pc, _Thread_Executing->Object.id); + printk ("----------------------------------------------------------\n"); + printk ("Processor execution context at time of the fault was :\n"); + printk ("----------------------------------------------------------\n"); + printk ("\t A0 = %x\n", ctx->a0); + printk ("\t A1 = %x\n", ctx->a1); + printk ("\t A2 = %x\n", ctx->a2); + printk ("\t A3 = %x\n", ctx->a3); + printk ("\t A4 = %x\n", ctx->a4); + printk ("\t A5 = %x\n", ctx->a5); + printk ("\t A6 = %x\n", ctx->a6); + printk ("\t A7 = %x\n", ctx->a7); + printk ("\t D0 = %x\n", ctx->d0); + printk ("\t D1 = %x\n", ctx->d1); + printk ("\t D2 = %x\n", ctx->d2); + printk ("\t D3 = %x\n", ctx->d3); + printk ("\t D4 = %x\n", ctx->d4); + printk ("\t D5 = %x\n", ctx->d5); + printk ("\t D6 = %x\n", ctx->d6); + printk ("\t D7 = %x\n", ctx->d7); + printk ("\t SR = %x\n", ctx->sr); #endif - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'), - 0, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &continueSemId); + status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'), + 0, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, 0, &continueSemId); if (status != RTEMS_SUCCESSFUL) rtems_panic ("Can't create continue semaphore: `%s'\n", - rtems_status_text(status)); + rtems_status_text (status)); PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); - - switch (ctx->vecnum){ - case 9 : /* trace */ - DPRINTF((" TRACE EXCEPTION !!!\n")); + + switch (ctx->vecnum) { + case 9: /* trace */ + DPRINTF ((" TRACE EXCEPTION !!!\n")); ctx->sr &= ~(1 << 15); - ExitForSingleStep-- ; - rtems_semaphore_release( wakeupEventSemId ); - break; + ExitForSingleStep--; + rtems_semaphore_release (wakeupEventSemId); + break; - case 47 : /* trap #15 */ - DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; + case 47: /* trap #15 */ + DPRINTF ((" BREAKPOINT EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); + break; - case 36 : /* trap #4 */ - DPRINTF((" ENTER RDBG !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + case 36: /* trap #4 */ + DPRINTF ((" ENTER RDBG !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; default: - DPRINTF((" OTHER EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + DPRINTF ((" OTHER EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; } - rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - + rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + PopExceptCtx (_Thread_Executing->Object.id); - rtems_semaphore_delete(continueSemId); + rtems_semaphore_delete (continueSemId); } - connect_rdbg_exception(); /* monitor stub changes trace vector */ + connect_rdbg_exception (); /* monitor stub changes trace vector */ } - - - diff --git a/c/src/librdbg/src/m68k/rdbg_f.c b/c/src/librdbg/src/m68k/rdbg_f.c index 35535cd59b..7f7e92b437 100644 --- a/c/src/librdbg/src/m68k/rdbg_f.c +++ b/c/src/librdbg/src/m68k/rdbg_f.c @@ -12,14 +12,14 @@ #include #include -#include +#include #include #include -#include -#include +#include +#include -void -CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs) + void +CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs) { regs->r_dreg[0] = ctx->d0; regs->r_dreg[1] = ctx->d1; @@ -44,8 +44,8 @@ CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs) regs->r_vec = ctx->vecnum; } -void -RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx) + void +RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx) { ctx->d0 = regs->r_dreg[0]; ctx->d1 = regs->r_dreg[1]; @@ -70,97 +70,107 @@ RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx) ctx->vecnum = regs->r_vec; } -void -get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { unsigned int *ptr; unsigned int i; - - /* + + /* * ISR stores d0-d1/a0-a1, calls _Thread_Dispatch * _Thread_Dispatch calls _Context_Switch == _CPU_Context_switch * _CPU_Context_switch stores/restores sr,d2-d7,a2-a7 * so if my reasoning is correct, *sp points to a location in * _Thread_Dispatch */ - ctx->vecnum = 0xdeadbeef; - ctx->sr = thread->Registers.sr; - ctx->pc = *(unsigned32 *)thread->Registers.a7_msp; - ctx->d0 = 0xdeadbeef; - ctx->d1 = 0xdeadbeef; - ctx->a0 = 0xdeadbeef; - ctx->a1 = 0xdeadbeef; - - ctx->a2 = (unsigned32)thread->Registers.a2; - ctx->a3 = (unsigned32)thread->Registers.a3; - ctx->a4 = (unsigned32)thread->Registers.a4; - ctx->a5 = (unsigned32)thread->Registers.a5; - ctx->a6 = (unsigned32)thread->Registers.a6; - ctx->a7 = (unsigned32)thread->Registers.a7_msp; - ctx->d2 = thread->Registers.d2; - ctx->d3 = thread->Registers.d3; - ctx->d4 = thread->Registers.d4; - ctx->d5 = thread->Registers.d5; - ctx->d6 = thread->Registers.d6; - ctx->d7 = thread->Registers.d7; + ctx->vecnum = 0xdeadbeef; + ctx->sr = thread->Registers.sr; + ctx->pc = *(unsigned32 *) thread->Registers.a7_msp; + ctx->d0 = 0xdeadbeef; + ctx->d1 = 0xdeadbeef; + ctx->a0 = 0xdeadbeef; + ctx->a1 = 0xdeadbeef; + + ctx->a2 = (unsigned32) thread->Registers.a2; + ctx->a3 = (unsigned32) thread->Registers.a3; + ctx->a4 = (unsigned32) thread->Registers.a4; + ctx->a5 = (unsigned32) thread->Registers.a5; + ctx->a6 = (unsigned32) thread->Registers.a6; + ctx->a7 = (unsigned32) thread->Registers.a7_msp; + ctx->d2 = thread->Registers.d2; + ctx->d3 = thread->Registers.d3; + ctx->d4 = thread->Registers.d4; + ctx->d5 = thread->Registers.d5; + ctx->d6 = thread->Registers.d6; + ctx->d7 = thread->Registers.d7; } -void -set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { - thread->Registers.sr = ctx->sr; - thread->Registers.d2 = ctx->d2; - thread->Registers.d3 = ctx->d3; - thread->Registers.d4 = ctx->d4; - thread->Registers.d5 = ctx->d5; - thread->Registers.d6 = ctx->d6; - thread->Registers.d7 = ctx->d7; - thread->Registers.a2 = (void *)ctx->a2; - thread->Registers.a3 = (void *)ctx->a3; - thread->Registers.a4 = (void *)ctx->a4; - thread->Registers.a5 = (void *)ctx->a5; - thread->Registers.a6 = (void *)ctx->a6; - thread->Registers.a7_msp = (void *)ctx->a7; + thread->Registers.sr = ctx->sr; + thread->Registers.d2 = ctx->d2; + thread->Registers.d3 = ctx->d3; + thread->Registers.d4 = ctx->d4; + thread->Registers.d5 = ctx->d5; + thread->Registers.d6 = ctx->d6; + thread->Registers.d7 = ctx->d7; + thread->Registers.a2 = (void *) ctx->a2; + thread->Registers.a3 = (void *) ctx->a3; + thread->Registers.a4 = (void *) ctx->a4; + thread->Registers.a5 = (void *) ctx->a5; + thread->Registers.a6 = (void *) ctx->a6; + thread->Registers.a7_msp = (void *) ctx->a7; } -int -Single_Step(CPU_Exception_frame* ctx) + int +Single_Step (CPU_Exception_frame * ctx) { - if ((ctx->sr & (1<<15)) != 0 || ExitForSingleStep != 0) { - /* Check coherency */ - assert ((ctx->sr & (1<<15)) != 0); + if ((ctx->sr & (1 << 15)) != 0 || ExitForSingleStep != 0) { + /* + * Check coherency + */ + assert ((ctx->sr & (1 << 15)) != 0); assert (ExitForSingleStep != 0); return 0; } - ctx->sr |= 1<<15; + ctx->sr |= 1 << 15; ++ExitForSingleStep; return 0; } -int -CheckForSingleStep (CPU_Exception_frame* ctx) + int +CheckForSingleStep (CPU_Exception_frame * ctx) { - if (ExitForSingleStep) { - ctx->sr &= ~(1<<15); - ExitForSingleStep = 0; - return 1; - } - return 0; + if (ExitForSingleStep) { + ctx->sr &= ~(1 << 15); + ExitForSingleStep = 0; + return 1; + } + return 0; } -void -CancelSingleStep (CPU_Exception_frame* ctx) + void +CancelSingleStep (CPU_Exception_frame * ctx) { - /* Cancel scheduled SS */ - ctx->sr &= ~(1<<15); - ExitForSingleStep-- ; + /* + * Cancel scheduled SS + */ + ctx->sr &= ~(1 << 15); + ExitForSingleStep--; } -rtems_isr excHandler(); +extern rtems_isr excHandler (); -void connect_rdbg_exception(void) + void +connect_rdbg_exception (void) +{ + set_vector (excHandler, 9, 0); + set_vector (excHandler, 47, 0); + set_vector (excHandler, 36, 0); +} + +void +disconnect_rdbg_exception (void) { - set_vector(excHandler, 9, 0); - set_vector(excHandler, 47, 0); - set_vector(excHandler, 36, 0); } diff --git a/c/src/librdbg/src/powerpc/excep_f.c b/c/src/librdbg/src/powerpc/excep_f.c index 13adcd1e67..b821f39c1d 100644 --- a/c/src/librdbg/src/powerpc/excep_f.c +++ b/c/src/librdbg/src/powerpc/excep_f.c @@ -17,32 +17,35 @@ #include #include - int -ExcepToSig (Exception_context *ctx) + int +ExcepToSig (Exception_context * ctx) { int excep = getExcNum (ctx); - + switch (excep) { - case ASM_FLOAT_VECTOR : return SIGFPE; - - case ASM_TRACE_VECTOR : - case ASM_PROG_VECTOR : - case ASM_SYS_VECTOR : return SIGTRAP; - - case ASM_ISI_VECTOR : return SIGSEGV; - - case ASM_RESET_VECTOR : - case ASM_MACH_VECTOR : - case ASM_EXT_VECTOR : - case ASM_ALIGN_VECTOR : return SIGILL; - - default: - break; - } - return SIGKILL; + case ASM_FLOAT_VECTOR: + return SIGFPE; + + case ASM_TRACE_VECTOR: + case ASM_PROG_VECTOR: + case ASM_SYS_VECTOR: + return SIGTRAP; + + case ASM_ISI_VECTOR: + return SIGSEGV; + + case ASM_RESET_VECTOR: + case ASM_MACH_VECTOR: + case ASM_EXT_VECTOR: + case ASM_ALIGN_VECTOR: + return SIGILL; + + default: + break; + } + return SIGKILL; } - /*----- Breakpoint Exception management -----*/ /* @@ -51,134 +54,124 @@ ExcepToSig (Exception_context *ctx) */ void -BreakPointExcHdl(CPU_Exception_frame *ctx) +BreakPointExcHdl (CPU_Exception_frame * ctx) { rtems_status_code status; rtems_id continueSemId; - /* T. Straumann, 1/16/2002: we must re-enable the floating point engine - * if the interrupted thread is FP. Otherwise, - * the semaphore primitives may crash when they - * try to save FP context while switching this - * thread... + /* + * we must re-enable the floating point engine + * if the interrupted thread is FP. Otherwise, + * the semaphore primitives may crash when they + * try to save FP context while switching this + * thread... NB : deferred fp context switching + * would 1) avoid to have to save FP, make this code + * obsolete. */ - if (ctx->EXC_SRR1 & 0x2000) { - register unsigned long msr; - __asm__ __volatile__("mfmsr %0":"=r"(msr)); - __asm__ __volatile__("mtmsr %0"::"r"(msr|MSR_FP)); + if (ctx->EXC_SRR1 & MSR_FP) { + register unsigned long msr; + __asm__ __volatile__ ("mfmsr %0":"=r" (msr)); + __asm__ __volatile__ ("mtmsr %0"::"r" (msr | MSR_FP)); } - if ( (justSaveContext) && (ctx->_EXC_number == ASM_SYS_VECTOR) ) { + if ((justSaveContext) && (ctx->_EXC_number == ASM_SYS_VECTOR)) { PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); justSaveContext = 0; - } - else { - if (ctx->_EXC_number != ASM_TRACE_VECTOR){ + } else { + if (ctx->_EXC_number != ASM_TRACE_VECTOR) { NbSerializedCtx++; - rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); NbSerializedCtx--; } - + currentTargetThread = _Thread_Executing->Object.id; #ifdef DDEBUG - printk("----------------------------------------------------------\n"); - printk("Exception %d caught at PC %x by thread %d\n", - ctx->_EXC_number, - ctx->EXC_SRR0, - _Thread_Executing->Object.id); - printk("----------------------------------------------------------\n"); - printk("Processor execution context at time of the fault was :\n"); - printk("----------------------------------------------------------\n"); - printk("\t R0 = %x\n", ctx->GPR0); - printk("\t R1 = %x\n", ctx->GPR1); - printk("\t R2 = %x\n", ctx->GPR2); - printk("\t R3 = %x\n", ctx->GPR3); - printk("\t R4 = %x\n", ctx->GPR4); - printk("\t R5 = %x\n", ctx->GPR5); - printk("\t R6 = %x\n", ctx->GPR6); - printk("\t R7 = %x\n", ctx->GPR7); - printk("\t R8 = %x\n", ctx->GPR8); - printk("\t R9 = %x\n", ctx->GPR9); - printk("\t R10 = %x\n", ctx->GPR10); - printk("\t R11 = %x\n", ctx->GPR11); - printk("\t R12 = %x\n", ctx->GPR12); - printk("\t R13 = %x\n", ctx->GPR13); - printk("\t R14 = %x\n", ctx->GPR14); - printk("\t R15 = %x\n", ctx->GPR15); - printk("\t R16 = %x\n", ctx->GPR16); - printk("\t R17 = %x\n", ctx->GPR17); - printk("\t R18 = %x\n", ctx->GPR18); - printk("\t R19 = %x\n", ctx->GPR19); - printk("\t R20 = %x\n", ctx->GPR20); - printk("\t R21 = %x\n", ctx->GPR21); - printk("\t R22 = %x\n", ctx->GPR22); - printk("\t R23 = %x\n", ctx->GPR23); - printk("\t R24 = %x\n", ctx->GPR24); - printk("\t R25 = %x\n", ctx->GPR25); - printk("\t R26 = %x\n", ctx->GPR26); - printk("\t R27 = %x\n", ctx->GPR27); - printk("\t R28 = %x\n", ctx->GPR28); - printk("\t R29 = %x\n", ctx->GPR29); - printk("\t R30 = %x\n", ctx->GPR30); - printk("\t R31 = %x\n", ctx->GPR31); - printk("\t CR = %x\n", ctx->EXC_CR); - printk("\t CTR = %x\n", ctx->EXC_CTR); - printk("\t XER = %x\n", ctx->EXC_XER); - printk("\t LR = %x\n", ctx->EXC_LR); - printk("\t MSR = %x\n", ctx->EXC_SRR1); + printk ("----------------------------------------------------------\n"); + printk ("Exception %d caught at PC %x by thread %d\n", + ctx->_EXC_number, ctx->EXC_SRR0, _Thread_Executing->Object.id); + printk ("----------------------------------------------------------\n"); + printk ("Processor execution context at time of the fault was :\n"); + printk ("----------------------------------------------------------\n"); + printk ("\t R0 = %x\n", ctx->GPR0); + printk ("\t R1 = %x\n", ctx->GPR1); + printk ("\t R2 = %x\n", ctx->GPR2); + printk ("\t R3 = %x\n", ctx->GPR3); + printk ("\t R4 = %x\n", ctx->GPR4); + printk ("\t R5 = %x\n", ctx->GPR5); + printk ("\t R6 = %x\n", ctx->GPR6); + printk ("\t R7 = %x\n", ctx->GPR7); + printk ("\t R8 = %x\n", ctx->GPR8); + printk ("\t R9 = %x\n", ctx->GPR9); + printk ("\t R10 = %x\n", ctx->GPR10); + printk ("\t R11 = %x\n", ctx->GPR11); + printk ("\t R12 = %x\n", ctx->GPR12); + printk ("\t R13 = %x\n", ctx->GPR13); + printk ("\t R14 = %x\n", ctx->GPR14); + printk ("\t R15 = %x\n", ctx->GPR15); + printk ("\t R16 = %x\n", ctx->GPR16); + printk ("\t R17 = %x\n", ctx->GPR17); + printk ("\t R18 = %x\n", ctx->GPR18); + printk ("\t R19 = %x\n", ctx->GPR19); + printk ("\t R20 = %x\n", ctx->GPR20); + printk ("\t R21 = %x\n", ctx->GPR21); + printk ("\t R22 = %x\n", ctx->GPR22); + printk ("\t R23 = %x\n", ctx->GPR23); + printk ("\t R24 = %x\n", ctx->GPR24); + printk ("\t R25 = %x\n", ctx->GPR25); + printk ("\t R26 = %x\n", ctx->GPR26); + printk ("\t R27 = %x\n", ctx->GPR27); + printk ("\t R28 = %x\n", ctx->GPR28); + printk ("\t R29 = %x\n", ctx->GPR29); + printk ("\t R30 = %x\n", ctx->GPR30); + printk ("\t R31 = %x\n", ctx->GPR31); + printk ("\t CR = %x\n", ctx->EXC_CR); + printk ("\t CTR = %x\n", ctx->EXC_CTR); + printk ("\t XER = %x\n", ctx->EXC_XER); + printk ("\t LR = %x\n", ctx->EXC_LR); + printk ("\t MSR = %x\n", ctx->EXC_SRR1); #endif - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'), - 0, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &continueSemId); + status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'), + 0, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, 0, &continueSemId); if (status != RTEMS_SUCCESSFUL) - rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status)); + rtems_panic ("Can't create continue semaphore: `%s'\n", + rtems_status_text (status)); PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); - - switch (ctx->_EXC_number){ - case ASM_TRACE_VECTOR : - DPRINTF((" TRACE EXCEPTION !!!\n")); + + switch (ctx->_EXC_number) { + case ASM_TRACE_VECTOR: + DPRINTF ((" TRACE EXCEPTION !!!\n")); ctx->EXC_SRR1 &= ~MSR_SE; - ExitForSingleStep-- ; - rtems_semaphore_release( wakeupEventSemId ); - break; + ExitForSingleStep--; + rtems_semaphore_release (wakeupEventSemId); + break; - case ASM_PROG_VECTOR : - DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; + case ASM_PROG_VECTOR: + DPRINTF ((" BREAKPOINT EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); + break; - case ASM_SYS_VECTOR : - DPRINTF((" ENTER RDBG !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + case ASM_SYS_VECTOR: + DPRINTF ((" ENTER RDBG !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; default: - DPRINTF((" OTHER EXCEPTION !!!\n")); -#ifdef DDEBUG - { extern void BSP_printStackTrace(); - BSP_printStackTrace(ctx); - } -#endif - rtems_semaphore_release( wakeupEventSemId ); + DPRINTF ((" OTHER EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; } - rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - + rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + PopExceptCtx (_Thread_Executing->Object.id); - rtems_semaphore_delete(continueSemId); + rtems_semaphore_delete (continueSemId); } - } - - - diff --git a/c/src/librdbg/src/powerpc/new_exception_processing/Makefile.am b/c/src/librdbg/src/powerpc/new_exception_processing/Makefile.am index 7ff7edceee..6f72c853bf 100644 --- a/c/src/librdbg/src/powerpc/new_exception_processing/Makefile.am +++ b/c/src/librdbg/src/powerpc/new_exception_processing/Makefile.am @@ -71,6 +71,8 @@ if RPCTOOLS -o powerpc/new_exception_processing/tmpSvc.c remdeb.x; \ $(AWK) -f ./awk.svc THEPROG="remdeb.h" powerpc/new_exception_processing/tmpSvc.c \ > powerpc/new_exception_processing/remdeb_svc.c; \ + $(SED) -e 's/fprintf.*,/printf(/' powerpc/new_exception_processing/remdeb_svc.c; > powerpc/new_exception_processing/remdeb_svc.tmp; \ + mv powerpc/new_exception_processing/remdeb_svc.tmp powerpc/new_exception_processing/remdeb_svc.c; \ rm -f powerpc/new_exception_processing/tmpSvc.c ) endif diff --git a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb.h b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb.h index ebbb44eaa1..07f50eed15 100644 --- a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb.h +++ b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb.h @@ -16,7 +16,7 @@ extern "C" { #define RTEMS_PORT 2071 #define RTEMS_BACK_PORT 2073 #ifndef REMDEB_H -#define RPCGENSRVNAME(a) a +#define RPCGENSRVNAME(a) a enum rpc_type { SUNRPC = 0, @@ -99,62 +99,62 @@ struct xdr_regs { typedef struct xdr_regs xdr_regs; /* now define register macros to apply to xdr_regs struct */ -#define R_PC 0 -#define R_MSR 1 -#define R_EXCEPNB 2 -#define R_R0 3 -#define R_R1 (R_R0 + 1) -#define R_R2 (R_R0 + 2) -#define R_R3 (R_R0 + 3) -#define R_R4 (R_R0 + 4) -#define R_R5 (R_R0 + 5) -#define R_R6 (R_R0 + 6) -#define R_R7 (R_R0 + 7) -#define R_R8 (R_R0 + 8) -#define R_R9 (R_R0 + 9) -#define R_R10 (R_R0 + 10) -#define R_R11 (R_R0 + 11) -#define R_R12 (R_R0 + 12) -#define R_R13 (R_R0 + 13) -#define R_R14 (R_R0 + 14) -#define R_R15 (R_R0 + 15) -#define R_R16 (R_R0 + 16) -#define R_R17 (R_R0 + 17) -#define R_R18 (R_R0 + 18) -#define R_R19 (R_R0 + 19) -#define R_R20 (R_R0 + 20) -#define R_R21 (R_R0 + 21) -#define R_R22 (R_R0 + 22) -#define R_R23 (R_R0 + 23) -#define R_R24 (R_R0 + 24) -#define R_R25 (R_R0 + 25) -#define R_R26 (R_R0 + 26) -#define R_R27 (R_R0 + 27) -#define R_R28 (R_R0 + 28) -#define R_R29 (R_R0 + 29) -#define R_R30 (R_R0 + 30) -#define R_R31 (R_R0 + 31) -#define R_CR 35 -#define R_CTR 36 -#define R_XER 37 -#define R_LR 38 -#define R_MQ 39 +#define R_PC 0 +#define R_MSR 1 +#define R_EXCEPNB 2 +#define R_R0 3 +#define R_R1 (R_R0 + 1) +#define R_R2 (R_R0 + 2) +#define R_R3 (R_R0 + 3) +#define R_R4 (R_R0 + 4) +#define R_R5 (R_R0 + 5) +#define R_R6 (R_R0 + 6) +#define R_R7 (R_R0 + 7) +#define R_R8 (R_R0 + 8) +#define R_R9 (R_R0 + 9) +#define R_R10 (R_R0 + 10) +#define R_R11 (R_R0 + 11) +#define R_R12 (R_R0 + 12) +#define R_R13 (R_R0 + 13) +#define R_R14 (R_R0 + 14) +#define R_R15 (R_R0 + 15) +#define R_R16 (R_R0 + 16) +#define R_R17 (R_R0 + 17) +#define R_R18 (R_R0 + 18) +#define R_R19 (R_R0 + 19) +#define R_R20 (R_R0 + 20) +#define R_R21 (R_R0 + 21) +#define R_R22 (R_R0 + 22) +#define R_R23 (R_R0 + 23) +#define R_R24 (R_R0 + 24) +#define R_R25 (R_R0 + 25) +#define R_R26 (R_R0 + 26) +#define R_R27 (R_R0 + 27) +#define R_R28 (R_R0 + 28) +#define R_R29 (R_R0 + 29) +#define R_R30 (R_R0 + 30) +#define R_R31 (R_R0 + 31) +#define R_CR 35 +#define R_CTR 36 +#define R_XER 37 +#define R_LR 38 +#define R_MQ 39 #include -#define REG_PC tabreg[R_PC] /* PC register offset */ -#define REG_SP tabreg[R_R1] /* SP register offset */ -#define REG_FP tabreg[R_R1] /* SP register offset (no FP on PPC) */ -#define BREAK_SIZE 4 /* Breakpoint occupies 4 bytes */ -#define BREAK_ADJ 0 /* Nothing to subtract from address after bp */ -#define IS_BREAK(l) ((l) == 0x7d8d6808) -#define SET_BREAK(l) (0x7d8d6808) +#define REG_PC tabreg[R_PC] /* PC register offset */ +#define REG_SP tabreg[R_R1] /* SP register offset */ +#define REG_FP tabreg[R_R1] /* SP register offset (no FP on PPC) */ +#define BREAK_SIZE 4 /* Breakpoint occupies 4 bytes */ +#define BREAK_ADJ 0 /* Nothing to subtract from address after bp */ +#define IS_BREAK(l) ((l) == 0x7d8d6808) +#define SET_BREAK(l) (0x7d8d6808) #define ORG_BREAK(c,p) (p) -#define IS_STEP(regs) (regs.tabreg[R_EXCEPNB] == ASM_TRACE_VECTOR) /* Was step and not break */ -#define TARGET_PROC_TYPE 3 +#define IS_STEP(regs) (regs.tabreg[R_EXCEPNB] == ASM_TRACE_VECTOR) /* Was step and not break */ +#define TARGET_PROC_TYPE 3 #define MAXDEBUGGEE 150 #define 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 @@ -250,40 +250,9 @@ typedef struct { u_int CHAR_DATA_len; char *CHAR_DATA_val; } CHAR_DATA; -#define XRY_MAX_INST_BUFF 128 -#define XRY_MAX_INSTANCES 16 -#ifndef XRY_MAX_CMD_STR -#define XRY_MAX_CMD_STR 320 -#endif /* REMDEB_H */ - -struct xry_inst { - u_char flags; - u_char type; - u_char sub_type; - u_char res_type; - u_long value; - u_long value2; -}; -typedef struct xry_inst xry_inst; - -struct instance { - struct xry_inst instances[XRY_MAX_INSTANCES]; - u_char buffer[XRY_MAX_INST_BUFF]; -}; -typedef struct instance instance; - -struct instance_union { - bool_t instances; - union { - instance inst; - char *buffer; - } instance_union_u; -}; -typedef struct instance_union instance_union; typedef char *one_arg; -#define XRY_MAX_OBJ_NAME 32 - /* now open_connex() routine which establishes a connection to server */ + /* now open_connex() routine which establishes a connection to server */ enum debug_type { DEBTYP_PROCESS = 0, @@ -292,7 +261,7 @@ enum debug_type { DEBTYP_OTHER = 3, }; typedef enum debug_type debug_type; -#define DEBUGGER_IS_GDB 0x2 /* */ +#define DEBUGGER_IS_GDB 0x2 /* */ struct open_in { u_char back_port[16]; @@ -312,7 +281,7 @@ struct open_out { u_short server_vers; }; typedef struct open_out open_out; - /* now close_connex() routine which detaches from server */ + /* now close_connex() routine which detaches from server */ enum close_control { CLOSE_IGNORE = 0, @@ -325,7 +294,7 @@ struct close_in { close_control control; }; typedef struct close_in close_in; - /* now send_signal() routine which sends signals to processes like kill(2) */ + /* now send_signal() routine which sends signals to processes like kill(2) */ struct signal_in { int pid; @@ -338,7 +307,7 @@ struct signal_out { int errNo; }; typedef struct signal_out signal_out; - /* now wait_info() routine which returns results of polling the wait status + /* 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 { @@ -373,8 +342,8 @@ struct wait_out { u_long thread; }; typedef struct wait_out wait_out; - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ + /* now ptrace() routine. This matches the Sun UNIX ptrace as well as + some additions */ #define PTRFLG_FORCE 1 #define PTRFLG_NON_OWNER 2 #define PTRFLG_FREE 4 @@ -442,7 +411,7 @@ struct get_signal_names_out { all_signals signals; }; typedef struct get_signal_names_out get_signal_names_out; - /* now define the actual calls we support */ + /* now define the actual calls we support */ #define REMDEB_H #endif @@ -508,9 +477,6 @@ extern bool_t xdr_thread_list (XDR *, thread_list*); extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in*); extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out*); extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA*); -extern bool_t xdr_xry_inst (XDR *, xry_inst*); -extern bool_t xdr_instance (XDR *, instance*); -extern bool_t xdr_instance_union (XDR *, instance_union*); extern bool_t xdr_one_arg (XDR *, one_arg*); extern bool_t xdr_debug_type (XDR *, debug_type*); extern bool_t xdr_open_in (XDR *, open_in*); @@ -547,9 +513,6 @@ extern bool_t xdr_thread_list (); extern bool_t xdr_ptrace_addr_data_in (); extern bool_t xdr_ptrace_addr_data_out (); extern bool_t xdr_CHAR_DATA (); -extern bool_t xdr_xry_inst (); -extern bool_t xdr_instance (); -extern bool_t xdr_instance_union (); extern bool_t xdr_one_arg (); extern bool_t xdr_debug_type (); extern bool_t xdr_open_in (); diff --git a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_svc.c b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_svc.c index e06aef7620..88c15cc708 100644 --- a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_svc.c +++ b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_svc.c @@ -6,7 +6,7 @@ #include #include #include -#define fprintf(fp, ...) printf(__VA_ARGS__) +#define printf(c) /*HEADER_START*/ #define RTEMS_PORT 2071 #define RTEMS_BACK_PORT 2073 @@ -14,30 +14,28 @@ * Sun request values for the remote ptrace system call */ - /* + /* * 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. */ -#ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ - /* now open_connex() routine which establishes a connection to server */ -#define DEBUGGER_IS_GDB 0x2 /* */ - /* now close_connex() routine which detaches from server */ - /* now send_signal() routine which sends signals to processes like kill(2) */ - /* now wait_info() routine which returns results of polling the wait status + /* now open_connex() routine which establishes a connection to server */ +#define DEBUGGER_IS_GDB 0x2 /* */ + /* now close_connex() routine which detaches from server */ + /* now send_signal() routine which sends signals to processes like kill(2) */ + /* 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 */ - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ - /* now define the actual calls we support */ + /* now ptrace() routine. This matches the Sun UNIX ptrace as well as + some additions */ + /* now define the actual calls we support */ 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" + "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" }; void @@ -115,7 +113,7 @@ remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp) svcerr_systemerr (transp); } if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) { - fprintf (stderr, "%s", "unable to free arguments"); + printf( "unable to free arguments"); exit (1); } return; diff --git a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_xdr.c b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_xdr.c index 45a41ae35e..defadeca19 100644 --- a/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_xdr.c +++ b/c/src/librdbg/src/powerpc/new_exception_processing/remdeb_xdr.c @@ -97,7 +97,7 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) return FALSE; return TRUE; } - /* + /* * 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 @@ -105,16 +105,16 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp) * become too small if this value gets incremented. */ bool_t xdr_xdr_mem(xdrs, objp) - XDR *xdrs; - struct xdr_mem *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)); + 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)); } bool_t @@ -262,11 +262,11 @@ xdr_KernThread (XDR *xdrs, KernThread *objp) return TRUE; } bool_t xdr_thread_list(xdrs, objp) - XDR *xdrs; - struct thread_list *objp; + XDR *xdrs; + struct thread_list *objp; { - return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread, - UTHREAD_MAX, sizeof(KernThread), xdr_KernThread)); + return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread, + UTHREAD_MAX, sizeof(KernThread), xdr_KernThread)); } bool_t @@ -386,65 +386,6 @@ xdr_CHAR_DATA (XDR *xdrs, CHAR_DATA *objp) return FALSE; return TRUE; } -#ifndef XRY_MAX_CMD_STR -#endif /* REMDEB_H */ - -bool_t -xdr_xry_inst (XDR *xdrs, xry_inst *objp) -{ - register int32_t *buf; - - if (!xdr_u_char (xdrs, &objp->flags)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->sub_type)) - return FALSE; - if (!xdr_u_char (xdrs, &objp->res_type)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value)) - return FALSE; - if (!xdr_u_long (xdrs, &objp->value2)) - return FALSE; - return TRUE; -} - -bool_t -xdr_instance (XDR *xdrs, instance *objp) -{ - register int32_t *buf; - - int i; - if (!xdr_vector (xdrs, (char *)objp->instances, XRY_MAX_INSTANCES, - sizeof (xry_inst), (xdrproc_t) xdr_xry_inst)) - return FALSE; - if (!xdr_vector (xdrs, (char *)objp->buffer, XRY_MAX_INST_BUFF, - sizeof (u_char), (xdrproc_t) xdr_u_char)) - return FALSE; - return TRUE; -} - -bool_t -xdr_instance_union (XDR *xdrs, instance_union *objp) -{ - register int32_t *buf; - - if (!xdr_bool (xdrs, &objp->instances)) - return FALSE; - switch (objp->instances) { - case TRUE: - if (!xdr_instance (xdrs, &objp->instance_union_u.inst)) - return FALSE; - break; - case FALSE: - if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR)) - return FALSE; - break; - default: - return FALSE; - } - return TRUE; -} bool_t xdr_one_arg (XDR *xdrs, one_arg *objp) @@ -455,7 +396,7 @@ xdr_one_arg (XDR *xdrs, one_arg *objp) return FALSE; return TRUE; } - /* now open_connex() routine which establishes a connection to server */ + /* now open_connex() routine which establishes a connection to server */ bool_t xdr_debug_type (XDR *xdrs, debug_type *objp) @@ -466,7 +407,7 @@ xdr_debug_type (XDR *xdrs, debug_type *objp) return FALSE; return TRUE; } -#define DEBUGGER_IS_GDB 0x2 /* */ +#define DEBUGGER_IS_GDB 0x2 /* */ bool_t xdr_open_in (XDR *xdrs, open_in *objp) @@ -573,7 +514,7 @@ xdr_open_out (XDR *xdrs, open_out *objp) return FALSE; return TRUE; } - /* now close_connex() routine which detaches from server */ + /* now close_connex() routine which detaches from server */ bool_t xdr_close_control (XDR *xdrs, close_control *objp) @@ -594,7 +535,7 @@ xdr_close_in (XDR *xdrs, close_in *objp) return FALSE; return TRUE; } - /* now send_signal() routine which sends signals to processes like kill(2) */ + /* now send_signal() routine which sends signals to processes like kill(2) */ bool_t xdr_signal_in (XDR *xdrs, signal_in *objp) @@ -619,7 +560,7 @@ xdr_signal_out (XDR *xdrs, signal_out *objp) return FALSE; return TRUE; } - /* now wait_info() routine which returns results of polling the wait status + /* 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 */ bool_t @@ -744,8 +685,8 @@ xdr_wait_out (XDR *xdrs, wait_out *objp) return FALSE; return TRUE; } - /* now ptrace() routine. This matches the Sun UNIX ptrace as well as - some additions */ + /* now ptrace() routine. This matches the Sun UNIX ptrace as well as + some additions */ bool_t xdr_ptrace_in (XDR *xdrs, ptrace_in *objp) @@ -925,4 +866,4 @@ xdr_get_signal_names_out (XDR *xdrs, get_signal_names_out *objp) return FALSE; return TRUE; } - /* now define the actual calls we support */ + /* now define the actual calls we support */ diff --git a/c/src/librdbg/src/powerpc/rdbg_f.c b/c/src/librdbg/src/powerpc/rdbg_f.c index 6149b5d426..3cdfc26579 100644 --- a/c/src/librdbg/src/powerpc/rdbg_f.c +++ b/c/src/librdbg/src/powerpc/rdbg_f.c @@ -12,109 +12,108 @@ #include #include -#include +#include #include #include -#include -#include +#include +#include #include -void -CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs) + void +CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs) { - * ((CPU_Exception_frame*) regs) = *ctx; + *((CPU_Exception_frame *) regs) = *ctx; } - - void -RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx) + void +RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx) { - *ctx = * ((CPU_Exception_frame*) regs); + *ctx = *((CPU_Exception_frame *) regs); } -void -get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { unsigned int *ptr; unsigned int i; - - ctx->EXC_SRR0 = thread->Registers.pc; - ctx->EXC_SRR1 = thread->Registers.msr; + + ctx->EXC_SRR0 = thread->Registers.pc; + ctx->EXC_SRR1 = thread->Registers.msr; ctx->_EXC_number = 0xdeadbeef; - - ctx->GPR1 = thread->Registers.gpr1; - ctx->GPR2 = thread->Registers.gpr2; + + ctx->GPR1 = thread->Registers.gpr1; + ctx->GPR2 = thread->Registers.gpr2; /* * Fill with dummy values... */ ptr = &ctx->GPR3; for (i = 0; i < 10; i++) - ptr [i] = 0xdeadbeef; - - ctx->GPR13 = thread->Registers.gpr13; - ctx->GPR14 = thread->Registers.gpr14; - ctx->GPR15 = thread->Registers.gpr15; - ctx->GPR16 = thread->Registers.gpr16; - ctx->GPR17 = thread->Registers.gpr17; - ctx->GPR18 = thread->Registers.gpr18; - ctx->GPR19 = thread->Registers.gpr19; - ctx->GPR20 = thread->Registers.gpr20; - ctx->GPR21 = thread->Registers.gpr21; - ctx->GPR22 = thread->Registers.gpr22; - ctx->GPR23 = thread->Registers.gpr23; - ctx->GPR24 = thread->Registers.gpr24; - ctx->GPR25 = thread->Registers.gpr25; - ctx->GPR26 = thread->Registers.gpr26; - ctx->GPR27 = thread->Registers.gpr27; - ctx->GPR28 = thread->Registers.gpr28; - ctx->GPR29 = thread->Registers.gpr29; - ctx->GPR30 = thread->Registers.gpr30; - ctx->GPR31 = thread->Registers.gpr31; - ctx->EXC_CR = thread->Registers.cr; - ctx->EXC_CTR = 0xdeadbeef; - ctx->EXC_XER = 0xdeadbeef; - ctx->EXC_LR = 0xdeadbeef; - ctx->EXC_MSR = 0xdeadbeef; - ctx->EXC_DAR = 0xdeadbeef; + ptr[i] = 0xdeadbeef; + + ctx->GPR13 = thread->Registers.gpr13; + ctx->GPR14 = thread->Registers.gpr14; + ctx->GPR15 = thread->Registers.gpr15; + ctx->GPR16 = thread->Registers.gpr16; + ctx->GPR17 = thread->Registers.gpr17; + ctx->GPR18 = thread->Registers.gpr18; + ctx->GPR19 = thread->Registers.gpr19; + ctx->GPR20 = thread->Registers.gpr20; + ctx->GPR21 = thread->Registers.gpr21; + ctx->GPR22 = thread->Registers.gpr22; + ctx->GPR23 = thread->Registers.gpr23; + ctx->GPR24 = thread->Registers.gpr24; + ctx->GPR25 = thread->Registers.gpr25; + ctx->GPR26 = thread->Registers.gpr26; + ctx->GPR27 = thread->Registers.gpr27; + ctx->GPR28 = thread->Registers.gpr28; + ctx->GPR29 = thread->Registers.gpr29; + ctx->GPR30 = thread->Registers.gpr30; + ctx->GPR31 = thread->Registers.gpr31; + ctx->EXC_CR = thread->Registers.cr; + ctx->EXC_CTR = 0xdeadbeef; + ctx->EXC_XER = 0xdeadbeef; + ctx->EXC_LR = 0xdeadbeef; + ctx->EXC_MSR = 0xdeadbeef; + ctx->EXC_DAR = 0xdeadbeef; } -void -set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx) + void +set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx) { - thread->Registers.gpr1 = ctx->GPR1; - thread->Registers.gpr2 = ctx->GPR2; + thread->Registers.gpr1 = ctx->GPR1; + thread->Registers.gpr2 = ctx->GPR2; - thread->Registers.gpr13 = ctx->GPR13; - thread->Registers.gpr14 = ctx->GPR14; - thread->Registers.gpr15 = ctx->GPR15; - thread->Registers.gpr16 = ctx->GPR16; - thread->Registers.gpr17 = ctx->GPR17; - thread->Registers.gpr18 = ctx->GPR18; - thread->Registers.gpr19 = ctx->GPR19; - thread->Registers.gpr20 = ctx->GPR20; - thread->Registers.gpr21 = ctx->GPR21; - thread->Registers.gpr22 = ctx->GPR22; - thread->Registers.gpr23 = ctx->GPR23; - thread->Registers.gpr24 = ctx->GPR24; - thread->Registers.gpr25 = ctx->GPR25; - thread->Registers.gpr26 = ctx->GPR26; - thread->Registers.gpr27 = ctx->GPR27; - thread->Registers.gpr28 = ctx->GPR28; - thread->Registers.gpr29 = ctx->GPR29; - thread->Registers.gpr30 = ctx->GPR30; - thread->Registers.gpr31 = ctx->GPR31; - thread->Registers.cr = ctx->EXC_CR; - thread->Registers.pc = ctx->EXC_SRR0; - thread->Registers.msr = ctx->EXC_SRR1; + thread->Registers.gpr13 = ctx->GPR13; + thread->Registers.gpr14 = ctx->GPR14; + thread->Registers.gpr15 = ctx->GPR15; + thread->Registers.gpr16 = ctx->GPR16; + thread->Registers.gpr17 = ctx->GPR17; + thread->Registers.gpr18 = ctx->GPR18; + thread->Registers.gpr19 = ctx->GPR19; + thread->Registers.gpr20 = ctx->GPR20; + thread->Registers.gpr21 = ctx->GPR21; + thread->Registers.gpr22 = ctx->GPR22; + thread->Registers.gpr23 = ctx->GPR23; + thread->Registers.gpr24 = ctx->GPR24; + thread->Registers.gpr25 = ctx->GPR25; + thread->Registers.gpr26 = ctx->GPR26; + thread->Registers.gpr27 = ctx->GPR27; + thread->Registers.gpr28 = ctx->GPR28; + thread->Registers.gpr29 = ctx->GPR29; + thread->Registers.gpr30 = ctx->GPR30; + thread->Registers.gpr31 = ctx->GPR31; + thread->Registers.cr = ctx->EXC_CR; + thread->Registers.pc = ctx->EXC_SRR0; + thread->Registers.msr = ctx->EXC_SRR1; } - - -int -Single_Step(CPU_Exception_frame* ctx) + int +Single_Step (CPU_Exception_frame * ctx) { - if ((ctx->EXC_SRR1 & MSR_SE) != 0 || ExitForSingleStep != 0) { - /* Check coherency */ + if ((ctx->EXC_SRR1 & MSR_SE) != 0 || ExitForSingleStep != 0) { + /* + * Check coherency + */ assert ((ctx->EXC_SRR1 & MSR_SE) != 0); assert (ExitForSingleStep != 0); return 0; @@ -124,33 +123,54 @@ Single_Step(CPU_Exception_frame* ctx) return 0; } - int -CheckForSingleStep (CPU_Exception_frame* ctx) + int +CheckForSingleStep (CPU_Exception_frame * ctx) { - if (ExitForSingleStep) { - /* - * This functions can be called both from - * INT1 and INT3 handlers. In case it is - * called from INT3, need to clear TF. - */ - ctx->EXC_SRR1 &= ~MSR_SE; - ExitForSingleStep = 0; - return 1; - } - return 0; + if (ExitForSingleStep) { + /* + * This functions can be called both from + * INT1 and INT3 handlers. In case it is + * called from INT3, need to clear TF. + */ + ctx->EXC_SRR1 &= ~MSR_SE; + ExitForSingleStep = 0; + return 1; + } + return 0; } -void -CancelSingleStep (CPU_Exception_frame* ctx) + void +CancelSingleStep (CPU_Exception_frame * ctx) { - /* Cancel scheduled SS */ + /* + * Cancel scheduled SS + */ ctx->EXC_SRR1 &= ~MSR_SE; - ExitForSingleStep-- ; + ExitForSingleStep--; } -cpuExcHandlerType oldExcHandler; -void connect_rdbg_exception() +static cpuExcHandlerType oldExcHandler; + + void +connect_rdbg_exception () +{ + /* + * test if rdbg already connected its exception handler + */ + if (globalExceptHdl != BreakPointExcHdl) { + oldExcHandler = globalExceptHdl; + globalExceptHdl = BreakPointExcHdl; + } +} + + void +disconnect_rdbg_exception () { - oldExcHandler = globalExceptHdl; - globalExceptHdl = BreakPointExcHdl ; + /* + * test if current execption handler is rdbg's one + * and restore the original one in this case. + */ + if (globalExceptHdl == BreakPointExcHdl) { + globalExceptHdl = oldExcHandler; + } } diff --git a/c/src/librdbg/src/ptrace.c b/c/src/librdbg/src/ptrace.c index bb6fc5a6b8..62a74d2135 100644 --- a/c/src/librdbg/src/ptrace.c +++ b/c/src/librdbg/src/ptrace.c @@ -19,52 +19,47 @@ extern rtems_id serializeSemId; extern rtems_id wakeupEventSemId; extern rtems_id eventTaskId; +extern rtems_id debugId; extern Exception_context *FirstCtx; extern Exception_context *LastCtx; extern CPU_Exception_frame SavedContext; extern unsigned int NbExceptCtx; +/* + * return a pointer to the Thread Control structure of the specified + * Id + */ - -/* -------------------------------------------------------------------- - return a pointer to the Thread Control structure of the specified - Id - -------------------------------------------------------------------- */ - -Thread_Control *Thread_Get_RDBG ( - Objects_Id Id -) + Thread_Control * +Thread_Get_RDBG (Objects_Id Id) { unsigned index; - if ( Id <_Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id && - Id >_Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) { + if (Id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id && + Id > _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) { index = Id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id; - if ( _Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index] != NULL) { - return (Thread_Control *)(_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index]); + if (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1 + index] != NULL) { + return (Thread_Control*) (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1 + index]); } } - - if ( Id <_Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id && - Id >_Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) { + + if (Id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id && + Id > _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) { index = Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id; - if ( _Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index] != NULL) - return (Thread_Control *)(_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index]); + if (_Objects_Information_table[OBJECTS_POSIX_THREADS]-> + local_table[1 + index] != NULL) + return (Thread_Control*) (_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1 + index]); } return 0; } - -/* -------------------------------------------------------------------- - Memory read - -------------------------------------------------------------------- */ - -int -safeMemRead(void *src, void *dest, int nbBytes){ + int +safeMemRead (void *src, void *dest, int nbBytes) +{ /* * safe because if it generates an exception, @@ -72,261 +67,261 @@ safeMemRead(void *src, void *dest, int nbBytes){ * TBD */ - memcpy(dest, src, nbBytes); + memcpy (dest, src, nbBytes); return 0; } -/* -------------------------------------------------------------------- - Memory write - -------------------------------------------------------------------- */ -int -safeMemWrite(void *src, void * dest, int nbBytes){ + int +safeMemWrite (void *src, void *dest, int nbBytes) +{ /* * safe because if it generates an exception, * it must return normally * TBD */ - - memcpy(dest, src, nbBytes); - return 0; + + memcpy (dest, src, nbBytes); + return 0; } -/* -------------------------------------------------------------------- - Ptrace - -------------------------------------------------------------------- */ - -int -ptrace (int request, int pid, char* addr, int data, char* addr2) - { - int diag; - errno = 0 ; - if (pid != 1) { - errno = ESRCH; - return -1; - } - switch (request) { - - case RPT_SINGLESTEP:{ - Exception_context *ctx; - - if (CannotRestart == 1){ - setErrno(EIO); - return -1; - } - - if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { - Single_Step(ctx->ctx); - rtems_semaphore_release( ctx->semaphoreId ); - return 0; - } - break; - } - - case RPT_PEEKTEXT: - case RPT_PEEKDATA: { - diag = safeMemRead(addr, &data, sizeof data); - if (diag == 0) return data; - mem_error: - return -1; - } - - case RPT_POKETEXT: { - diag = safeMemWrite(&data, addr, sizeof data); - - /* - * We must flush the INSTR and DATA cache to be sure the - * opcode modification is taken into account, because - * the breakpoint opcode is written via the data cache - * while execution code is fetched via the instruction - * cache - */ - - if (diag == 0) { - copyback_data_cache_and_invalidate_instr_cache(addr, sizeof data); - return 0; - } - goto mem_error; - } - case RPT_POKEDATA: { - diag = safeMemWrite(&data, addr, sizeof data); - if (diag == 0) return 0; - goto mem_error; - } - case RPT_CONT: { - Exception_context *ctx; - - if (CannotRestart == 1){ - setErrno (EIO); - return -1; - } - - ctx = GetExceptCtx (currentTargetThread); - - if (!isRdbgException(ctx)) { - CannotRestart = 1; - setErrno (EIO); - return -1; - } - - assert (data == 0); - assert (ExitForSingleStep == 0); - - rtems_semaphore_release( serializeSemId ); - - if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { - rtems_semaphore_release( ctx->semaphoreId ); - } - return 0; - } - - case RPT_ATTACH: - return 0; - - case RPT_DETACH:{ - Exception_context *ctx; - - if (NbExceptCtx || NbSerializedCtx) { - ctx = FirstCtx; - rtems_task_delete(eventTaskId); - rtems_semaphore_delete(serializeSemId); - rtems_semaphore_delete(wakeupEventSemId); - } - return 0; - } - - case RPT_GETREGS:{ - Exception_context *ctx; - - if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { - CtxToRegs (ctx->ctx, (xdr_regs*) addr); - return 0; - } - break; - } - - case RPT_SETREGS:{ - Exception_context *ctx; - - if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { - RegsToCtx ((xdr_regs*) addr, ctx->ctx); - return 0; - } - break; - } - - case RPT_READTEXT: - case RPT_READDATA: { - diag = safeMemRead(addr, addr2, data); - if (diag == 0) return 0; - goto mem_error; - } - case RPT_WRITETEXT: - case RPT_WRITEDATA: { - diag = safeMemWrite(addr2, addr, data); - if (diag == 0) return 0; - goto mem_error; - } - - case RPT_GETTARGETTHREAD: - if (!NbExceptCtx) { - errno = EBUSY; - return -1; - } - return currentTargetThread; - - case RPT_SETTARGETTHREAD: - if (!NbExceptCtx) { - errno = EBUSY; - return -1; - } - currentTargetThread = data; - return 0; - - case RPT_GETTHREADNAME: { - return TgtGetThreadName (NULL, (unsigned)(data), (char *) addr); - } - - case RPT_THREADLIST: { - int count = TgtThreadList (NULL, (unsigned*) addr, UTHREAD_MAX - * sizeof (unsigned)); - if (count < 0) { - errno = EINVAL; - return -1; - } - return count; - } - - case RPT_SETTHREADREGS: { - Exception_context *ctx; - CPU_Exception_frame Ectx; - Thread_Control *thread; - rtems_id id; - - rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); - if (data == (unsigned)id) - break; - - if ((ctx = GetExceptCtx (data)) != NULL) { - RegsToCtx ((xdr_regs*) addr, ctx->ctx); - return 0; - } - thread = Thread_Get_RDBG ((Objects_Id)(data)); - if (thread != NULL) { - RegsToCtx ((xdr_regs*) addr, &Ectx); - set_ctx_thread (thread, &Ectx); - return 0; - } - break; - } - - case RPT_GETTHREADREGS: { - Exception_context *ctx; - CPU_Exception_frame Ectx; - Thread_Control *thread; - rtems_id id; - - rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); - if (data == (unsigned)id){ - justSaveContext = 1; - enterRdbg(); - CtxToRegs (&(SavedContext), (xdr_regs*) addr); - return 0; - } - - if ((ctx = GetExceptCtx (data)) != NULL) { - CtxToRegs (ctx->ctx, (xdr_regs*) addr); - return 0; - } - thread = Thread_Get_RDBG ((Objects_Id)(data)); - if (thread != NULL) { - get_ctx_thread (thread, &Ectx); - CtxToRegs (&Ectx, (xdr_regs*) addr); - return 0; - } - break; - } - - case RPT_KILL: - TotalReboot = 1; - return 0; - - case RPT_TRACEME: - case RPT_PEEKUSER: - case RPT_POKEUSER: - case RPT_GETFPREGS: - case RPT_SETFPREGS: - case RPT_GETFPAREGS: - case RPT_SETFPAREGS: - case RPT_SYSCALL: - case RPT_DUMPCORE: - case RPT_GETUCODE: - case RPT_THREADSUSPEND: - case RPT_THREADRESUME: - case RPT_SETTHREADNAME: - default: - break; - } - errno = EINVAL; - return -1; + int +ptrace (int request, int pid, char *addr, int data, char *addr2) +{ + int diag; + errno = 0; + if (pid != 1) { + errno = ESRCH; + return -1; + } + switch (request) { + + case RPT_SINGLESTEP:{ + Exception_context *ctx; + + if (CannotRestart == 1) { + setErrno (EIO); + return -1; + } + + if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { + Single_Step (ctx->ctx); + rtems_semaphore_release (ctx->semaphoreId); + return 0; + } + break; + } + + case RPT_PEEKTEXT: + case RPT_PEEKDATA:{ + diag = safeMemRead (addr, &data, sizeof data); + if (diag == 0) + return data; + mem_error: + return -1; + } + + case RPT_POKETEXT:{ + diag = safeMemWrite (&data, addr, sizeof data); + + /* + * We must flush the INSTR and DATA cache to be sure the + * opcode modification is taken into account, because + * the breakpoint opcode is written via the data cache + * while execution code is fetched via the instruction + * cache + */ + + if (diag == 0) { + copyback_data_cache_and_invalidate_instr_cache (addr, sizeof data); + return 0; + } + goto mem_error; + } + case RPT_POKEDATA:{ + diag = safeMemWrite (&data, addr, sizeof data); + if (diag == 0) + return 0; + goto mem_error; + } + case RPT_CONT:{ + Exception_context *ctx; + + if (CannotRestart == 1) { + setErrno (EIO); + return -1; + } + + ctx = GetExceptCtx (currentTargetThread); + if (ctx == NULL) + ctx = GetExceptCtx (debugId); + + if (ctx != NULL) { + + if (!isRdbgException (ctx)) { + CannotRestart = 1; + setErrno (EIO); + return -1; + } + + assert (data == 0); + assert (ExitForSingleStep == 0); + + rtems_semaphore_release (ctx->semaphoreId); + } + rtems_semaphore_release (serializeSemId); + return 0; + } + + case RPT_ATTACH: + return 0; + + case RPT_DETACH:{ + Exception_context *ctx; + + if (NbExceptCtx || NbSerializedCtx) { + ctx = FirstCtx; + rtems_task_delete (eventTaskId); + rtems_semaphore_delete (serializeSemId); + rtems_semaphore_delete (wakeupEventSemId); + } + return 0; + } + + case RPT_GETREGS:{ + Exception_context *ctx; + + if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { + CtxToRegs (ctx->ctx, (xdr_regs *) addr); + return 0; + } + break; + } + + case RPT_SETREGS:{ + Exception_context *ctx; + + if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) { + RegsToCtx ((xdr_regs *) addr, ctx->ctx); + return 0; + } + break; + } + + case RPT_READTEXT: + case RPT_READDATA:{ + diag = safeMemRead (addr, addr2, data); + if (diag == 0) + return 0; + goto mem_error; + } + case RPT_WRITETEXT: + case RPT_WRITEDATA:{ + diag = safeMemWrite (addr2, addr, data); + if (diag == 0) + return 0; + goto mem_error; + } + + case RPT_GETTARGETTHREAD: + if (!NbExceptCtx) { + errno = EBUSY; + return -1; + } + return currentTargetThread; + + case RPT_SETTARGETTHREAD: + if (!NbExceptCtx) { + errno = EBUSY; + return -1; + } + currentTargetThread = data; + return 0; + + case RPT_GETTHREADNAME:{ + return TgtGetThreadName (NULL, (unsigned) (data), (char *) addr); + } + + case RPT_THREADLIST:{ + int count = TgtThreadList (NULL, (unsigned *) addr, UTHREAD_MAX + * sizeof (unsigned)); + if (count < 0) { + errno = EINVAL; + return -1; + } + return count; + } + + case RPT_SETTHREADREGS:{ + Exception_context *ctx; + CPU_Exception_frame Ectx; + Thread_Control *thread; + rtems_id id; + + rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); + if (data == (unsigned) id) + break; + + if ((ctx = GetExceptCtx (data)) != NULL) { + RegsToCtx ((xdr_regs *) addr, ctx->ctx); + return 0; + } + thread = Thread_Get_RDBG ((Objects_Id) (data)); + if (thread != NULL) { + RegsToCtx ((xdr_regs *) addr, &Ectx); + set_ctx_thread (thread, &Ectx); + return 0; + } + break; + } + + case RPT_GETTHREADREGS:{ + Exception_context *ctx; + CPU_Exception_frame Ectx; + Thread_Control *thread; + rtems_id id; + + rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); + if (data == (unsigned) id) { + justSaveContext = 1; + enterRdbg (); + CtxToRegs (&(SavedContext), (xdr_regs *) addr); + return 0; + } + + if ((ctx = GetExceptCtx (data)) != NULL) { + CtxToRegs (ctx->ctx, (xdr_regs *) addr); + return 0; + } + thread = Thread_Get_RDBG ((Objects_Id) (data)); + if (thread != NULL) { + get_ctx_thread (thread, &Ectx); + CtxToRegs (&Ectx, (xdr_regs *) addr); + return 0; + } + break; + } + + case RPT_KILL: + TotalReboot = 1; + return 0; + + case RPT_TRACEME: + case RPT_PEEKUSER: + case RPT_POKEUSER: + case RPT_GETFPREGS: + case RPT_SETFPREGS: + case RPT_GETFPAREGS: + case RPT_SETFPAREGS: + case RPT_SYSCALL: + case RPT_DUMPCORE: + case RPT_GETUCODE: + case RPT_THREADSUSPEND: + case RPT_THREADRESUME: + case RPT_SETTHREADNAME: + default: + break; + } + errno = EINVAL; + return -1; } diff --git a/c/src/librdbg/src/rdbg.c b/c/src/librdbg/src/rdbg.c index 5f08e99f5c..3dd9a52e10 100644 --- a/c/src/librdbg/src/rdbg.c +++ b/c/src/librdbg/src/rdbg.c @@ -3,7 +3,7 @@ * * Component = * - * Synopsis = rkdb/rkdb.c + * Synopsis = rdbg.c * * $Id$ * @@ -21,131 +21,128 @@ #include #include -u_short rtemsPort = RTEMS_PORT; -int BackPort = RTEMS_BACK_PORT; -int rtemsActive = 0; -SVCXPRT* rtemsXprt; -int rtemsSock; -char ActName[] = "RTEMS"; -volatile int ExitForSingleStep = 0 ; -volatile int Continue; -volatile int justSaveContext; -volatile Objects_Id currentTargetThread; -volatile int CannotRestart = 0; -volatile int TotalReboot = 0; +u_short rtemsPort = RTEMS_PORT; +int BackPort = RTEMS_BACK_PORT; +int rtemsActive = 0; +SVCXPRT *rtemsXprt; +int rtemsSock; +char taskName[] = "RTEMS rdbg daemon"; +volatile int ExitForSingleStep = 0; +volatile int Continue; +volatile int justSaveContext; +volatile Objects_Id currentTargetThread; +volatile int CannotRestart = 0; +volatile int TotalReboot = 0; int CONN_LIST_INC = 3; -int PID_LIST_INC = 1; -int TSP_RETRIES = 10; +int PID_LIST_INC = 1; +int TSP_RETRIES = 10; - -int -getId() + int +getId () { rtems_id id; - - rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); - return (int)(id) ; -} -static void -remotedeb_2_hook(struct svc_req *rqstp, register SVCXPRT *transp) -{ - connect_rdbg_exception(); /* monitor stub changes trace vector */ - remotedeb_2(rqstp, transp); - connect_rdbg_exception(); + rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id); + return (int) (id); } -static int + static int rdbgInit (void) { - int sock; - struct sockaddr_in addr; - - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (sock == -1) { - printf("%s: rkdbInit: cannot allocate socket\n", ActName); - return -1; - } - - bzero( (void *)&addr, sizeof(struct sockaddr_in)); - addr.sin_port = htons(rtemsPort); - if ((bind(sock, (struct sockaddr*) &addr, sizeof(addr))) == -1) { - printf("%s: rkdbInit: cannot bind socket\n", ActName); - return -2; - } - rtemsXprt = svcudp_create(sock); - if (svcudp_enablecache(rtemsXprt, 1) == 0) { - printf("%s: rkdbInit: cannot enable rpc cache\n", ActName); - return -3; - } - rtemsSock = sock; - if (!svc_register(rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2, 0)) { - printf(stderr, "unable to register (REMOTEDEB, REMOTEVERS, udp)."); - return -4; - } - - return 0; + int sock; + struct sockaddr_in addr; + + sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock == -1) { + printf ("%s: rdbgInit: cannot allocate socket\n", taskName); + return -1; + } + + bzero ((void *) &addr, sizeof (struct sockaddr_in)); + addr.sin_port = htons (rtemsPort); + if ((bind (sock, (struct sockaddr *) &addr, sizeof (addr))) == -1) { + printf ("%s: rdbgInit: cannot bind socket\n", taskName); + return -2; + } + rtemsXprt = svcudp_create (sock); + if (svcudp_enablecache (rtemsXprt, 1) == 0) { + printf ("%s: rdbgInit: cannot enable rpc cache\n", taskName); + return -3; + } + rtemsSock = sock; + if (!svc_register (rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2, 0)) { + printf (stderr, "unable to register (REMOTEDEB, REMOTEVERS, udp)."); + return -4; + } + connect_rdbg_exception (); + + return 0; } -rtems_task + rtems_task rdbgDaemon (rtems_task_argument argument) { - svc_run(); + svc_run (); } -void + void rtems_rdbg_initialize (void) { - rtems_name task_name; - rtems_id tid; + rtems_name task_name; + rtems_id tid; rtems_status_code status; #ifdef DDEBUG - rdb_debug = 1; /* DPRINTF now will display */ + rdb_debug = 1; /* DPRINTF now will display */ #endif - DPRINTF (("%s init starting\n", ActName)); + DPRINTF (("%s init starting\n", taskName)); - /* Print version string */ + /* + * Print version string + */ #ifdef DDEBUG - printk ("RDBG v.%d built on [%s %s]\n", SERVER_VERS, __DATE__, __TIME__); + printk ("RDBG v.%d built on [%s %s]\n", SERVER_VERS, __DATE__, __TIME__); #else - printk ("RDBG v.%d\n", SERVER_VERS); + printk ("RDBG v.%d\n", SERVER_VERS); #endif - /* Create socket and init UDP RPC server */ - if (rdbgInit() != 0) goto error; + /* + * Create socket and init UDP RPC server + */ + if (rdbgInit () != 0) + goto error; + + Continue = 1; + justSaveContext = 0; + currentTargetThread = 0; - Continue = 1; - justSaveContext = 0; - currentTargetThread = 0; - - task_name = rtems_build_name( 'R', 'D', 'B', 'G' ); - if ((status = rtems_task_create( task_name, 5, 24576, - RTEMS_INTERRUPT_LEVEL(0), - RTEMS_DEFAULT_ATTRIBUTES | RTEMS_SYSTEM_TASK - , &tid )) - != RTEMS_SUCCESSFUL){ - printf("status = %d\n",status); - rtems_panic ("Can't create task.\n"); - } + task_name = rtems_build_name ('R', 'D', 'B', 'G'); + if ((status = rtems_task_create (task_name, 5, 24576, + RTEMS_INTERRUPT_LEVEL (0), + RTEMS_DEFAULT_ATTRIBUTES | + RTEMS_SYSTEM_TASK, &tid)) + != RTEMS_SUCCESSFUL) { + printf ("status = %d\n", status); + rtems_panic ("Can't create task.\n"); + } - status = rtems_task_start(tid, rdbgDaemon, 0); + status = rtems_task_start (tid, rdbgDaemon, 0); - return; + return; error: - printf ("initialization failed.\n"); + printf ("initialization failed.\n"); } -void + void setErrno (int error) { - errno = error; + errno = error; } -int -getErrno() + int +getErrno () { - return errno; + return errno; } diff --git a/c/src/librdbg/src/remdeb.x b/c/src/librdbg/src/remdeb.x index b36ee3dcbb..3415f0e92a 100644 --- a/c/src/librdbg/src/remdeb.x +++ b/c/src/librdbg/src/remdeb.x @@ -291,43 +291,8 @@ union ptrace_addr_data_out switch (ptracereq req) { typedef opaque CHAR_DATA ; /* variable sized data */ -const XRY_MAX_INST_BUFF = 128; -const XRY_MAX_INSTANCES = 16; -%#ifndef XRY_MAX_CMD_STR -const XRY_MAX_CMD_STR = 320; /* XRY_MAX_INST_BUFF+(XRY_MAX_INSTANCES*12) */ -%#endif /* REMDEB_H */ - - -struct xry_inst -{ - unsigned char flags; /* value2 interp, etc. INFL_xxx */ - unsigned char type; /* base type of data (str, val, etc) INST_xxx */ - unsigned char sub_type; /* specific type (task, res, etc). This is - set and defined by the user defined instance - processor and not the auto-processor */ - unsigned char res_type; - u_long value; /* pointer to value or value itself */ - u_long value2; /* second value (optional - based on flags) */ -}; - -struct instance -{ - struct xry_inst instances[XRY_MAX_INSTANCES]; - unsigned char buffer[XRY_MAX_INST_BUFF]; -}; - -union instance_union switch (bool instances) -{ - case TRUE: - instance inst; - case FALSE: - string buffer ; -}; - typedef string one_arg ; -const XRY_MAX_OBJ_NAME = 32; /* objname in some commands */ - % /* now open_connex() routine which establishes a connection to server */ enum debug_type diff --git a/c/src/librdbg/src/servbkpt.c b/c/src/librdbg/src/servbkpt.c index f6c76bb494..dce1b4fdf3 100644 --- a/c/src/librdbg/src/servbkpt.c +++ b/c/src/librdbg/src/servbkpt.c @@ -12,14 +12,14 @@ */ #include -#include +#include #include #include /*----- Macros -----*/ #define BKPT0(plst) ((BASE_BREAK*)(plst)->break_list) -#define BKPT_INCR 5 /* how many bkpt slots alloc at a time */ +#define BKPT_INCR 5 /* how many bkpt slots alloc at a time */ #define BKPT_OVER(plst,idx,addr,size) \ ((plst)->break_list[idx].ee_loc + BREAK_SIZE > (UINT32) (addr) \ @@ -29,7 +29,6 @@ (sizeof ((xdr_break*) 0)->thread_list / \ sizeof ((xdr_break*) 0)->thread_list [0]) - /* * BreakAlloc - alloc a breakpoint entry. * @@ -38,45 +37,51 @@ * created. It returns -1 if failed. */ - static int -BreakAlloc (PID_LIST* plst, Boolean normal) + static int +BreakAlloc (PID_LIST * plst, Boolean normal) { - int idx, len; - xdr_break* blst; - - if (!normal) { /* want 0 entry */ - if (plst->break_list) { - return(0); /* already there */ - } - idx = 1; /* force alloc below */ - } else { - for (idx = 1; idx < (int)plst->break_alloc; idx++) { - if (plst->break_list[idx].type == BRKT_NONE) { - /* got a free one */ - memset(&plst->break_list[idx], 0, sizeof(xdr_break)); - return(idx); /* found one */ - } - } + int idx, len; + xdr_break *blst; + + if (!normal) { /* want 0 entry */ + if (plst->break_list) { + return (0); /* already there */ + } + idx = 1; /* force alloc below */ + } else { + for (idx = 1; idx < (int) plst->break_alloc; idx++) { + if (plst->break_list[idx].type == BRKT_NONE) { + /* + * got a free one + */ + memset (&plst->break_list[idx], 0, sizeof (xdr_break)); + return (idx); /* found one */ + } + } + } + /* + * idx is the requested entry + */ + + if (idx >= (int) plst->break_alloc) { /* need more space */ + len = plst->break_alloc + BKPT_INCR; + blst = (xdr_break *) Realloc (plst->break_list, len * sizeof (xdr_break)); + if (!blst) { + return (-1); /* failed, no space */ } - /* idx is the requested entry */ - - if (idx >= (int)plst->break_alloc) { /* need more space */ - len = plst->break_alloc + BKPT_INCR; - blst = (xdr_break*)Realloc(plst->break_list, len*sizeof(xdr_break)); - if (!blst) { - return(-1); /* failed, no space */ - } - plst->break_alloc = len; /* got more */ - plst->break_list = blst; - - /* Clear new space */ - memset(blst + len - BKPT_INCR, 0, BKPT_INCR * sizeof(xdr_break)); - idx = len - BKPT_INCR; /* next available */ - if (!idx) { - idx = 1; /* for normal cases */ - } + plst->break_alloc = len; /* got more */ + plst->break_list = blst; + + /* + * Clear new space + */ + memset (blst + len - BKPT_INCR, 0, BKPT_INCR * sizeof (xdr_break)); + idx = len - BKPT_INCR; /* next available */ + if (!idx) { + idx = 1; /* for normal cases */ } - return(normal ? idx : 0); /* return it */ + } + return (normal ? idx : 0); /* return it */ } /* @@ -86,237 +91,259 @@ BreakAlloc (PID_LIST* plst, Boolean normal) */ #ifdef DDEBUG -static const char* BreakTypes[] = { - "NONE", "INSTR", "READ", "WRITE", - "ACCESS", "EXEC", "OS_CALL", "OS_SWITCH", - "STEPEMUL" +static const char *BreakTypes[] = { + "NONE", "INSTR", "READ", "WRITE", + "ACCESS", "EXEC", "OS_CALL", "OS_SWITCH", + "STEPEMUL" }; #define BN_MAX (sizeof BreakTypes / sizeof BreakTypes[0]) #define BREAK_NAME(t) ((unsigned) (t) < BN_MAX ? BreakTypes[t] : "???") #endif - int -BreakSet (PID_LIST* plst, int conn_idx, xdr_break* bkpt) + int +BreakSet (PID_LIST * plst, int conn_idx, xdr_break * bkpt) { - int pid = plst->pid; - int type = bkpt->type; - void* addr = (void *) bkpt->ee_loc; - int idx; - int data; - - DPRINTF(("BreakSet: type %d (%s) at 0x%x th %d ee_type %d len %d " - "pass %d curr %d list %d %d %d %d\n", type, BREAK_NAME(type), - (int) addr, - bkpt->thread_spec, bkpt->ee_type, bkpt->length, bkpt->pass_count, - bkpt->curr_pass, bkpt->thread_list [0], bkpt->thread_list [1], - bkpt->thread_list [2], bkpt->thread_list [3])); - - idx = BreakAlloc(plst, True); /* get entry */ - if (idx < 0) { /* no memory */ - setErrno(ENOMEM); /* set for safety */ - return -1; /* return the error */ - } - - data = TgtPtrace(RPT_PEEKTEXT, pid, addr, 0, NULL); /* current */ - if (getErrno()) { - return -1; /* failed, return the error */ + int pid = plst->pid; + int type = bkpt->type; + void *addr = (void *) bkpt->ee_loc; + int idx; + int data; + + DPRINTF (("BreakSet: type %d (%s) at 0x%x th %d ee_type %d len %d " + "pass %d curr %d list %d %d %d %d\n", type, BREAK_NAME (type), + (int) addr, + bkpt->thread_spec, bkpt->ee_type, bkpt->length, bkpt->pass_count, + bkpt->curr_pass, bkpt->thread_list[0], bkpt->thread_list[1], + bkpt->thread_list[2], bkpt->thread_list[3])); + + idx = BreakAlloc (plst, True); /* get entry */ + if (idx < 0) { /* no memory */ + setErrno (ENOMEM); /* set for safety */ + return -1; /* return the error */ + } + + data = TgtPtrace (RPT_PEEKTEXT, pid, addr, 0, NULL); /* current */ + if (getErrno ()) { + return -1; /* failed, return the error */ + } + if (IS_BREAK (data)) { /* There is already a break here */ + DPRINTF (("BreakSet: already have soft bkpt at %x\n", addr)); + if (type == BRKT_STEPEMUL) { + ++BKPT0 (plst)->pad1; + return 1; /* Any non-error value is OK */ } - if (IS_BREAK(data)) { /* There is already a break here */ - DPRINTF(("BreakSet: already have soft bkpt at %x\n", addr)); - if (type == BRKT_STEPEMUL) { - ++BKPT0 (plst)->pad1; - return 1; /* Any non-error value is OK */ - } - setErrno(EBUSY); - return -1; - } - - TgtPtrace(RPT_POKETEXT, pid, addr, SET_BREAK(data), NULL); - - if (getErrno()) { - return -1; - } - - plst->break_list[idx] = *bkpt; - plst->break_list[idx].ee_type = data; /* saved data */ - - /* Inform other owners */ - if (type != BRKT_STEPEMUL) { - TgtNotifyAll (plst - pid_list, BMSG_BREAK, 1 /*added*/, idx, - conn_idx, False); - } else { - ++BKPT0 (plst)->pad1; - } - /* Return the number */ - setErrno(0); /* Just in case */ - return idx; + setErrno (EBUSY); + return -1; + } + + TgtPtrace (RPT_POKETEXT, pid, addr, SET_BREAK (data), NULL); + + if (getErrno ()) { + return -1; + } + + plst->break_list[idx] = *bkpt; + plst->break_list[idx].ee_type = data; /* saved data */ + + /* + * Inform other owners + */ + if (type != BRKT_STEPEMUL) { + TgtNotifyAll (plst - pid_list, BMSG_BREAK, 1 /*added */ , idx, + conn_idx, False); + } else { + ++BKPT0 (plst)->pad1; + } + /* + * Return the number + */ + setErrno (0); /* Just in case */ + return idx; } - int -BreakSetAt (PID_LIST* plst, int conn_idx, unsigned long addr, break_type type) + int +BreakSetAt (PID_LIST * plst, int conn_idx, unsigned long addr, + break_type type) { - xdr_break xb; + xdr_break xb; - memset (&xb, 0, sizeof xb); - xb.type = type; - xb.ee_loc = addr; - return BreakSet (plst, conn_idx, &xb); + memset (&xb, 0, sizeof xb); + xb.type = type; + xb.ee_loc = addr; + return BreakSet (plst, conn_idx, &xb); } /*----- Find a breakpoint by address -----*/ - int -BreakGetIndex(PID_LIST* plst, void* addr) + int +BreakGetIndex (PID_LIST * plst, void *addr) { - int idx; - int data = -1; - - if (!plst->break_alloc) { - setErrno(EFAULT); - return -1; - } - for (idx = 1; idx < (int)plst->break_alloc; idx++) { - if ((u_long) addr == plst->break_list [idx].ee_loc) { - data = idx; - break; - } + int idx; + int data = -1; + + if (!plst->break_alloc) { + setErrno (EFAULT); + return -1; + } + for (idx = 1; idx < (int) plst->break_alloc; idx++) { + if ((u_long) addr == plst->break_list[idx].ee_loc) { + data = idx; + break; } - return data; + } + return data; } /*----- Getting information about breakpoint -----*/ /* - * If data > 0, fill "bkpt" with information about breakpoint + * If data > 0, fill "bkpt" with information about breakpoint * and return the number of the next one. * If data == 0, return the count of breakpoints. */ - int -BreakGet (const PID_LIST* plst, int data, xdr_break* bkpt) + int +BreakGet (const PID_LIST * plst, int data, xdr_break * bkpt) { - int idx; - - if (!data) { /* just count them */ - for (idx = 1; idx < (int)plst->break_alloc; idx++) { - if (plst->break_list[idx].type != BRKT_NONE) { - data++; - } - } - return data; /* count */ - } - if ((unsigned) data >= plst->break_alloc) { - /* out of range */ - setErrno(EFAULT); /* closest match */ - return -1; + int idx; + + if (!data) { /* just count them */ + for (idx = 1; idx < (int) plst->break_alloc; idx++) { + if (plst->break_list[idx].type != BRKT_NONE) { + data++; + } } - /* get it and say which is next */ - *bkpt = plst->break_list[data]; - for (idx = (int)data+1; idx < (int)plst->break_alloc; idx++) { - if (plst->break_list[idx].type != BRKT_NONE) { - return idx; - } + return data; /* count */ + } + if ((unsigned) data >= plst->break_alloc) { + /* + * out of range + */ + setErrno (EFAULT); /* closest match */ + return -1; + } + /* + * get it and say which is next + */ + *bkpt = plst->break_list[data]; + for (idx = (int) data + 1; idx < (int) plst->break_alloc; idx++) { + if (plst->break_list[idx].type != BRKT_NONE) { + return idx; } - return 0; /* otherwise returns 0 for no more */ + } + return 0; /* otherwise returns 0 for no more */ } /*----- Clearing bkpts -----*/ /* - * BreakClear - clear one (if data != 0) or all breakpoints + * BreakClear - clear one (if data != 0) or all breakpoints * (if data == 0). Return the number of bkpts cleared. * If (data == -1), remove step-emulation breakpoints. */ - int -BreakClear (PID_LIST* plst, int conn_idx, int data) + int +BreakClear (PID_LIST * plst, int conn_idx, int data) { - int pid_idx = plst - pid_list; - int idx; - int cleared = 0; - int clearStepEmul = 0; - int terminated = PROC_TERMINATED (plst); - int stepEmulCount = 0; - - /* break handle in data */ - if (!plst->break_alloc) { /* there are no breaks */ - DPRINTF (("BreakClear: no bkpts defined.\n")); - setErrno(EFAULT); /* closest match */ - return -1; /* return error */ - } - if (!data) { /* clear all */ - idx = 1; - data = plst->break_alloc-1; - - /* Inform other owners */ - DPRINTF (("BreakClear: clearing all bkpts.\n")); - TgtNotifyAll (pid_idx, BMSG_BREAK, 0 /*clr*/, 0, conn_idx, False); - - } else if (data == -1) { /* clear all step-emul bkpts */ - DPRINTF(("BreakClear: removing %d step-emul bkpts\n", - BKPT0 (plst)->pad1)); - - stepEmulCount = BKPT0 (plst)->pad1; - BKPT0 (plst)->pad1 = 0; - - clearStepEmul = 1; - idx = 1; - data = plst->break_alloc-1; - } else if ((unsigned) data >= plst->break_alloc - || plst->break_list[data].type == BRKT_NONE) { - - /* out of range */ - DPRINTF (("BreakClear: invalid bkpt %d\n", data)); - setErrno(EFAULT); /* closest match */ - return -1; /* return error */ - } else { - idx = data; - /* Inform other owners */ - TgtNotifyAll (pid_idx, BMSG_BREAK, 0 /*clr*/, idx, conn_idx, False); - DPRINTF (("BreakClear: clearing bkpt %d\n", data)); - } + int pid_idx = plst - pid_list; + int idx; + int cleared = 0; + int clearStepEmul = 0; + int terminated = PROC_TERMINATED (plst); + int stepEmulCount = 0; + + /* + * break handle in data + */ + if (!plst->break_alloc) { /* there are no breaks */ + DPRINTF (("BreakClear: no bkpts defined.\n")); + setErrno (EFAULT); /* closest match */ + return -1; /* return error */ + } + if (!data) { /* clear all */ + idx = 1; + data = plst->break_alloc - 1; - for (; idx <= data; idx++) { /* clear each one */ - int type = plst->break_list[idx].type; - - if (clearStepEmul && type != BRKT_STEPEMUL) continue; - - if (type == BRKT_INSTR || (clearStepEmul && type == BRKT_STEPEMUL)) { - /* just patch back */ - char* addr = (char *)plst->break_list[idx].ee_loc; - int val; - - if (BKPT0 (plst)->clr_step && BKPT0 (plst)->last_break == idx) { - BKPT0 (plst)->clr_step = 0; /* not needed */ - } - /* Neighboring bytes can have breakpoints too... */ - if (! terminated) { - setErrno (0); - val = TgtPtrace(RPT_PEEKTEXT, plst->pid, addr, 0, NULL); - if (getErrno()) { - DPRINTF (("BreakClear: addr %x not readable!\n", addr)); - setErrno (0); /* Forget bkpt */ - } else { - assert (IS_BREAK (val)); - val = ORG_BREAK (val, (int)plst->break_list[idx].ee_type); - TgtPtrace(RPT_POKETEXT, plst->pid, addr, val, NULL); - if (getErrno()) { - DPRINTF (("BreakClear: addr %x not writable!\n", addr)); - setErrno (0); - } - } - } - ++cleared; /* indicate cleared */ - } - memset(&plst->break_list[idx], 0, sizeof(xdr_break)); - } - assert (!clearStepEmul || cleared <= stepEmulCount); - if (stepEmulCount && cleared == 0) { - DPRINTF (("BreakClear: all STEPEMUL bkpts were shared\n")); - return 1; + /* + * Inform other owners + */ + DPRINTF (("BreakClear: clearing all bkpts.\n")); + TgtNotifyAll (pid_idx, BMSG_BREAK, 0 /*clr */ , 0, conn_idx, False); + + } else if (data == -1) { /* clear all step-emul bkpts */ + DPRINTF (("BreakClear: removing %d step-emul bkpts\n", + BKPT0 (plst)->pad1)); + + stepEmulCount = BKPT0 (plst)->pad1; + BKPT0 (plst)->pad1 = 0; + + clearStepEmul = 1; + idx = 1; + data = plst->break_alloc - 1; + } else if ((unsigned) data >= plst->break_alloc + || plst->break_list[data].type == BRKT_NONE) { + + /* + * out of range + */ + DPRINTF (("BreakClear: invalid bkpt %d\n", data)); + setErrno (EFAULT); /* closest match */ + return -1; /* return error */ + } else { + idx = data; + /* + * Inform other owners + */ + TgtNotifyAll (pid_idx, BMSG_BREAK, 0 /*clr */ , idx, conn_idx, False); + DPRINTF (("BreakClear: clearing bkpt %d\n", data)); + } + + for (; idx <= data; idx++) { /* clear each one */ + int type = plst->break_list[idx].type; + + if (clearStepEmul && type != BRKT_STEPEMUL) + continue; + + if (type == BRKT_INSTR || (clearStepEmul && type == BRKT_STEPEMUL)) { + /* + * just patch back + */ + char *addr = (char *) plst->break_list[idx].ee_loc; + int val; + + if (BKPT0 (plst)->clr_step && BKPT0 (plst)->last_break == idx) { + BKPT0 (plst)->clr_step = 0; /* not needed */ + } + /* + * Neighboring bytes can have breakpoints too... + */ + if (!terminated) { + setErrno (0); + val = TgtPtrace (RPT_PEEKTEXT, plst->pid, addr, 0, NULL); + if (getErrno ()) { + DPRINTF (("BreakClear: addr %x not readable!\n", addr)); + setErrno (0); /* Forget bkpt */ + } else { + assert (IS_BREAK (val)); + val = ORG_BREAK (val, (int) plst->break_list[idx].ee_type); + TgtPtrace (RPT_POKETEXT, plst->pid, addr, val, NULL); + if (getErrno ()) { + DPRINTF (("BreakClear: addr %x not writable!\n", addr)); + setErrno (0); + } + } + } + ++cleared; /* indicate cleared */ } - return cleared; + memset (&plst->break_list[idx], 0, sizeof (xdr_break)); + } + assert (!clearStepEmul || cleared <= stepEmulCount); + if (stepEmulCount && cleared == 0) { + DPRINTF (("BreakClear: all STEPEMUL bkpts were shared\n")); + return 1; + } + return cleared; } /*----- Hiding of breakpoints -----*/ @@ -329,70 +356,84 @@ BreakClear (PID_LIST* plst, int conn_idx, int data) * buffer from a ptrace read/peek. */ - static void -PatchBreak (char* buff, UINT32 bstart, int bsize, UINT32 dstart, char* dvalue) + static void +PatchBreak (char *buff, UINT32 bstart, int bsize, UINT32 dstart, char *dvalue) { - int size = BREAK_SIZE; /* default size */ - - /* Must deal with all sorts of unalignments - * (3 full overlaps, 3 unaligns) - */ - if (bsize < BREAK_SIZE) { - /* case where buffer is smaller than data */ - memcpy(buff, dvalue+(bstart-dstart), bsize); /* copy over */ - return; - } - /* buffer larger than data. - * we need to see where break fits in buffer and whether - * we have part of it off the end. We set bstart to be the - * buffer offset, dtart to be the break data offset, and - * size to be the amount to copy - */ - if (dstart < bstart) { - /* break before actual buffer */ - dstart = bstart-dstart; /* offset in data */ - size -= dstart; /* amount to copy */ - bstart = 0; /* offset in buffer */ - - } else if (dstart + size > bstart + bsize) { - /* off end */ - bstart += bsize; /* end of buffer */ - size -= (dstart + size) - bstart; - bstart = bsize - size; /* come back into buffer enough */ - dstart = 0; /* start of data */ - - } else { /* normal case */ - bstart = dstart - bstart; /* offset in buffer */ - dstart = 0; - } - memcpy(buff+bstart, dvalue+dstart, size); + int size = BREAK_SIZE; /* default size */ + + /* + * Must deal with all sorts of unalignments + * * (3 full overlaps, 3 unaligns) + */ + if (bsize < BREAK_SIZE) { + /* + * case where buffer is smaller than data + */ + memcpy (buff, dvalue + (bstart - dstart), bsize); /* copy over */ + return; + } + /* + * buffer larger than data. + * * we need to see where break fits in buffer and whether + * * we have part of it off the end. We set bstart to be the + * * buffer offset, dtart to be the break data offset, and + * * size to be the amount to copy + */ + if (dstart < bstart) { + /* + * break before actual buffer + */ + dstart = bstart - dstart; /* offset in data */ + size -= dstart; /* amount to copy */ + bstart = 0; /* offset in buffer */ + + } else if (dstart + size > bstart + bsize) { + /* + * off end + */ + bstart += bsize; /* end of buffer */ + size -= (dstart + size) - bstart; + bstart = bsize - size; /* come back into buffer enough */ + dstart = 0; /* start of data */ + + } else { /* normal case */ + bstart = dstart - bstart; /* offset in buffer */ + dstart = 0; + } + memcpy (buff + bstart, dvalue + dstart, size); } - void -BreakHide (const PID_LIST* plst, void* addr, int data, void* addr2) + void +BreakHide (const PID_LIST * plst, void *addr, int data, void *addr2) { - int idx; - - if (!plst->break_list) /* no breaks exist, so skip this */ - return; + int idx; - /* if breakpoints, replace */ + if (!plst->break_list) /* no breaks exist, so skip this */ + return; - for (idx = 1; idx < (int)plst->break_alloc; idx++) { - int type = plst->break_list[idx].type; + /* + * if breakpoints, replace + */ - if (type != BRKT_INSTR && type != BRKT_STEPEMUL) { - continue; - } - /* break, see if overlaps */ - if (BKPT_OVER (plst, idx, addr, data)) { + for (idx = 1; idx < (int) plst->break_alloc; idx++) { + int type = plst->break_list[idx].type; - /* overlaps, patch in old value */ - PatchBreak((char *)addr2, (UINT32)addr, data, - plst->break_list[idx].ee_loc, - (char *)&plst->break_list[idx].ee_type); - } + if (type != BRKT_INSTR && type != BRKT_STEPEMUL) { + continue; + } + /* + * break, see if overlaps + */ + if (BKPT_OVER (plst, idx, addr, data)) { + + /* + * overlaps, patch in old value + */ + PatchBreak ((char *) addr2, (UINT32) addr, data, + plst->break_list[idx].ee_loc, + (char *) &plst->break_list[idx].ee_type); } + } } /*----- Checking of breakpoint overwrites -----*/ @@ -402,27 +443,29 @@ BreakHide (const PID_LIST* plst, void* addr, int data, void* addr2) * having software breakpoints. */ - int -BreakOverwrite (const PID_LIST* plst, const char* addr, unsigned int size) + int +BreakOverwrite (const PID_LIST * plst, const char *addr, unsigned int size) { - int idx; + int idx; - if (!plst->break_list) { /* No breaks exist */ - return 0; - } + if (!plst->break_list) { /* No breaks exist */ + return 0; + } - for (idx = 1; idx < (int)plst->break_alloc; idx++) { - int type = plst->break_list[idx].type; + for (idx = 1; idx < (int) plst->break_alloc; idx++) { + int type = plst->break_list[idx].type; - /* Consider only breakpoints involving modified memory */ - if (type != BRKT_INSTR && type != BRKT_STEPEMUL) { - continue; - } - if (BKPT_OVER (plst, idx, addr, size)) { - return -1; /* overlaps */ - } + /* + * Consider only breakpoints involving modified memory + */ + if (type != BRKT_INSTR && type != BRKT_STEPEMUL) { + continue; } - return 0; + if (BKPT_OVER (plst, idx, addr, size)) { + return -1; /* overlaps */ + } + } + return 0; } /*----- Execution support -----*/ @@ -433,19 +476,21 @@ BreakOverwrite (const PID_LIST* plst, const char* addr, unsigned int size) * Range is saved in breakpoint 0. */ - int -BreakStepRange (PID_LIST* plst, void* addr, int len) + int +BreakStepRange (PID_LIST * plst, void *addr, int len) { - if (!plst->break_list) { - /* get list */ - if (BreakAlloc (plst, False) == -1) { /* must not be any memory */ - setErrno(ENOMEM); /* to be safe */ - return -1; /* fails */ - } + if (!plst->break_list) { + /* + * get list + */ + if (BreakAlloc (plst, False) == -1) { /* must not be any memory */ + setErrno (ENOMEM); /* to be safe */ + return -1; /* fails */ } - BKPT0 (plst)->range_start = (UINT32)addr; - BKPT0 (plst)->range_end = (UINT32)addr+(len-1); - return 0; + } + BKPT0 (plst)->range_start = (UINT32) addr; + BKPT0 (plst)->range_end = (UINT32) addr + (len - 1); + return 0; } /* @@ -453,137 +498,147 @@ BreakStepRange (PID_LIST* plst, void* addr, int len) * current breakpoint has not been reached yet. */ - void -BreakPcChanged (PID_LIST* plst) + void +BreakPcChanged (PID_LIST * plst) { - if (plst->break_list) { - /* clear break stuff */ - BKPT0 (plst)->clr_step = False; - } + if (plst->break_list) { + /* + * clear break stuff + */ + BKPT0 (plst)->clr_step = False; + } } /* * BreakStepOff - prepare stepping off a breakpoint. */ - int -BreakStepOff (const PID_LIST* plst, void** paddr2) + int +BreakStepOff (const PID_LIST * plst, void **paddr2) { - if (plst->break_list && BKPT0 (plst)->clr_step) { + if (plst->break_list && BKPT0 (plst)->clr_step) { - /* need clear then step off break */ - int last = BKPT0 (plst)->last_break; + /* + * need clear then step off break + */ + int last = BKPT0 (plst)->last_break; - /* clear break, step, then do exec */ + /* + * clear break, step, then do exec + */ - *paddr2 = (void*) plst->break_list[last].ee_type; + *paddr2 = (void *) plst->break_list[last].ee_type; - /* Need to clr_step after TgtPtrace() when wait() returns */ - return 1; - } - return 0; + /* + * Need to clr_step after TgtPtrace() when wait() returns + */ + return 1; + } + return 0; } /* - * BreakSteppedOff - check if just stepped off a breakpoint + * BreakSteppedOff - check if just stepped off a breakpoint * and re-insert it into the code. */ - void -BreakSteppedOff (PID_LIST* plst) + void +BreakSteppedOff (PID_LIST * plst) { - if (plst->break_list && BKPT0 (plst)->clr_step) { - int idx = BKPT0 (plst)->last_break; - int data; - - BKPT0 (plst)->clr_step = 0; - - /* - * Re-insert the breakpoint. - */ - data = TgtPtrace (RPT_PEEKTEXT, plst->pid, - (char *)plst->break_list [idx].ee_loc, 0, NULL); - assert (! IS_BREAK (data)); - TgtPtrace (RPT_POKETEXT, plst->pid, - (char *)plst->break_list[idx].ee_loc, - (int) SET_BREAK (data), NULL); - } -} + if (plst->break_list && BKPT0 (plst)->clr_step) { + int idx = BKPT0 (plst)->last_break; + int data; + BKPT0 (plst)->clr_step = 0; + + /* + * Re-insert the breakpoint. + */ + data = TgtPtrace (RPT_PEEKTEXT, plst->pid, + (char *) plst->break_list[idx].ee_loc, 0, NULL); + assert (!IS_BREAK (data)); + TgtPtrace (RPT_POKETEXT, plst->pid, + (char *) plst->break_list[idx].ee_loc, + (int) SET_BREAK (data), NULL); + } +} /* * Returns whether a thread matches a breakpoint. */ - static int -BreakThreadMatch (xdr_break* xb, int thread) + static int +BreakThreadMatch (xdr_break * xb, int thread) { - int slot; + int slot; - if (thread < 0) return 1; /* Break existence check only */ + if (thread < 0) + return 1; /* Break existence check only */ - if (xb->thread_list [0] == 0) return 1; /* Universal break */ + if (xb->thread_list[0] == 0) + return 1; /* Universal break */ - for (slot = 0; slot < BKPT_SLOTS; ++slot) { - if (xb->thread_list [slot] == 0) return 0; /* End of list */ - if (xb->thread_list [slot] == thread) return 1; /* Match */ - } - return 0; /* No matches found */ + for (slot = 0; slot < BKPT_SLOTS; ++slot) { + if (xb->thread_list[slot] == 0) + return 0; /* End of list */ + if (xb->thread_list[slot] == thread) + return 1; /* Match */ + } + return 0; /* No matches found */ } - -int -BreakAdjustPC (PID_LIST* plst) + int +BreakAdjustPC (PID_LIST * plst) { - /* - * BREAK_ADJ is the value by which the Program Counter - * has to be decremented after a software breakpoint - * is hit. It must be defined and can be zero. - */ + /* + * BREAK_ADJ is the value by which the Program Counter + * has to be decremented after a software breakpoint + * is hit. It must be defined and can be zero. + */ #if BREAK_ADJ - /* subtract back if necessary */ - plst->regs.REG_PC -= BREAK_ADJ; /* now write back */ - TgtPtrace(RPT_SETREGS, plst->pid, (char *)&plst->regs, 0, NULL); + /* + * subtract back if necessary + */ + plst->regs.REG_PC -= BREAK_ADJ; /* now write back */ + TgtPtrace (RPT_SETREGS, plst->pid, (char *) &plst->regs, 0, NULL); #else - (void) plst; + (void) plst; #endif - return 0; + return 0; } - /* * Identify the current breakpoint. The process just stopped. */ - int -BreakIdentify (PID_LIST* plst, int adjust, int thread) + int +BreakIdentify (PID_LIST * plst, int adjust, int thread) { - int foreignBkpt = 0; - int bidx; - - for (bidx = 1; bidx < (int) plst->break_alloc; bidx++) { - int type = plst->break_list[bidx].type; - - if ((type == BRKT_INSTR || type == BRKT_STEPEMUL) - && plst->regs.REG_PC - BREAK_ADJ - == plst->break_list[bidx].ee_loc) { /* found matching */ - if (!BreakThreadMatch (&plst->break_list[bidx], thread)) { - if (foreignBkpt == 0) { - foreignBkpt = bidx; - } - continue; - } - if (adjust) { - BreakAdjustPC (plst); - } - return bidx; - } + int foreignBkpt = 0; + int bidx; + + for (bidx = 1; bidx < (int) plst->break_alloc; bidx++) { + int type = plst->break_list[bidx].type; + + if ((type == BRKT_INSTR || type == BRKT_STEPEMUL) + && plst->regs.REG_PC - BREAK_ADJ == plst->break_list[bidx].ee_loc) { /* found matching */ + if (!BreakThreadMatch (&plst->break_list[bidx], thread)) { + if (foreignBkpt == 0) { + foreignBkpt = bidx; + } + continue; + } + if (adjust) { + BreakAdjustPC (plst); + } + return bidx; } - if (foreignBkpt) { - if (adjust) { - BreakAdjustPC (plst); - } - return -foreignBkpt; + } + if (foreignBkpt) { + if (adjust) { + BreakAdjustPC (plst); } - return 0; + return -foreignBkpt; + } + return 0; } diff --git a/c/src/librdbg/src/servcon.c b/c/src/librdbg/src/servcon.c index 30570760db..4660453f94 100644 --- a/c/src/librdbg/src/servcon.c +++ b/c/src/librdbg/src/servcon.c @@ -11,10 +11,10 @@ ************************************************************************** */ -#include -#include -#include - +#include +#include +#include + /* * ConnCreate - create a new connection entry for a client. * @@ -25,66 +25,74 @@ * the caller. */ - int -ConnCreate (struct svc_req* rqstp, open_in* in) + int +ConnCreate (struct svc_req *rqstp, open_in * in) { - NET_OPAQUE sender; - int idx; - CONN_LIST* clst; - - setErrno (0); - - /* Convert to valid Net address */ - if (! TspTranslateRpcAddr (rqstp, &sender)) { - DPRINTF (("ConnCreate: TspTranslateRpcAddr failed\n")); - return -1; - } - if (! TspValidateAddr ((NET_OPAQUE*) in->back_port, &sender)) { - DPRINTF (("ConnCreate: TspValidateAddr failed\n")); - return -1; /* errno now setup with error */ + NET_OPAQUE sender; + int idx; + CONN_LIST *clst; + + setErrno (0); + + /* + * Convert to valid Net address + */ + if (!TspTranslateRpcAddr (rqstp, &sender)) { + DPRINTF (("ConnCreate: TspTranslateRpcAddr failed\n")); + return -1; + } + if (!TspValidateAddr ((NET_OPAQUE *) in->back_port, &sender)) { + DPRINTF (("ConnCreate: TspValidateAddr failed\n")); + return -1; /* errno now setup with error */ + } + + /* + * look for an empty connection entry + */ + for (idx = 0; idx < conn_list_cnt; idx++) { + if (!conn_list[idx].in_use) + break; /* an empty one found */ + } + + if (idx >= conn_list_cnt) { /* no empties, create space */ + CONN_LIST *tmp_conn_list = conn_list; + + conn_list_cnt += CONN_LIST_INC; + if (conn_list) { + conn_list = (CONN_LIST *) Realloc (conn_list, /* extend */ + conn_list_cnt * sizeof (CONN_LIST)); + } else { + conn_list = (CONN_LIST *) Malloc (conn_list_cnt * sizeof (CONN_LIST)); } - /* look for an empty connection entry */ - for (idx = 0; idx < conn_list_cnt; idx++) { - if (!conn_list[idx].in_use) - break; /* an empty one found */ + if (!conn_list) { /* unable to get space */ + if ((conn_list_cnt -= CONN_LIST_INC)) { + /* + * was realloc, restore space + */ + conn_list = tmp_conn_list; + } + return -1; /* errno set by failed alloc */ } - - if (idx >= conn_list_cnt) { /* no empties, create space */ - CONN_LIST* tmp_conn_list = conn_list; - - conn_list_cnt += CONN_LIST_INC; - if (conn_list) { - conn_list = (CONN_LIST *) Realloc (conn_list, /* extend */ - conn_list_cnt * sizeof (CONN_LIST)); - } else { - conn_list = (CONN_LIST *)Malloc(conn_list_cnt * sizeof(CONN_LIST)); - } - - if (!conn_list) { /* unable to get space */ - if ((conn_list_cnt -= CONN_LIST_INC)) { - /* was realloc, restore space */ - conn_list = tmp_conn_list; - } - return -1; /* errno set by failed alloc */ - } - /* clear newly created memory */ - memset (conn_list + idx, 0, CONN_LIST_INC * sizeof (CONN_LIST)); - } else { /* clear new entry */ - memset (conn_list + idx, 0, sizeof (CONN_LIST)); - } - clst = conn_list + idx; - - clst->in_use = True; /* now in use */ - clst->sender = sender; - memcpy (&clst->back_port, &in->back_port, sizeof (NET_OPAQUE)); - memcpy (&clst->route, &in->destination, sizeof (NET_OPAQUE)); - clst->debug_type = (UCHAR) in->debug_type; - clst->flags = in->flags; - strncpy (clst->user_name, in->user_name, NAMEMAX-1); - clst->user_name [NAMEMAX-1] = 0; - - return idx; + /* + * clear newly created memory + */ + memset (conn_list + idx, 0, CONN_LIST_INC * sizeof (CONN_LIST)); + } else { /* clear new entry */ + memset (conn_list + idx, 0, sizeof (CONN_LIST)); + } + clst = conn_list + idx; + + clst->in_use = True; /* now in use */ + clst->sender = sender; + memcpy (&clst->back_port, &in->back_port, sizeof (NET_OPAQUE)); + memcpy (&clst->route, &in->destination, sizeof (NET_OPAQUE)); + clst->debug_type = (UCHAR) in->debug_type; + clst->flags = in->flags; + strncpy (clst->user_name, in->user_name, NAMEMAX - 1); + clst->user_name[NAMEMAX - 1] = 0; + + return idx; } /* @@ -92,47 +100,56 @@ ConnCreate (struct svc_req* rqstp, open_in* in) * */ - void -ConnDelete (int conn, struct svc_req* rqstp, close_control control) + void +ConnDelete (int conn, struct svc_req *rqstp, close_control control) { - CONN_LIST* clst = conn_list + conn; - int idx; - Boolean prim; - - if (! clst->in_use) return; /* not active */ - - for (idx = 0; idx < pid_list_cnt; idx++) { - PID_LIST* plst = pid_list + idx; - - if (! PIDMAP_TEST (conn, idx)) continue; - - /* found a controlled pid */ - prim = (plst->primary_conn == conn) ? True : False; - TgtDetachCon (conn, idx, True); - - /* if still running or alive, we use close control on it */ - if (! plst->pid) - continue; /* entry gone */ - - if (prim && control == CLOSE_KILL) { - /* kill off process */ - TgtKillAndDelete (plst, rqstp, True); - } else if (! plst->owners) { - /* no owners left */ - if (control == CLOSE_DETACH) { - TgtKillAndDelete (plst, rqstp, False); - } - if (control == CLOSE_DETACH || PROC_TERMINATED (plst)) { - TgtDelete (plst, conn, (control==CLOSE_DETACH) ? - BMSG_DETACH : 0); - } - } - } - if (clst->list) { - Free (clst->list); /* free allocated memory */ - } - DPRINTF (("ConnDelete: Connection closed for port %u\n", - HL_W(*((UINT16*) &clst->back_port.c[2])))); + CONN_LIST *clst = conn_list + conn; + int idx; + Boolean prim; + + if (!clst->in_use) + return; /* not active */ - clst->in_use = False; /* free it back */ + for (idx = 0; idx < pid_list_cnt; idx++) { + PID_LIST *plst = pid_list + idx; + + if (!PIDMAP_TEST (conn, idx)) + continue; + + /* + * found a controlled pid + */ + prim = (plst->primary_conn == conn) ? True : False; + TgtDetachCon (conn, idx, True); + + /* + * if still running or alive, we use close control on it + */ + if (!plst->pid) + continue; /* entry gone */ + + if (prim && control == CLOSE_KILL) { + /* + * kill off process + */ + TgtKillAndDelete (plst, rqstp, True); + } else if (!plst->owners) { + /* + * no owners left + */ + if (control == CLOSE_DETACH) { + TgtKillAndDelete (plst, rqstp, False); + } + if (control == CLOSE_DETACH || PROC_TERMINATED (plst)) { + TgtDelete (plst, conn, (control == CLOSE_DETACH) ? BMSG_DETACH : 0); + } + } + } + if (clst->list) { + Free (clst->list); /* free allocated memory */ + } + DPRINTF (("ConnDelete: Connection closed for port %u\n", + HL_W (*((UINT16 *) & clst->back_port.c[2])))); + + clst->in_use = False; /* free it back */ } diff --git a/c/src/librdbg/src/servrpc.c b/c/src/librdbg/src/servrpc.c index 310f3bb6c4..9fd56080f5 100644 --- a/c/src/librdbg/src/servrpc.c +++ b/c/src/librdbg/src/servrpc.c @@ -31,48 +31,53 @@ properly. ----------------------------------------------------------------------- */ -open_out* RPCGENSRVNAME(open_connex_2_svc) (open_in *in, struct svc_req *rqstp) + open_out * +RPCGENSRVNAME (open_connex_2_svc) (open_in * in, + struct svc_req * rqstp) { - static open_out out; /* output response. This could be heap local */ - int idx; - static int one_time = 0; /* we do one-time setup on back port */ - - /* need to support in->debug_type, in->flags, and in->destination!!! */ - - if (!one_time) - { /* only setup one backport socket */ - /* now setup signals and the like for handling process changes */ - setErrno(0); - TspInit(rqstp->rq_xprt->xp_sock); /* init transport system */ - if (getErrno()) - { /* failed in setup */ - out.port = (u_long)-1; - out.fp = getErrno(); /* error causing to fail */ - return(&out); /* fail */ + static open_out out; /* output response. This could be heap local */ + int idx; + static int one_time = 0; /* we do one-time setup on back port */ + + /* + * need to support in->debug_type, in->flags, and in->destination!!! + */ + + if (!one_time) { /* only setup one backport socket */ + /* + * now setup signals and the like for handling process changes + */ + setErrno (0); + TspInit (rqstp->rq_xprt->xp_sock); /* init transport system */ + if (getErrno ()) { /* failed in setup */ + out.port = (u_long) - 1; + out.fp = getErrno (); /* error causing to fail */ + return (&out); /* fail */ } - one_time = True; /* disable doing this again */ + one_time = True; /* disable doing this again */ } - DPRINTF(("open_connex_2_svc: Opening connection from '%s'\n", - in->user_name)); + DPRINTF (("open_connex_2_svc: Opening connection from '%s'\n", + in->user_name)); - /* now setup a validation of all other connections */ + /* + * now setup a validation of all other connections + */ for (idx = 0; idx < conn_list_cnt; idx++) - if (conn_list[idx].in_use) - { /* setup retry timer */ - DPRINTF(("open_connex_2_svc: Still have connection %d with port %d\n", - idx, HL_W(*((UINT16*)&conn_list[idx].back_port.c[2])))); + if (conn_list[idx].in_use) { /* setup retry timer */ + DPRINTF (("open_connex_2_svc: Still have connection %d with port %d\n", + idx, HL_W (*((UINT16 *) & conn_list[idx].back_port.c[2])))); } - idx = ConnCreate(rqstp, in); /* setup the connection */ - out.port = idx; /* connection number */ + idx = ConnCreate (rqstp, in); /* setup the connection */ + out.port = idx; /* connection number */ if (idx == -1) - out.fp = getErrno(); /* error causing to fail */ + out.fp = getErrno (); /* error causing to fail */ else out.fp = TARGET_PROC_TYPE; out.server_vers = SERVER_VERS; - return(&out); + return (&out); } /* ----------------------------------------------------------------------- @@ -86,30 +91,36 @@ open_out* RPCGENSRVNAME(open_connex_2_svc) (open_in *in, struct svc_req *rqstp) needed. ----------------------------------------------------------------------- */ -signal_out *RPCGENSRVNAME(send_signal_2_svc) (signal_in *in, struct svc_req *rqstp) + signal_out * +RPCGENSRVNAME (send_signal_2_svc) (signal_in * in, + struct svc_req * rqstp) { - static signal_out out; /* return code from kill */ + static signal_out out; /* return code from kill */ - /* we do not care if connected */ - setErrno(0); + /* + * we do not care if connected + */ + setErrno (0); out.kill_return = 0; out.errNo = 0; TotalReboot = 1; - return(&out); + return (&out); } /* ----------------------------------------------------------------------- close_connex_2_svc - close a connection from a client. ----------------------------------------------------------------------- */ -void *RPCGENSRVNAME(close_connex_2_svc) (close_in *in, struct svc_req *rqstp) + void * +RPCGENSRVNAME (close_connex_2_svc) (close_in * in, + struct svc_req * rqstp) { - int conn_idx = TspConnGetIndex(rqstp); + int conn_idx = TspConnGetIndex (rqstp); - if (conn_idx != -1) /* found it, clear out */ - ConnDelete(conn_idx, rqstp, in->control); + if (conn_idx != -1) /* found it, clear out */ + ConnDelete (conn_idx, rqstp, in->control); - return (void*) ""; /* need to return something */ + return (void *) ""; /* need to return something */ } /* ----------------------------------------------------------------------- @@ -119,121 +130,123 @@ void *RPCGENSRVNAME(close_connex_2_svc) (close_in *in, struct svc_req *rqstp) #define REG_COUNT \ (sizeof (xdr_regs) / sizeof (int)) -ptrace_out *RPCGENSRVNAME(ptrace_2_svc) (ptrace_in *in, struct svc_req *rqstp) + ptrace_out * +RPCGENSRVNAME (ptrace_2_svc) (ptrace_in * in, + struct svc_req * rqstp) { - int conn_idx = rqstp ? TspConnGetIndex(rqstp) : -1; - static ptrace_out out; /* outut response (error or data) */ - void *addr, *addr2; /* used for actual ptrace call */ - unsigned int data; - int req, pid, ret, pid_idx, idx; - static union - { /* local buffer for returned data */ - Objects_Id t_list[UTHREAD_MAX]; /* thread_list return */ - char t_name[THREADNAMEMAX]; /* thread name return */ - } local_buff; /* for return handling of strings and the like */ - PID_LIST *plst = NULL; /* current pid_list entry */ + int conn_idx = rqstp ? TspConnGetIndex (rqstp) : -1; + static ptrace_out out; /* outut response (error or data) */ + void *addr, *addr2; /* used for actual ptrace call */ + unsigned int data; + int req, pid, ret, pid_idx, idx; + static union { /* local buffer for returned data */ + Objects_Id t_list[UTHREAD_MAX]; /* thread_list return */ + char t_name[THREADNAMEMAX]; /* thread name return */ + } local_buff; /* for return handling of strings and the like */ + PID_LIST *plst = NULL; /* current pid_list entry */ DPRINTF (("ptrace_2_svc: entered (%s (%d), %d, XXXX, %d, XXXX)\n", - PtraceName (in->addr.req), in->addr.req, in->pid, - in->data)); + PtraceName (in->addr.req), in->addr.req, in->pid, in->data)); out.addr.ptrace_addr_data_out_u.addr = 0; - /* validate the connection */ - if (conn_idx == -1 && rqstp != NULL) - { /* no connection, error */ - DPRINTF(("ptrace_2_svc: msg from unknown debugger!\n")); + /* + * validate the connection + */ + if (conn_idx == -1 && rqstp != NULL) { /* no connection, error */ + DPRINTF (("ptrace_2_svc: msg from unknown debugger!\n")); out.result = -1; - out.errNo = ECHILD; /* closest error */ - out.addr.req = 0; /* to avoid copies that should not occur */ - return(&out); + out.errNo = ECHILD; /* closest error */ + out.addr.req = 0; /* to avoid copies that should not occur */ + return (&out); } - /* Consider that the last back-message is acknowledged */ - if (conn_idx >= 0 && conn_list[conn_idx].retry) { - TspMessageReceive(conn_idx, in->pid); + /* + * Consider that the last back-message is acknowledged + */ + if (conn_idx >= 0 && conn_list[conn_idx].retry) { + TspMessageReceive (conn_idx, in->pid); } req = in->addr.req; - out.addr.req = req; /* needed for RPC */ + out.addr.req = req; /* needed for RPC */ pid = in->pid; addr = addr2 = NULL; data = in->data; - setErrno(0); /* assume works */ - out.result = 0; /* assume worked ok */ + setErrno (0); /* assume works */ + out.result = 0; /* assume worked ok */ out.errNo = 0; - /* lookup process to make sure we have under control */ + /* + * lookup process to make sure we have under control + */ pid_idx = FindPidEntry (in->pid); - if (pid_idx >= 0) /* found it */ - { + if (pid_idx >= 0) { /* found it */ plst = &pid_list[pid_idx]; if (conn_idx < 0) conn_idx = plst->primary_conn; } - /* now we handle the special case of ATTACH to a pid we already control */ - if (req == RPT_ATTACH) - { /* look it up first */ - if (plst) - { /* we have controlled , so return ok+show conn */ - ret = 2; /* normally secondary connection */ - if (! PIDMAP_TEST (conn_idx, pid_idx)) - { /* mark as an owner if not already */ - plst->owners++; - PIDMAP_SET (conn_idx, pid_idx); /* mask in */ - } - else if (plst->primary_conn != NO_PRIMARY) - { /* regrab makes primary */ - /* Only if not primary already */ - if (plst->primary_conn != conn_idx) { - TspSendWaitChange(plst->primary_conn, BMSG_NOT_PRIM, - conn_idx, plst->pid, 0, False); /* tell old owner */ - } - plst->primary_conn = NO_PRIMARY; + /* + * now we handle the special case of ATTACH to a pid we already control + */ + if (req == RPT_ATTACH) { /* look it up first */ + if (plst) { /* we have controlled , so return ok+show conn */ + ret = 2; /* normally secondary connection */ + if (!PIDMAP_TEST (conn_idx, pid_idx)) { /* mark as an owner if not already */ + plst->owners++; + PIDMAP_SET (conn_idx, pid_idx); /* mask in */ + } else if (plst->primary_conn != NO_PRIMARY) { /* regrab makes primary */ + /* + * Only if not primary already + */ + if (plst->primary_conn != conn_idx) { + TspSendWaitChange (plst->primary_conn, BMSG_NOT_PRIM, conn_idx, plst->pid, 0, False); /* tell old owner */ + } + plst->primary_conn = NO_PRIMARY; } - if (plst->primary_conn == NO_PRIMARY) - { /* none now, so take over */ - plst->primary_conn = conn_idx; /* new primary */ - ret = 1; /* primary */ + if (plst->primary_conn == NO_PRIMARY) { /* none now, so take over */ + plst->primary_conn = conn_idx; /* new primary */ + ret = 1; /* primary */ } - out.result = ret; /* primary or secondary owner */ - return(&out); + out.result = ret; /* primary or secondary owner */ + return (&out); } - /* else attach process using target code */ - setErrno(ESRCH); /* assume the worst */ - if (!TgtAttach(conn_idx, pid)) - { /* failed */ - out.errNo = getErrno(); + /* + * else attach process using target code + */ + setErrno (ESRCH); /* assume the worst */ + if (!TgtAttach (conn_idx, pid)) { /* failed */ + out.errNo = getErrno (); out.result = 0; } - return(&out); - } - else if (req == RPT_DETACH) - { /* see which kind of detach */ - if (data == PTRDET_UNOWN) - { /* only want to disconnect from */ - TgtDetachCon(conn_idx, pid_idx, True); /* remove from control */ - return(&out); /* done */ + return (&out); + } else if (req == RPT_DETACH) { /* see which kind of detach */ + if (data == PTRDET_UNOWN) { /* only want to disconnect from */ + TgtDetachCon (conn_idx, pid_idx, True); /* remove from control */ + return (&out); /* done */ } - } - else if (plst && (req == RPT_GETNAME || req == RPT_GETBREAK)) - { - /* do nothing */ + } else if (plst && (req == RPT_GETNAME || req == RPT_GETBREAK)) { + /* + * do nothing + */ } - else if (plst && req == RPT_CLRBREAK) { - /* To be able to remove breakpoints from a "running" system */ + else if (plst && req == RPT_CLRBREAK) { + /* + * To be able to remove breakpoints from a "running" system + */ DPRINTF (("ptrace_2_svc: allowing RPT_CLRBREAK %d\n", data)); - /* do nothing */ + /* + * do nothing + */ } - else if (plst && plst->running) - { /* error, process is running and not detach */ + else if (plst && plst->running) { /* error, process is running and not detach */ out.result = -1; - out.errNo = ETXTBSY; /* closest error */ + out.errNo = ETXTBSY; /* closest error */ DPRINTF (("ptrace_2_svc: failed, still running.\n")); - return(&out); + return (&out); } if (plst == NULL) { out.result = -1; @@ -242,457 +255,494 @@ ptrace_out *RPCGENSRVNAME(ptrace_2_svc) (ptrace_in *in, struct svc_req *rqstp) return (&out); } - /* now make sure secondary owner is not trying to modify */ - if (!(in->flags & PTRFLG_NON_OWNER)) /* if not overriden */ + /* + * now make sure secondary owner is not trying to modify + */ + if (!(in->flags & PTRFLG_NON_OWNER)) /* if not overriden */ if (conn_idx != plst->primary_conn - && ( (req >= RPT_POKETEXT && req <= RPT_SINGLESTEP) - || (req >= RPT_SETREGS && req <= RPT_SETFPAREGS && (req & 1)) - || (req >= RPT_SYSCALL && req <= RPT_DUMPCORE) - || (req >= RPT_SETTARGETTHREAD && req <= RPT_THREADRESUME) - || (req >= RPT_SETTHREADNAME && req <= RPT_SETTHREADREGS) - || (req >= RPT_STEPRANGE && req <= RPT_CLRBREAK) - || (req == RPT_STOP) - || (req >= RPT_PSETREGS && req <= RPT_PSETTHREADREGS))) - { /* not owner */ + && ((req >= RPT_POKETEXT && req <= RPT_SINGLESTEP) + || (req >= RPT_SETREGS && req <= RPT_SETFPAREGS && (req & 1)) + || (req >= RPT_SYSCALL && req <= RPT_DUMPCORE) + || (req >= RPT_SETTARGETTHREAD && req <= RPT_THREADRESUME) + || (req >= RPT_SETTHREADNAME && req <= RPT_SETTHREADREGS) + || (req >= RPT_STEPRANGE && req <= RPT_CLRBREAK) + || (req == RPT_STOP) + || (req >= RPT_PSETREGS && req <= RPT_PSETTHREADREGS))) { /* not owner */ out.result = -1; - out.errNo = EPERM; /* cannot alter as not primary */ - DPRINTF (("ptrace_2_svc: refused, not owner, flags %d conn_idx %d primary_conn %d\n", in->flags, conn_idx, - plst->primary_conn)); - return(&out); + out.errNo = EPERM; /* cannot alter as not primary */ + DPRINTF (("ptrace_2_svc: refused, not owner, flags %d conn_idx %d primary_conn %d\n", in->flags, conn_idx, plst->primary_conn)); + return (&out); } - addr = (void *)in->addr.ptrace_addr_data_in_u.address; /* default */ - /* now setup normal ptrace request by unpacking. May execute here. */ - switch (req) - { /* handle unpacking or setup for real call */ - /* first the ones where addr points to input data */ - case RPT_SETREGS: - case RPT_SETTHREADREGS: - addr = (void *)&in->addr.ptrace_addr_data_in_u.regs; /* reg list */ - break; - - case RPT_PSETREGS: - case RPT_PSETTHREADREGS: - if (in->addr.ptrace_addr_data_in_u.pregs.pregs_len != REG_COUNT) { - DPRINTF(("ptrace_2_svc: pid %d got %d expected %d\n", pid, - in->addr.ptrace_addr_data_in_u.pregs.pregs_len, REG_COUNT)); - setErrno(EINVAL); - break; - } - req = req == RPT_PSETREGS ? RPT_SETREGS : RPT_SETTHREADREGS; - addr = (void *) in->addr.ptrace_addr_data_in_u.pregs.pregs_val; - break; - - case RPT_SETTHREADNAME: - addr = (void *)in->addr.ptrace_addr_data_in_u.name; + addr = (void *) in->addr.ptrace_addr_data_in_u.address; /* default */ + /* + * now setup normal ptrace request by unpacking. May execute here. + */ + switch (req) { /* handle unpacking or setup for real call */ + /* + * first the ones where addr points to input data + */ + case RPT_SETREGS: + case RPT_SETTHREADREGS: + addr = (void *) &in->addr.ptrace_addr_data_in_u.regs; /* reg list */ + break; + + case RPT_PSETREGS: + case RPT_PSETTHREADREGS: + if (in->addr.ptrace_addr_data_in_u.pregs.pregs_len != REG_COUNT) { + DPRINTF (("ptrace_2_svc: pid %d got %d expected %d\n", pid, + in->addr.ptrace_addr_data_in_u.pregs.pregs_len, REG_COUNT)); + setErrno (EINVAL); break; - case RPT_WRITETEXT: - case RPT_WRITEDATA: - if ((int) data < 0) { - setErrno(EINVAL); - break; - } - addr = (void *)in->addr.ptrace_addr_data_in_u.mem.addr; /* targ addr */ - addr2 = (void *)in->addr.ptrace_addr_data_in_u.mem.data; /* buff */ - - /* Forbid writing over breakpoints */ - if (BreakOverwrite (plst, addr, data)) { - setErrno(EBUSY); - } - break; - - case RPT_POKETEXT: - case RPT_POKEDATA: - /* Forbid writing over breakpoints */ - if (BreakOverwrite (plst, addr, sizeof (int))) { - setErrno(EBUSY); - } - break; - - /* now ones where we handle locally */ - case RPT_GETTARGETTHREAD: - out.result = plst->thread; - req = 0; /* force exit */ - break; - - case RPT_PGETREGS: /* return from our buffer */ - out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; - out.addr.ptrace_addr_data_out_u.pregs.pregs_val = (u_int*) &plst->regs; - req = 0; /* force exit */ - break; - - case RPT_GETREGS: - /* return directly from our buffer */ - /* this buffer is refreshed when changing target thread */ - out.addr.ptrace_addr_data_out_u.regs = plst->regs; - req = 0; /* force exit */ - break; - - case RPT_SETBREAK: - idx = BreakSet (plst, conn_idx, &in->addr.ptrace_addr_data_in_u.breakp); - if (idx < 0) break; - req = 0; /* force exit */ - out.result = idx; /* return break index (>0) */ - break; - - case RPT_CLRBREAK: - if (conn_list[conn_idx].flags & DEBUGGER_IS_GDB) { - data = BreakGetIndex (plst, addr); - } - out.result = BreakClear (plst, conn_idx, data); - /* if errored, errno will still be set */ - req = 0; + } + req = req == RPT_PSETREGS ? RPT_SETREGS : RPT_SETTHREADREGS; + addr = (void *) in->addr.ptrace_addr_data_in_u.pregs.pregs_val; + break; + + case RPT_SETTHREADNAME: + addr = (void *) in->addr.ptrace_addr_data_in_u.name; + break; + case RPT_WRITETEXT: + case RPT_WRITEDATA: + if ((int) data < 0) { + setErrno (EINVAL); break; - - case RPT_GETBREAK: - /* data=handle, addr=in_buffer, returns next break. Data=0, returns cnt */ - out.result = BreakGet (plst, data, &out.addr. - ptrace_addr_data_out_u.breakp); - req = 0; /* handle locally */ + } + addr = (void *) in->addr.ptrace_addr_data_in_u.mem.addr; /* targ addr */ + addr2 = (void *) in->addr.ptrace_addr_data_in_u.mem.data; /* buff */ + + /* + * Forbid writing over breakpoints + */ + if (BreakOverwrite (plst, addr, data)) { + setErrno (EBUSY); + } + break; + + case RPT_POKETEXT: + case RPT_POKEDATA: + /* + * Forbid writing over breakpoints + */ + if (BreakOverwrite (plst, addr, sizeof (int))) { + setErrno (EBUSY); + } + break; + + /* + * now ones where we handle locally + */ + case RPT_GETTARGETTHREAD: + out.result = plst->thread; + req = 0; /* force exit */ + break; + + case RPT_PGETREGS: /* return from our buffer */ + out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; + out.addr.ptrace_addr_data_out_u.pregs.pregs_val = (u_int *) & plst->regs; + req = 0; /* force exit */ + break; + + case RPT_GETREGS: + /* + * return directly from our buffer + */ + /* + * this buffer is refreshed when changing target thread + */ + out.addr.ptrace_addr_data_out_u.regs = plst->regs; + req = 0; /* force exit */ + break; + + case RPT_SETBREAK: + idx = BreakSet (plst, conn_idx, &in->addr.ptrace_addr_data_in_u.breakp); + if (idx < 0) break; + req = 0; /* force exit */ + out.result = idx; /* return break index (>0) */ + break; - case RPT_GETNAME: /* get the name of the process */ - if (!plst->name) - out.addr.ptrace_addr_data_out_u.mem.dataNb = 0; - else - { - int maxLen = sizeof out.addr.ptrace_addr_data_out_u.mem.data - 1; - data = strlen(plst->name); - if (data > maxLen) - data = maxLen; - out.addr.ptrace_addr_data_out_u.mem.dataNb = data+1; - memcpy(out.addr.ptrace_addr_data_out_u.mem.data, plst->name, data+1); - out.addr.ptrace_addr_data_out_u.mem.data [maxLen] = '\0'; - } - req = 0; - break; + case RPT_CLRBREAK: + if (conn_list[conn_idx].flags & DEBUGGER_IS_GDB) { + data = BreakGetIndex (plst, addr); + } + out.result = BreakClear (plst, conn_idx, data); + /* + * if errored, errno will still be set + */ + req = 0; + break; + + case RPT_GETBREAK: + /* + * data=handle, addr=in_buffer, returns next break. Data=0, returns cnt + */ + out.result = BreakGet (plst, data, &out.addr. + ptrace_addr_data_out_u.breakp); + req = 0; /* handle locally */ + break; + + case RPT_GETNAME: /* get the name of the process */ + if (!plst->name) + out.addr.ptrace_addr_data_out_u.mem.dataNb = 0; + else { + int maxLen = sizeof(out.addr.ptrace_addr_data_out_u.mem.data) - 1; + data = strlen (plst->name); + if (data > maxLen) + data = maxLen; + out.addr.ptrace_addr_data_out_u.mem.dataNb = data + 1; + memcpy (out.addr.ptrace_addr_data_out_u.mem.data, plst->name, data + 1); + out.addr.ptrace_addr_data_out_u.mem.data[maxLen] = '\0'; + } + req = 0; + break; - case RPT_CONTTO: - if (BreakSetAt (plst, conn_idx, (u_long) addr, BRKT_STEPEMUL) < 0) - { - DPRINTF(("ptrace_2_svc: BreakSet failed at %x", addr)); - break; - } - req = RPT_CONT; - /* data can contain a signal number, addr2 is unused */ - goto case_RPT_CONT; - - case RPT_STEPRANGE: - /* convert to step */ - if (!data) - data = 1; /* should we give an error?? */ - BreakStepRange (plst, addr, data); - if (getErrno()) break; - - req = RPT_SINGLESTEP; /* do by stepping */ - addr = (void*) 1; /* start from current PC */ - data = -2; /* want non-atomic stepping */ - /* fall through to other exec cases */ - - case RPT_CONT: - case_RPT_CONT: - case RPT_SINGLESTEP: - - if (BreakStepOff (plst, &addr2)) - { /* need clear then step off break */ - /* clear break, step, then do exec */ - if (addr == (void*) 1) - addr = (void*) plst->regs.REG_PC;/* need for patch */ - - /* data is always 0, so atomic single-step */ - } else if (req == RPT_SINGLESTEP) { - data = -2; /* want non-atomic stepping */ - } + case RPT_CONTTO: + if (BreakSetAt (plst, conn_idx, (u_long) addr, BRKT_STEPEMUL) < 0) { + DPRINTF (("ptrace_2_svc: BreakSet failed at %x", addr)); break; - - /* now ones where addr points to an output area */ - case RPT_PGETTHREADREGS: - addr = (void*) out.addr.ptrace_addr_data_out_u.mem.data; - if (sizeof out.addr.ptrace_addr_data_out_u.mem.data < - REG_COUNT * sizeof(int)) { - setErrno(EINVAL); - break; - } - if (data == plst->thread) { - out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; - out.addr.ptrace_addr_data_out_u.pregs.pregs_val = (u_int*) &plst->regs; - req = 0; /* force exit */ - break; - } - req = RPT_GETTHREADREGS; + } + req = RPT_CONT; + /* + * data can contain a signal number, addr2 is unused + */ + goto case_RPT_CONT; + + case RPT_STEPRANGE: + /* + * convert to step + */ + if (!data) + data = 1; /* should we give an error?? */ + BreakStepRange (plst, addr, data); + if (getErrno ()) break; - case RPT_GETTHREADREGS: - addr = (void*) &out.addr.ptrace_addr_data_out_u.regs; - break; - case RPT_GETTHREADNAME: - out.addr.ptrace_addr_data_out_u.name = local_buff.t_name; - addr = (void*) out.addr.ptrace_addr_data_out_u.name; + req = RPT_SINGLESTEP; /* do by stepping */ + addr = (void *) 1; /* start from current PC */ + data = -2; /* want non-atomic stepping */ + /* + * fall through to other exec cases + */ + + case RPT_CONT: + case_RPT_CONT: + case RPT_SINGLESTEP: + + if (BreakStepOff (plst, &addr2)) { /* need clear then step off break */ + /* + * clear break, step, then do exec + */ + if (addr == (void *) 1) + addr = (void *) plst->regs.REG_PC; /* need for patch */ + + /* + * data is always 0, so atomic single-step + */ + } else if (req == RPT_SINGLESTEP) { + data = -2; /* want non-atomic stepping */ + } + break; + + /* + * now ones where addr points to an output area + */ + case RPT_PGETTHREADREGS: + addr = (void *) out.addr.ptrace_addr_data_out_u.mem.data; + if (sizeof(out.addr.ptrace_addr_data_out_u.mem.data) < REG_COUNT * sizeof (int)) { + setErrno (EINVAL); break; - case RPT_THREADLIST: - out.addr.ptrace_addr_data_out_u.threads.threads =(ptThreadList) local_buff.t_list; - addr = (void*) out.addr.ptrace_addr_data_out_u.threads.threads; + } + if (data == plst->thread) { + out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; + out.addr.ptrace_addr_data_out_u.pregs.pregs_val = + (u_int *) & plst->regs; + req = 0; /* force exit */ break; - case RPT_READTEXT: - case RPT_READDATA: - if ((int) data < 0) { - setErrno(EINVAL); - break; - } - addr = (void *)in->addr.ptrace_addr_data_in_u.address; - addr2 = (void *)out.addr.ptrace_addr_data_out_u.mem.data; - out.addr.ptrace_addr_data_out_u.mem.dataNb = data; + } + req = RPT_GETTHREADREGS; + break; + + case RPT_GETTHREADREGS: + addr = (void *) &out.addr.ptrace_addr_data_out_u.regs; + break; + case RPT_GETTHREADNAME: + out.addr.ptrace_addr_data_out_u.name = local_buff.t_name; + addr = (void *) out.addr.ptrace_addr_data_out_u.name; + break; + case RPT_THREADLIST: + out.addr.ptrace_addr_data_out_u.threads.threads = + (ptThreadList) local_buff.t_list; + addr = (void *) out.addr.ptrace_addr_data_out_u.threads.threads; + break; + case RPT_READTEXT: + case RPT_READDATA: + if ((int) data < 0) { + setErrno (EINVAL); break; - case RPT_DETACH: - /* Do not allow detaching if breakpoints still there */ - if (BreakGet (plst, 0, NULL)) - { /* some bkpts still set */ - setErrno(EINVAL); /* cannot detach safely */ - break; - } - /* fall through */ - case RPT_KILL: - /* in the event they are trying to detach or kill a terminated process, - we just delete the entry. */ - if (PROC_TERMINATED (plst)) - { - TgtDelete(plst, -1, BMSG_KILLED); /* just blow off */ - req = 0; /* now exit */ - } + } + addr = (void *) in->addr.ptrace_addr_data_in_u.address; + addr2 = (void *) out.addr.ptrace_addr_data_out_u.mem.data; + out.addr.ptrace_addr_data_out_u.mem.dataNb = data; + break; + case RPT_DETACH: + /* + * Do not allow detaching if breakpoints still there + */ + if (BreakGet (plst, 0, NULL)) { /* some bkpts still set */ + setErrno (EINVAL); /* cannot detach safely */ break; + } + /* + * fall through + */ + case RPT_KILL: + /* + * in the event they are trying to detach or kill a terminated process, + * we just delete the entry. + */ + if (PROC_TERMINATED (plst)) { + TgtDelete (plst, -1, BMSG_KILLED); /* just blow off */ + req = 0; /* now exit */ + } + break; } - if (getErrno()) - { /* failed in code above */ + if (getErrno ()) { /* failed in code above */ out.result = -1; - out.errNo = getErrno(); - DPRINTF(("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); - return(&out); - } - else if (!req) - { /* bail out now */ - DPRINTF(("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); - return(&out); + out.errNo = getErrno (); + DPRINTF (("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); + return (&out); + } else if (!req) { /* bail out now */ + DPRINTF (("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); + return (&out); } - /* OK, make the call */ - out.result = TgtPtrace(req, pid, addr, data, addr2); - out.errNo = getErrno(); - - /* if no error, cleanup afterwards */ - if (getErrno()) - { - /* Remove step-emul breakpoints if any */ + /* + * OK, make the call + */ + out.result = TgtPtrace (req, pid, addr, data, addr2); + out.errNo = getErrno (); + + /* + * if no error, cleanup afterwards + */ + if (getErrno ()) { + /* + * Remove step-emul breakpoints if any + */ if (req == RPT_SINGLESTEP || req == RPT_CONT) { BreakClear (plst, -1, -1); } - DPRINTF(("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); - return(&out); /* return error */ + DPRINTF (("ptrace_2_svc: result %d errNo %d\n", out.result, out.errNo)); + return (&out); /* return error */ } - switch (in->addr.req) - { /* handle some special calls that affect state */ - case RPT_CONT: - case RPT_STEPRANGE: - /* change to running */ - if (in->addr.req == RPT_STEPRANGE) - plst->last_start = LAST_RANGE; /* so range steps */ - else if (addr2) - plst->last_start = LAST_STEPOFF; /* now continue after wait */ - else - plst->last_start = LAST_CONT; - plst->running = 1; /* mark as running */ - if (!rqstp) /* Called internally to restart bkpt, no msg to anybody */ - break; - TgtNotifyAll(pid_idx, BMSG_WAIT, 0, 0, (in->flags & PTRFLG_NON_OWNER) - ? -1 : conn_idx, True); - break; - case RPT_SINGLESTEP: - /* mark as step */ - plst->last_start = LAST_STEP; /* so we know how started */ - plst->running = 1; /* mark as running (wait should catch fast) */ - break; - case RPT_DETACH: /* mark as disconnected */ - case RPT_KILL: /* mark as killed */ - if (in->flags & PTRFLG_FREE) /* notify and delete entry */ - TgtDelete(plst, -1, (in->addr.req==RPT_KILL) ? BMSG_KILLED : BMSG_DETACH); - else - { /* notify and mark */ - plst->last_start = (in->addr.req==RPT_KILL) ? - LAST_KILLED : LAST_DETACHED; - plst->state = -1; - plst->running = False; - TgtNotifyAll(pid_idx, (in->addr.req==RPT_KILL) ? - BMSG_KILLED : BMSG_DETACH, 0, 0, -1, True); - } + switch (in->addr.req) { /* handle some special calls that affect state */ + case RPT_CONT: + case RPT_STEPRANGE: + /* + * change to running + */ + if (in->addr.req == RPT_STEPRANGE) + plst->last_start = LAST_RANGE; /* so range steps */ + else if (addr2) + plst->last_start = LAST_STEPOFF; /* now continue after wait */ + else + plst->last_start = LAST_CONT; + plst->running = 1; /* mark as running */ + if (!rqstp) /* Called internally to restart bkpt, no msg to anybody */ break; - case RPT_SETTHREADREGS: - case RPT_PSETTHREADREGS: - if (data != plst->thread) - break; - DPRINTF(("ptrace_2_svc: pid %d target thread regs changed!\n", pid)); - - case RPT_SETREGS: - case RPT_PSETREGS: - /* change our buffer as well */ - if (plst->regs.REG_PC != ((xdr_regs*)addr)->REG_PC) - BreakPcChanged (plst); - plst->regs = *(xdr_regs*) addr; /* copy in */ - break; - - /* case RPT_PGETREGS has been handled locally above */ - case RPT_PGETTHREADREGS: - /* We need to update pointer so that XDR works on return */ - out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; - out.addr.ptrace_addr_data_out_u.pregs.pregs_val = - (void*) out.addr.ptrace_addr_data_out_u.mem.data; - break; - - case RPT_PEEKTEXT: - case RPT_PEEKDATA: - case RPT_READDATA: - case RPT_READTEXT: - if (req < RPT_READDATA) - { /* peek */ - /* addr is start */ - data = sizeof(int); - addr2 = &out.result; /* data buffer */ - /* Like read: addr is start, data is length, addr2 is buffer */ - } - BreakHide (plst, addr, data, addr2); - break; - - case RPT_SETTARGETTHREAD: - DPRINTF(("ptrace_2_svc: pid %d new target thread %d\n", pid, data)); - TgtPtrace (RPT_GETREGS, pid, (char*) &plst->regs, 0, NULL); - plst->thread = data; - if (plst->break_list) { /* Forget we had to step off breakpoint */ - BASE_BREAK* base = (BASE_BREAK*) plst->break_list; - DPRINTF(("ptrace_2_svc: clr_step %d last_break %d\n", base->clr_step, - base->last_break)); - base->clr_step = 0; /* Not stopped on break */ - base->last_break = 0; - } + TgtNotifyAll (pid_idx, BMSG_WAIT, 0, 0, (in->flags & PTRFLG_NON_OWNER) + ? -1 : conn_idx, True); + break; + case RPT_SINGLESTEP: + /* + * mark as step + */ + plst->last_start = LAST_STEP; /* so we know how started */ + plst->running = 1; /* mark as running (wait should catch fast) */ + break; + case RPT_DETACH: /* mark as disconnected */ + case RPT_KILL: /* mark as killed */ + if (in->flags & PTRFLG_FREE) /* notify and delete entry */ + TgtDelete (plst, -1, + (in->addr.req == RPT_KILL) ? BMSG_KILLED : BMSG_DETACH); + else { /* notify and mark */ + plst->last_start = (in->addr.req == RPT_KILL) ? + LAST_KILLED : LAST_DETACHED; + plst->state = -1; + plst->running = False; + TgtNotifyAll (pid_idx, (in->addr.req == RPT_KILL) ? + BMSG_KILLED : BMSG_DETACH, 0, 0, -1, True); + } + break; + case RPT_SETTHREADREGS: + case RPT_PSETTHREADREGS: + if (data != plst->thread) break; + DPRINTF (("ptrace_2_svc: pid %d target thread regs changed!\n", pid)); + + case RPT_SETREGS: + case RPT_PSETREGS: + /* + * change our buffer as well + */ + if (plst->regs.REG_PC != ((xdr_regs *) addr)->REG_PC) + BreakPcChanged (plst); + plst->regs = *(xdr_regs *) addr; /* copy in */ + break; + + /* + * case RPT_PGETREGS has been handled locally above + */ + case RPT_PGETTHREADREGS: + /* + * We need to update pointer so that XDR works on return + */ + out.addr.ptrace_addr_data_out_u.pregs.pregs_len = REG_COUNT; + out.addr.ptrace_addr_data_out_u.pregs.pregs_val = + (void *) out.addr.ptrace_addr_data_out_u.mem.data; + break; + + case RPT_PEEKTEXT: + case RPT_PEEKDATA: + case RPT_READDATA: + case RPT_READTEXT: + if (req < RPT_READDATA) { /* peek */ + /* + * addr is start + */ + data = sizeof (int); + addr2 = &out.result; /* data buffer */ + /* + * Like read: addr is start, data is length, addr2 is buffer + */ + } + BreakHide (plst, addr, data, addr2); + break; + + case RPT_SETTARGETTHREAD: + DPRINTF (("ptrace_2_svc: pid %d new target thread %d\n", pid, data)); + TgtPtrace (RPT_GETREGS, pid, (char *) &plst->regs, 0, NULL); + plst->thread = data; + if (plst->break_list) { /* Forget we had to step off breakpoint */ + BASE_BREAK *base = (BASE_BREAK *) plst->break_list; + DPRINTF (("ptrace_2_svc: clr_step %d last_break %d\n", base->clr_step, + base->last_break)); + base->clr_step = 0; /* Not stopped on break */ + base->last_break = 0; + } + break; - case RPT_THREADLIST: - out.addr.ptrace_addr_data_out_u.threads.nbThread = out.result; - break; + case RPT_THREADLIST: + out.addr.ptrace_addr_data_out_u.threads.nbThread = out.result; + break; - default: - break; - } /* end switch */ - DPRINTF(("ptrace_2_svc 2: result %d errNo %d\n", out.result, out.errNo)); - return(&out); + default: + break; + } /* end switch */ + DPRINTF (("ptrace_2_svc 2: result %d errNo %d\n", out.result, out.errNo)); + return (&out); } /* ----------------------------------------------------------------------- wait_info_2_svc - non-blocking wait request to check status. ----------------------------------------------------------------------- */ -wait_out *RPCGENSRVNAME(wait_info_2_svc) (in, rqstp) - wait_in *in; - struct svc_req *rqstp; /* server info */ + wait_out * +RPCGENSRVNAME (wait_info_2_svc) (wait_in * in, struct svc_req *rqstp) { - int conn_idx = TspConnGetIndex(rqstp); - static wait_out out; /* output of pid and status */ - int idx; - PID_LIST *plst; + int conn_idx = TspConnGetIndex (rqstp); + static wait_out out; /* output of pid and status */ + int idx; + PID_LIST *plst; - memset(&out, 0, sizeof(out)); /* zero for safety */ - out.reason = STOP_ERROR; /* assume the worst */ + memset (&out, 0, sizeof (out)); /* zero for safety */ + out.reason = STOP_ERROR; /* assume the worst */ - if (conn_idx == -1) - { /* no connection, error */ - DPRINTF(("wait_info_2_svc: msg from unknown debugger!\n")); + if (conn_idx == -1) { /* no connection, error */ + DPRINTF (("wait_info_2_svc: msg from unknown debugger!\n")); out.wait_return = -1; - out.errNo = ECHILD; /* closest error */ - return(&out); - } - else - { /* see if confirming message received */ + out.errNo = ECHILD; /* closest error */ + return (&out); + } else { /* see if confirming message received */ if (conn_list[conn_idx].retry) - TspMessageReceive(conn_idx, in->pid); + TspMessageReceive (conn_idx, in->pid); } - if (!in->pid) - { /* warm test verify only */ - /* this call (pid==0) is made to confirm that that connection is still - active. */ - /* we let it fall through as an error since any use other than connection - reset would be an error (there is no pid0). */ - } - else - { /* normal request */ + if (!in->pid) { /* warm test verify only */ + /* + * this call (pid==0) is made to confirm that that connection is still + * active. + */ + /* + * we let it fall through as an error since any use other than connection + * reset would be an error (there is no pid0). + */ + } else { /* normal request */ idx = FindPidEntry (in->pid); - if (idx >= 0) - { /* found process they requested on */ + if (idx >= 0) { /* found process they requested on */ plst = &pid_list[idx]; out.wait_return = plst->running ? 0 : in->pid; - /* return: 0 is running, pid is stopped/term */ + /* + * return: 0 is running, pid is stopped/term + */ out.errNo = 0; out.status = plst->state; /* last stopped reason if stopped */ - out.thread = plst->thread;/* current thread (or -1 if none) from stop */ + out.thread = plst->thread; /* current thread (or -1 if none) from stop */ if (!out.wait_return) - out.reason = STOP_NONE; /* running, no action */ - else if (STS_SIGNALLED (out.status)) - { /* stopped on signal */ - out.handle = STS_GETSIG (out.status); /* signal number */ - if (out.handle == SIGTRAP) - if (plst->is_step) - { /* single step with hitting a break */ - out.reason = STOP_STEP; - out.handle = 0; /* no information */ - } - else - { /* stopped on break */ - out.reason = STOP_BREAK; - if (plst->break_list) - out.handle = ((BASE_BREAK*)plst->break_list)->last_break; - else - out.handle = 0; /* no break */ - } - else - out.reason = STOP_SIGNAL; - out.PC = plst->regs.REG_PC; /* copy standard regs */ - out.SP = plst->regs.REG_SP; - out.FP = plst->regs.REG_FP; - } - else - { /* terminated, so lower use count */ - if (plst->last_start == LAST_KILLED) - out.reason = STOP_KILLED; - else if (plst->last_start == LAST_DETACHED) - out.reason = STOP_DETACHED; - else if (plst->last_start == LAST_START) - { /* failed in exec */ - out.reason = STOP_SPAWN_FAILED; - out.handle = STS_GETCODE (out.status); /* errno reason */ - } - else if (STS_TERMONSIG (out.status)) - { /* terminated on signal */ - out.reason = STOP_TERM_SIG; - /* mask off the core-dumped bit 7 */ - out.handle = (int)(unsigned)(u_char) STS_TERMGETSIG (out.status); - } - else - { /* exit(2)ed */ - out.reason = STOP_TERM_EXIT; - out.handle = STS_GETCODE (out.status); /* code */ - } + out.reason = STOP_NONE; /* running, no action */ + else if (STS_SIGNALLED (out.status)) { /* stopped on signal */ + out.handle = STS_GETSIG (out.status); /* signal number */ + if (out.handle == SIGTRAP) + if (plst->is_step) { /* single step with hitting a break */ + out.reason = STOP_STEP; + out.handle = 0; /* no information */ + } else { /* stopped on break */ + out.reason = STOP_BREAK; + if (plst->break_list) + out.handle = ((BASE_BREAK *) plst->break_list)->last_break; + else + out.handle = 0; /* no break */ + } else + out.reason = STOP_SIGNAL; + out.PC = plst->regs.REG_PC; /* copy standard regs */ + out.SP = plst->regs.REG_SP; + out.FP = plst->regs.REG_FP; + } else { /* terminated, so lower use count */ + if (plst->last_start == LAST_KILLED) + out.reason = STOP_KILLED; + else if (plst->last_start == LAST_DETACHED) + out.reason = STOP_DETACHED; + else if (plst->last_start == LAST_START) { /* failed in exec */ + out.reason = STOP_SPAWN_FAILED; + out.handle = STS_GETCODE (out.status); /* errno reason */ + } else if (STS_TERMONSIG (out.status)) { /* terminated on signal */ + out.reason = STOP_TERM_SIG; + /* + * mask off the core-dumped bit 7 + */ + out.handle = (int) (unsigned) (u_char) STS_TERMGETSIG (out.status); + } else { /* exit(2)ed */ + out.reason = STOP_TERM_EXIT; + out.handle = STS_GETCODE (out.status); /* code */ + } } - DPRINTF(("wait_info_2_svc: pid %d return %d status %x errNo %d" - " reason %d handle %d pc %x sp %x fp %x thread %d\n", - in->pid, out.wait_return, out.status, out.errNo, out.reason, - out.handle, out.PC, out.SP, out.FP, out.thread)); - return(&out); + DPRINTF (("wait_info_2_svc: pid %d return %d status %x errNo %d" + " reason %d handle %d pc %x sp %x fp %x thread %d\n", + in->pid, out.wait_return, out.status, out.errNo, out.reason, + out.handle, out.PC, out.SP, out.FP, out.thread)); + return (&out); } } - /* if not found in list, we return error: no such process */ + /* + * if not found in list, we return error: no such process + */ out.wait_return = -1; - out.errNo = ESRCH; /* no process */ + out.errNo = ESRCH; /* no process */ out.status = 0; - return(&out); + return (&out); } /* ----------------------------------------------------------------------- @@ -700,23 +750,22 @@ wait_out *RPCGENSRVNAME(wait_info_2_svc) (in, rqstp) ----------------------------------------------------------------------- */ static one_signal SignalNames[] = { - {SIGILL, "SIGILL/EVT_ILL"}, - {SIGTRAP, "SIGTRAP/EVT_BKPT"}, - {SIGFPE, "SIGFPE/EVT_FPE"}, - {SIGKILL, "SIGKILL/EVT_AKILL"}, - {SIGSEGV, "SIGSEGV/EVT_SEGV"}, - {17, "SIGSTOP"}, - {23, "SIGSTOP"} + {SIGILL, "SIGILL/EVT_ILL"}, + {SIGTRAP, "SIGTRAP/EVT_BKPT"}, + {SIGFPE, "SIGFPE/EVT_FPE"}, + {SIGKILL, "SIGKILL/EVT_AKILL"}, + {SIGSEGV, "SIGSEGV/EVT_SEGV"}, + {17, "SIGSTOP"}, + {23, "SIGSTOP"} }; -get_signal_names_out* RPCGENSRVNAME(get_signal_names_2_svc) (in, rqstp) - void* in; - struct svc_req *rqstp; /* server info */ + get_signal_names_out * +RPCGENSRVNAME (get_signal_names_2_svc) (void * in, struct svc_req * rqstp) { static get_signal_names_out out; - out.signals.all_signals_len = sizeof SignalNames / sizeof SignalNames[0]; + out.signals.all_signals_len = sizeof (SignalNames) / sizeof (SignalNames[0]); out.signals.all_signals_val = SignalNames; - return(&out); + return (&out); } diff --git a/c/src/librdbg/src/servtgt.c b/c/src/librdbg/src/servtgt.c index de41abc1a6..4e96f14916 100644 --- a/c/src/librdbg/src/servtgt.c +++ b/c/src/librdbg/src/servtgt.c @@ -9,12 +9,11 @@ ************************************************************************** */ - #include #include -#include -#include -#include +#include +#include +#include #include #ifdef DDEBUG @@ -23,229 +22,234 @@ #define Ptrace TgtRealPtrace #endif -/* ---------------------------------------------------------------- - TgtBreakRestoreOrig - Restore original instruction at "addr" - just before single-stepping it. - ---------------------------------------------------------------- */ +/* + * TgtBreakRestoreOrig - Restore original instruction at "addr" + * just before single-stepping it. + */ -int TgtBreakRestoreOrig (int pid, void *addr, void *addr2) - /* Process identifier */ - /* Breakpoint address */ - /* Original instruction or bkpt number */ + int +TgtBreakRestoreOrig (int pid, void *addr, void *addr2) + /* + * Process identifier + */ + /* + * Breakpoint address + */ + /* + * Original instruction or bkpt number + */ { int ret; int l; - - l = (long)Ptrace(RPT_PEEKTEXT, pid, addr, 0, NULL); /* assume ok */ - ret = ORG_BREAK (l, (UINT32) addr2); /* reconstruct old instr */ - ret = Ptrace(RPT_POKETEXT, pid, addr, ret, NULL); /* poke back old */ + + l = (long) Ptrace (RPT_PEEKTEXT, pid, addr, 0, NULL); /* assume ok */ + ret = ORG_BREAK (l, (UINT32) addr2); /* reconstruct old instr */ + ret = Ptrace (RPT_POKETEXT, pid, addr, ret, NULL); /* poke back old */ return ret; } -/* ----------------------------------------------------------------------- - TgtBreakCancelStep - Restore the breakpoint at "addr" if the single-step - has failed at the ptrace level. - ----------------------------------------------------------------------- */ +/* + * + * TgtBreakCancelStep - Restore the breakpoint at "addr" if the single-step + * has failed at the ptrace level. + */ #define BKPT0(plst) ((BASE_BREAK*)(plst)->break_list) -void TgtBreakCancelStep (PID_LIST* plst) + void +TgtBreakCancelStep (PID_LIST * plst) { assert (plst->break_list); assert (BKPT0 (plst)->clr_step); - if (plst->break_list && BKPT0 (plst)->clr_step) { + if (plst->break_list && BKPT0 (plst)->clr_step) { int idx = BKPT0 (plst)->last_break; int data; data = Ptrace (RPT_PEEKTEXT, plst->pid, - (char *)plst->break_list [idx].ee_loc, 0, NULL); - assert (! IS_BREAK (data)); + (char *) plst->break_list[idx].ee_loc, 0, NULL); + assert (!IS_BREAK (data)); Ptrace (RPT_POKETEXT, plst->pid, - (char *)plst->break_list[idx].ee_loc, - (int) SET_BREAK (data), NULL); + (char *) plst->break_list[idx].ee_loc, + (int) SET_BREAK (data), NULL); } } -/* ----------------------------------------------------------------------- - TgtCreateNew - add a new process into the process management lists. - ----------------------------------------------------------------------- */ +/* + * TgtCreateNew - add a new process into the process management lists. + */ - void -TgtCreateNew(PID pid, int conn, INT32 child, char *name, Boolean spawn) + void +TgtCreateNew (PID pid, int conn, INT32 child, char *name, Boolean spawn) { - int idx; + int idx; for (idx = 0; idx < pid_list_cnt; idx++) if (!pid_list[idx].pid) - break; /* find empty */ + break; /* find empty */ - if (idx >= pid_list_cnt) - { /* no empties, add more */ - PID_LIST *tmp_pid_list = pid_list; + if (idx >= pid_list_cnt) { /* no empties, add more */ + PID_LIST *tmp_pid_list = pid_list; pid_list_cnt += PID_LIST_INC; - pid_list = (PID_LIST*) Realloc(pid_list, /* get new or extend */ - pid_list_cnt * sizeof(PID_LIST)); - if (!pid_list) - { /* out of memory */ + pid_list = (PID_LIST *) Realloc (pid_list, /* get new or extend */ + pid_list_cnt * sizeof (PID_LIST)); + if (!pid_list) { /* out of memory */ pid_list_cnt -= PID_LIST_INC; - if (pid_list_cnt) - { /* realloc failed - malloc again */ - pid_list = tmp_pid_list; - /* above relies on old pointer being valid after failed realloc */ + if (pid_list_cnt) { /* realloc failed - malloc again */ + pid_list = tmp_pid_list; + /* + * above relies on old pointer being valid after failed realloc + */ } - return; /* failed */ + return; /* failed */ } - /* now clear newly added space */ - memset(pid_list+pid_list_cnt-PID_LIST_INC, 0, - PID_LIST_INC * sizeof(PID_LIST)); + /* + * now clear newly added space + */ + memset (pid_list + pid_list_cnt - PID_LIST_INC, 0, + PID_LIST_INC * sizeof (PID_LIST)); idx = pid_list_cnt - PID_LIST_INC; - } - else /* clear entry we found */ - memset(&pid_list[idx], 0, sizeof(PID_LIST)); + } else /* clear entry we found */ + memset (&pid_list[idx], 0, sizeof (PID_LIST)); - /* now fill in empty entry */ + /* + * now fill in empty entry + */ pid_list[idx].pid = pid; - pid_list[idx].running = 1; /* we have not called wait yet */ - pid_list[idx].primary_conn = (UCHAR)conn; /* primary owner */ - if (conn != -1) - { /* found caller */ + pid_list[idx].running = 1; /* we have not called wait yet */ + pid_list[idx].primary_conn = (UCHAR) conn; /* primary owner */ + if (conn != -1) { /* found caller */ pid_list[idx].owners = 1; - PIDMAP_SET (conn, idx); /* mask in */ + PIDMAP_SET (conn, idx); /* mask in */ } - pid_list[idx].thread = (UINT32)-1; /* no thread for now */ - pid_list[idx].last_start = LAST_START; /* handle MiX bug */ + pid_list[idx].thread = (UINT32) - 1; /* no thread for now */ + pid_list[idx].last_start = LAST_START; /* handle MiX bug */ - pid_list[idx].name = name ? (char *)StrDup(name) : (char *)NULL; + pid_list[idx].name = name ? (char *) StrDup (name) : (char *) NULL; } -/* ----------------------------------------------------------------------- - TgtNotifyWaitChange - send event to clients indicating child changed state. - ----------------------------------------------------------------------- */ +/* + * TgtNotifyWaitChange - send event to clients indicating child changed state. + */ - void -TgtNotifyWaitChange( PID pid, int status, Boolean exclude) + void +TgtNotifyWaitChange (PID pid, int status, Boolean exclude) { - int conn, idx; - - idx = FindPidEntry (pid); /* locate the pid that changed */ - if (idx < 0) - { - DPRINTF(("TgtNotifyWaitChange: pid %d not in our list\n", - (int) pid)); - return; /* not in our list */ + int conn, idx; + + idx = FindPidEntry (pid); /* locate the pid that changed */ + if (idx < 0) { + DPRINTF (("TgtNotifyWaitChange: pid %d not in our list\n", (int) pid)); + return; /* not in our list */ } - pid_list[idx].running = 0; /* not running */ - pid_list[idx].state = status; /* save status of stop/term */ - if (!pid_list[idx].owners && !STS_SIGNALLED(status)) - TgtDelete(&pid_list[idx], -1, 0); /* terminated and no owners */ - else - { /* normal cases */ - for (conn = 0; conn < conn_list_cnt; conn++) - { /* now find all interested clients */ - if (!conn_list[conn].in_use /* free entry */ - || ! PIDMAP_TEST (conn, idx)) - continue; /* not using this pid */ + pid_list[idx].running = 0; /* not running */ + pid_list[idx].state = status; /* save status of stop/term */ + if (!pid_list[idx].owners && !STS_SIGNALLED (status)) + TgtDelete (&pid_list[idx], -1, 0); /* terminated and no owners */ + else { /* normal cases */ + for (conn = 0; conn < conn_list_cnt; conn++) { /* now find all interested clients */ + if (!conn_list[conn].in_use /* free entry */ + || !PIDMAP_TEST (conn, idx)) + continue; /* not using this pid */ if (conn == exclude) - continue; /* do not do this one */ - TspSendWaitChange(conn, BMSG_WAIT, 1, pid, 0, False);/* notify of change */ + continue; /* do not do this one */ + TspSendWaitChange (conn, BMSG_WAIT, 1, pid, 0, False); /* notify of change */ } } } -/* ----------------------------------------------------------------------- - TgtNotifyAll - send a message to all clients interested in process. - ----------------------------------------------------------------------- */ +/* + * TgtNotifyAll - send a message to all clients interested in process. + */ - void - TgtNotifyAll( int pid_idx, BACK_MSG msg, UINT16 spec, - UINT32 context, int exclude, Boolean force) + void +TgtNotifyAll (int pid_idx, BACK_MSG msg, UINT16 spec, + UINT32 context, int exclude, Boolean force) { - int conn; + int conn; - DPRINTF(("TgtNotifyAll: msg %d (%s) for pid_idx=%d (%d,%d)\n", - msg, BmsgNames [msg], pid_idx, exclude, force)); + DPRINTF (("TgtNotifyAll: msg %d (%s) for pid_idx=%d (%d,%d)\n", + msg, BmsgNames[msg], pid_idx, exclude, force)); for (conn = 0; conn < conn_list_cnt; conn++) - if (conn_list[conn].in_use /* not free */ - && PIDMAP_TEST (conn, pid_idx)) - { + if (conn_list[conn].in_use /* not free */ + && PIDMAP_TEST (conn, pid_idx)) { if (conn != exclude) - TspSendWaitChange(conn, msg, spec, pid_list[pid_idx].pid, context, - force); + TspSendWaitChange (conn, msg, spec, pid_list[pid_idx].pid, context, + force); } } -/* ----------------------------------------------------------------------- - TgtDelete - mark process as now uncontrolled. - - Notes: - - this function removes a process from the process list. - - the notify argument indicates a message to send if needed. - ----------------------------------------------------------------------- */ +/* + * TgtDelete - mark process as now uncontrolled. + * + * Notes: + * - this function removes a process from the process list. + * - the notify argument indicates a message to send if needed. + */ -void TgtDelete(PID_LIST *plst, int conn_idx, BACK_MSG notify) + void +TgtDelete (PID_LIST * plst, int conn_idx, BACK_MSG notify) { - int idx = plst - pid_list, cnt, conn; + int idx = plst - pid_list, cnt, conn; - /* found */ + /* + * found + */ cnt = pid_list[idx].owners; - if (cnt) - { /* some connections to break */ + if (cnt) { /* some connections to break */ for (conn = 0; cnt && conn < conn_list_cnt; conn++) - if (conn_list[conn].in_use /* not free */ - && PIDMAP_TEST (conn, idx)) - { /* found one that uses it */ - PIDMAP_CLEAR (conn, idx); - if (notify && conn != conn_idx) - TspSendWaitChange(conn, notify, 0, plst->pid, 0, True); - if (!--cnt) - break; + if (conn_list[conn].in_use /* not free */ + && PIDMAP_TEST (conn, idx)) { /* found one that uses it */ + PIDMAP_CLEAR (conn, idx); + if (notify && conn != conn_idx) + TspSendWaitChange (conn, notify, 0, plst->pid, 0, True); + if (!--cnt) + break; } } if (pid_list[idx].name) - Free(pid_list[idx].name); /* free string name back */ - /* Free breakpoint list */ - if (pid_list [idx].break_list != NULL) { - Free (pid_list [idx].break_list); + Free (pid_list[idx].name); /* free string name back */ + /* + * Free breakpoint list + */ + if (pid_list[idx].break_list != NULL) { + Free (pid_list[idx].break_list); } - pid_list[idx].pid = 0; /* gone */ + pid_list[idx].pid = 0; /* gone */ } +/* + * TgtKillAndDelete - kill or detach process and remove entry. + */ -/* ----------------------------------------------------------------------- - TgtKillAndDelete - kill or detach process and remove entry. - ----------------------------------------------------------------------- */ - - int -TgtKillAndDelete( PID_LIST *plst, struct svc_req *rqstp, Boolean term) + int +TgtKillAndDelete (PID_LIST * plst, struct svc_req *rqstp, Boolean term) { - ptrace_in pin; /* used for ptrace call */ - ptrace_out *pout; + ptrace_in pin; /* used for ptrace call */ + ptrace_out *pout; - /* Remove breakpoints */ + /* + * Remove breakpoints + */ if (plst->break_alloc > 0) { pin.pid = plst->pid; pin.addr.req = RPT_CLRBREAK; - pin.data = 0; /* clear all */ + pin.data = 0; /* clear all */ pin.flags = PTRFLG_NON_OWNER; - pout = RPCGENSRVNAME(ptrace_2_svc) (&pin, rqstp); + pout = RPCGENSRVNAME (ptrace_2_svc) (&pin, rqstp); if (pout->result < 0) { - DPRINTF (("TgtKillAndDelete: RPT_CLRBREAK failed %d\n", - getErrno())); + DPRINTF (("TgtKillAndDelete: RPT_CLRBREAK failed %d\n", getErrno ())); return -1; } } - if (term) - { /* kill */ + if (term) { /* kill */ pin.addr.ptrace_addr_data_in_u.address = 0; - pin.data = -1; /* Don't want notification from slave */ + pin.data = -1; /* Don't want notification from slave */ pin.addr.req = RPT_KILL; - } - else - { /* detach */ + } else { /* detach */ pin.addr.ptrace_addr_data_in_u.address = 1; pin.data = 0; pin.addr.req = RPT_DETACH; @@ -254,26 +258,24 @@ TgtKillAndDelete( PID_LIST *plst, struct svc_req *rqstp, Boolean term) pin.flags = PTRFLG_FREE | PTRFLG_NON_OWNER; DPRINTF (("TgtKillAndDelete: ptrace_2_svc (%s (%d), %d)\n", - PtraceName (pin.addr.req), pin.addr.req, pin.pid)); + PtraceName (pin.addr.req), pin.addr.req, pin.pid)); - pout = RPCGENSRVNAME(ptrace_2_svc) (&pin, rqstp);/* start it */ + pout = RPCGENSRVNAME (ptrace_2_svc) (&pin, rqstp); /* start it */ if (pout->errNo == ESRCH && plst->pid) - TgtDelete(plst, -1, BMSG_KILLED); /* only entry remains */ + TgtDelete (plst, -1, BMSG_KILLED); /* only entry remains */ return 0; } -/* ----------------------------------------------------------------------- - TgtDetachCon - detach a connection's ownership of a process. - ----------------------------------------------------------------------- */ +/* + * TgtDetachCon - detach a connection's ownership of a process. + */ - void -TgtDetachCon( int conn_idx, int pid_idx, Boolean delete) + void +TgtDetachCon (int conn_idx, int pid_idx, Boolean delete) { - if ((unsigned) pid_idx >= pid_list_cnt - || !pid_list[pid_idx].pid) - return; /* not valid */ - if (PIDMAP_TEST (conn_idx, pid_idx)) - { /* if an owner, release control */ + if ((unsigned) pid_idx >= pid_list_cnt || !pid_list[pid_idx].pid) + return; /* not valid */ + if (PIDMAP_TEST (conn_idx, pid_idx)) { /* if an owner, release control */ PIDMAP_CLEAR (conn_idx, pid_idx); if (pid_list[pid_idx].owners) @@ -281,9 +283,8 @@ TgtDetachCon( int conn_idx, int pid_idx, Boolean delete) if (pid_list[pid_idx].primary_conn == conn_idx) pid_list[pid_idx].primary_conn = NO_PRIMARY; if (delete - && !pid_list[pid_idx].owners - && PROC_TERMINATED (pid_list + pid_idx)) - TgtDelete(&pid_list[pid_idx], -1, 0); /* remove entry */ + && !pid_list[pid_idx].owners && PROC_TERMINATED (pid_list + pid_idx)) + TgtDelete (&pid_list[pid_idx], -1, 0); /* remove entry */ } } @@ -293,231 +294,254 @@ TgtDetachCon( int conn_idx, int pid_idx, Boolean delete) ----------------------------------------------------------------------- */ #ifdef DDEBUG -static char* LastStartNames[] = { +static char *LastStartNames[] = { "NONE", "STEP", "CONT", "RANGE", "STEPOFF", "KILLED", "DETACHED" }; -char* GetLastStartName (int last_start) + char * +GetLastStartName (int last_start) { - static char buf [32]; + static char buf[32]; - strcpy (buf, LastStartNames [last_start & ~LAST_START]); - if (last_start & LAST_START) { - strcat (buf, "+START"); - } - return buf; + strcpy (buf, LastStartNames[last_start & ~LAST_START]); + if (last_start & LAST_START) { + strcat (buf, "+START"); + } + return buf; } #endif -Boolean TgtHandleChildChange(PID pid, int* status, int *unexp, - CPU_Exception_frame* ctx) -{ /* return False if continue, else stop */ - int idx, sig; - int bidx = 0; - PID_LIST *plst; - unsigned long PC; - BASE_BREAK *base = NULL; /* break_list[0] is really BASE_BREAK */ - int hadStepEmul; - int origHadStepEmul; - int stopWanted; + Boolean +TgtHandleChildChange (PID pid, int *status, int *unexp, + CPU_Exception_frame * ctx) +{ /* return False if continue, else stop */ + int idx, sig; + int bidx = 0; + PID_LIST *plst; + unsigned long PC; + BASE_BREAK *base = NULL; /* break_list[0] is really BASE_BREAK */ + int hadStepEmul; + int origHadStepEmul; + int stopWanted; DPRINTF (("TgtHandleChildChange: pid %d status %x cap\n", - (int) pid, *status)); + (int) pid, *status)); if (unexp) - *unexp = 0; /* initialize to ok */ + *unexp = 0; /* initialize to ok */ - /* first, find pid in question */ + /* + * first, find pid in question + */ idx = FindPidEntry (pid); - if (idx < 0) - { /* cannot locate this process */ + if (idx < 0) { /* cannot locate this process */ DPRINTF (("TgtHandleChildChange: unknown process (%s pid)\n", - FindPidEntry (pid) >= 0 ? "stale" : "unknown")); + FindPidEntry (pid) >= 0 ? "stale" : "unknown")); if (unexp) - *unexp = 1; /* Unexpected change */ - return(False); /* unknown: ignore (used to stop and notify) */ + *unexp = 1; /* Unexpected change */ + return (False); /* unknown: ignore (used to stop and notify) */ } - /* found */ - plst = &pid_list[idx]; /* pointer to entry */ - /* first we see if just stopped */ + /* + * found + */ + plst = &pid_list[idx]; /* pointer to entry */ + /* + * first we see if just stopped + */ - /* copy ctxt */ - CtxToRegs(ctx, &(plst->regs)); + /* + * copy ctxt + */ + CtxToRegs (ctx, &(plst->regs)); stopWanted = plst->stop_wanted; - plst->stop_wanted = 0; /* For the next time */ + plst->stop_wanted = 0; /* For the next time */ hadStepEmul = BreakClear (plst, -1, -1) > 0; - origHadStepEmul = hadStepEmul; /* hadStepEmul is cleared if real bkpt met */ + origHadStepEmul = hadStepEmul; /* hadStepEmul is cleared if real bkpt met */ - if (STS_SIGNALLED (*status)) - { /* stopped, not terminated */ - sig = STS_GETSIG (*status); /* signal that stopped us */ + if (STS_SIGNALLED (*status)) { /* stopped, not terminated */ + sig = STS_GETSIG (*status); /* signal that stopped us */ - /* now, we read the registers and see what to do next */ - if (TgtPtrace(RPT_GETREGS, pid, (void *)&plst->regs, 0, NULL) < 0) { - memset (&plst->regs, 0, sizeof plst->regs); + /* + * now, we read the registers and see what to do next + */ + if (TgtPtrace (RPT_GETREGS, pid, (void *) &plst->regs, 0, NULL) < 0) { + memset (&plst->regs, 0, sizeof (plst->regs)); } - /* Get current thread */ - plst->thread = TgtPtrace(RPT_GETTARGETTHREAD, pid, NULL, 0, NULL); + /* + * Get current thread + */ + plst->thread = TgtPtrace (RPT_GETTARGETTHREAD, pid, NULL, 0, NULL); - if (sig == SIGTRAP) - { /* stopped from break/step */ + if (sig == SIGTRAP) { /* stopped from break/step */ PC = plst->regs.REG_PC; - /* Must check PC to see whether in situations where we had - step emulation we are on a breakpoint or just - have returned from an emulated single-step */ - if (BreakIdentify (plst, 0 /*no adjust*/, -1 /*no thread*/) > 0) { - hadStepEmul = 0; + /* + * Must check PC to see whether in situations where we had + * step emulation we are on a breakpoint or just + * have returned from an emulated single-step + */ + if (BreakIdentify (plst, 0 /*no adjust */ , -1 /*no thread */ ) > 0) { + hadStepEmul = 0; } - plst->is_step = hadStepEmul || IS_STEP(plst->regs) - || plst->last_start == LAST_START; + plst->is_step = hadStepEmul || IS_STEP (plst->regs) + || plst->last_start == LAST_START; DPRINTF (("TgtHandleChildChange: %s last_start %s\n", plst->is_step - ? "step": "break", GetLastStartName (plst->last_start))); + ? "step" : "break", GetLastStartName (plst->last_start))); if ((plst->is_step || origHadStepEmul || stopWanted) - && (plst->last_start == LAST_STEP - || plst->last_start == LAST_STEPOFF - || plst->last_start == LAST_RANGE)) - { - DPRINTF (("TgtHandleChildChange: restoring stepped-off bkpt\n")); - BreakSteppedOff (plst); + && (plst->last_start == LAST_STEP + || plst->last_start == LAST_STEPOFF + || plst->last_start == LAST_RANGE)) { + DPRINTF (("TgtHandleChildChange: restoring stepped-off bkpt\n")); + BreakSteppedOff (plst); } - if (plst->last_start == LAST_STEPOFF && (plst->is_step||origHadStepEmul)) - { /* stepped off break and now need cont */ - DPRINTF (("TgtHandleChildChange: auto-resuming after step-off\n")); - plst->last_start = LAST_CONT; /* convert to normal cont */ - if (!stopWanted) { - if (TgtPtrace(RPT_CONT, pid, (char *)1, 0, NULL)) - return True; /* tell people */ - return(False); /* wait for change */ - } - DPRINTF (("TgtHandleChildChange: stop_wanted %d in step-off\n", - stopWanted)); - *status = STS_MAKESIG (stopWanted); - return True; /* Stop and notify */ + if (plst->last_start == LAST_STEPOFF && (plst->is_step || origHadStepEmul)) { /* stepped off break and now need cont */ + DPRINTF (("TgtHandleChildChange: auto-resuming after step-off\n")); + plst->last_start = LAST_CONT; /* convert to normal cont */ + if (!stopWanted) { + if (TgtPtrace (RPT_CONT, pid, (char *) 1, 0, NULL)) + return True; /* tell people */ + return (False); /* wait for change */ + } + DPRINTF (("TgtHandleChildChange: stop_wanted %d in step-off\n", + stopWanted)); + *status = STS_MAKESIG (stopWanted); + return True; /* Stop and notify */ } - base = plst->break_list ? ((BASE_BREAK*)plst->break_list) : - ((BASE_BREAK*)NULL); - /* now see if step in range */ - - if (plst->last_start == LAST_RANGE /* step in range */ - && (plst->is_step || origHadStepEmul) /* not a breakpoint */ - && PC >= base->range_start - && PC <= base->range_end) - { /* still in range, keep going */ - if (stopWanted) { - DPRINTF (("TgtHandleChildChange: stop_wanted %d in step-range\n", - stopWanted)); - } else { - DPRINTF (("TgtHandleChildChange: Reservation at %x\n", - plst->regs.REG_PC)); - } + base = plst->break_list ? ((BASE_BREAK *) plst->break_list) : + ((BASE_BREAK *) NULL); + /* + * now see if step in range + */ + + if (plst->last_start == LAST_RANGE /* step in range */ + && (plst->is_step || origHadStepEmul) /* not a breakpoint */ + &&PC >= base->range_start && PC <= base->range_end) { /* still in range, keep going */ + if (stopWanted) { + DPRINTF (("TgtHandleChildChange: stop_wanted %d in step-range\n", + stopWanted)); + } else { + DPRINTF (("TgtHandleChildChange: Reservation at %x\n", + plst->regs.REG_PC)); + } } - if (!plst->is_step) /* was break */ - { - bidx = BreakIdentify (plst, 1 /*adjust*/, plst->thread); - if (bidx == 0) { - DPRINTF (("TgtHandleChildChange: forwarding bkpt to kernel\n")); - if (unexp) { - *unexp = 1; - } - return False; - } - if (bidx < 0) { /* Unwanted breakpoint, must step it off */ - ptrace_in pin; - ptrace_out* out; - if (origHadStepEmul) - { - DPRINTF (("TgtHandleChildChange: bkpt %x becomes step\n", - plst->regs.REG_PC)); - bidx = -bidx; - plst->is_step = 1; - base->clr_step = plst->break_list [bidx].type == BRKT_INSTR; - base->last_break = bidx; - return True; - } - if (stopWanted) { - DPRINTF (("TgtHandleChildChange: stop_wanted %d at bkpt %x\n", - stopWanted, plst->regs.REG_PC)); - /* The PC has already been adjusted by BreakIdentify */ - *status = STS_MAKESIG (stopWanted); - return True; - } - /* All the handling is done in ptrace_2_svc() so call it */ - bidx = -bidx; - DPRINTF (("TgtHandleChildChange: last %d (%s) restarting bkpt %d\n", - plst->last_start, GetLastStartName (plst->last_start), bidx)); - base->clr_step = 1; - base->last_break = bidx; /* remember which one */ - plst->running = 0; /* So that ptrace is accepted */ - pin.pid = plst->pid; - - if (plst->last_start == LAST_STEP) { - pin.addr.req = RPT_SINGLESTEP; - } else { - pin.addr.req = RPT_CONT; - } - pin.addr.ptrace_addr_data_in_u.address = 1; - pin.data = 0; - pin.flags = PTRFLG_NON_OWNER; - out = RPCGENSRVNAME(ptrace_2_svc) (&pin, NULL); - if (out->result == 0) return False; /* Continue waiting */ - DPRINTF(("TgtHandleChildChange: failed to restart bkpt!\n")); - /* If something went wrong, just stop on breakpoint */ - } + if (!plst->is_step) { /* was break */ + bidx = BreakIdentify (plst, 1 /*adjust */ , plst->thread); + if (bidx == 0) { + DPRINTF (("TgtHandleChildChange: forwarding bkpt to kernel\n")); + if (unexp) { + *unexp = 1; + } + return False; + } + if (bidx < 0) { /* Unwanted breakpoint, must step it off */ + ptrace_in pin; + ptrace_out *out; + if (origHadStepEmul) { + DPRINTF (("TgtHandleChildChange: bkpt %x becomes step\n", + plst->regs.REG_PC)); + bidx = -bidx; + plst->is_step = 1; + base->clr_step = plst->break_list[bidx].type == BRKT_INSTR; + base->last_break = bidx; + return True; + } + if (stopWanted) { + DPRINTF (("TgtHandleChildChange: stop_wanted %d at bkpt %x\n", + stopWanted, plst->regs.REG_PC)); + /* + * The PC has already been adjusted by BreakIdentify + */ + *status = STS_MAKESIG (stopWanted); + return True; + } + /* + * All the handling is done in ptrace_2_svc() so call it + */ + bidx = -bidx; + DPRINTF (("TgtHandleChildChange: last %d (%s) restarting bkpt %d\n", + plst->last_start, GetLastStartName (plst->last_start), + bidx)); + base->clr_step = 1; + base->last_break = bidx; /* remember which one */ + plst->running = 0; /* So that ptrace is accepted */ + pin.pid = plst->pid; + + if (plst->last_start == LAST_STEP) { + pin.addr.req = RPT_SINGLESTEP; + } else { + pin.addr.req = RPT_CONT; + } + pin.addr.ptrace_addr_data_in_u.address = 1; + pin.data = 0; + pin.flags = PTRFLG_NON_OWNER; + out = RPCGENSRVNAME (ptrace_2_svc) (&pin, NULL); + if (out->result == 0) + return False; /* Continue waiting */ + DPRINTF (("TgtHandleChildChange: failed to restart bkpt!\n")); + /* + * If something went wrong, just stop on breakpoint + */ + } } - } /* else sig != SIGTRAP */ - - /* finally, fill in stop info in break point array base */ - if (bidx > 0) - { /* store break info */ - /* will need to get off the break for SW breakpoints only */ - base->clr_step = plst->break_list [bidx].type == BRKT_INSTR; - base->last_break = bidx; /* remember which one */ } - else if (base) - { /* clear break info */ - base->clr_step = False; /* not stopped on break */ + + /* + * else sig != SIGTRAP + */ + /* + * finally, fill in stop info in break point array base + */ + if (bidx > 0) { /* store break info */ + /* + * will need to get off the break for SW breakpoints only + */ + base->clr_step = plst->break_list[bidx].type == BRKT_INSTR; + base->last_break = bidx; /* remember which one */ + } else if (base) { /* clear break info */ + base->clr_step = False; /* not stopped on break */ base->last_break = 0; } - /* decision to notify owner based on last_start */ - } /* stopped */ - else /* terminated */ - { - if (plst->last_start == LAST_START) - { /* spawn failed */ - TgtNotifyAll(idx, BMSG_EXEC_FAIL, 0, 0, -1, True); - plst->running = False; /* not running - dead */ - plst->state = *status; /* contains errno in high word */ - return(False); + /* + * decision to notify owner based on last_start + */ + } /* stopped */ + else { /* terminated */ + + if (plst->last_start == LAST_START) { /* spawn failed */ + TgtNotifyAll (idx, BMSG_EXEC_FAIL, 0, 0, -1, True); + plst->running = False; /* not running - dead */ + plst->state = *status; /* contains errno in high word */ + return (False); } - - else if ((UCHAR)(plst->last_start & ~LAST_START) < (UCHAR)LAST_KILLED) + + else if ((UCHAR) (plst->last_start & ~LAST_START) < (UCHAR) LAST_KILLED) plst->last_start = LAST_NONE; /* doesn't matter anymore */ else - return(False); /* killed and detach already notified */ + return (False); /* killed and detach already notified */ } - return(True); /* stop and notify */ + return (True); /* stop and notify */ } #ifdef DDEBUG -/* ----------------------------------------------------------------------- - TgtDbgPtrace - debug version of ptrace. - ----------------------------------------------------------------------- */ +/* + * TgtDbgPtrace - debug version of ptrace. + */ -int TgtDbgPtrace(int request, PID pid, char *addr, int data, void *addr2) + int +TgtDbgPtrace (int request, PID pid, char *addr, int data, void *addr2) { - int diag; + int diag; DPRINTF (("TgtDbgPtrace: entered (%s (%d), %d, %x, %d, %x)\n", - PtraceName (request), request, pid, (int) addr, data, - (int) addr2)); + PtraceName (request), request, pid, (int) addr, data, + (int) addr2)); if (request == RPT_WRITETEXT || request == RPT_WRITEDATA) { int i; @@ -525,7 +549,7 @@ int TgtDbgPtrace(int request, PID pid, char *addr, int data, void *addr2) DPRINTF (("TgtDbgPtrace:")); if (rdb_debug) { for (i = 0; i < data && i < 16; ++i) { - printf (" %02x", ((char*) addr2) [i] & 0xFF); + printf (" %02x", ((char *) addr2)[i] & 0xFF); } printf ("\n"); } @@ -534,19 +558,19 @@ int TgtDbgPtrace(int request, PID pid, char *addr, int data, void *addr2) diag = TgtRealPtrace (request, pid, addr, data, addr2); DPRINTF (("TgtDbgPtrace: returned %d (%x) errno %d\n", - diag, diag, getErrno())); + diag, diag, getErrno ())); if (request == RPT_GETREGS || request == RPT_GETTHREADREGS - || request == RPT_SETREGS || request == RPT_SETTHREADREGS) - { - /* Use DPRINTF() so as to have the id prefix */ + || request == RPT_SETREGS || request == RPT_SETTHREADREGS) { + /* + * Use DPRINTF() so as to have the id prefix + */ DPRINTF (("TgtDbgPtrace: (%s) PC = %x, SP = %x, FP = %x\n", - PtraceName (request), - ((xdr_regs*)addr)->REG_PC, - ((xdr_regs*)addr)->REG_SP, - ((xdr_regs*)addr)->REG_FP)); + PtraceName (request), + ((xdr_regs *) addr)->REG_PC, + ((xdr_regs *) addr)->REG_SP, ((xdr_regs *) addr)->REG_FP)); } - return(diag); + return (diag); } -#endif /* DDEBUG */ +#endif /* DDEBUG */ diff --git a/c/src/librdbg/src/servtsp.c b/c/src/librdbg/src/servtsp.c index db342d58f9..634da70506 100644 --- a/c/src/librdbg/src/servtsp.c +++ b/c/src/librdbg/src/servtsp.c @@ -12,50 +12,52 @@ */ #include -#include +#include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include -static int out_sock; -static int warm_test; +static int out_sock; +static int warm_test; -static void TimeTestHandler(); +static void TimeTestHandler (); /* * TspInit - Initialize the transport system. * */ - void + void TspInit (int id) { - struct sigaction sa; - - /* setup a socket to send event messages back through */ - out_sock = socket (PF_INET, SOCK_DGRAM, 0); - if (out_sock < 0) { - DPRINTF (("TspInit: socket() failed %d errno %d\n", - out_sock, getErrno())); - return; /* failed to open socket, let caller deal with */ - } - { - struct sockaddr_in addr; - - bzero ((void *)(&addr), sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = htons (BackPort); - if (bind (out_sock, (struct sockaddr*) &addr, sizeof addr) < 0) { - DPRINTF (("TspInit: bind() failed\n")); - } - } - /* setup alarm timer for warm testing */ - memset (&sa, 0, sizeof (sa)); - sa.sa_handler = TimeTestHandler; - sigaction (SIGALRM, &sa, 0); + struct sigaction sa; + struct sockaddr_in addr; + + /* + * setup a socket to send event messages back through + */ + out_sock = socket (PF_INET, SOCK_DGRAM, 0); + if (out_sock < 0) { + DPRINTF (("TspInit: socket() failed %d errno %d\n", + out_sock, getErrno ())); + return; /* failed to open socket, let caller deal with */ + } + + bzero ((void *) (&addr), sizeof (addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons (BackPort); + if (bind (out_sock, (struct sockaddr *) &addr, sizeof (addr)) < 0) { + DPRINTF (("TspInit: bind() failed\n")); + } + /* + * setup alarm timer for warm testing + */ + memset (&sa, 0, sizeof (sa)); + sa.sa_handler = TimeTestHandler; + sigaction (SIGALRM, &sa, 0); } /* @@ -67,38 +69,43 @@ TspInit (int id) * on each call. */ - Boolean -TspTranslateRpcAddr (struct svc_req* rqstp, NET_OPAQUE* opaque) + Boolean +TspTranslateRpcAddr (struct svc_req *rqstp, NET_OPAQUE * opaque) { - struct sockaddr_in* addr; /* used as template to extract net info */ - unsigned char* up; - - memset (opaque, 0, sizeof (NET_OPAQUE)); - /* - * We interpret the remote address as a standard netbuf name. - * The format is 2 bytes of address family (normally AF_INET) - * and then a length (5) and then the IP address. - */ - if (rqstp->rq_xprt->xp_addrlen != 16) - { - DPRINTF (("TspTranslateRpcAddr: Unknown remote address!!!\n")); - setErrno (EPROTONOSUPPORT); - return False; /* invalid, so fails */ - } - /* addr = &rqstp->rq_xprt->xp_raddr; */ - addr = svc_getcaller (rqstp->rq_xprt); - /* verify it is AF_INET */ - if (addr->sin_family != AF_INET) { /* no, error */ - DPRINTF (("TspTranslateRpcAddr: Not an internet address!!\n")); - setErrno (EAFNOSUPPORT);/* invalid addr family */ - return False; - } - /* good address type */ - up = (unsigned char *) &addr->sin_addr.s_addr; - DPRINTF (("TspTranslateRpcAddr: Sent by %u.%u.%u.%u port #%u\n", - up[0], up[1], up[2], up[3], htons (addr->sin_port))); - memcpy (opaque, addr, sizeof (struct sockaddr_in)); - return True; + struct sockaddr_in *addr; /* used as template to extract net info */ + unsigned char *up; + + memset (opaque, 0, sizeof (NET_OPAQUE)); + /* + * We interpret the remote address as a standard netbuf name. + * The format is 2 bytes of address family (normally AF_INET) + * and then a length (5) and then the IP address. + */ + if (rqstp->rq_xprt->xp_addrlen != 16) { + DPRINTF (("TspTranslateRpcAddr: Unknown remote address!!!\n")); + setErrno (EPROTONOSUPPORT); + return False; /* invalid, so fails */ + } + /* + * addr = &rqstp->rq_xprt->xp_raddr; + */ + addr = svc_getcaller (rqstp->rq_xprt); + /* + * verify it is AF_INET + */ + if (addr->sin_family != AF_INET) { /* no, error */ + DPRINTF (("TspTranslateRpcAddr: Not an internet address!!\n")); + setErrno (EAFNOSUPPORT); /* invalid addr family */ + return False; + } + /* + * good address type + */ + up = (unsigned char *) &addr->sin_addr.s_addr; + DPRINTF (("TspTranslateRpcAddr: Sent by %u.%u.%u.%u port #%u\n", + up[0], up[1], up[2], up[3], htons (addr->sin_port))); + memcpy (opaque, addr, sizeof (struct sockaddr_in)); + return True; } /* @@ -108,22 +115,26 @@ TspTranslateRpcAddr (struct svc_req* rqstp, NET_OPAQUE* opaque) * expected. */ - Boolean -TspValidateAddr (NET_OPAQUE* opaque, NET_OPAQUE* sender) + Boolean +TspValidateAddr (NET_OPAQUE * opaque, NET_OPAQUE * sender) { - struct sockaddr_in* addr; /* used as template to extract net info */ - - addr = (struct sockaddr_in*) opaque; - /* Verify it is AF_INET. Should check against sender IP address too */ - if (addr->sin_family != AF_INET) { - DPRINTF (("TspValidateAddr: Back port invalid: %d\n", - htons (addr->sin_port))); - return False; /* not valid */ - } - /* otherwise, we copy in the IP address, since client may not know it */ - addr->sin_addr.s_addr = ((struct sockaddr_in*) sender)->sin_addr.s_addr; - DPRINTF (("TspValidateAddr: Back port is %d\n", htons (addr->sin_port))); - return True; + struct sockaddr_in *addr; /* used as template to extract net info */ + + addr = (struct sockaddr_in *) opaque; + /* + * Verify it is AF_INET. Should check against sender IP address too + */ + if (addr->sin_family != AF_INET) { + DPRINTF (("TspValidateAddr: Back port invalid: %d\n", + htons (addr->sin_port))); + return False; /* not valid */ + } + /* + * otherwise, we copy in the IP address, since client may not know it + */ + addr->sin_addr.s_addr = ((struct sockaddr_in *) sender)->sin_addr.s_addr; + DPRINTF (("TspValidateAddr: Back port is %d\n", htons (addr->sin_port))); + return True; } /* @@ -133,118 +144,123 @@ TspValidateAddr (NET_OPAQUE* opaque, NET_OPAQUE* sender) * connection index in our connection array. */ - int -TspConnGetIndex (struct svc_req* rqstp) + int +TspConnGetIndex (struct svc_req *rqstp) { - int conn; - /* &rqstp->rq_xprt->xp_raddr; */ - struct sockaddr_in *addr = svc_getcaller (rqstp->rq_xprt); - - for (conn = 0; conn < conn_list_cnt; conn++) { - if (!conn_list[conn].in_use) - continue; /* not used */ - - if (addr->sin_addr.s_addr == ((struct sockaddr_in *) - &conn_list [conn].sender)->sin_addr.s_addr - && addr->sin_port == ((struct sockaddr_in *) - &conn_list[conn].sender)->sin_port) { - return conn; - } + int conn; + /* + * &rqstp->rq_xprt->xp_raddr; + */ + struct sockaddr_in *addr = svc_getcaller (rqstp->rq_xprt); + + for (conn = 0; conn < conn_list_cnt; conn++) { + if (!conn_list[conn].in_use) + continue; /* not used */ + + if (addr->sin_addr.s_addr == ((struct sockaddr_in *) + &conn_list[conn].sender)->sin_addr.s_addr + && addr->sin_port == ((struct sockaddr_in *) + &conn_list[conn].sender)->sin_port) { + return conn; } - return -1; + } + return -1; } - /* * TspSendWaitChange - send wait-change message to clients to * notify change. */ - void -TspSendWaitChange( - int conn, /* connection to send to */ - BACK_MSG msg, /* BMSG type */ - UINT16 spec, /* special information */ - PID pid, /* pid it refers to */ - UINT32 context, /* additional context for message */ - Boolean force) /* force into being only message */ -{ - int idx; - struct SEND_LIST* snd_ptr; - - if (force) { - /* force to top, which means others gone */ - idx = 0; - conn_list [conn].send_idx = 1; - conn_list[conn].retry = 0; - } else { - for (idx = 0; idx < (int) conn_list[conn].send_idx; idx++) { - if (conn_list[conn].send_list[idx].send_type == msg - && conn_list[conn].send_list[idx].pid == pid) - return; /* already pended for this pid */ - } - idx = conn_list[conn].send_idx; - if (idx+1 > MAX_SEND) - return; /* we lose it, what should we do??? */ - conn_list[conn].send_idx++; + void +TspSendWaitChange (int conn, /* connection to send to */ + BACK_MSG msg, /* BMSG type */ + UINT16 spec, /* special information */ + PID pid, /* pid it refers to */ + UINT32 context, /* additional context for message */ + Boolean force) /* force into being only message */ +{ + int idx; + struct SEND_LIST *snd_ptr; + + if (force) { + /* + * force to top, which means others gone + */ + idx = 0; + conn_list[conn].send_idx = 1; + conn_list[conn].retry = 0; + } else { + for (idx = 0; idx < (int) conn_list[conn].send_idx; idx++) { + if (conn_list[conn].send_list[idx].send_type == msg + && conn_list[conn].send_list[idx].pid == pid) + return; /* already pended for this pid */ } - snd_ptr = &conn_list[conn].send_list[idx]; - snd_ptr->send_type = msg; /* message to send */ - snd_ptr->retry = TSP_RETRIES; /* about 1 minute of retries */ - snd_ptr->spec = htons ((u_short) spec); - snd_ptr->pid = htonl (pid); - snd_ptr->context = htonl (context); - TspSendMessage (conn, False); /* now do the send */ + idx = conn_list[conn].send_idx; + if (idx + 1 > MAX_SEND) + return; /* we lose it, what should we do??? */ + conn_list[conn].send_idx++; + } + snd_ptr = &conn_list[conn].send_list[idx]; + snd_ptr->send_type = msg; /* message to send */ + snd_ptr->retry = TSP_RETRIES; /* about 1 minute of retries */ + snd_ptr->spec = htons ((u_short) spec); + snd_ptr->pid = htonl (pid); + snd_ptr->context = htonl (context); + TspSendMessage (conn, False); /* now do the send */ } /* * TspSendMessage - send message at top of send list for connection. */ - void -TspSendMessage( int conn, Boolean resend) + void +TspSendMessage (int conn, Boolean resend) { - struct sockaddr_in addr; - struct UDP_MSG msg; - int cnt; - - if (!resend && conn_list[conn].retry) - return; /* already waiting for reply */ - - /* - * Note on above: if no back port we can't remove unless - * someone blows off. - */ - if (!resend) { - /* first time, setup. Set retry count: */ - conn_list[conn].retry = conn_list[conn].send_list[0].retry; - conn_list[conn].last_msg_num++; /* new sequence number */ - if (!warm_test++) { /* starting, so enable timer */ - alarm (2); /* resend every 2 seconds as needed */ - } - } - - msg.type = conn_list[conn].send_list[0].send_type; - msg.msg_num = conn_list[conn].last_msg_num; - msg.spec = conn_list[conn].send_list[0].spec; - msg.pid = conn_list[conn].send_list[0].pid; - msg.context = conn_list[conn].send_list[0].context; - - memset (&addr, 0, sizeof addr); - addr.sin_family = AF_INET; - addr.sin_port = ((struct sockaddr_in*)&conn_list[conn].back_port)->sin_port; - addr.sin_addr.s_addr = - ((struct sockaddr_in*)&conn_list[conn].back_port)->sin_addr.s_addr; - - DPRINTF (("TspSendMessage: Sending msg %d (%s) to port %d\n", - msg.type, BmsgNames [msg.type], HL_W (addr.sin_port))); - - cnt = sendto (out_sock, &msg, sizeof msg, 0, (struct sockaddr*) &addr, - sizeof addr); - if (cnt != sizeof msg) { /* failed on send */ - printf ("%s: Failed to send msg %d to conn %d (%d vs. %d)\n", - ActName, msg.type, conn, cnt, sizeof msg); + struct sockaddr_in addr; + struct UDP_MSG msg; + int cnt; + + if (!resend && conn_list[conn].retry) + return; /* already waiting for reply */ + + /* + * Note on above: if no back port we can't remove unless + * someone blows off. + */ + if (!resend) { + /* + * first time, setup. Set retry count: + */ + conn_list[conn].retry = conn_list[conn].send_list[0].retry; + conn_list[conn].last_msg_num++; /* new sequence number */ + if (!warm_test++) { /* starting, so enable timer */ + alarm (2); /* resend every 2 seconds as needed */ } + } + + msg.type = conn_list[conn].send_list[0].send_type; + msg.msg_num = conn_list[conn].last_msg_num; + msg.spec = conn_list[conn].send_list[0].spec; + msg.pid = conn_list[conn].send_list[0].pid; + msg.context = conn_list[conn].send_list[0].context; + + memset (&addr, 0, sizeof (addr)); + addr.sin_family = AF_INET; + addr.sin_port = + ((struct sockaddr_in *) &conn_list[conn].back_port)->sin_port; + addr.sin_addr.s_addr = + ((struct sockaddr_in *) &conn_list[conn].back_port)->sin_addr.s_addr; + + DPRINTF (("TspSendMessage: Sending msg %d (%s) to port %d\n", + msg.type, BmsgNames[msg.type], HL_W (addr.sin_port))); + + cnt = sendto (out_sock, &msg, sizeof (msg), 0, (struct sockaddr *) &addr, + sizeof (addr)); + if (cnt != sizeof (msg)) { /* failed on send */ + printf ("%s: Failed to send msg %d to conn %d (%d vs. %d)\n", + taskName, msg.type, conn, cnt, sizeof (msg)); + } } /* @@ -255,26 +271,29 @@ TspSendMessage( int conn, Boolean resend) * next (from ack). */ - void + void TspMessageReceive (int conn, PID pid) { - /* We remove the send list entry and use next if any */ - conn_list[conn].retry = 0; /* reset */ - if (!warm_test || !--warm_test) { - alarm (0); /* reset timer if not used */ - } + /* + * We remove the send list entry and use next if any + */ + conn_list[conn].retry = 0; /* reset */ + if (!warm_test || !--warm_test) { + alarm (0); /* reset timer if not used */ + } #ifdef DDEBUG - if (conn_list[conn].send_list[0].send_type == BMSG_WARM) { - DPRINTF (("TspMessageReceive: Connection reset for conn %d\n", conn)); - } + if (conn_list[conn].send_list[0].send_type == BMSG_WARM) { + DPRINTF (("TspMessageReceive: Connection reset for conn %d\n", conn)); + } #endif - /* Move up by one if needed */ - if (!--conn_list[conn].send_idx) - return; /* no more to do */ - - memcpy (conn_list[conn].send_list, conn_list[conn].send_list+1, - conn_list[conn].send_idx * sizeof(struct SEND_LIST)); /* copy down */ - TspSendMessage (conn, 0); + /* + * Move up by one if needed + */ + if (!--conn_list[conn].send_idx) + return; /* no more to do */ + + memcpy (conn_list[conn].send_list, conn_list[conn].send_list + 1, conn_list[conn].send_idx * sizeof (struct SEND_LIST)); /* copy down */ + TspSendMessage (conn, 0); } /* @@ -284,48 +303,53 @@ TspMessageReceive (int conn, PID pid) * number of unknown. */ - char* + char * TspGetHostName (conn_idx) - int conn_idx; /* client connection number */ + int conn_idx; /* client connection number */ { - static char buff [30]; /* largest net num */ - unsigned char* cp; + static char buff[30]; /* largest net num */ + unsigned char *cp; - cp = conn_list[conn_idx].sender.c+4; - sprintf (buff, "%u.%u.%u.%u", cp[0], cp[1], cp[2], cp[3]); - return buff; + cp = conn_list[conn_idx].sender.c + 4; + sprintf (buff, "%u.%u.%u.%u", cp[0], cp[1], cp[2], cp[3]); + return buff; } /* * TimeTestHandler - alarm timer handler to resend warm/wait test. */ - static void -TimeTestHandler() + static void +TimeTestHandler () { - int conn; - - if (!warm_test) - return; /* no longer enabled */ - - for (conn = 0; conn < conn_list_cnt; conn++) { - /* locate all that are using this */ - if (!conn_list[conn].in_use) - continue; /* not used */ - - if (!conn_list[conn].retry) continue; - /* found one that we are testing */ - if (!--conn_list[conn].retry) { - /* - * Counted down the retries: blow off. - * Need to have connection flag to indicate not blowing - * off for cases where client is stopped due to being - * debugged. - */ - ConnDelete (conn, NULL, CLOSE_IGNORE); - continue; - } - TspSendMessage (conn, True); /* send another message */ + int conn; + + if (!warm_test) + return; /* no longer enabled */ + + for (conn = 0; conn < conn_list_cnt; conn++) { + /* + * locate all that are using this + */ + if (!conn_list[conn].in_use) + continue; /* not used */ + + if (!conn_list[conn].retry) + continue; + /* + * found one that we are testing + */ + if (!--conn_list[conn].retry) { + /* + * Counted down the retries: blow off. + * Need to have connection flag to indicate not blowing + * off for cases where client is stopped due to being + * debugged. + */ + ConnDelete (conn, NULL, CLOSE_IGNORE); + continue; } - alarm (2); /* setup for 2 seconds from now */ + TspSendMessage (conn, True); /* send another message */ + } + alarm (2); /* setup for 2 seconds from now */ } diff --git a/c/src/librdbg/src/servutil.c b/c/src/librdbg/src/servutil.c index 1417fa5236..e7cf184703 100644 --- a/c/src/librdbg/src/servutil.c +++ b/c/src/librdbg/src/servutil.c @@ -25,30 +25,32 @@ * list. The fields list, list_sz and list_alloc are affected. */ - Boolean -ListAlloc(buff, clst) + Boolean +ListAlloc (buff, clst) char *buff; - CONN_LIST *clst; /* place to copy it */ + CONN_LIST *clst; /* place to copy it */ { - int tmp; - char* name; - int new_len; - int len; - - tmp = strlen(buff); - new_len = (int)clst->list_sz + 1 + tmp; - if (clst->list_alloc < (unsigned)new_len) { - /* need more space */ - name = (char *)Realloc(clst->list, len = new_len + MAX_FILENAME); - if (name == NULL) { - return(False); /* failed, no space */ - } - clst->list_alloc = len; - clst->list = name; + int tmp; + char *name; + int new_len; + int len; + + tmp = strlen (buff); + new_len = (int) clst->list_sz + 1 + tmp; + if (clst->list_alloc < (unsigned) new_len) { + /* + * need more space + */ + name = (char *) Realloc (clst->list, len = new_len + MAX_FILENAME); + if (name == NULL) { + return (False); /* failed, no space */ } - strcpy(clst->list + clst->list_sz, buff); - clst->list_sz += tmp; - return(True); + clst->list_alloc = len; + clst->list = name; + } + strcpy (clst->list + clst->list_sz, buff); + clst->list_sz += tmp; + return (True); } /*----- Management of processes -----*/ @@ -57,21 +59,22 @@ ListAlloc(buff, clst) * FindPidEntry - locate pid_list entry from pid */ - int -FindPidEntry (pid) - int pid; /* process identifier */ + int +FindPidEntry (int pid) /* pid = process identifier */ { - int idx; + int idx; - /* pid 0 is invalid, and signals a free slot */ - if (pid_list == NULL || pid == 0) { - return -1; - } - for (idx = 0; idx < pid_list_cnt; idx++) { - if (pid_list [idx].pid == pid ) - return idx; - } + /* + * pid 0 is invalid, and signals a free slot + */ + if (pid_list == NULL || pid == 0) { return -1; + } + for (idx = 0; idx < pid_list_cnt; idx++) { + if (pid_list[idx].pid == pid) + return idx; + } + return -1; } /*----- Debug suport -----*/ @@ -82,51 +85,51 @@ FindPidEntry (pid) * Names of debug primitives */ -const char* PtraceNames [] = { - -"RPT_TRACEME", "RPT_PEEKTEXT", "RPT_PEEKDATA", "RPT_PEEKUSER", -"RPT_POKETEXT", "RPT_POKEDATA", "RPT_POKEUSER", "RPT_CONT", -"RPT_KILL", "RPT_SINGLESTEP", "RPT_ATTACH", "RPT_DETACH", -"RPT_GETREGS", "RPT_SETREGS", "RPT_GETFPREGS", "RPT_SETFPREGS", -"RPT_READDATA", "RPT_WRITEDATA", "RPT_READTEXT", "RPT_WRITETEXT", -"RPT_GETFPAREGS", "RPT_SETFPAREGS", "RPT_22", "RPT_23", -"RPT_SYSCALL", "RPT_DUMPCORE", "RPT_26", "RPT_27", -"RPT_28", "RPT_GETUCODE", "RPT_30", "RPT_31", -"RPT_32", "RPT_33", "RPT_34", "RPT_35", -"RPT_36", "RPT_37", "RPT_38", "RPT_39", -"RPT_40", "RPT_41", "RPT_42", "RPT_43", -"RPT_44", "RPT_45", "RPT_46", "RPT_47", -"RPT_48", "RPT_49", "RPT_GETTARGETTHREAD", "RPT_SETTARGETTHREAD", -"RPT_THREADSUSPEND", "RPT_THREADRESUME", "RPT_THREADLIST", "RPT_GETTHREADNAME", -"RPT_SETTHREADNAME", "RPT_SETTHREADREGS", "RPT_GETTHREADREGS", - "RPT_59", -"RPT_60", "RPT_61", "RPT_62", "RPT_63", -"RPT_64", "RPT_65", "RPT_66", "RPT_67", -"RPT_68", "RPT_69", "RPT_70", "RPT_71", -"RPT_72", "RPT_73", "RPT_74", "RPT_STEPRANGE", -"RPT_CONTTO", "RPT_SETBREAK", "RPT_CLRBREAK", "RPT_GETBREAK", -"RPT_GETNAME", "RPT_STOP", -"RPT_PGETREGS", "RPT_PSETREGS", -"RPT_PSETTHREADREGS", "RPT_PGETTHREADREGS" +const char *PtraceNames[] = { + + "RPT_TRACEME", "RPT_PEEKTEXT", "RPT_PEEKDATA", "RPT_PEEKUSER", + "RPT_POKETEXT", "RPT_POKEDATA", "RPT_POKEUSER", "RPT_CONT", + "RPT_KILL", "RPT_SINGLESTEP", "RPT_ATTACH", "RPT_DETACH", + "RPT_GETREGS", "RPT_SETREGS", "RPT_GETFPREGS", "RPT_SETFPREGS", + "RPT_READDATA", "RPT_WRITEDATA", "RPT_READTEXT", "RPT_WRITETEXT", + "RPT_GETFPAREGS", "RPT_SETFPAREGS", "RPT_22", "RPT_23", + "RPT_SYSCALL", "RPT_DUMPCORE", "RPT_26", "RPT_27", + "RPT_28", "RPT_GETUCODE", "RPT_30", "RPT_31", + "RPT_32", "RPT_33", "RPT_34", "RPT_35", + "RPT_36", "RPT_37", "RPT_38", "RPT_39", + "RPT_40", "RPT_41", "RPT_42", "RPT_43", + "RPT_44", "RPT_45", "RPT_46", "RPT_47", + "RPT_48", "RPT_49", "RPT_GETTARGETTHREAD", "RPT_SETTARGETTHREAD", + "RPT_THREADSUSPEND", "RPT_THREADRESUME", "RPT_THREADLIST", + "RPT_GETTHREADNAME", + "RPT_SETTHREADNAME", "RPT_SETTHREADREGS", "RPT_GETTHREADREGS", + "RPT_59", + "RPT_60", "RPT_61", "RPT_62", "RPT_63", + "RPT_64", "RPT_65", "RPT_66", "RPT_67", + "RPT_68", "RPT_69", "RPT_70", "RPT_71", + "RPT_72", "RPT_73", "RPT_74", "RPT_STEPRANGE", + "RPT_CONTTO", "RPT_SETBREAK", "RPT_CLRBREAK", "RPT_GETBREAK", + "RPT_GETNAME", "RPT_STOP", + "RPT_PGETREGS", "RPT_PSETREGS", + "RPT_PSETTHREADREGS", "RPT_PGETTHREADREGS" }; -const char* -PtraceName(req) - int req; + const char * +PtraceName (int req) { - static char bufret[40]; + static char bufret[40]; - if ((req < 0) || (req >= sizeof(PtraceNames)/sizeof(char*))) { - sprintf(bufret, "BAD_REQ_%d", req); - return bufret; - } - return PtraceNames[req]; + if ((req < 0) || (req >= sizeof (PtraceNames) / sizeof (char *))) { + sprintf (bufret, "BAD_REQ_%d", req); + return bufret; + } + return PtraceNames[req]; } -const char* BmsgNames [] = { - "?", "WARM", "WAIT", "BREAK", - "EXEC_FAIL", "DETACH", "KILLED", "NOT_PRIM", - "NEW_PID" +const char *BmsgNames[] = { + "?", "WARM", "WAIT", "BREAK", + "EXEC_FAIL", "DETACH", "KILLED", "NOT_PRIM", + "NEW_PID" }; #endif /* DDEBUG */ -- cgit v1.2.3