summaryrefslogblamecommitdiffstats
path: root/c/src/librdbg/src/rdbg.c
blob: 5f08e99f5cd8167d09cde8925074ae39c97829e1 (plain) (tree)
1
2
3
4
5
6
7
8
9






                                                                           

       








                                                                           



                               

















                                               
   







                                                            








                                                                   






















                                                                     




                                                                           


             
          

                                         
            

 
    











































                                                                                 
    




                    
   



                 
/*
 **************************************************************************
 *
 * 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>
#include <rtems/rtems_bsdnet.h>
#include <rpc/pmap_clnt.h>
#include <sys/socket.h>
#include <netinet/in.h>

u_short  rtemsPort = RTEMS_PORT;
int	 BackPort = RTEMS_BACK_PORT;
int      rtemsActive = 0;
SVCXPRT* rtemsXprt;
int      rtemsSock;
char	 ActName[] = "RTEMS";
volatile int 		ExitForSingleStep = 0 ;
volatile int 		Continue;
volatile int 		justSaveContext;
volatile Objects_Id 	currentTargetThread;
volatile int 		CannotRestart = 0;
volatile int 		TotalReboot = 0;
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 void
remotedeb_2_hook(struct svc_req *rqstp, register SVCXPRT *transp)
{
  connect_rdbg_exception(); /* monitor stub changes trace vector */
  remotedeb_2(rqstp, transp);
  connect_rdbg_exception();
}

static int
rdbgInit (void)
{
    int sock;
    struct sockaddr_in addr;

    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == -1) {
	printf("%s: rkdbInit: cannot allocate socket\n", ActName);
	return -1;
    }

    bzero( (void *)&addr, sizeof(struct sockaddr_in));
    addr.sin_port = htons(rtemsPort);
    if ((bind(sock, (struct sockaddr*) &addr, sizeof(addr))) == -1) {
	printf("%s: rkdbInit: cannot bind socket\n", ActName);
	return -2;
    }
    rtemsXprt = svcudp_create(sock);
    if (svcudp_enablecache(rtemsXprt, 1) == 0) {
        printf("%s: rkdbInit: cannot enable rpc cache\n", ActName);
        return -3;
    }
    rtemsSock = sock;
    if (!svc_register(rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2, 0)) {
        printf(stderr, "unable to register (REMOTEDEB, REMOTEVERS, udp).");
	return -4;
    }

    return 0;
}

rtems_task
rdbgDaemon (rtems_task_argument argument)
{
  svc_run();
}

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;
}