summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/librdbg/Makefile.in24
-rw-r--r--c/src/lib/librdbg/_servtgt.c305
-rw-r--r--c/src/lib/librdbg/awk.svc67
-rw-r--r--c/src/lib/librdbg/configure.in55
-rw-r--r--c/src/lib/librdbg/excep.c136
-rw-r--r--c/src/lib/librdbg/i386/Makefile.in25
-rw-r--r--c/src/lib/librdbg/i386/excep_f.c153
-rw-r--r--c/src/lib/librdbg/i386/pc386/Makefile.in109
-rw-r--r--c/src/lib/librdbg/i386/pc386/remdeb_f.x59
-rw-r--r--c/src/lib/librdbg/i386/rdbg_cpu_asm.S72
-rw-r--r--c/src/lib/librdbg/i386/rdbg_f.c155
-rw-r--r--c/src/lib/librdbg/powerpc/Makefile.in25
-rw-r--r--c/src/lib/librdbg/powerpc/excep_f.c167
-rw-r--r--c/src/lib/librdbg/powerpc/mcp750/Makefile.in113
-rw-r--r--c/src/lib/librdbg/powerpc/mcp750/remdeb_f.x76
-rw-r--r--c/src/lib/librdbg/powerpc/rdbg_cpu_asm.S84
-rw-r--r--c/src/lib/librdbg/powerpc/rdbg_f.c156
-rw-r--r--c/src/lib/librdbg/ptrace.c333
-rw-r--r--c/src/lib/librdbg/rdbg.c141
-rw-r--r--c/src/lib/librdbg/remdeb.x546
-rw-r--r--c/src/lib/librdbg/servbkpt.c589
-rw-r--r--c/src/lib/librdbg/servcon.c138
-rw-r--r--c/src/lib/librdbg/servrpc.c722
-rw-r--r--c/src/lib/librdbg/servtgt.c552
-rw-r--r--c/src/lib/librdbg/servtsp.c331
-rw-r--r--c/src/lib/librdbg/servutil.c132
26 files changed, 0 insertions, 5265 deletions
diff --git a/c/src/lib/librdbg/Makefile.in b/c/src/lib/librdbg/Makefile.in
deleted file mode 100644
index c86a39c891..0000000000
--- a/c/src/lib/librdbg/Makefile.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# $Id$
-#
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = .
-
-RTEMS_ROOT = @RTEMS_ROOT@
-PROJECT_ROOT = @PROJECT_ROOT@
-
-VPATH = @srcdir@
-
-include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
-include $(RTEMS_ROOT)/make/directory.cfg
-
-INSTALL_CHANGE = @INSTALL_CHANGE@
-
-SUB_DIRS = $(RTEMS_CPU)
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
diff --git a/c/src/lib/librdbg/_servtgt.c b/c/src/lib/librdbg/_servtgt.c
deleted file mode 100644
index b58ac0e676..0000000000
--- a/c/src/lib/librdbg/_servtgt.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- ============================================================================
- _SERVTGT
- $Id$
- ============================================================================
-*/
-
-
-#include <string.h>
-#include <rtems.h>
-#include <rtems/error.h>
-
-#include <rdbg/rdbg.h>
-#include <rdbg/rdbg_f.h>
-#include <rdbg/servrpc.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <assert.h>
-#include <rtems/score/cpu.h>
-
-#ifdef DDEBUG
-#define Ptrace TgtDbgPtrace
-#else
-#define Ptrace TgtRealPtrace
-#endif
-
-extern int errno;
-
-rtems_id eventTaskId;
-rtems_id serializeSemId;
-rtems_id wakeupEventSemId;
-
-CPU_Exception_frame Idle_frame;
-
-/* -----------------------------------------------------------------
- TgtRealPtrace - lowest level ptrace() wrapper
- ----------------------------------------------------------------- */
-
- int
-TgtRealPtrace(int req, PID aid, char* addr, int d, void* 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)
-{
-
- if (TgtHandleChildChange (pid, &status, NULL, ctx)) {
- TgtNotifyWaitChange (pid, status, -1);
- }
-
- return 0;
-}
-
-/* -----------------------------------------------------------------------
- eventTask
- ----------------------------------------------------------------------- */
-
-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 (;;){
- DPRINTF (("Event Task: wait event\n"));
- rtems_semaphore_obtain(wakeupEventSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
- DPRINTF (("Event Task: wake up !!!!!!!!!!!!!\n"));
-
- errno = 0;
- ctx = GetExceptCtx(currentTargetThread);
-
- CheckForSingleStep(ctx->ctx);
-
- TgtChange(pid, ctx->ctx,STS_MAKESIG(ExcepToSig(ctx)));
-
- }
-}
-
-/* -------------------------------------------------------------------
- MyThreadIdle -
-
- This task is used to initiate the exception mechanism:
- It calls the enterDebug function with justSaveContext=1
- only to push a first valid context in the list
- ---------------------------------------------------------------------*/
-
-rtems_task MyThreadIdle(rtems_task_argument argument)
-{
- enterRdbg();
- rtems_task_delete( RTEMS_SELF );
-}
-
-/* -----------------------------------------------------------------------
- TgtAttach - attach to a process that is running without control.
-
- Notes:
- - this function performs a ptrace ATTACH equivalent (attaching to a
- process that we do not control now).
- ----------------------------------------------------------------------- */
-
-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);
- if (errno)
- return(False); /* failed */
-
- TgtCreateNew(pid, conn_idx, 0, NULL, False);
-
-
- connect_rdbg_exception();
-
- /*
- * Create the attach debuger 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);
- 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);
- if (status != RTEMS_SUCCESSFUL)
- 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\n",status);
- rtems_panic ("Can't create task.\n");
- }
-
- status = rtems_task_start(debugId, MyThreadIdle, pid);
-
- return(True);
-}
-
-/* -----------------------------------------------------------------------
- TgtPtrace - handle ptrace requests for server.
- ----------------------------------------------------------------------- */
-
-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;
-
- errno = 0;
- TgtBreakRestoreOrig (pid, addr, addr2);
- 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]);
- }
- 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;
-
-}
-
-/* -----------------------------------------------------------------
- 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){
- threads[curr] = (unsigned) id;
- curr++;
- }
- 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){
- threads[curr] = (unsigned) id;
- curr++;
- }
- id ++;
- }
-
- return curr;
-}
diff --git a/c/src/lib/librdbg/awk.svc b/c/src/lib/librdbg/awk.svc
deleted file mode 100644
index b9a88bdaca..0000000000
--- a/c/src/lib/librdbg/awk.svc
+++ /dev/null
@@ -1,67 +0,0 @@
-#########################################################################
-#
-# Component: RDBG
-# Module: awk.svc
-#
-# Synopsis: AWK script which transforms the server skeleton produced
-# by rpcgen(1) into something suitable for RDB servers.
-#
-#########################################################################
-#
-# $Id$
-#
-BEGIN {
- headerstarted = 0
- withinproc = 0
- brack = 0
-}
-
-$1 ~ /^\/\*HEADER_START\*\/$/ {
- headerstarted = 1
- printf("#include <rpc/types.h>\n");
- printf("#include <rpc/rpc.h>\n");
- printf("#include <stdio.h>\n");
- printf("#include <stdlib.h>\n");
- printf("#include <string.h>\n");
- 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 msgout(a) printf(a)\n")
- printf("#define _msgout(a) fprintf(stderr,a)\n");
-}
-
-$1 ~ /^\/\*HEADER_END\*\/$/ {
- headerstarted = 0
-}
-
-{
- if (headerstarted == 1) {
- print $0
- } else if ($1 ~ /.*_2.*/) {
- withinproc = 1
- printf("void\n");
- print $0
- } else if (withinproc == 1) {
- if ($1 == "switch") {
- print "\tDPRINTF ((\"remotedeb_2: %s (%d)\\n\", "
- print "\t\t(unsigned) rqstp->rq_proc < "
- print "\t\t(unsigned) (sizeof names / sizeof names[0]) ?"
- print "\t\tnames [rqstp->rq_proc] : \"???\", "
- print "\t\t(int) rqstp->rq_proc));\n"
- }
- for (i = 1; i <= NF; i++) {
- if ($i == "{") {
- brack++;
- } else if ($i == "}") {
- brack--;
- if (brack == 0) {
- withinproc = 0;
- }
- }
- }
- if ($1 != "_rpcsvcdirty" ) {
- print $0
- }
- }
-}
diff --git a/c/src/lib/librdbg/configure.in b/c/src/lib/librdbg/configure.in
deleted file mode 100644
index 5871e06bfd..0000000000
--- a/c/src/lib/librdbg/configure.in
+++ /dev/null
@@ -1,55 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-dnl
-dnl $Id$
-
-AC_PREREQ(2.13)
-AC_INIT(awk.svc)
-RTEMS_TOP(../../../..)
-AC_CONFIG_AUX_DIR(../../../..)
-
-RTEMS_CANONICAL_TARGET_CPU
-
-AC_PROG_MAKE_SET
-AC_PROG_INSTALL
-# AM_INIT_AUTOMAKE(rtems-c-src-lib-librdbg,$RTEMS_VERSION,no)
-AM_MAINTAINER_MODE
-
-RTEMS_ENABLE_NETWORKING
-RTEMS_ENABLE_RDBG
-RTEMS_ENABLE_LIBCDIR
-RTEMS_ENABLE_BARE
-
-RTEMS_ENV_RTEMSBSP
-
-RTEMS_CHECK_CPU
-RTEMS_CANONICAL_HOST
-
-RTEMS_PROJECT_ROOT
-
-dnl check target cc
-RTEMS_PROG_CC_FOR_TARGET
-RTEMS_CANONICALIZE_TOOLS
-
-AC_CHECK_PROG(RPCGEN,rpcgen,rpcgen)
-AC_PROG_AWK
-
-if test "$RPCGEN" = "no"; then
- AC_MSG_ERROR([missing rpcgen, required to build librdbg])
-fi
-if test "$AWK" = "no"; then
- AC_MSG_ERROR([missing awk, required to build librdbg])
-fi
-
-RTEMS_CHECK_CUSTOM_BSP(RTEMS_BSP)
-RTEMS_BSP_ALIAS(${RTEMS_BSP},bspdir)
-RTEMS_CHECK_NETWORKING(RTEMS_BSP)
-RTEMS_CHECK_RDBG(bspdir)
-
-# Try to explicitly list a Makefile here
-AC_OUTPUT(
-Makefile
-i386/Makefile
-i386/pc386/Makefile
-powerpc/Makefile
-powerpc/mcp750/Makefile
-)
diff --git a/c/src/lib/librdbg/excep.c b/c/src/lib/librdbg/excep.c
deleted file mode 100644
index d3183e24e2..0000000000
--- a/c/src/lib/librdbg/excep.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rdbgexcep.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <rtems.h>
-#include <rtems/error.h>
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-
-unsigned int NbExceptCtx;
-volatile unsigned int NbSerializedCtx;
-Exception_context *FirstCtx = NULL;
-Exception_context *LastCtx = NULL;
-
-CPU_Exception_frame SavedContext;
-
-
-/********* Save an exception context at the end of a list *****/
-
-int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) {
-
- Exception_context *SaveCtx;
-
- SaveCtx = (Exception_context *)malloc(sizeof(Exception_context));
- if (SaveCtx == NULL)
- 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 */
- FirstCtx = SaveCtx;
- LastCtx = SaveCtx;
- NbExceptCtx = 1;
- }
- else {
- NbExceptCtx ++;
- LastCtx->next = SaveCtx;
- SaveCtx->previous = LastCtx;
- LastCtx = SaveCtx;
- }
- return 0;
-}
-
-/********* Save an temporary exception context in a ******/
-/********* global variable ******/
-
-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 *********/
-
-
-int PopExceptCtx ( Objects_Id Id ) {
-
- Exception_context *ExtractCtx;
-
- if (FirstCtx == NULL) return -1;
-
- if (Id == -1) {
- ExtractCtx = LastCtx;
- LastCtx = LastCtx->previous;
- free(ExtractCtx);
- NbExceptCtx --;
- return 0;
- }
-
- ExtractCtx = LastCtx;
-
- while (ExtractCtx->id != Id && ExtractCtx != NULL) {
- ExtractCtx = ExtractCtx->previous;
- }
-
- if (ExtractCtx == NULL)
- return -1;
-
- if ( ExtractCtx->previous != NULL)
- (ExtractCtx->previous)->next = ExtractCtx->next;
-
- if ( ExtractCtx->next != NULL)
- (ExtractCtx->next)->previous = ExtractCtx->previous;
-
- if (ExtractCtx == FirstCtx)
- FirstCtx = FirstCtx->next;
- else
- if (ExtractCtx == LastCtx)
- LastCtx = LastCtx->previous;
-
- free(ExtractCtx);
- NbExceptCtx --;
- return 0;
-}
-
-/****** Return the context of the specified Id thread *********/
-/****** If Id = -1, then return the first context *********/
-
-
-Exception_context *GetExceptCtx ( Objects_Id Id ) {
-
- Exception_context *ExtractCtx;
-
- if (FirstCtx == NULL) return NULL;
-
- if (Id == -1) {
- return LastCtx;
- }
-
- ExtractCtx = LastCtx;
-
- while (ExtractCtx->id != Id && ExtractCtx != NULL) {
- ExtractCtx = ExtractCtx->previous;
- }
-
- if (ExtractCtx == NULL)
- return NULL;
-
- return ExtractCtx;
-}
diff --git a/c/src/lib/librdbg/i386/Makefile.in b/c/src/lib/librdbg/i386/Makefile.in
deleted file mode 100644
index 152aa9eeaa..0000000000
--- a/c/src/lib/librdbg/i386/Makefile.in
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# $Id$
-#
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ..
-subdir = i386
-
-RTEMS_ROOT = @RTEMS_ROOT@
-PROJECT_ROOT = @PROJECT_ROOT@
-
-VPATH = @srcdir@
-
-include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
-include $(RTEMS_ROOT)/make/directory.cfg
-
-INSTALL_CHANGE = @INSTALL_CHANGE@
-
-SUB_DIRS = @RTEMS_BSP@
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
diff --git a/c/src/lib/librdbg/i386/excep_f.c b/c/src/lib/librdbg/i386/excep_f.c
deleted file mode 100644
index 100b0d79d6..0000000000
--- a/c/src/lib/librdbg/i386/excep_f.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rdbg/i386/excep.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <rtems.h>
-#include <rtems/error.h>
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-
-/* -----------------------------------------------------------------
- Maping of hardware exceptions into Unix-like signal numbers.
- It is identical to the one used by the PM and the AM.
- ----------------------------------------------------------------- */
-
- 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;
-
- default:
- break;
- }
- return SIGKILL;
-}
-
-
-/*----- Breakpoint Exception management -----*/
-
- /*
- * Handler for Breakpoint Exceptions :
- * software breakpoints.
- */
-
-void
-BreakPointExcHdl(CPU_Exception_frame *ctx)
-{
- rtems_status_code status;
- rtems_id continueSemId;
-
- if ( (justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG) ) {
- PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
- justSaveContext = 0;
- }
- else {
- if (ctx->idtIndex != I386_EXCEPTION_DEBUG){
- NbSerializedCtx++;
- 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");
-#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);
- if (status != RTEMS_SUCCESSFUL)
- rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status));
-
- PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx);
-
- switch (ctx->idtIndex){
- case I386_EXCEPTION_DEBUG:
- DPRINTF((" DEBUG EXCEPTION !!!\n"));
- ctx->eflags &= ~EFLAGS_TF;
- ExitForSingleStep-- ;
- rtems_semaphore_release( wakeupEventSemId );
- break;
-
- case I386_EXCEPTION_BREAKPOINT:
- DPRINTF((" BREAKPOINT EXCEPTION !!!\n"));
- rtems_semaphore_release( wakeupEventSemId );
- break;
-
- case I386_EXCEPTION_ENTER_RDBG:
- DPRINTF((" ENTER RDBG !!!\n"));
- rtems_semaphore_release( wakeupEventSemId );
- break;
-
- default:
- DPRINTF((" OTHER EXCEPTION !!!\n"));
- rtems_semaphore_release( wakeupEventSemId );
- break;
- }
-
- rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
-
- PopExceptCtx (_Thread_Executing->Object.id);
- rtems_semaphore_delete(continueSemId);
- }
-}
-
-
-
diff --git a/c/src/lib/librdbg/i386/pc386/Makefile.in b/c/src/lib/librdbg/i386/pc386/Makefile.in
deleted file mode 100644
index 6717e7e695..0000000000
--- a/c/src/lib/librdbg/i386/pc386/Makefile.in
+++ /dev/null
@@ -1,109 +0,0 @@
-#
-# $Id$
-#
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ../..
-subdir = i386/pc386
-
-RTEMS_ROOT = @RTEMS_ROOT@
-PROJECT_ROOT = @PROJECT_ROOT@
-
-VPATH = @srcdir@:@srcdir@/..:@srcdir@/../..
-
-LIBNAME = librdbg.a
-LIB = ${ARCH}/${LIBNAME}
-
-# C and C++ source names, if any, go here -- minus the .c or .cc
-C_PIECES = rdbg servcon servbkpt servrpc excep_f servtgt servtsp \
- servutil _servtgt rdbg_f ptrace
-
-C_FILES = $(C_PIECES:%=%.c)
-C_O_FILES = $(C_PIECES:%=${ARCH}/%.o)
-
-# Asm source names, if any, go here -- minus the .s
-S_PIECES = rdbg_cpu_asm
-S_FILES = $(S_PIECES:%=%.S)
-S_O_FILES = $(S_PIECES:%=${ARCH}/%.o)
-
-# Generated C source names, if any, go here -- minus the .c
-GEN_C_PIECES = remdeb_xdr remdeb_svc
-GEN_C_FILES = $(GEN_C_PIECES:%=%.c)
-GEN_C_O_FILES = $(GEN_C_PIECES:%=${ARCH}/%.o)
-
-# H source names, if any, go here -- minus the .h
-H_PIECES = remdeb
-H_FILES = $(H_PIECES:%=%.h)
-
-# X source names
-X_FILES = remdeb.x remdeb_f.x
-
-SRCS = $(C_FILES) $(S_FILES) $(GEN_C_FILES) $(H_FILES)
-OBJS = $(GEN_C_O_FILES) $(C_O_FILES) $(S_O_FILES)
-
-RPCGEN = @RPCGEN@
-AWK = @AWK@
-
-include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
-include $(RTEMS_ROOT)/make/lib.cfg
-
-INSTALL_CHANGE = @INSTALL_CHANGE@
-mkinstalldirs = $(SHELL) $(top_srcdir)/@RTEMS_TOPdir@/mkinstalldirs
-
-INSTALLDIRS = $(PROJECT_INCLUDE)/rdbg
-
-$(INSTALLDIRS):
- @$(mkinstalldirs) $(INSTALLDIRS)
-
-#
-# Add local stuff here using +=
-#
-
-DEFINES +=
-CPPFLAGS +=
-CFLAGS +=
-
-#
-# Add your list of files to delete here. The config files
-# already know how to delete some stuff, so you may want
-# to just run 'make clean' first to see what gets missed.
-# 'make clobber' already includes 'make clean'
-#
-
-CLEAN_ADDITIONS += $(LIB) $(H_FILES) $(GEN_C_FILES)
-CLOBBER_ADDITIONS +=
-
-FRONTEND = \"$(RTEMS_CPU)/@RTEMS_BSP@/remdeb_f.x\"
-
-all: ${ARCH} $(LIB)
- @$(INSTALL_VARIANT) -m 644 $(LIB) $(PROJECT_RELEASE)/lib
-
-$(LIB): $(SRCS) ${OBJS}
- $(make-library)
-
-remdeb.h: $(X_FILES)
- @rm -f $@
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -h -DFRONTEND=$(FRONTEND) \
- -o $$pwd/$@ remdeb.x )
- @$(INSTALL_CHANGE) -m 755 $@ $(PROJECT_INCLUDE)/rdbg
-
-remdeb_xdr.c: $(X_FILES)
- @rm -f $@
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -c -DFRONTEND=$(FRONTEND) \
- -o $$pwd/$@ remdeb.x )
-
-remdeb_svc.c: $(X_FILES)
- @rm -f $@ tmpSvc.c
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -s udp -DFRONTEND=$(FRONTEND) \
- -o $$pwd/tmpSvc.c remdeb.x )
- $(AWK) -f $(srcdir)/../../awk.svc THEPROG="remdeb.h" tmpSvc.c >$@
- @rm -f tmpSvc.c
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
diff --git a/c/src/lib/librdbg/i386/pc386/remdeb_f.x b/c/src/lib/librdbg/i386/pc386/remdeb_f.x
deleted file mode 100644
index 01d899fe54..0000000000
--- a/c/src/lib/librdbg/i386/pc386/remdeb_f.x
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- **************************************************************************
- *
- * Component = rdblib
- *
- * Synopsis = remdeb_f.x
- *
- * $Id$
- *
- **************************************************************************
- */
-
-struct xdr_regs
-{
- unsigned int tabreg[19];
-};
-
-#ifdef RPC_HDR
-
-%/* now define register macros to apply to xdr_reg struct */
-%
-%#define GS 0
-%#define FS 1
-%#define ES 2
-%#define DS 3
-%#define EDI 4
-%#define ESI 5
-%#define EBP 6
-%#define ESP 7
-%#define EBX 8
-%#define EDX 9
-%#define ECX 10
-%#define EAX 11
-%#define TRAPNO 12
-%#define ERR 13
-%#define EIP 14
-%#define CS 15
-%#define EFL 16
-%#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 */
-
-%/* now define the BREAKPOINT mask technique to a long word */
-%#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 TARGET_PROC_TYPE 0
-
-#endif
-
-
-
diff --git a/c/src/lib/librdbg/i386/rdbg_cpu_asm.S b/c/src/lib/librdbg/i386/rdbg_cpu_asm.S
deleted file mode 100644
index 073262f864..0000000000
--- a/c/src/lib/librdbg/i386/rdbg_cpu_asm.S
+++ /dev/null
@@ -1,72 +0,0 @@
-/* cpu_asm.s
- *
- * This file contains all assembly code for the Intel i386 implementation
- * of RDBG.
- *
- * $Id$
- *
- */
-
-#include <asm.h>
-
- BEGIN_CODE
-
-/*
- * void copyback_data_cache_and_invalidate_instr_cache(addr, size)
- *
- * This routine performs a copy of the data cache
- * and invalidate the instruction cache
- */
-
- .p2align 1
- PUBLIC (copyback_data_cache_and_invalidate_instr_cache)
-
-SYM (copyback_data_cache_and_invalidate_instr_cache):
- wbinvd
- ret
-
-
-
-/*
- * void enterRdbg(void)
- *
- * This function perform a call to the exception 19
- * It is used :
- * 1 - in the user code, to simulate a Breakpoint.
- * (with justSaveContext = 0)
- * 2 - in the RDBG code, to push a ctx in the list.
- * (with justSaveContext = 1)
- *
- * In most of case, it will be use as described in 1.
- * The 2nd possibility will be used by RDBG to obtain
- * its own ctx
- */
-
- PUBLIC (enterRdbg)
-
-SYM (enterRdbg):
- int $50
- ret
-
-
-/*
- * void rtems_exception_prologue_50(void)
- *
- * Exception 50 is used to enter Rdbg
- *
- */
-
- .p2align 4
-
- PUBLIC (rtems_exception_prologue_50)
- PUBLIC (_Exception_Handler)
-
-SYM (rtems_exception_prologue_50):
- pushl $ 0
- pushl $ 50
- jmp SYM(_Exception_Handler) ;
-
-
-END_CODE
-
-END
diff --git a/c/src/lib/librdbg/i386/rdbg_f.c b/c/src/lib/librdbg/i386/rdbg_f.c
deleted file mode 100644
index b339256e70..0000000000
--- a/c/src/lib/librdbg/i386/rdbg_f.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rdbg/i386/rdbg_f.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/reg.h>
-#include <rdbg/remdeb.h>
-#include <rdbg/rdbg.h>
-#include <rtems/score/cpu.h>
-#include <rtems/score/thread.h>
-
-
-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;
-}
-
-
- 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];
-}
-
-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;
-}
-
-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;
-}
-
-
-
-int
-Single_Step(CPU_Exception_frame* ctx)
-{
- /* 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 */
- ++ExitForSingleStep;
-
- return 0;
-}
-
- 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;
-}
-
-void
-CancelSingleStep (CPU_Exception_frame* ctx)
-{
- /* Cancel scheduled SS */
- ctx->eflags &= ~EFLAGS_TF;
- ExitForSingleStep-- ;
-}
-
-cpuExcHandlerType old_currentExcHandler;
-extern void rtems_exception_prologue_50();
-
-void connect_rdbg_exception()
-{
- interrupt_gate_descriptor *currentIdtEntry;
- unsigned limit;
- unsigned level;
-
- /*
- * Connect the Exception used to debug
- */
- i386_get_info_from_IDTR (&currentIdtEntry, &limit);
-
- _CPU_ISR_Disable(level);
- create_interrupt_gate_descriptor (&currentIdtEntry[50], rtems_exception_prologue_50);
- _CPU_ISR_Enable(level);
-
- old_currentExcHandler = _currentExcHandler;
- _currentExcHandler = BreakPointExcHdl ;
-
-}
diff --git a/c/src/lib/librdbg/powerpc/Makefile.in b/c/src/lib/librdbg/powerpc/Makefile.in
deleted file mode 100644
index dd0067f3e2..0000000000
--- a/c/src/lib/librdbg/powerpc/Makefile.in
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# $Id$
-#
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ..
-subdir = powerpc
-
-RTEMS_ROOT = @RTEMS_ROOT@
-PROJECT_ROOT = @PROJECT_ROOT@
-
-VPATH = @srcdir@
-
-include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
-include $(RTEMS_ROOT)/make/directory.cfg
-
-INSTALL_CHANGE = @INSTALL_CHANGE@
-
-SUB_DIRS = @RTEMS_BSP@
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
diff --git a/c/src/lib/librdbg/powerpc/excep_f.c b/c/src/lib/librdbg/powerpc/excep_f.c
deleted file mode 100644
index 8580789b99..0000000000
--- a/c/src/lib/librdbg/powerpc/excep_f.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rdbg/powerpc/excep_f.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <rtems.h>
-#include <rtems/error.h>
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-
- 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;
-}
-
-
-/*----- Breakpoint Exception management -----*/
-
- /*
- * Handler for Breakpoint Exceptions :
- * software breakpoints.
- */
-
-void
-BreakPointExcHdl(CPU_Exception_frame *ctx)
-{
- rtems_status_code status;
- rtems_id continueSemId;
-
- if ( (justSaveContext) && (ctx->_EXC_number == ASM_SYS_VECTOR) ) {
- PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
- justSaveContext = 0;
- }
- else {
- if (ctx->_EXC_number != ASM_TRACE_VECTOR){
- NbSerializedCtx++;
- 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_MSR);
-#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);
- if (status != RTEMS_SUCCESSFUL)
- 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"));
- ctx->EXC_SRR1 &= ~MSR_SE;
- ExitForSingleStep-- ;
- 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 );
- break;
-
- default:
- DPRINTF((" OTHER EXCEPTION !!!\n"));
- rtems_semaphore_release( wakeupEventSemId );
- break;
- }
-
- rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
-
- PopExceptCtx (_Thread_Executing->Object.id);
- rtems_semaphore_delete(continueSemId);
- }
-
-}
-
-
-
diff --git a/c/src/lib/librdbg/powerpc/mcp750/Makefile.in b/c/src/lib/librdbg/powerpc/mcp750/Makefile.in
deleted file mode 100644
index 9415b41410..0000000000
--- a/c/src/lib/librdbg/powerpc/mcp750/Makefile.in
+++ /dev/null
@@ -1,113 +0,0 @@
-#
-# $Id$
-#
-
-@SET_MAKE@
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = ../..
-subdir = powerpc/mcp750
-
-RTEMS_ROOT = @RTEMS_ROOT@
-PROJECT_ROOT = @PROJECT_ROOT@
-
-VPATH = @srcdir@:@srcdir@/..:@srcdir@/../..
-
-LIBNAME = librdbg.a
-LIB = ${ARCH}/${LIBNAME}
-
-# C and C++ source names, if any, go here -- minus the .c or .cc
-C_PIECES = rdbg servcon servbkpt servrpc excep excep_f servtgt servtsp \
- servutil _servtgt rdbg_f ptrace
-C_FILES = $(C_PIECES:%=%.c)
-C_O_FILES = $(C_PIECES:%=${ARCH}/%.o)
-
-# Asm source names, if any, go here -- minus the .s
-S_PIECES = rdbg_cpu_asm
-S_FILES = $(S_PIECES:%=%.S)
-S_O_FILES = $(S_PIECES:%=${ARCH}/%.o)
-
-# Generated C source names, if any, go here -- minus the .c
-GEN_C_PIECES = remdeb_xdr remdeb_svc
-GEN_C_FILES = $(GEN_C_PIECES:%=%.c)
-GEN_C_O_FILES = $(GEN_C_PIECES:%=${ARCH}/%.o)
-
-# H source names, if any, go here -- minus the .h
-H_PIECES = remdeb
-H_FILES = $(H_PIECES:%=%.h)
-
-# X source names
-X_FILES = remdeb.x remdeb_f.x
-
-SRCS = $(C_FILES) $(S_FILES) $(GEN_C_FILES) $(H_FILES)
-OBJS = $(GEN_C_O_FILES) $(C_O_FILES) $(S_O_FILES)
-
-RPCGEN = @RPCGEN@
-AWK = @AWK@
-
-include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
-include $(RTEMS_ROOT)/make/lib.cfg
-
-INSTALL_CHANGE = @INSTALL_CHANGE@
-mkinstalldirs = $(SHELL) $(top_srcdir)/@RTEMS_TOPdir@/mkinstalldirs
-
-INSTALLDIRS = $(PROJECT_INCLUDE)/rdbg
-
-$(INSTALLDIRS):
- @$(mkinstalldirs) $(INSTALLDIRS)
-
-#
-# Add local stuff here using +=
-#
-
-DEFINES +=
-CPPFLAGS +=
-#
-# Enable traces in RDBG
-#
-#CFLAGS += -DDDEBUG
-#
-CFLAGS +=
-
-#
-# Add your list of files to delete here. The config files
-# already know how to delete some stuff, so you may want
-# to just run 'make clean' first to see what gets missed.
-# 'make clobber' already includes 'make clean'
-#
-
-CLEAN_ADDITIONS += $(LIB) $(H_FILES) $(GEN_C_FILES)
-CLOBBER_ADDITIONS +=
-
-FRONTEND = \"$(RTEMS_CPU)/@RTEMS_BSP@/remdeb_f.x\"
-
-all: ${ARCH} $(LIB)
- @$(INSTALL_VARIANT) -m 644 $(LIB) $(PROJECT_RELEASE)/lib
-
-$(LIB): $(SRCS) ${OBJS}
- $(make-library)
-
-remdeb.h: $(X_FILES)
- @rm -f $@
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -h -DFRONTEND=$(FRONTEND) \
- -o $$pwd/$@ remdeb.x )
- @$(INSTALL_CHANGE) -m 755 $@ $(PROJECT_INCLUDE)/rdbg
-
-remdeb_xdr.c: $(X_FILES)
- @rm -f $@
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -c -DFRONTEND=$(FRONTEND) \
- -o $$pwd/$@ remdeb.x )
-
-remdeb_svc.c: $(X_FILES)
- @rm -f $@ tmpSvc.c
- ( pwd=`pwd`; cd $(srcdir)/../..; \
- $(RPCGEN) -s udp -DFRONTEND=$(FRONTEND) \
- -o $$pwd/tmpSvc.c remdeb.x )
- $(AWK) -f $(srcdir)/../../awk.svc THEPROG="remdeb.h" tmpSvc.c >$@
- @rm -f tmpSvc.c
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
diff --git a/c/src/lib/librdbg/powerpc/mcp750/remdeb_f.x b/c/src/lib/librdbg/powerpc/mcp750/remdeb_f.x
deleted file mode 100644
index 10cf8dd540..0000000000
--- a/c/src/lib/librdbg/powerpc/mcp750/remdeb_f.x
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- **************************************************************************
- *
- * Component = rdblib
- * Synopsis = remdeb_f.x
- *
- **************************************************************************
- * $Id$
- **************************************************************************
- */
-
-struct xdr_regs
-{
- unsigned int tabreg[40];
-};
-
-#ifdef RPC_HDR
-
-%/* 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
-%
-%#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 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
-
-#endif
-
diff --git a/c/src/lib/librdbg/powerpc/rdbg_cpu_asm.S b/c/src/lib/librdbg/powerpc/rdbg_cpu_asm.S
deleted file mode 100644
index 657a279830..0000000000
--- a/c/src/lib/librdbg/powerpc/rdbg_cpu_asm.S
+++ /dev/null
@@ -1,84 +0,0 @@
-/* cpu_asm.s
- *
- * This file contains all assembly code for the Intel i386 implementation
- * of RDBG.
- *
- * $Id$
- *
- */
-
-#include <libcpu/cpu.h>
-#include <libcpu/io.h>
-#include <rtems/score/targopts.h>
-#include <asm.h>
-
- BEGIN_CODE
-
-/*
- * void copyback_data_cache_and_invalidate_instr_cache(addr, size)
- *
- * This routine performs a copy of the data cache
- * and invalidate the instruction cache
- */
-
- .p2align 5
- PUBLIC_VAR (copyback_data_cache_and_invalidate_instr_cache)
-
-SYM (copyback_data_cache_and_invalidate_instr_cache):
- /* make sure the data changed is in the cache */
- sync
- /* r3 address to handle, r4 length in bytes */
- addi r6, r0, PPC_CACHE_ALIGNMENT
- /* r5 = last address to handle */
- add r5,r3,r4
- /* r3 = cache_align(r3, PPC_CACHE_ALIGNMENT) */
- subi r0,r6,1
- andc r3,r3,r0
- /* R4 = R3 = copy of first address */
- mr r4,r3
- /*
- * Copyback data cache
- */
-1: cmplw r4,r5 /* r4 >= r5 then done */
- dcbst 0,r4 /* flush (data cache bloc store) */
- add r4,r4,r6 /* r4 = next cache line addr */
- blt 1b /* end r4 >= r5 then done */
- sync /* Wait for all dcbst to complete on bus */
- /*
- * invalidate instruction cache
- */
- /* R4 = fisrt address */
- mr r4,r3
-2: cmplw r4,r5 /* r4 >= r5 then done */
- icbi 0,r4 /* invalidate (instruction cache bloc invalidate) */
- add r4,r4,r6 /* r4 = next cache line addr */
- blt 2b /* end r4 >= r5 then done */
- sync /* Wait for all icbi to complete on bus */
- isync
- blr
-
-
-/*
- * void enterRdbg(void)
- *
- * This function perform a call to the exception SYSTEM call
- * It is used :
- * 1 - in the user code, to simulate a Breakpoint.
- * (with justSaveContext = 0)
- * 2 - in the RDBG code, to push a ctx in the list.
- * (with justSaveContext = 1)
- *
- * In most of case, it will be use as described in 1.
- * The 2nd possibility will be used by RDBG to obtain
- * its own ctx
- */
-
- PUBLIC_VAR (enterRdbg)
-
-SYM (enterRdbg):
- sc
- blr
-
-END_CODE
-
-END
diff --git a/c/src/lib/librdbg/powerpc/rdbg_f.c b/c/src/lib/librdbg/powerpc/rdbg_f.c
deleted file mode 100644
index 6149b5d426..0000000000
--- a/c/src/lib/librdbg/powerpc/rdbg_f.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rdbg/powerpc/rdbg_f.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/reg.h>
-#include <rdbg/remdeb.h>
-#include <rdbg/rdbg.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)
-{
- * ((CPU_Exception_frame*) regs) = *ctx;
-}
-
-
- void
-RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx)
-{
- *ctx = * ((CPU_Exception_frame*) regs);
-}
-
-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_number = 0xdeadbeef;
-
- 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;
-}
-
-void
-set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
-{
- 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;
-}
-
-
-
-int
-Single_Step(CPU_Exception_frame* ctx)
-{
- if ((ctx->EXC_SRR1 & MSR_SE) != 0 || ExitForSingleStep != 0) {
- /* Check coherency */
- assert ((ctx->EXC_SRR1 & MSR_SE) != 0);
- assert (ExitForSingleStep != 0);
- return 0;
- }
- ctx->EXC_SRR1 |= MSR_SE;
- ++ExitForSingleStep;
- return 0;
-}
-
- 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;
-}
-
-void
-CancelSingleStep (CPU_Exception_frame* ctx)
-{
- /* Cancel scheduled SS */
- ctx->EXC_SRR1 &= ~MSR_SE;
- ExitForSingleStep-- ;
-}
-cpuExcHandlerType oldExcHandler;
-
-void connect_rdbg_exception()
-{
- oldExcHandler = globalExceptHdl;
- globalExceptHdl = BreakPointExcHdl ;
-}
diff --git a/c/src/lib/librdbg/ptrace.c b/c/src/lib/librdbg/ptrace.c
deleted file mode 100644
index 91772bb2bd..0000000000
--- a/c/src/lib/librdbg/ptrace.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rkdb/rkdb.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/rdbg_f.h>
-#include <rdbg/servrpc.h>
-
-extern rtems_id serializeSemId;
-extern rtems_id wakeupEventSemId;
-extern rtems_id eventTaskId;
-extern Exception_context *FirstCtx;
-extern Exception_context *LastCtx;
-extern CPU_Exception_frame SavedContext;
-extern unsigned int NbExceptCtx;
-extern unsigned int NbSerializedCtx;
-
-
-
-/* --------------------------------------------------------------------
- return a pointeur to the Tread Control structure of the specified
- 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) {
-
- 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 ( 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]);
- }
-
- return 0;
-
-}
-
-
-/* --------------------------------------------------------------------
- Memory read
- -------------------------------------------------------------------- */
-
-int
-safeMemRead(void *src, void *dest, int nbBytes){
-
- /*
- * safe because if it generates an exception,
- * it must return normally
- * TBD
- */
-
- memcpy(dest, src, nbBytes);
- return 0;
-}
-
-/* --------------------------------------------------------------------
- Memory write
- -------------------------------------------------------------------- */
-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;
-}
-
-/* --------------------------------------------------------------------
- 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;
-}
diff --git a/c/src/lib/librdbg/rdbg.c b/c/src/lib/librdbg/rdbg.c
deleted file mode 100644
index a7288550a4..0000000000
--- a/c/src/lib/librdbg/rdbg.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- **************************************************************************
- *
- * Component =
- *
- * Synopsis = rkdb/rkdb.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <assert.h>
-#include <errno.h>
-#include <rtems.h>
-#include <rtems/error.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.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;
-int CONN_LIST_INC = 3;
-int PID_LIST_INC = 1;
-int TSP_RETRIES = 10;
-
-
- int
-getId()
-{
- rtems_id id;
-
- rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
- return (int)(id) ;
-}
-
- 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;
- return 0;
-}
-
- rtems_task
-rdbgDaemon (rtems_task_argument argument)
-{
- for (;;){
-
- if (TotalReboot == 1){
- rtemsReboot();
- }
-
- svc_processrequest( rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2);
- }
-}
-
- void
-rtems_rdbg_initialize (void)
-{
- rtems_name task_name;
- rtems_id tid;
- rtems_status_code status;
-
-#ifdef DDEBUG
- rdb_debug = 1; /* DPRINTF now will display */
-#endif
-
- DPRINTF (("%s init starting\n", ActName));
-
- /* Print version string */
-#ifdef DDEBUG
- printk ("RDBG v.%d built on [%s %s]\n", SERVER_VERS, __DATE__, __TIME__);
-#else
- printk ("RDBG v.%d\n", SERVER_VERS);
-#endif
-
- /* Create socket and init UDP RPC server */
- if (rdbgInit() != 0) goto error;
-
- 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");
- }
-
- status = rtems_task_start(tid, rdbgDaemon, 0);
-
- return;
-
-error:
- printf ("initialization failed.\n");
-}
-
- void
-setErrno (int error)
-{
- errno = error;
-}
-
- int
-getErrno()
-{
- return errno;
-}
diff --git a/c/src/lib/librdbg/remdeb.x b/c/src/lib/librdbg/remdeb.x
deleted file mode 100644
index b36ee3dcbb..0000000000
--- a/c/src/lib/librdbg/remdeb.x
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- **********************************************************************
- *
- * Component: RDBG servers
- * Module: remdeb.x
- *
- * Synopsis: XDR definitions for remote debug server RPC calls.
- * XDR definitions for RPCGEN to build remote debug server.
- *
- * $Id$
- *
- **********************************************************************
- */
-
-#ifdef RPC_SVC
-%/*HEADER_START*/
-#endif
-
-%#define RTEMS_PORT 2071
-%#define RTEMS_BACK_PORT 2073
-
-#ifdef RPC_HDR
-%#ifndef REMDEB_H
-%#define RPCGENSRVNAME(a) a
-#endif
-
-enum rpc_type {
- SUNRPC = 0,
- BADRPCTYPE = 25
-};
-
-
-const NET_SAFE = 1400; /* this is safe for UDP messages */
-
-struct UDP_MSG
-{ /* format of UDP messages (should be in .h) */
- unsigned char type; /* type of message (BMSG_xx) */
- unsigned char msg_num; /* ringed number for resend detect */
- unsigned short spec; /* specific information for type */
- long pid; /* process this affects */
- unsigned long context; /* specific information to request */
-};
-
- /* First we support the overhead structures and types needed for RPC
- requests. Then, we have all RPC routines input/output args. */
-
-%/*
-% * Sun request values for the remote ptrace system call
-% */
-%
-enum ptracereq
-{ /* these match PTRACE_xxx numbers */
- RPT_TRACEME = 0, /* 0, by tracee to begin tracing */
- RPT_CHILDDONE = 0, /* 0, tracee is done with his half */
- RPT_PEEKTEXT, /* 1, read word from text segment */
- RPT_PEEKDATA, /* 2, read word from data segment */
- RPT_PEEKUSER, /* 3, read word from user struct */
- RPT_POKETEXT, /* 4, write word into text segment */
- RPT_POKEDATA, /* 5, write word into data segment */
- RPT_POKEUSER, /* 6, write word into user struct */
- RPT_CONT, /* 7, continue process */
- RPT_KILL, /* 8, terminate process */
- RPT_SINGLESTEP, /* 9, single step process */
- RPT_ATTACH, /* 10, attach to an existing process (returns 2 if not primary)*/
- RPT_DETACH, /* 11, detach from a process */
- RPT_GETREGS, /* 12, get all registers */
- RPT_SETREGS, /* 13, set all registers */
- RPT_GETFPREGS, /* 14, get all floating point regs */
- RPT_SETFPREGS, /* 15, set all floating point regs */
- RPT_READDATA, /* 16, read data segment */
- RPT_WRITEDATA, /* 17, write data segment */
- RPT_READTEXT, /* 18, read text segment */
- RPT_WRITETEXT, /* 19, write text segment */
- RPT_GETFPAREGS, /* 20, get all fpa regs */
- RPT_SETFPAREGS, /* 21, set all fpa regs */
- RPT_22, /* 22, filler */
- RPT_23, /* 23, filler */
- RPT_SYSCALL, /* 24, trap next sys call */
- RPT_DUMPCORE, /* 25, dump process core */
- RPT_26, /* 26, filler */
- RPT_27, /* 27, filler */
- RPT_28, /* 28, filler */
- RPT_GETUCODE, /* 29, get u.u_code */
- /* Begin specific ptrace options */
- RPT_GETTARGETTHREAD = 50, /* get PM target thread identifier */
- RPT_SETTARGETTHREAD = 51, /* set PM target thread identifier */
- RPT_THREADSUSPEND = 52, /* suspend a thread */
- RPT_THREADRESUME = 53, /* resume a thread */
- RPT_THREADLIST = 54, /* get list of process's threads */
- RPT_GETTHREADNAME = 55, /* get the name of the thread */
- RPT_SETTHREADNAME = 56, /* set the name of the thread */
- RPT_SETTHREADREGS = 57, /* set all registers for a specific thread*/
- RPT_GETTHREADREGS = 58, /* get all registers for a specific thread*/
- /* Begin extended ptrace options for remote debug server */
- RPT_STEPRANGE = 75, /* step while in range (addr=start, data=len) */
- RPT_CONTTO = 76, /* cont from PC to temp break in addr */
- RPT_SETBREAK = 77, /* set a breakpoint (addr=break) */
- RPT_CLRBREAK = 78, /* clear a breakpoint (data=handle or 0 for all) */
- RPT_GETBREAK = 79, /* get breakpoint (data=handle, addr=buffer to
- fill). Returns next break. If data=0,
- returns number of breaks. */
- RPT_GETNAME = 80, /* get name of process (data 0=name, 1=path
- as started, 2=fullpath). Return in addr
- as mem) */
- RPT_STOP = 81, /* (C-actors) Stop the C-actor */
- RPT_PGETREGS = 82, /* portable version */
- RPT_PSETREGS = 83, /* portable version */
- RPT_PSETTHREADREGS = 84, /* portable version */
- RPT_PGETTHREADREGS = 85 /* portable version */
-};
-
-#include FRONTEND
-
-const MAXDEBUGGEE= 150;
-const NAMEMAX = 17;
-
-% /*
-% * Memory data for read/write text or data. The size is in data. The target
-% * addr is in the addr field.
-% * Be careful before modifying because this value goes into internal
-% * pipes and is allocated on stack too. Pipes and/or the stack could
-% * become too small if this value gets incremented.
-% */
-
-const MEM_DATA_MAX = 256;
-
-#ifndef RPC_XDR
-
-struct xdr_mem {
- u_long addr;
- u_int dataNb;
- unsigned char data[MEM_DATA_MAX];
-};
-
-#else
-/* manually define best XDR function for this */
-%bool_t xdr_xdr_mem(xdrs, objp)
-% XDR *xdrs;
-% struct xdr_mem *objp;
-%{
-% if (!xdr_u_long(xdrs, &objp->addr)) {
-% return (FALSE);
-% }
-% if (!xdr_u_int(xdrs, &objp->dataNb)) {
-% return(FALSE);
-% }
-% return (xdr_opaque(xdrs, objp->data, objp->dataNb));
-%}
-
-#endif
-
-/* Breakpoint structure maps to same structure on host. Do not change one
- without changing the other. */
-
-enum break_type
-{ /* types of breakpoints */
- BRKT_NONE, /* unused entry */
- BRKT_INSTR, /* general instruction break */
- BRKT_READ, /* read break */
- BRKT_WRITE, /* write breakpoint */
- BRKT_ACCESS, /* read-or-write break */
- BRKT_EXEC, /* execution HW breakpoint */
- BRKT_OS_CALL, /* break on OS call, addr is call number */
- BRKT_OS_SWITCH, /* dispatch breakpoint */
- BRKT_STEPEMUL /* emulate hardware single-step */
-};
-const MAX_THRD_BRK = 4; /* enough for 128 threads per process */
-struct xdr_break
-{ /* one per process local breakpoint */
- u_char type; /* BRKT_xxx type of break */
- u_char thread_spec; /* 0=all, else count of threads it affects */
- u_short handle; /* handle of breakpoint returned */
- u_long ee_loc; /* address of start */
- u_long ee_type; /* type/method of address */
- u_short length; /* length of break if range, else 0 */
- u_char pass_count; /* pass count to initialize to (0=none) */
- u_char curr_pass; /* pass count current value */
- u_long thread_list[MAX_THRD_BRK]; /* bit map for thread list */
-}; /* 20 bytes+4 per thread_list (4x4=16) = 36 */
-
-const UTHREAD_MAX = 64;
-
-const THREADNAMEMAX = 16;
-typedef string thread_name <THREADNAMEMAX>;
-
-struct KernThread {
- unsigned int threadLi;
-};
-
-#ifndef RPC_XDR
-
-#ifdef RPC_HDR
-%typedef KernThread *ptThreadList;
-#endif
-
-struct thread_list {
- unsigned int nbThread;
- ptThreadList threads;
-};
-
-#else /* RPC_XDR */
-
-/* must write this function by hand */
-
-%bool_t xdr_thread_list(xdrs, objp)
-% XDR *xdrs;
-% struct thread_list *objp;
-%{
-% return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread,
-% UTHREAD_MAX, sizeof(KernThread), xdr_KernThread));
-%}
-
-#endif /* not RPC_XDR */
-
-
-union ptrace_addr_data_in switch (ptracereq req) {
- /*
- * due to rpcgen poor features, we cannot put RPC_SETREGS
- * AND RPC_SETTHREADREGS in the case list. So we use a hack (FIX rpcgen).
- */
-#ifndef RPC_HDR
- case RPT_SETTHREADREGS :
- xdr_regs regs;
-#endif
- case RPT_SETREGS:
-
- xdr_regs regs;
-
-#ifndef RPC_HDR
- case RPT_PSETTHREADREGS:
- u_int pregs<>;
-#endif
- case RPT_PSETREGS:
- u_int pregs<>;
-
-#ifdef LATER
- case RPT_SETFPREGS:
- xdr_fp_status fpregs;
-#endif
- case RPT_SETTHREADNAME:
- thread_name name;
-#ifndef RPC_HDR
- case RPT_WRITETEXT:
- xdr_mem mem;
-#endif
- case RPT_WRITEDATA:
- xdr_mem mem;
- case RPT_SETBREAK:
- xdr_break breakp;
- default:
- u_int address;
-};
-
-union ptrace_addr_data_out switch (ptracereq req) {
- case RPT_GETREGS:
- xdr_regs regs;
-#ifndef RPC_HDR
- case RPT_GETTHREADREGS:
- xdr_regs regs;
-#endif
-
- case RPT_PGETREGS:
- u_int pregs<>;
-
-#ifndef RPC_HDR
- case RPT_PGETTHREADREGS:
- u_int pregs<>;
-#endif
-
-#ifdef LATER
- case RPT_GETFPREGS:
- xdr_fp_status fpregs;
-#endif
- case RPT_THREADLIST:
- thread_list threads;
- case RPT_GETTHREADNAME:
- thread_name name;
-#ifndef RPC_HDR
- case RPT_READTEXT:
- xdr_mem mem;
- case RPT_GETNAME:
- xdr_mem mem;
-#endif
- case RPT_READDATA:
- xdr_mem mem;
- case RPT_GETBREAK:
- xdr_break breakp;
- default:
- u_int addr;
-};
-
-typedef opaque CHAR_DATA <NET_SAFE>; /* variable sized data */
-
-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
-{ /* type of connection requested */
- DEBTYP_PROCESS = 0, /* process connection */
- DEBTYP_C_ACTOR = 1, /* C-Actor connection */
- DEBTYP_KERNEL = 2, /* kernel debug connection */
- DEBTYP_OTHER = 3 /* other subsystem */
-};
-
-%#define DEBUGGER_IS_GDB 0x2 /* */
-
-struct open_in
-{ /* input args to open a connection */
- u_char back_port[16]; /* opaque NET address format */
- u_short debug_type; /* type of process DEBTYP_xxx */
- u_short flags; /* connection information OPNFLG_xxx */
- u_char destination[16];/* opaque address if to router */
- one_arg user_name; /* name of user on host */
-};
-
-struct open_out
-{ /* return from open_connex */
- u_long port; /* connection number to server or -1 if error */
- u_int pad[4]; /* Planned to be KnIpcDest. Never used */
- u_int fp; /* True if floating point processor. If error,
- set to errno for open error. */
- u_char cmd_table_num; /* command table used */
- u_char cmd_table_vers; /* version of command table */
- u_short server_vers; /* version number of server itself */
-};
-
-% /* now close_connex() routine which detaches from server */
-
-enum close_control
-{ /* choice of how to handle owned processes */
- CLOSE_IGNORE = 0, /* ignore all controlled pids on close */
- CLOSE_KILL = 1, /* kill all controlled pids on close */
- CLOSE_DETACH = 2 /* detach free running all controlled pids */
-};
-
-struct close_in
-{ /* arg to close connection */
- close_control control; /* shutdown of owned processes control */
-};
-
-% /* now send_signal() routine which sends signals to processes like kill(2) */
-
-struct signal_in
-{ /* input to send_signal */
- int pid; /* process/actor to send signal to */
- int sig; /* signal to send (from /usr/include/signal.h) */
-};
-
-struct signal_out
-{ /* return from send_signal */
- int kill_return; /* return code from kill(2) call */
- int errNo; /* error code if failed */
-};
-
-
-% /* now wait_info() routine which returns results of polling the wait status
-% of a process/actor. It may return 0 if running, else pid or -1 */
-
-enum stop_code
-{ /* stop code information */
- STOP_ERROR = 0, /* error, errno set */
- STOP_NONE = 1, /* not stopped */
- STOP_UNKNOWN = 2, /* unknown stop reason */
- STOP_BREAK = 3, /* stopped on breakpoint */
- STOP_STEP = 4, /* stopped on step */
- STOP_SIGNAL = 5, /* stopped on signal receieve */
- STOP_TERM_EXIT = 6, /* terminated normally */
- STOP_TERM_SIG = 7, /* terminated by signal */
- STOP_DETACHED = 8, /* detached from server */
- STOP_KILLED = 9, /* killed by ptrace KILL */
- STOP_SPAWN_FAILED = 10 /* spawn failed in exec part, handle=errno */
-};
-
-struct wait_in
-{ /* input arg to wait is process */
- int pid; /* process/actor id */
-};
-
-struct wait_out
-{ /* result of wait_info call */
- int wait_return; /* -1=error,0=running,pid=stopped */
- int errNo; /* error code if error */
- int status; /* wait(2) status if stopped */
- stop_code reason; /* reason in more abstracted terms */
- int handle; /* handle of break if stopped on break,
- or signal number or exit code */
- u_long PC; /* program counter if stopped */
- u_long SP; /* stack pointer if stopped */
- u_long FP; /* frame pointer if stopped */
- u_long thread; /* thread that stopped if applies (else -1) */
-};
-
-% /* now ptrace() routine. This matches the Sun UNIX ptrace as well as
-% some additions */
-
-const PTRFLG_FORCE = 1; /* when set and process running, forces process
- to stop, make the request, then start again.
- This is used for breakpoints and the like */
-const PTRFLG_NON_OWNER = 2; /* do request even if not primary owner (will
- notify all owners including caller if owns) */
-const PTRFLG_FREE = 4; /* free pid_list after KILL/DETACH */
-
-const PTRDET_UNOWN = 0x100; /* data value in RPT_DETACH just disconnects
- caller as an owner of process. */
-
-struct ptrace_in
-{ /* input args matches ptrace but for XDR */
- int pid; /* process to act on */
- ptrace_addr_data_in addr; /* mappings for addr and addr2 */
- u_int data; /* simple data arg of ptrace */
- u_int flags; /* mask of PTRFLG_xxx flags. */
-};
-
-struct ptrace_out
-{ /* return information from ptrace */
- ptrace_addr_data_out addr; /* return through addr/addr2 */
- int result; /* result of ptrace call (return value) */
- int errNo; /* error code if error */
-};
-
- /* Data for GET_GLOBAL_SYMBOLS */
-struct one_symbol { /* Must match common/src/lib/ctx/ctx.h */
- string symbolName<>;
- long symbolValue;
-};
-
-typedef one_symbol all_symbols<>;
-
-struct get_global_symbols_out {
- all_symbols symbols;
-};
-
- /* Data for GET_TEXT_DATA */
-struct get_text_data_in {
- int pid; /* process/actor id if non-zero */
- string actorName<16>; /* actor name for system mode */
-};
-
-struct get_text_data_out {
- int result;
- int errNo;
- u_long textStart;
- u_long textSize;
- u_long dataStart;
- u_long dataSize;
-};
-
- /* Data for GET_SIGNAL_NAMES */
-struct one_signal {
- u_int number;
- string name<>;
-};
-
-typedef one_signal all_signals<>;
-
-struct get_signal_names_out {
- all_signals signals;
-};
-
-% /* now define the actual calls we support */
-
-program REMOTEDEB {
- version REMOTEVERS {
-
- /* open a connection to server or router */
- open_out
- OPEN_CONNEX(open_in) = 1;
-
- /* send a signal to a process */
- signal_out
- SEND_SIGNAL(signal_in) = 2;
-
- /* all routines below require a connection first */
-
- /* close the connection to the server */
- void
- CLOSE_CONNEX(close_in) = 10;
-
- /* process ptrace request */
- ptrace_out
- PTRACE(ptrace_in) = 11;
-
- /* poll for status of process */
- wait_out
- WAIT_INFO(wait_in) = 13;
-
- get_signal_names_out
- GET_SIGNAL_NAMES(void) = 17;
-
- } = 2; /* now version 2 */
-} = 0x20000fff;
-
-#ifdef RPC_HDR
-%#define REMDEB_H
-%#endif
-#endif
-
-#ifdef RPC_SVC
-
-%const char* names [] = {
-% "NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
-% "name4", "name5", "name6", "name7",
-% "name8", "name9", "CLOSE_CONNEX", "PTRACE",
-% "name12", "WAIT_INFO", "name14", "name15",
-% "name16", "GET_SIGNAL_NAMES", "name18"
-%};
-%
-
-%/*HEADER_END*/
-#endif
diff --git a/c/src/lib/librdbg/servbkpt.c b/c/src/lib/librdbg/servbkpt.c
deleted file mode 100644
index f6c76bb494..0000000000
--- a/c/src/lib/librdbg/servbkpt.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- **********************************************************************
- *
- * Component: RDB servers
- * Module: servbkpt.c
- *
- * Synopsis: Management of breakpoints
- *
- * $Id$
- *
- **********************************************************************
- */
-
-#include <sys/errno.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_OVER(plst,idx,addr,size) \
- ((plst)->break_list[idx].ee_loc + BREAK_SIZE > (UINT32) (addr) \
- && (plst)->break_list[idx].ee_loc < (UINT32) (addr) + (size))
-
-#define BKPT_SLOTS \
- (sizeof ((xdr_break*) 0)->thread_list / \
- sizeof ((xdr_break*) 0)->thread_list [0])
-
-
- /*
- * BreakAlloc - alloc a breakpoint entry.
- *
- * This is a generic routine to insert an entry in the
- * breakpoint list. It returns the number of entry just
- * created. It returns -1 if failed.
- */
-
- 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 */
- }
- }
- }
- /* 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 */
- }
- }
- return(normal ? idx : 0); /* return it */
-}
-
- /*
- * BreakSet - set a breakpoint in process
- *
- * Returns the number or -1/errno.
- */
-
-#ifdef DDEBUG
-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 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 */
- }
- 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)
-{
- xdr_break 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 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;
-}
-
-/*----- Getting 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 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;
- }
- /* 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 */
-}
-
-/*----- Clearing bkpts -----*/
-
- /*
- * 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 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));
- }
-
- 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;
- }
- return cleared;
-}
-
-/*----- Hiding of breakpoints -----*/
-
- /*
- * PatchBreak - patch original data from break into data buffer.
- *
- * Notes:
- * - this routine patches the original data under a break into the data
- * buffer from a ptrace read/peek.
- */
-
- 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);
-}
-
- 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;
-
- /* if breakpoints, replace */
-
- for (idx = 1; idx < (int)plst->break_alloc; idx++) {
- int type = plst->break_list[idx].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 -----*/
-
- /*
- * BreakOverwrite - check if memory write does not involve addresses
- * having software breakpoints.
- */
-
- int
-BreakOverwrite (const PID_LIST* plst, const char* addr, unsigned int size)
-{
- int idx;
-
- 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;
-
- /* Consider only breakpoints involving modified memory */
- if (type != BRKT_INSTR && type != BRKT_STEPEMUL) {
- continue;
- }
- if (BKPT_OVER (plst, idx, addr, size)) {
- return -1; /* overlaps */
- }
- }
- return 0;
-}
-
-/*----- Execution support -----*/
-
- /*
- * BreakStepRange - Start stepping in a range.
- *
- * Range is saved in breakpoint 0.
- */
-
- 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 */
- }
- }
- BKPT0 (plst)->range_start = (UINT32)addr;
- BKPT0 (plst)->range_end = (UINT32)addr+(len-1);
- return 0;
-}
-
- /*
- * If the Program Counter is changed, consider that the
- * current breakpoint has not been reached yet.
- */
-
- void
-BreakPcChanged (PID_LIST* plst)
-{
- 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)
-{
- if (plst->break_list && BKPT0 (plst)->clr_step) {
-
- /* need clear then step off break */
- int last = BKPT0 (plst)->last_break;
-
- /* clear break, step, then do exec */
-
- *paddr2 = (void*) plst->break_list[last].ee_type;
-
- /* Need to clr_step after TgtPtrace() when wait() returns */
- return 1;
- }
- return 0;
-}
-
- /*
- * BreakSteppedOff - check if just stepped off a breakpoint
- * and re-insert it into the code.
- */
-
- 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);
- }
-}
-
-
- /*
- * Returns whether a thread matches a breakpoint.
- */
-
- static int
-BreakThreadMatch (xdr_break* xb, int thread)
-{
- int slot;
-
- if (thread < 0) return 1; /* Break existence check only */
-
- 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 */
-}
-
-
-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.
- */
-#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);
-#else
- (void) plst;
-#endif
- return 0;
-}
-
-
-/*
- * Identify the current breakpoint. The process just stopped.
- */
-
- 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;
- }
- }
- if (foreignBkpt) {
- if (adjust) {
- BreakAdjustPC (plst);
- }
- return -foreignBkpt;
- }
- return 0;
-}
diff --git a/c/src/lib/librdbg/servcon.c b/c/src/lib/librdbg/servcon.c
deleted file mode 100644
index 30570760db..0000000000
--- a/c/src/lib/librdbg/servcon.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- **************************************************************************
- *
- * Component: RDBG
- * Module: servcon.c
- *
- * Synopsis: Management of RPC client connections.
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <sys/errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-
- /*
- * ConnCreate - create a new connection entry for a client.
- *
- * This function finds an empty entry in the connection array
- * or makes space. It fills in the fields that are passed to it.
- * It does not do any validation on net addresses nor does it
- * start a validation cycle on other clients. This is done by
- * the caller.
- */
-
- 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 */
- }
-
- /* 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));
- }
-
- 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;
-}
-
- /*
- * ConnDelete - remove connection entry when shutdown.
- *
- */
-
- 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]))));
-
- clst->in_use = False; /* free it back */
-}
diff --git a/c/src/lib/librdbg/servrpc.c b/c/src/lib/librdbg/servrpc.c
deleted file mode 100644
index 310f3bb6c4..0000000000
--- a/c/src/lib/librdbg/servrpc.c
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- **********************************************************************
- *
- * Component: RDBG
- * Module: servrpc.c
- *
- * Synopsis: support routines for RPC dispatch for remote debug server.
- * Main server dispatch routines from RPC to support remote debug.
- *
- * $Id$
- *
- **********************************************************************
- */
-
-#include <string.h>
-#include <sys/errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/remdeb.h>
-#include <rdbg/servrpc.h>
-
-/************************************************************************/
-
-/* -----------------------------------------------------------------------
- open_connex_2_svc - setup a new connection from a client.
-
- Notes:
- - this function creates a new connection to a client. It allocates
- an entry in the connection structure and fills in the information
- sent and implied by the message.
- - a client connection entry is needed for all further messages to work
- properly.
- ----------------------------------------------------------------------- */
-
-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 */
- }
- one_time = True; /* disable doing this again */
- }
-
- DPRINTF(("open_connex_2_svc: Opening connection from '%s'\n",
- in->user_name));
-
- /* 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]))));
- }
-
- idx = ConnCreate(rqstp, in); /* setup the connection */
- out.port = idx; /* connection number */
- if (idx == -1)
- out.fp = getErrno(); /* error causing to fail */
- else
- out.fp = TARGET_PROC_TYPE;
-
- out.server_vers = SERVER_VERS;
- return(&out);
-}
-
-/* -----------------------------------------------------------------------
- send_signal_2_svc - send a kill/signal to the specified process.
-
- Notes:
- - this function sends a signal to the process specified. This process
- does not have to be under debug nor attached by this server. The kill
- may be refused on other grounds though.
- - kill(pid, 0) can be used to validate the process still exists if
- needed.
- ----------------------------------------------------------------------- */
-
-signal_out *RPCGENSRVNAME(send_signal_2_svc) (signal_in *in, struct svc_req *rqstp)
-{
- static signal_out out; /* return code from kill */
-
- /* we do not care if connected */
- setErrno(0);
- out.kill_return = 0;
- out.errNo = 0;
- TotalReboot = 1;
- 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)
-{
- int conn_idx = TspConnGetIndex(rqstp);
-
- if (conn_idx != -1) /* found it, clear out */
- ConnDelete(conn_idx, rqstp, in->control);
-
- return (void*) ""; /* need to return something */
-}
-
-/* -----------------------------------------------------------------------
- ptrace_2_svc - control process under debug.
- ----------------------------------------------------------------------- */
-
-#define REG_COUNT \
- (sizeof (xdr_regs) / sizeof (int))
-
-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 */
-
- DPRINTF (("ptrace_2_svc: entered (%s (%d), %d, XXXX, %d, XXXX)\n",
- 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"));
- out.result = -1;
- 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);
- }
-
- req = in->addr.req;
- 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 */
- out.errNo = 0;
-
- /* lookup process to make sure we have under control */
- pid_idx = FindPidEntry (in->pid);
- 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;
- }
-
- 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);
- }
- /* 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 */
- }
- }
- 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 */
- DPRINTF (("ptrace_2_svc: allowing RPT_CLRBREAK %d\n", data));
- /* do nothing */
- }
-
- else if (plst && plst->running)
- { /* error, process is running and not detach */
- out.result = -1;
- out.errNo = ETXTBSY; /* closest error */
- DPRINTF (("ptrace_2_svc: failed, still running.\n"));
- return(&out);
- }
- if (plst == NULL) {
- out.result = -1;
- out.errNo = ESRCH;
- DPRINTF (("ptrace_2_svc: No such process.\n"));
- return (&out);
- }
-
- /* 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 */
- 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);
- }
-
- 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;
- 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;
- 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 */
- }
- 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;
- 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;
- }
- 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 */
- 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);
- }
-
- /* 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 */
- }
-
- 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);
- }
- 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;
-
- 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 */
-{
- 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 */
-
- 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 */
- if (conn_list[conn_idx].retry)
- 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 */
- idx = FindPidEntry (in->pid);
- 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 */
- out.errNo = 0;
- out.status = plst->state; /* last stopped reason if stopped */
- 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 */
- }
- }
- 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 */
- out.wait_return = -1;
- out.errNo = ESRCH; /* no process */
- out.status = 0;
- return(&out);
-}
-
-/* -----------------------------------------------------------------------
- get_signal_names_2_svc - return names for signals
- ----------------------------------------------------------------------- */
-
-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"}
-};
-
-get_signal_names_out* RPCGENSRVNAME(get_signal_names_2_svc) (in, rqstp)
- void* in;
- struct svc_req *rqstp; /* server info */
-{
- static get_signal_names_out out;
-
- out.signals.all_signals_len = sizeof SignalNames / sizeof SignalNames[0];
- out.signals.all_signals_val = SignalNames;
-
- return(&out);
-}
diff --git a/c/src/lib/librdbg/servtgt.c b/c/src/lib/librdbg/servtgt.c
deleted file mode 100644
index de41abc1a6..0000000000
--- a/c/src/lib/librdbg/servtgt.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- **************************************************************************
- *
- * Component: RDB servers
- * Module: servtgt.c
- *
- * $Id$
- *
- **************************************************************************
- */
-
-
-#include <string.h>
-#include <sys/errno.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-#include <sys/socket.h>
-#include <assert.h>
-
-#ifdef DDEBUG
-#define Ptrace TgtDbgPtrace
-#else
-#define Ptrace TgtRealPtrace
-#endif
-
-/* ----------------------------------------------------------------
- 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 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 */
- return ret;
-}
-
-/* -----------------------------------------------------------------------
- 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)
-{
- assert (plst->break_list);
- assert (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));
- Ptrace (RPT_POKETEXT, plst->pid,
- (char *)plst->break_list[idx].ee_loc,
- (int) SET_BREAK (data), NULL);
- }
-}
-
-/* -----------------------------------------------------------------------
- TgtCreateNew - add a new process into the process management lists.
- ----------------------------------------------------------------------- */
-
- void
-TgtCreateNew(PID pid, int conn, INT32 child, char *name, Boolean spawn)
-{
- int idx;
-
- for (idx = 0; idx < pid_list_cnt; idx++)
- if (!pid_list[idx].pid)
- break; /* find empty */
-
- 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_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 */
- }
- return; /* failed */
- }
- /* 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));
-
- /* 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].owners = 1;
- 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].name = name ? (char *)StrDup(name) : (char *)NULL;
-
-}
-
-/* -----------------------------------------------------------------------
- TgtNotifyWaitChange - send event to clients indicating child changed state.
- ----------------------------------------------------------------------- */
-
- 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 */
- }
- 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 */
- }
- }
-}
-
-/* -----------------------------------------------------------------------
- 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)
-{
- int conn;
-
- 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 != exclude)
- 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.
- ----------------------------------------------------------------------- */
-
-void TgtDelete(PID_LIST *plst, int conn_idx, BACK_MSG notify)
-{
- int idx = plst - pid_list, cnt, conn;
-
- /* found */
- cnt = pid_list[idx].owners;
- 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 (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);
- }
- pid_list[idx].pid = 0; /* gone */
-}
-
-
-/* -----------------------------------------------------------------------
- TgtKillAndDelete - kill or detach process and remove entry.
- ----------------------------------------------------------------------- */
-
- int
-TgtKillAndDelete( PID_LIST *plst, struct svc_req *rqstp, Boolean term)
-{
- ptrace_in pin; /* used for ptrace call */
- ptrace_out *pout;
-
- /* Remove breakpoints */
- if (plst->break_alloc > 0) {
- pin.pid = plst->pid;
- pin.addr.req = RPT_CLRBREAK;
- pin.data = 0; /* clear all */
- pin.flags = PTRFLG_NON_OWNER;
- pout = RPCGENSRVNAME(ptrace_2_svc) (&pin, rqstp);
- if (pout->result < 0) {
- DPRINTF (("TgtKillAndDelete: RPT_CLRBREAK failed %d\n",
- getErrno()));
- return -1;
- }
- }
-
- if (term)
- { /* kill */
- pin.addr.ptrace_addr_data_in_u.address = 0;
- pin.data = -1; /* Don't want notification from slave */
- pin.addr.req = RPT_KILL;
- }
- else
- { /* detach */
- pin.addr.ptrace_addr_data_in_u.address = 1;
- pin.data = 0;
- pin.addr.req = RPT_DETACH;
- }
- pin.pid = plst->pid;
- 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));
-
- pout = RPCGENSRVNAME(ptrace_2_svc) (&pin, rqstp);/* start it */
- if (pout->errNo == ESRCH && plst->pid)
- TgtDelete(plst, -1, BMSG_KILLED); /* only entry remains */
- return 0;
-}
-
-/* -----------------------------------------------------------------------
- TgtDetachCon - detach a connection's ownership of a process.
- ----------------------------------------------------------------------- */
-
- 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 */
- PIDMAP_CLEAR (conn_idx, pid_idx);
-
- if (pid_list[pid_idx].owners)
- pid_list[pid_idx].owners--;
- 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 */
- }
-}
-
-/* -----------------------------------------------------------------------
- TgtHandleChildChange - decide what action to take after wait() returns.
- Used in the master only.
- ----------------------------------------------------------------------- */
-
-#ifdef DDEBUG
-static char* LastStartNames[] = {
- "NONE", "STEP", "CONT", "RANGE",
- "STEPOFF", "KILLED", "DETACHED"
-};
-
-char* GetLastStartName (int last_start)
-{
- static char buf [32];
-
- 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;
-
- DPRINTF (("TgtHandleChildChange: pid %d status %x cap\n",
- (int) pid, *status));
- if (unexp)
- *unexp = 0; /* initialize to ok */
-
- /* first, find pid in question */
- idx = FindPidEntry (pid);
- if (idx < 0)
- { /* cannot locate this process */
- DPRINTF (("TgtHandleChildChange: unknown process (%s pid)\n",
- FindPidEntry (pid) >= 0 ? "stale" : "unknown"));
- if (unexp)
- *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 */
-
- /* copy ctxt */
- CtxToRegs(ctx, &(plst->regs));
-
- stopWanted = plst->stop_wanted;
- plst->stop_wanted = 0; /* For the next time */
-
- hadStepEmul = BreakClear (plst, -1, -1) > 0;
- origHadStepEmul = hadStepEmul; /* hadStepEmul is cleared if real bkpt met */
-
- 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);
- }
-
- /* Get current thread */
- plst->thread = TgtPtrace(RPT_GETTARGETTHREAD, pid, NULL, 0, NULL);
-
- 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;
- }
- 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)));
-
- 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);
- }
-
- 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));
- }
- }
- 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 */
- 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);
- }
-
- 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(True); /* stop and notify */
-}
-
-#ifdef DDEBUG
-
-/* -----------------------------------------------------------------------
- TgtDbgPtrace - debug version of ptrace.
- ----------------------------------------------------------------------- */
-
-int TgtDbgPtrace(int request, PID pid, char *addr, int data, void *addr2)
-{
- int diag;
-
- DPRINTF (("TgtDbgPtrace: entered (%s (%d), %d, %x, %d, %x)\n",
- PtraceName (request), request, pid, (int) addr, data,
- (int) addr2));
-
- if (request == RPT_WRITETEXT || request == RPT_WRITEDATA) {
- int i;
-
- DPRINTF (("TgtDbgPtrace:"));
- if (rdb_debug) {
- for (i = 0; i < data && i < 16; ++i) {
- printf (" %02x", ((char*) addr2) [i] & 0xFF);
- }
- printf ("\n");
- }
- }
-
- diag = TgtRealPtrace (request, pid, addr, data, addr2);
-
- DPRINTF (("TgtDbgPtrace: returned %d (%x) errno %d\n",
- 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 */
- 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));
- }
-
- return(diag);
-}
-#endif /* DDEBUG */
diff --git a/c/src/lib/librdbg/servtsp.c b/c/src/lib/librdbg/servtsp.c
deleted file mode 100644
index db342d58f9..0000000000
--- a/c/src/lib/librdbg/servtsp.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- **************************************************************************
- *
- * Component: RDBG
- * Module: servtsp.c
- *
- * Synopsis: Transport management for remote debug server.
- *
- * $Id$
- *
- **************************************************************************
- */
-
-#include <sys/errno.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>
-
-static int out_sock;
-static int warm_test;
-
-static void TimeTestHandler();
-
- /*
- * TspInit - Initialize the transport system.
- *
- */
-
- 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);
-}
-
- /*
- * TspTranslateRpcAddr - translate from an RPC handle to an
- * opaque address.
- *
- * Converts the sender's address into the opaque data structure
- * used for network addresses. This is used to look up the sender
- * on each call.
- */
-
- 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;
-}
-
- /*
- * TspValidateAddr - validate a passed in opaque address.
- *
- * Checks that the passed in address is in the format
- * expected.
- */
-
- 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;
-}
-
- /*
- * TspConnGetIndex - lookup an rpc caller's address as a connection entry.
- *
- * Looks up an ip address of a caller to locate the
- * connection index in our connection array.
- */
-
- 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;
- }
- }
- 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++;
- }
- 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)
-{
- 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);
- }
-}
-
- /*
- * TspMessageReceive - confirmation received, now send next if any.
- *
- * - since UDP is connectionless, we batch up the sends and use
- * one at a time until we get a message indicating ready for
- * next (from ack).
- */
-
- 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 */
- }
-#ifdef DDEBUG
- 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);
-}
-
- /*
- * TspGetHostName - return client's host name.
- *
- * - this routine returns the name of the client's host or the net
- * number of unknown.
- */
-
- char*
-TspGetHostName (conn_idx)
- int conn_idx; /* client connection number */
-{
- 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;
-}
-
- /*
- * TimeTestHandler - alarm timer handler to resend warm/wait test.
- */
-
- 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 */
- }
- alarm (2); /* setup for 2 seconds from now */
-}
diff --git a/c/src/lib/librdbg/servutil.c b/c/src/lib/librdbg/servutil.c
deleted file mode 100644
index 1417fa5236..0000000000
--- a/c/src/lib/librdbg/servutil.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- **********************************************************************
- *
- * Component: RDB
- * Module: servutil.c
- *
- * Synopsis: Various utility routines
- *
- * $Id$
- *
- **********************************************************************
- */
-
-#include <string.h>
-#include <rdbg/rdbg.h>
-#include <rdbg/servrpc.h>
-
-/*----- Management of per-process list ----*/
-
- /*
- * ListAlloc - build up list entry.
- *
- * Notes:
- * - this is a generic routine to build up entries in the per-connection
- * list. The fields list, list_sz and list_alloc are affected.
- */
-
- Boolean
-ListAlloc(buff, clst)
- char *buff;
- 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;
- }
- strcpy(clst->list + clst->list_sz, buff);
- clst->list_sz += tmp;
- return(True);
-}
-
-/*----- Management of processes -----*/
-
- /*
- * FindPidEntry - locate pid_list entry from pid
- */
-
- int
-FindPidEntry (pid)
- int pid; /* process identifier */
-{
- 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;
- }
- return -1;
-}
-
-/*----- Debug suport -----*/
-
-#ifdef DDEBUG
-
- /*
- * 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*
-PtraceName(req)
- int req;
-{
- static char bufret[40];
-
- 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"
-};
-
-#endif /* DDEBUG */