diff options
Diffstat (limited to 'c')
35 files changed, 6155 insertions, 5885 deletions
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 <strauman@slac.stanford.edu> * 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 <string.h> +#include <string.h> #include <rtems.h> #include <rtems/error.h> #include <rdbg/rdbg.h> #include <rdbg/rdbg_f.h> -#include <rdbg/servrpc.h> +#include <rdbg/servrpc.h> #include <errno.h> -#include <sys/socket.h> +#include <sys/socket.h> #include <assert.h> #include <rtems/score/cpu.h> @@ -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 <bsp.h>\n"); printf("#include <rdbg/servrpc.h>\n"); printf("#include <rdbg/%s>\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 <rpc/rpc.h> - #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 <assert.h> #include <errno.h> -#include <rdbg/reg.h> +#include <rdbg/reg.h> #include <rdbg/remdeb.h> #include <rdbg/rdbg.h> -#include <rtems/score/cpu.h> -#include <rtems/score/thread.h> +#include <rtems/score/cpu.h> +#include <rtems/score/thread.h> - -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 <rpc/rpc.h> - #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 <rdbg/rdbg.h> #include <rdbg/servrpc.h> -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 <assert.h> #include <errno.h> -#include <rdbg/reg.h> +#include <rdbg/reg.h> #include <rdbg/remdeb.h> #include <rdbg/rdbg.h> -#include <rtems/score/cpu.h> -#include <rtems/score/thread.h> +#include <rtems/score/cpu.h> +#include <rtems/score/thread.h> -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 <rdbg/rdbg.h> #include <rdbg/servrpc.h> - 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 <libcpu/raw_exception.h> -#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 <bsp.h> #include <rdbg/servrpc.h> #include <rdbg/remdeb.h> -#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 <assert.h> #include <errno.h> -#include <rdbg/reg.h> +#include <rdbg/reg.h> #include <rdbg/remdeb.h> #include <rdbg/rdbg.h> -#include <rtems/score/cpu.h> -#include <rtems/score/thread.h> +#include <rtems/score/cpu.h> +#include <rtems/score/thread.h> #include <libcpu/cpu.h> -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 <sys/socket.h> #include <netinet/in.h> -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 <NET_SAFE>; /* 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 <XRY_MAX_CMD_STR>; -}; - typedef string one_arg <NET_SAFE>; -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 <sys/errno.h> -#include <assert.h> +#include <assert.h> #include <rdbg/rdbg.h> #include <rdbg/servrpc.h> /*----- 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 <sys/errno.h> -#include <rdbg/rdbg.h> -#include <rdbg/servrpc.h> - +#include <sys/errno.h> +#include <rdbg/rdbg.h> +#include <rdbg/servrpc.h> + /* * 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 <string.h> #include <sys/errno.h> -#include <rdbg/rdbg.h> -#include <rdbg/servrpc.h> -#include <sys/socket.h> +#include <rdbg/rdbg.h> +#include <rdbg/servrpc.h> +#include <sys/socket.h> #include <assert.h> #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 <sys/errno.h> -#include <rdbg/rdbg.h> +#include <rdbg/rdbg.h> #include <rdbg/servrpc.h> -#include <signal.h> -#include <rpc/rpc.h> -#include <rpc/svc.h> -#include <netinet/in.h> -#include <sys/socket.h> +#include <signal.h> +#include <rpc/rpc.h> +#include <rpc/svc.h> +#include <netinet/in.h> +#include <sys/socket.h> -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 */ |