OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [rel-0-3-0-rc3/] [or1ksim/] [debug/] [gdbcomm.c] - Diff between revs 1744 and 1748

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1744 Rev 1748
Line 3... Line 3...
   Copyright (C) 2001 by Marko Mlinar, markom@opencores.org
   Copyright (C) 2001 by Marko Mlinar, markom@opencores.org
   Copyright (C) 2008 Embecosm Limited
   Copyright (C) 2008 Embecosm Limited
 
 
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
 
 
   This file is part of OpenRISC 1000 Architectural Simulator.
   This file is part of Or1ksim, the OpenRISC 1000 Architectural Simulator.
 
 
   This program is free software; you can redistribute it and/or modify it
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the Free
   under the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3 of the License, or (at your option)
   Software Foundation; either version 3 of the License, or (at your option)
   any later version.
   any later version.
Line 18... Line 18...
   more details.
   more details.
 
 
   You should have received a copy of the GNU General Public License along
   You should have received a copy of the GNU General Public License along
   with this program.  If not, see <http://www.gnu.org/licenses/>. */
   with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 
 
/* This program is commented throughout in a fashion suitable for processing
 
   with Doxygen. */
 
 
/* Code copied from toplevel.c */
 
 
 
 
/* Autoconf and/or portability configuration */
 
#include "config.h"
 
#include "port.h"
 
 
 
/* System includes */
#include <stdlib.h>
#include <stdlib.h>
 
#include <unistd.h>
#include <stdio.h>
#include <stdio.h>
#include <sys/stat.h>
 
#include <sys/types.h>
 
#include <sys/socket.h>
 
#include <netinet/in.h>
 
#include <sys/select.h>
 
#include <sys/poll.h>
#include <sys/poll.h>
#include <fcntl.h>
#include <fcntl.h>
#include <netdb.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
 
 
 
#include "config.h"
 
 
 
#ifdef HAVE_INTTYPES_H
/* Package includes */
#include <inttypes.h>
#include "sim-config.h"
#endif
 
 
 
#include "port.h"
 
#include "arch.h"
 
#include "gdb.h"
#include "gdb.h"
#include "gdbcomm.h"
#include "gdbcomm.h"
 
#include "debug-unit.h"
#include "vapi.h"
#include "vapi.h"
#include "sim-config.h"
 
#include "debug_unit.h"
 
 
 
 
 
 
/* Forward declaration of static functions */
 
static void  jtag_request ();
 
static void  gdb_request (void);
 
static void  protocol_clean (int, int32_t);
 
static int   get_server_socket (const char *name, const char *proto, int port);
static int gdb_read(void* buf,int len);
static int gdb_read(void* buf,int len);
static int gdb_write(const void* buf,int len);
static int gdb_write(const void* buf,int len);
 
 
static unsigned int serverIP = 0;
/* Data structures for this file */
static unsigned int serverPort = 0;
static unsigned int  server_ip   = 0;
 
static unsigned int  server_port = 0;
static unsigned int server_fd = 0;
static unsigned int server_fd = 0;
static unsigned int gdb_fd = 0;
static unsigned int gdb_fd = 0;
 
 
static int tcp_level = 0;
static int tcp_level = 0;
 
 
/* Added by CZ 24/05/01 */
/* Added by CZ 24/05/01 */
int GetServerSocket(const char* name,const char* proto,int port)
static int
 
get_server_socket (const char *name, const char *proto, int port)
{
{
  struct servent *service;
  struct servent *service;
  struct protoent *protocol;
  struct protoent *protocol;
  struct sockaddr_in sa;
  struct sockaddr_in sa;
  struct hostent *hp;
  struct hostent *hp;
Line 97... Line 98...
      perror("Unable to create socket");
      perror("Unable to create socket");
      return 0;
      return 0;
    }
    }
 
 
  flags = 1;
  flags = 1;
  if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&flags,sizeof(int)) < 0)
  if (setsockopt
 
      (sockfd, SOL_SOCKET, SO_REUSEADDR, (const char *) &flags,
 
       sizeof (int)) < 0)
    {
    {
      sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd);
      sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd);
      perror(sTemp);
      perror(sTemp);
      close(sockfd);
      close(sockfd);
      return 0;
      return 0;
    }
    }
 
 
  /* The server should also be non blocking. Get the current flags. */
  /* The server should also be non blocking. Get the current flags. */
  if(fcntl(sockfd,F_GETFL,&flags) < 0)
  if (fcntl (sockfd, F_GETFL, &flags) < 0)
    {
    {
      sprintf(sTemp,"Unable to get flags for socket %d",sockfd);
      sprintf(sTemp,"Unable to get flags for socket %d",sockfd);
      perror(sTemp);
      perror(sTemp);
      close(sockfd);
      close(sockfd);
      return 0;
      return 0;
Line 144... Line 147...
      sprintf(sTemp,"Unable to bind socket %d to port %d",sockfd,port);
      sprintf(sTemp,"Unable to bind socket %d to port %d",sockfd,port);
      perror(sTemp);
      perror(sTemp);
      close(sockfd);
      close(sockfd);
      return 0;
      return 0;
    }
    }
  serverIP = sa.sin_addr.s_addr;
  server_ip = sa.sin_addr.s_addr;
  len = sizeof(struct sockaddr_in);
  len = sizeof(struct sockaddr_in);
  if(getsockname(sockfd,(struct sockaddr*)&sa,&len) < 0)
  if (getsockname (sockfd, (struct sockaddr *) &sa, &len) < 0)
    {
    {
      sprintf(sTemp,"Unable to get socket information for socket %d",sockfd);
      sprintf (sTemp, "Unable to get socket information for socket %d",
 
               sockfd);
      perror(sTemp);
      perror(sTemp);
      close(sockfd);
      close(sockfd);
      return 0;
      return 0;
    }
    }
  serverPort = ntohs(sa.sin_port);
  server_port = ntohs (sa.sin_port);
 
 
  /* Set the backlog to 1 connections */
  /* Set the backlog to 1 connections */
  if(listen(sockfd,1) < 0)
  if(listen(sockfd,1) < 0)
    {
    {
      sprintf(sTemp,"Unable to set backlog on socket %d to %d",sockfd,1);
      sprintf(sTemp,"Unable to set backlog on socket %d to %d",sockfd,1);
Line 167... Line 171...
    }
    }
 
 
  return sockfd;
  return sockfd;
}
}
 
 
void BlockJTAG(void)
void
 
block_jtag ()
{
{
  struct pollfd fds[2];
  struct pollfd fds[2];
  int n = 0;
  int n = 0;
 
 
  fds[n].fd = server_fd;
  fds[n].fd = server_fd;
Line 181... Line 186...
    {
    {
      fds[n].fd = gdb_fd;
      fds[n].fd = gdb_fd;
      fds[n].events = POLLIN;
      fds[n].events = POLLIN;
      fds[n++].revents = 0;
      fds[n++].revents = 0;
    }
    }
  poll(fds,n,-1);
  poll (fds, n, -1);
}
}
 
 
void HandleServerSocket(Boolean block)
void
 
handle_server_socket (enum boolean block)
{
{
  struct pollfd fds[3];
  struct pollfd fds[3];
  int n = 0;
  int n = 0;
  int timeout = block ? -1 : 0;
  int timeout = block ? -1 : 0;
  Boolean data_on_stdin = false;
  enum boolean data_on_stdin = FALSE;
  int o_serv_fd = server_fd;
  int o_serv_fd = server_fd;
 
 
  if(!o_serv_fd && !gdb_fd)
  if(!o_serv_fd && !gdb_fd)
    return;
    return;
 
 
Line 216... Line 222...
      fds[n++].revents = 0;
      fds[n++].revents = 0;
    }
    }
 
 
  while(!data_on_stdin)
  while(!data_on_stdin)
    {
    {
 
      fds[0].revents = 0;
 
      fds[1].revents = 0;
 
      fds[2].revents = 0;
      switch(poll(fds,n,timeout))
      switch(poll(fds,n,timeout))
        {
        {
        case -1:
        case -1:
          if(errno == EINTR)
          if(errno == EINTR)
            continue;
            continue;
          perror("poll");
          perror("poll");
          server_fd = 0;
          server_fd = 0;
          break;
          break;
        case 0: /* Nothing interesting going on */
        case 0: /* Nothing interesting going on */
          data_on_stdin = true; /* Can only get here if nonblocking */
          data_on_stdin = TRUE; /* Can only get here if nonblocking */
          break;
          break;
        default:
        default:
          /* Make sure to handle the gdb port first! */
          /* Make sure to handle the gdb port first! */
          if((fds[0].revents && gdb_fd && !o_serv_fd) ||
          if((fds[0].revents && gdb_fd && !o_serv_fd) ||
             (fds[1].revents && server_fd && gdb_fd))
             (fds[1].revents && server_fd && gdb_fd))
            {
            {
              int revents = o_serv_fd ? fds[1].revents : fds[0].revents;
              int revents = o_serv_fd ? fds[1].revents : fds[0].revents;
 
 
              if(revents & POLLIN)
              if(revents & POLLIN)
                GDBRequest();
                gdb_request ();
              else /* Error Occurred */
              else /* Error Occurred */
                {
                {
                  fprintf(stderr,"Received flags 0x%08x on gdb socket. Shutting down.\n",revents);
                  fprintf (stderr,
 
                           "Received flags 0x%08x on gdb socket. Shutting down.\n",
 
                           revents);
                  close(gdb_fd);
                  close(gdb_fd);
                  gdb_fd = 0;
                  gdb_fd = 0;
                }
                }
            }
            }
          if(fds[0].revents && o_serv_fd)
          if(fds[0].revents && o_serv_fd)
            {
            {
              if(fds[0].revents & POLLIN)
              if(fds[0].revents & POLLIN)
                JTAGRequest();
                jtag_request ();
              else /* Error Occurred */
              else /* Error Occurred */
                {
                {
                  fprintf(stderr,"Received flags 0x%08x on server. Shutting down.\n",fds[0].revents);
                  fprintf (stderr,
 
                           "Received flags 0x%08x on server. Shutting down.\n",
 
                           fds[0].revents);
                  close(o_serv_fd);
                  close(o_serv_fd);
                  server_fd = 0;
                  server_fd = 0;
                  serverPort = 0;
                  server_port = 0;
                  serverIP = 0;
                  server_ip = 0;
                }
                }
            }
            }
          if(fds[2].revents || (fds[1].revents && !gdb_fd))
          if(fds[2].revents || (fds[1].revents && !gdb_fd))
            data_on_stdin = true;
            data_on_stdin = TRUE;
          break;
          break;
        } /* End of switch statement */
        } /* End of switch statement */
    } /* End of while statement */
    } /* End of while statement */
}
}
 
 
void JTAGRequest(void)
static void
 
jtag_request (void)
{
{
  struct sockaddr_in sa;
  struct sockaddr_in sa;
  struct sockaddr* addr = (struct sockaddr*)&sa;
  struct sockaddr* addr = (struct sockaddr*)&sa;
  socklen_t len = sizeof(struct sockaddr_in);
  socklen_t len = sizeof(struct sockaddr_in);
  int fd = accept(server_fd,addr,&len);
  int fd = accept (server_fd, addr, &len);
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
  int flags;
  int flags;
  char sTemp[256];
  char sTemp[256];
 
 
  if(fd < 0)
  if(fd < 0)
Line 283... Line 297...
      if(errno != EWOULDBLOCK && errno != EAGAIN)
      if(errno != EWOULDBLOCK && errno != EAGAIN)
        {
        {
          perror("accept");
          perror("accept");
          close(server_fd);
          close(server_fd);
          server_fd = 0;
          server_fd = 0;
          serverPort = 0;
          server_port = 0;
          serverIP = 0;
          server_ip = 0;
        }
        }
      return;
      return;
    }
    }
 
 
  if(gdb_fd)
  if(gdb_fd)
Line 312... Line 326...
      perror(sTemp);
      perror(sTemp);
      close(fd);
      close(fd);
      return;
      return;
    }
    }
 
 
  if(setsockopt(fd,tcp_level,TCP_NODELAY,&on_off,sizeof(int)) < 0)
  if (setsockopt (fd, tcp_level, TCP_NODELAY, &on_off, sizeof (int)) < 0)
    {
    {
      sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",fd);
      sprintf (sTemp,
 
               "Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",
 
               fd);
      perror(sTemp);
      perror(sTemp);
      close(fd);
      close(fd);
      return;
      return;
    }
    }
 
 
  gdb_fd = fd;
  gdb_fd = fd;
}
}
 
 
void GDBRequest(void)
static void
 
gdb_request (void)
{
{
  JTAGProxyWriteMessage msg_write;
  struct jtr_read_message          msg_read;
  JTAGProxyReadMessage msg_read;
  struct jtr_write_message         msg_write;
  JTAGProxyChainMessage msg_chain;
  struct jtr_read_block_message    msg_bread;
  JTAGProxyWriteResponse resp_write;
  struct jtr_write_block_message  *msg_bwrite;
  JTAGProxyReadResponse resp_read;
  struct jtr_chain_message         msg_chain;
  JTAGProxyChainResponse resp_chain;
  struct jtr_read_response         resp_read;
  JTAGProxyBlockWriteMessage *msg_bwrite;
  struct jtr_write_response        resp_write;
  JTAGProxyBlockReadMessage msg_bread;
  struct jtr_read_block_response  *resp_bread;
  JTAGProxyBlockWriteResponse resp_bwrite;
  struct jtr_write_block_response  resp_bwrite;
  JTAGProxyBlockReadResponse *resp_bread;
  struct jtr_chain_response        resp_chain;
 
 
  char *buf;
  char *buf;
  int err = 0;
  int err = 0;
  uint32_t command,length;
  uint32_t command,length;
  int len,i;
  int len,i;
 
 
Line 366... Line 384...
  length = ntohl(length);
  length = ntohl(length);
 
 
  /* Now, verify the protocol and implement the command */
  /* Now, verify the protocol and implement the command */
  switch(ntohl(command))
  switch(ntohl(command))
    {
    {
    case JTAG_COMMAND_WRITE:
    case OR1K_JTAG_COMMAND_WRITE:
      if(length != sizeof(msg_write) - 8)
      if(length != sizeof(msg_write) - 8)
        {
        {
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
          protocol_clean (length, JTAG_PROXY_PROTOCOL_ERROR);
          return;
          return;
        }
        }
      buf = (char*)&msg_write;
      buf = (char*)&msg_write;
      if(gdb_read(&buf[8],length) < 0)
      if(gdb_read(&buf[8],length) < 0)
        {
        {
Line 384... Line 402...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      msg_write.address = ntohl(msg_write.address);
      msg_write.address = ntohl(msg_write.address);
      msg_write.data_H = ntohl(msg_write.data_H);
      msg_write.data_h = ntohl (msg_write.data_h);
      msg_write.data_L = ntohl(msg_write.data_L);
      msg_write.data_l = ntohl (msg_write.data_l);
      err = DebugSetRegister(msg_write.address,msg_write.data_L);
      err = debug_set_register (msg_write.address, msg_write.data_l);
      resp_write.status = htonl(err);
      resp_write.status = htonl(err);
      if(gdb_write(&resp_write,sizeof(resp_write)) < 0)
      if(gdb_write(&resp_write,sizeof(resp_write)) < 0)
        {
        {
          if(gdb_fd)
          if(gdb_fd)
            {
            {
Line 399... Line 417...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      break;
      break;
    case JTAG_COMMAND_READ:
    case OR1K_JTAG_COMMAND_READ:
      if(length != sizeof(msg_read) - 8)
      if(length != sizeof(msg_read) - 8)
        {
        {
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
          protocol_clean (length, JTAG_PROXY_PROTOCOL_ERROR);
          return;
          return;
        }
        }
      buf = (char*)&msg_read;
      buf = (char*)&msg_read;
      if(gdb_read(&buf[8],length) < 0)
      if(gdb_read(&buf[8],length) < 0)
        {
        {
Line 417... Line 435...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      msg_read.address = ntohl(msg_read.address);
      msg_read.address = ntohl(msg_read.address);
      err = DebugGetRegister(msg_read.address,&resp_read.data_L);
      err = debug_get_register (msg_read.address, &resp_read.data_l);
      resp_read.status = htonl(err);
      resp_read.status = htonl(err);
      resp_read.data_H = 0;
      resp_read.data_h = 0;
      resp_read.data_L = htonl(resp_read.data_L);
      resp_read.data_l = htonl (resp_read.data_l);
      if(gdb_write(&resp_read,sizeof(resp_read)) < 0)
      if(gdb_write(&resp_read,sizeof(resp_read)) < 0)
        {
        {
          if(gdb_fd)
          if(gdb_fd)
            {
            {
              perror("gdb socket - 6");
              perror("gdb socket - 6");
Line 432... Line 450...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      break;
      break;
    case JTAG_COMMAND_BLOCK_WRITE:
    case OR1K_JTAG_COMMAND_WRITE_BLOCK:
      if(length < sizeof(JTAGProxyBlockWriteMessage)-8)
      if (length < sizeof (struct jtr_write_block_message) - 8)
        {
        {
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
          protocol_clean (length, JTAG_PROXY_PROTOCOL_ERROR);
          return;
          return;
        }
        }
      if(!(buf = (char*)malloc(8+length)))
      if(!(buf = (char*)malloc(8+length)))
        {
        {
          ProtocolClean(length,JTAG_PROXY_OUT_OF_MEMORY);
          protocol_clean (length, JTAG_PROXY_OUT_OF_MEMORY);
          return;
          return;
        }
        }
      msg_bwrite = (JTAGProxyBlockWriteMessage*)buf;
      msg_bwrite = (struct jtr_write_block_message *) buf;
      if(gdb_read(&buf[8],length) < 0)
      if(gdb_read(&buf[8],length) < 0)
        {
        {
          if(gdb_fd)
          if(gdb_fd)
            {
            {
              perror("gdb socket - 5");
              perror("gdb socket - 5");
Line 456... Line 474...
            }
            }
          free(buf);
          free(buf);
          return;
          return;
        }
        }
      msg_bwrite->address = ntohl(msg_bwrite->address);
      msg_bwrite->address = ntohl(msg_bwrite->address);
      msg_bwrite->nRegisters = ntohl(msg_bwrite->nRegisters);
      msg_bwrite->num_regs = ntohl (msg_bwrite->num_regs);
      for(i=0;i<msg_bwrite->nRegisters;i++)
      for (i = 0; i < msg_bwrite->num_regs; i++)
        {
        {
          int t_err = 0;
          int t_err = 0;
 
 
          msg_bwrite->data[i] = ntohl(msg_bwrite->data[i]);
          msg_bwrite->data[i] = ntohl(msg_bwrite->data[i]);
          t_err = DebugSetRegister(msg_bwrite->address + 4 * i,msg_bwrite->data[i]);
          t_err =
 
            debug_set_register (msg_bwrite->address + 4 * i,
 
                                msg_bwrite->data[i]);
          err = err ? err : t_err;
          err = err ? err : t_err;
        }
        }
      resp_bwrite.status = htonl(err);
      resp_bwrite.status = htonl(err);
      free(buf);
      free(buf);
      buf = NULL;
      buf = NULL;
Line 480... Line 500...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      break;
      break;
    case JTAG_COMMAND_BLOCK_READ:
    case OR1K_JTAG_COMMAND_READ_BLOCK:
      if(length != sizeof(msg_bread) - 8)
      if(length != sizeof(msg_bread) - 8)
        {
        {
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
          protocol_clean (length, JTAG_PROXY_PROTOCOL_ERROR);
          return;
          return;
        }
        }
      buf = (char*)&msg_bread;
      buf = (char*)&msg_bread;
      if(gdb_read(&buf[8],length) < 0)
      if(gdb_read(&buf[8],length) < 0)
        {
        {
Line 498... Line 518...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      msg_bread.address = ntohl(msg_bread.address);
      msg_bread.address = ntohl(msg_bread.address);
      msg_bread.nRegisters = ntohl(msg_bread.nRegisters);
      msg_bread.num_regs = ntohl (msg_bread.num_regs);
      len = sizeof(JTAGProxyBlockReadResponse) + 4*(msg_bread.nRegisters-1);
      len =
 
        sizeof (struct jtr_read_block_response) + 4 * (msg_bread.num_regs - 1);
      if(!(buf = (char*)malloc(len)))
      if(!(buf = (char*)malloc(len)))
        {
        {
          ProtocolClean(0,JTAG_PROXY_OUT_OF_MEMORY);
          protocol_clean (0, JTAG_PROXY_OUT_OF_MEMORY);
          return;
          return;
        }
        }
      resp_bread = (JTAGProxyBlockReadResponse*)buf;
      resp_bread = (struct jtr_read_block_response *) buf;
      for(i=0;i<msg_bread.nRegisters;i++)
      for (i = 0; i < msg_bread.num_regs; i++)
        {
        {
          int t_err;
          int t_err;
 
 
          t_err = DebugGetRegister(msg_bread.address + 4 * i,&resp_bread->data[i]);
          t_err =
 
            debug_get_register (msg_bread.address + 4 * i,
 
                                &resp_bread->data[i]);
          resp_bread->data[i] = htonl(resp_bread->data[i]);
          resp_bread->data[i] = htonl(resp_bread->data[i]);
          err = err ? err : t_err;
          err = err ? err : t_err;
        }
        }
      resp_bread->status = htonl(err);
      resp_bread->status = htonl(err);
      resp_bread->nRegisters = htonl(msg_bread.nRegisters);
      resp_bread->num_regs = htonl (msg_bread.num_regs);
      if(gdb_write(resp_bread,len) < 0)
      if(gdb_write(resp_bread,len) < 0)
        {
        {
          if(gdb_fd)
          if(gdb_fd)
            {
            {
              perror("gdb socket - 6");
              perror("gdb socket - 6");
Line 531... Line 554...
        }
        }
      free(buf);
      free(buf);
      buf = NULL;
      buf = NULL;
      resp_bread = NULL;
      resp_bread = NULL;
      break;
      break;
    case JTAG_COMMAND_CHAIN:
    case OR1K_JTAG_COMMAND_CHAIN:
      if(length != sizeof(msg_chain) - 8)
      if(length != sizeof(msg_chain) - 8)
        {
        {
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
          protocol_clean (length, JTAG_PROXY_PROTOCOL_ERROR);
          return;
          return;
        }
        }
      buf = (char*)&msg_chain;
      buf = (char*)&msg_chain;
      if(gdb_read(&buf[8],sizeof(msg_chain)-8) < 0)
      if(gdb_read(&buf[8],sizeof(msg_chain)-8) < 0)
        {
        {
Line 549... Line 572...
              gdb_fd = 0;
              gdb_fd = 0;
            }
            }
          return;
          return;
        }
        }
      msg_chain.chain = htonl(msg_chain.chain);
      msg_chain.chain = htonl(msg_chain.chain);
      err = DebugSetChain(msg_chain.chain);
      err = debug_set_chain (msg_chain.chain);
      resp_chain.status = htonl(err);
      resp_chain.status = htonl(err);
      if(gdb_write(&resp_chain,sizeof(resp_chain)) < 0)
      if(gdb_write(&resp_chain,sizeof(resp_chain)) < 0)
        {
        {
          if(gdb_fd)
          if(gdb_fd)
            {
            {
Line 563... Line 586...
            }
            }
          return;
          return;
        }
        }
      break;
      break;
    default:
    default:
      ProtocolClean(length,JTAG_PROXY_COMMAND_NOT_IMPLEMENTED);
      protocol_clean (length, JTAG_PROXY_COMMAND_NOT_IMPLEMENTED);
      break;
      break;
    }
    }
}
}
 
 
void ProtocolClean(int length,int32_t err)
static void
 
protocol_clean (int length, int32_t err)
{
{
  char buf[4096];
  char buf[4096];
 
 
  err = htonl(err);
  err = htonl(err);
  if((gdb_read(buf,length) < 0) ||
  if((gdb_read(buf,length) < 0) ||
Line 582... Line 606...
      close(gdb_fd);
      close(gdb_fd);
      gdb_fd = 0;
      gdb_fd = 0;
    }
    }
}
}
 
 
static int gdb_write(const void* buf,int len)
static int
 
gdb_write (const void *buf, int len)
{
{
  int n, log_n = 0;
  int n, log_n = 0;
  const char* w_buf = (const char*)buf;
  const char* w_buf = (const char*)buf;
  const uint32_t* log_buf = (const uint32_t*)buf;
  const uint32_t* log_buf = (const uint32_t*)buf;
  struct pollfd block;
  struct pollfd block;
 
 
  while(len) {
  while (len)
    if((n = write(gdb_fd,w_buf,len)) < 0) {
    {
      switch(errno) {
      if ((n = write (gdb_fd, w_buf, len)) < 0)
 
        {
 
          switch (errno)
 
            {
      case EWOULDBLOCK: /* or EAGAIN */
      case EWOULDBLOCK: /* or EAGAIN */
        /* We've been called on a descriptor marked
        /* We've been called on a descriptor marked
           for nonblocking I/O. We better simulate
           for nonblocking I/O. We better simulate
           blocking behavior. */
           blocking behavior. */
        block.fd = gdb_fd;
        block.fd = gdb_fd;
        block.events = POLLOUT;
        block.events = POLLOUT;
        block.revents = 0;
        block.revents = 0;
        poll(&block,1,-1);
              poll (&block, 1, -1);
        continue;
        continue;
      case EINTR:
      case EINTR:
        continue;
        continue;
      case EPIPE:
      case EPIPE:
        close(gdb_fd);
        close(gdb_fd);
Line 611... Line 639...
        return -1;
        return -1;
      default:
      default:
        return -1;
        return -1;
      }
      }
    }
    }
    else {
      else
 
        {
      len -= n;
      len -= n;
      w_buf += n;
      w_buf += n;
      if ( config.debug.vapi_id )
      if ( config.debug.vapi_id )
        for ( log_n += n; log_n >= 4; log_n -= 4, ++ log_buf )
        for ( log_n += n; log_n >= 4; log_n -= 4, ++ log_buf )
          vapi_write_log_file( VAPI_COMMAND_SEND, config.debug.vapi_id, ntohl(*log_buf) );
              vapi_write_log_file (VAPI_COMMAND_SEND, config.debug.vapi_id,
 
                                   ntohl (*log_buf));
    }
    }
  }
  }
  return 0;
  return 0;
}
}
 
 
static int gdb_read(void* buf,int len)
static int
 
gdb_read (void *buf, int len)
{
{
  int n, log_n = 0;
  int n, log_n = 0;
  char* r_buf = (char*)buf;
  char* r_buf = (char*)buf;
  uint32_t* log_buf = (uint32_t*)buf;
  uint32_t* log_buf = (uint32_t*)buf;
  struct pollfd block;
  struct pollfd block;
 
 
  while(len) {
  while (len)
    if((n = read(gdb_fd,r_buf,len)) < 0) {
    {
      switch(errno) {
      if ((n = read (gdb_fd, r_buf, len)) < 0)
 
        {
 
          switch (errno)
 
            {
      case EWOULDBLOCK: /* or EAGAIN */
      case EWOULDBLOCK: /* or EAGAIN */
        /* We've been called on a descriptor marked
        /* We've been called on a descriptor marked
           for nonblocking I/O. We better simulate
           for nonblocking I/O. We better simulate
           blocking behavior. */
           blocking behavior. */
        block.fd = gdb_fd;
        block.fd = gdb_fd;
        block.events = POLLIN;
        block.events = POLLIN;
        block.revents = 0;
        block.revents = 0;
        poll(&block,1,-1);
              poll (&block, 1, -1);
        continue;
        continue;
      case EINTR:
      case EINTR:
        continue;
        continue;
      default:
      default:
        return -1;
        return -1;
      }
      }
    }
    }
    else if(n == 0) {
      else if (n == 0)
 
        {
      close(gdb_fd);
      close(gdb_fd);
      gdb_fd = 0;
      gdb_fd = 0;
      return -1;
      return -1;
    }
    }
    else {
      else
 
        {
      len -= n;
      len -= n;
      r_buf += n;
      r_buf += n;
      if ( config.debug.vapi_id )
      if ( config.debug.vapi_id )
        for ( log_n += n; log_n >= 4; log_n -= 4, ++ log_buf )
        for ( log_n += n; log_n >= 4; log_n -= 4, ++ log_buf )
          vapi_write_log_file( VAPI_COMMAND_REQUEST, config.debug.vapi_id, ntohl(*log_buf) );
              vapi_write_log_file (VAPI_COMMAND_REQUEST, config.debug.vapi_id,
 
                                   ntohl (*log_buf));
    }
    }
  }
  }
  return 0;
  return 0;
}
}
 
 
void gdbcomm_init (void)
void
 
gdbcomm_init ()
{
{
  serverPort = config.debug.server_port;
  server_port = config.debug.server_port;
  if((server_fd = GetServerSocket("or1ksim","tcp",serverPort)))
  if ((server_fd = get_server_socket ("or1ksim", "tcp", server_port)))
    PRINTF("JTAG Proxy server started on port %d\n",serverPort);
    PRINTF ("JTAG Proxy server started on port %d\n", server_port);
  else
  else
    PRINTF("Cannot start JTAG proxy server on port %d\n", serverPort);
    PRINTF ("Cannot start JTAG proxy server on port %d\n", server_port);
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.