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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [sparcl-tdep.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Target dependent code for the Fujitsu SPARClite for GDB, the GNU debugger.
/* Target dependent code for the Fujitsu SPARClite for GDB, the GNU debugger.
   Copyright 1994, 1995, 1996, 1999  Free Software Foundation, Inc.
   Copyright 1994, 1995, 1996, 1999  Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include "defs.h"
#include "defs.h"
#include "gdbcore.h"
#include "gdbcore.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "target.h"
#include "target.h"
#include "serial.h"
#include "serial.h"
#include <sys/types.h>
#include <sys/types.h>
 
 
#if (!defined(__GO32__) && !defined(_WIN32)) || defined(__CYGWIN32__)
#if (!defined(__GO32__) && !defined(_WIN32)) || defined(__CYGWIN32__)
#define HAVE_SOCKETS
#define HAVE_SOCKETS
#include <sys/time.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in.h>
#include <netdb.h>
#include <netdb.h>
#endif
#endif
 
 
static struct target_ops sparclite_ops;
static struct target_ops sparclite_ops;
 
 
static char *remote_target_name = NULL;
static char *remote_target_name = NULL;
static serial_t remote_desc = NULL;
static serial_t remote_desc = NULL;
static int serial_flag;
static int serial_flag;
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
static int udp_fd = -1;
static int udp_fd = -1;
#endif
#endif
 
 
static serial_t open_tty PARAMS ((char *name));
static serial_t open_tty PARAMS ((char *name));
static int send_resp PARAMS ((serial_t desc, char c));
static int send_resp PARAMS ((serial_t desc, char c));
static void close_tty PARAMS ((int ignore));
static void close_tty PARAMS ((int ignore));
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
static int recv_udp_buf PARAMS ((int fd, unsigned char *buf, int len, int timeout));
static int recv_udp_buf PARAMS ((int fd, unsigned char *buf, int len, int timeout));
static int send_udp_buf PARAMS ((int fd, unsigned char *buf, int len));
static int send_udp_buf PARAMS ((int fd, unsigned char *buf, int len));
#endif
#endif
static void sparclite_open PARAMS ((char *name, int from_tty));
static void sparclite_open PARAMS ((char *name, int from_tty));
static void sparclite_close PARAMS ((int quitting));
static void sparclite_close PARAMS ((int quitting));
static void download PARAMS ((char *target_name, char *args, int from_tty,
static void download PARAMS ((char *target_name, char *args, int from_tty,
                              void (*write_routine) (bfd * from_bfd,
                              void (*write_routine) (bfd * from_bfd,
                                                     asection * from_sec,
                                                     asection * from_sec,
                                                     file_ptr from_addr,
                                                     file_ptr from_addr,
                                                  bfd_vma to_addr, int len),
                                                  bfd_vma to_addr, int len),
                              void (*start_routine) (bfd_vma entry)));
                              void (*start_routine) (bfd_vma entry)));
static void sparclite_serial_start PARAMS ((bfd_vma entry));
static void sparclite_serial_start PARAMS ((bfd_vma entry));
static void sparclite_serial_write PARAMS ((bfd * from_bfd, asection * from_sec,
static void sparclite_serial_write PARAMS ((bfd * from_bfd, asection * from_sec,
                                            file_ptr from_addr,
                                            file_ptr from_addr,
                                            bfd_vma to_addr, int len));
                                            bfd_vma to_addr, int len));
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
static unsigned short calc_checksum PARAMS ((unsigned char *buffer,
static unsigned short calc_checksum PARAMS ((unsigned char *buffer,
                                             int count));
                                             int count));
static void sparclite_udp_start PARAMS ((bfd_vma entry));
static void sparclite_udp_start PARAMS ((bfd_vma entry));
static void sparclite_udp_write PARAMS ((bfd * from_bfd, asection * from_sec,
static void sparclite_udp_write PARAMS ((bfd * from_bfd, asection * from_sec,
                                         file_ptr from_addr, bfd_vma to_addr,
                                         file_ptr from_addr, bfd_vma to_addr,
                                         int len));
                                         int len));
#endif
#endif
static void sparclite_download PARAMS ((char *filename, int from_tty));
static void sparclite_download PARAMS ((char *filename, int from_tty));
 
 
#define DDA2_SUP_ASI            0xb000000
#define DDA2_SUP_ASI            0xb000000
#define DDA1_SUP_ASI            0xb0000
#define DDA1_SUP_ASI            0xb0000
 
 
#define DDA2_ASI_MASK           0xff000000
#define DDA2_ASI_MASK           0xff000000
#define DDA1_ASI_MASK           0xff0000
#define DDA1_ASI_MASK           0xff0000
#define DIA2_SUP_MODE           0x8000
#define DIA2_SUP_MODE           0x8000
#define DIA1_SUP_MODE           0x4000
#define DIA1_SUP_MODE           0x4000
#define DDA2_ENABLE             0x100
#define DDA2_ENABLE             0x100
#define DDA1_ENABLE             0x80
#define DDA1_ENABLE             0x80
#define DIA2_ENABLE             0x40
#define DIA2_ENABLE             0x40
#define DIA1_ENABLE             0x20
#define DIA1_ENABLE             0x20
#define DSINGLE_STEP            0x10    /* not used */
#define DSINGLE_STEP            0x10    /* not used */
#define DDV_TYPE_MASK           0xc
#define DDV_TYPE_MASK           0xc
#define DDV_TYPE_LOAD           0x0
#define DDV_TYPE_LOAD           0x0
#define DDV_TYPE_STORE          0x4
#define DDV_TYPE_STORE          0x4
#define DDV_TYPE_ACCESS         0x8
#define DDV_TYPE_ACCESS         0x8
#define DDV_TYPE_ALWAYS         0xc
#define DDV_TYPE_ALWAYS         0xc
#define DDV_COND                0x2
#define DDV_COND                0x2
#define DDV_MASK                0x1
#define DDV_MASK                0x1
 
 
int
int
sparclite_insert_watchpoint (addr, len, type)
sparclite_insert_watchpoint (addr, len, type)
     CORE_ADDR addr;
     CORE_ADDR addr;
     int len;
     int len;
     int type;
     int type;
{
{
  CORE_ADDR dcr;
  CORE_ADDR dcr;
 
 
  dcr = read_register (DCR_REGNUM);
  dcr = read_register (DCR_REGNUM);
 
 
  if (!(dcr & DDA1_ENABLE))
  if (!(dcr & DDA1_ENABLE))
    {
    {
      write_register (DDA1_REGNUM, addr);
      write_register (DDA1_REGNUM, addr);
      dcr &= ~(DDA1_ASI_MASK | DDV_TYPE_MASK);
      dcr &= ~(DDA1_ASI_MASK | DDV_TYPE_MASK);
      dcr |= (DDA1_SUP_ASI | DDA1_ENABLE);
      dcr |= (DDA1_SUP_ASI | DDA1_ENABLE);
      if (type == 1)
      if (type == 1)
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_LOAD & (~DDV_COND & ~DDV_MASK));
          dcr |= (DDV_TYPE_LOAD & (~DDV_COND & ~DDV_MASK));
        }
        }
      else if (type == 0)
      else if (type == 0)
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_STORE & (~DDV_COND & ~DDV_MASK));
          dcr |= (DDV_TYPE_STORE & (~DDV_COND & ~DDV_MASK));
        }
        }
      else
      else
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_ACCESS);
          dcr |= (DDV_TYPE_ACCESS);
        }
        }
      write_register (DCR_REGNUM, dcr);
      write_register (DCR_REGNUM, dcr);
    }
    }
  else if (!(dcr & DDA2_ENABLE))
  else if (!(dcr & DDA2_ENABLE))
    {
    {
      write_register (DDA2_REGNUM, addr);
      write_register (DDA2_REGNUM, addr);
      dcr &= ~(DDA2_ASI_MASK & DDV_TYPE_MASK);
      dcr &= ~(DDA2_ASI_MASK & DDV_TYPE_MASK);
      dcr |= (DDA2_SUP_ASI | DDA2_ENABLE);
      dcr |= (DDA2_SUP_ASI | DDA2_ENABLE);
      if (type == 1)
      if (type == 1)
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_LOAD & ~DDV_COND & ~DDV_MASK);
          dcr |= (DDV_TYPE_LOAD & ~DDV_COND & ~DDV_MASK);
        }
        }
      else if (type == 0)
      else if (type == 0)
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_STORE & ~DDV_COND & ~DDV_MASK);
          dcr |= (DDV_TYPE_STORE & ~DDV_COND & ~DDV_MASK);
        }
        }
      else
      else
        {
        {
          write_register (DDV1_REGNUM, 0);
          write_register (DDV1_REGNUM, 0);
          write_register (DDV2_REGNUM, 0xffffffff);
          write_register (DDV2_REGNUM, 0xffffffff);
          dcr |= (DDV_TYPE_ACCESS);
          dcr |= (DDV_TYPE_ACCESS);
        }
        }
      write_register (DCR_REGNUM, dcr);
      write_register (DCR_REGNUM, dcr);
    }
    }
  else
  else
    return -1;
    return -1;
 
 
  return 0;
  return 0;
}
}
 
 
int
int
sparclite_remove_watchpoint (addr, len, type)
sparclite_remove_watchpoint (addr, len, type)
     CORE_ADDR addr;
     CORE_ADDR addr;
     int len;
     int len;
     int type;
     int type;
{
{
  CORE_ADDR dcr, dda1, dda2;
  CORE_ADDR dcr, dda1, dda2;
 
 
  dcr = read_register (DCR_REGNUM);
  dcr = read_register (DCR_REGNUM);
  dda1 = read_register (DDA1_REGNUM);
  dda1 = read_register (DDA1_REGNUM);
  dda2 = read_register (DDA2_REGNUM);
  dda2 = read_register (DDA2_REGNUM);
 
 
  if ((dcr & DDA1_ENABLE) && addr == dda1)
  if ((dcr & DDA1_ENABLE) && addr == dda1)
    write_register (DCR_REGNUM, (dcr & ~DDA1_ENABLE));
    write_register (DCR_REGNUM, (dcr & ~DDA1_ENABLE));
  else if ((dcr & DDA2_ENABLE) && addr == dda2)
  else if ((dcr & DDA2_ENABLE) && addr == dda2)
    write_register (DCR_REGNUM, (dcr & ~DDA2_ENABLE));
    write_register (DCR_REGNUM, (dcr & ~DDA2_ENABLE));
  else
  else
    return -1;
    return -1;
 
 
  return 0;
  return 0;
}
}
 
 
int
int
sparclite_insert_hw_breakpoint (addr, len)
sparclite_insert_hw_breakpoint (addr, len)
     CORE_ADDR addr;
     CORE_ADDR addr;
     int len;
     int len;
{
{
  CORE_ADDR dcr;
  CORE_ADDR dcr;
 
 
  dcr = read_register (DCR_REGNUM);
  dcr = read_register (DCR_REGNUM);
 
 
  if (!(dcr & DIA1_ENABLE))
  if (!(dcr & DIA1_ENABLE))
    {
    {
      write_register (DIA1_REGNUM, addr);
      write_register (DIA1_REGNUM, addr);
      write_register (DCR_REGNUM, (dcr | DIA1_ENABLE | DIA1_SUP_MODE));
      write_register (DCR_REGNUM, (dcr | DIA1_ENABLE | DIA1_SUP_MODE));
    }
    }
  else if (!(dcr & DIA2_ENABLE))
  else if (!(dcr & DIA2_ENABLE))
    {
    {
      write_register (DIA2_REGNUM, addr);
      write_register (DIA2_REGNUM, addr);
      write_register (DCR_REGNUM, (dcr | DIA2_ENABLE | DIA2_SUP_MODE));
      write_register (DCR_REGNUM, (dcr | DIA2_ENABLE | DIA2_SUP_MODE));
    }
    }
  else
  else
    return -1;
    return -1;
 
 
  return 0;
  return 0;
}
}
 
 
int
int
sparclite_remove_hw_breakpoint (addr, shadow)
sparclite_remove_hw_breakpoint (addr, shadow)
     CORE_ADDR addr;
     CORE_ADDR addr;
     int shadow;
     int shadow;
{
{
  CORE_ADDR dcr, dia1, dia2;
  CORE_ADDR dcr, dia1, dia2;
 
 
  dcr = read_register (DCR_REGNUM);
  dcr = read_register (DCR_REGNUM);
  dia1 = read_register (DIA1_REGNUM);
  dia1 = read_register (DIA1_REGNUM);
  dia2 = read_register (DIA2_REGNUM);
  dia2 = read_register (DIA2_REGNUM);
 
 
  if ((dcr & DIA1_ENABLE) && addr == dia1)
  if ((dcr & DIA1_ENABLE) && addr == dia1)
    write_register (DCR_REGNUM, (dcr & ~DIA1_ENABLE));
    write_register (DCR_REGNUM, (dcr & ~DIA1_ENABLE));
  else if ((dcr & DIA2_ENABLE) && addr == dia2)
  else if ((dcr & DIA2_ENABLE) && addr == dia2)
    write_register (DCR_REGNUM, (dcr & ~DIA2_ENABLE));
    write_register (DCR_REGNUM, (dcr & ~DIA2_ENABLE));
  else
  else
    return -1;
    return -1;
 
 
  return 0;
  return 0;
}
}
 
 
int
int
sparclite_check_watch_resources (type, cnt, ot)
sparclite_check_watch_resources (type, cnt, ot)
     int type;
     int type;
     int cnt;
     int cnt;
     int ot;
     int ot;
{
{
  /* Watchpoints not supported on simulator.  */
  /* Watchpoints not supported on simulator.  */
  if (strcmp (target_shortname, "sim") == 0)
  if (strcmp (target_shortname, "sim") == 0)
    return 0;
    return 0;
 
 
  if (type == bp_hardware_breakpoint)
  if (type == bp_hardware_breakpoint)
    {
    {
      if (TARGET_HW_BREAK_LIMIT == 0)
      if (TARGET_HW_BREAK_LIMIT == 0)
        return 0;
        return 0;
      else if (cnt <= TARGET_HW_BREAK_LIMIT)
      else if (cnt <= TARGET_HW_BREAK_LIMIT)
        return 1;
        return 1;
    }
    }
  else
  else
    {
    {
      if (TARGET_HW_WATCH_LIMIT == 0)
      if (TARGET_HW_WATCH_LIMIT == 0)
        return 0;
        return 0;
      else if (ot)
      else if (ot)
        return -1;
        return -1;
      else if (cnt <= TARGET_HW_WATCH_LIMIT)
      else if (cnt <= TARGET_HW_WATCH_LIMIT)
        return 1;
        return 1;
    }
    }
  return -1;
  return -1;
}
}
 
 
CORE_ADDR
CORE_ADDR
sparclite_stopped_data_address ()
sparclite_stopped_data_address ()
{
{
  CORE_ADDR dsr, dda1, dda2;
  CORE_ADDR dsr, dda1, dda2;
 
 
  dsr = read_register (DSR_REGNUM);
  dsr = read_register (DSR_REGNUM);
  dda1 = read_register (DDA1_REGNUM);
  dda1 = read_register (DDA1_REGNUM);
  dda2 = read_register (DDA2_REGNUM);
  dda2 = read_register (DDA2_REGNUM);
 
 
  if (dsr & 0x10)
  if (dsr & 0x10)
    return dda1;
    return dda1;
  else if (dsr & 0x20)
  else if (dsr & 0x20)
    return dda2;
    return dda2;
  else
  else
    return 0;
    return 0;
}
}


static serial_t
static serial_t
open_tty (name)
open_tty (name)
     char *name;
     char *name;
{
{
  serial_t desc;
  serial_t desc;
 
 
  desc = SERIAL_OPEN (name);
  desc = SERIAL_OPEN (name);
  if (!desc)
  if (!desc)
    perror_with_name (name);
    perror_with_name (name);
 
 
  if (baud_rate != -1)
  if (baud_rate != -1)
    {
    {
      if (SERIAL_SETBAUDRATE (desc, baud_rate))
      if (SERIAL_SETBAUDRATE (desc, baud_rate))
        {
        {
          SERIAL_CLOSE (desc);
          SERIAL_CLOSE (desc);
          perror_with_name (name);
          perror_with_name (name);
        }
        }
    }
    }
 
 
  SERIAL_RAW (desc);
  SERIAL_RAW (desc);
 
 
  SERIAL_FLUSH_INPUT (desc);
  SERIAL_FLUSH_INPUT (desc);
 
 
  return desc;
  return desc;
}
}
 
 
/* Read a single character from the remote end, masking it down to 7 bits. */
/* Read a single character from the remote end, masking it down to 7 bits. */
 
 
static int
static int
readchar (desc, timeout)
readchar (desc, timeout)
     serial_t desc;
     serial_t desc;
     int timeout;
     int timeout;
{
{
  int ch;
  int ch;
  char s[10];
  char s[10];
 
 
  ch = SERIAL_READCHAR (desc, timeout);
  ch = SERIAL_READCHAR (desc, timeout);
 
 
  switch (ch)
  switch (ch)
    {
    {
    case SERIAL_EOF:
    case SERIAL_EOF:
      error ("SPARClite remote connection closed");
      error ("SPARClite remote connection closed");
    case SERIAL_ERROR:
    case SERIAL_ERROR:
      perror_with_name ("SPARClite communication error");
      perror_with_name ("SPARClite communication error");
    case SERIAL_TIMEOUT:
    case SERIAL_TIMEOUT:
      error ("SPARClite remote timeout");
      error ("SPARClite remote timeout");
    default:
    default:
      if (remote_debug > 0)
      if (remote_debug > 0)
        {
        {
          sprintf (s, "[%02x]", ch & 0xff);
          sprintf (s, "[%02x]", ch & 0xff);
          puts_debug ("read -->", s, "<--");
          puts_debug ("read -->", s, "<--");
        }
        }
      return ch;
      return ch;
    }
    }
}
}
 
 
static void
static void
debug_serial_write (desc, buf, len)
debug_serial_write (desc, buf, len)
     serial_t desc;
     serial_t desc;
     char *buf;
     char *buf;
     int len;
     int len;
{
{
  char s[10];
  char s[10];
 
 
  SERIAL_WRITE (desc, buf, len);
  SERIAL_WRITE (desc, buf, len);
  if (remote_debug > 0)
  if (remote_debug > 0)
    {
    {
      while (len-- > 0)
      while (len-- > 0)
        {
        {
          sprintf (s, "[%02x]", *buf & 0xff);
          sprintf (s, "[%02x]", *buf & 0xff);
          puts_debug ("Sent -->", s, "<--");
          puts_debug ("Sent -->", s, "<--");
          buf++;
          buf++;
        }
        }
    }
    }
}
}
 
 
 
 
static int
static int
send_resp (desc, c)
send_resp (desc, c)
     serial_t desc;
     serial_t desc;
     char c;
     char c;
{
{
  debug_serial_write (desc, &c, 1);
  debug_serial_write (desc, &c, 1);
  return readchar (desc, remote_timeout);
  return readchar (desc, remote_timeout);
}
}
 
 
static void
static void
close_tty (ignore)
close_tty (ignore)
     int ignore;
     int ignore;
{
{
  if (!remote_desc)
  if (!remote_desc)
    return;
    return;
 
 
  SERIAL_CLOSE (remote_desc);
  SERIAL_CLOSE (remote_desc);
 
 
  remote_desc = NULL;
  remote_desc = NULL;
}
}
 
 
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
static int
static int
recv_udp_buf (fd, buf, len, timeout)
recv_udp_buf (fd, buf, len, timeout)
     int fd, len;
     int fd, len;
     unsigned char *buf;
     unsigned char *buf;
     int timeout;
     int timeout;
{
{
  int cc;
  int cc;
  fd_set readfds;
  fd_set readfds;
 
 
  FD_ZERO (&readfds);
  FD_ZERO (&readfds);
  FD_SET (fd, &readfds);
  FD_SET (fd, &readfds);
 
 
  if (timeout >= 0)
  if (timeout >= 0)
    {
    {
      struct timeval timebuf;
      struct timeval timebuf;
 
 
      timebuf.tv_sec = timeout;
      timebuf.tv_sec = timeout;
      timebuf.tv_usec = 0;
      timebuf.tv_usec = 0;
      cc = select (fd + 1, &readfds, 0, 0, &timebuf);
      cc = select (fd + 1, &readfds, 0, 0, &timebuf);
    }
    }
  else
  else
    cc = select (fd + 1, &readfds, 0, 0, 0);
    cc = select (fd + 1, &readfds, 0, 0, 0);
 
 
  if (cc == 0)
  if (cc == 0)
    return 0;
    return 0;
 
 
  if (cc != 1)
  if (cc != 1)
    perror_with_name ("recv_udp_buf: Bad return value from select:");
    perror_with_name ("recv_udp_buf: Bad return value from select:");
 
 
  cc = recv (fd, buf, len, 0);
  cc = recv (fd, buf, len, 0);
 
 
  if (cc < 0)
  if (cc < 0)
    perror_with_name ("Got an error from recv: ");
    perror_with_name ("Got an error from recv: ");
}
}
 
 
static int
static int
send_udp_buf (fd, buf, len)
send_udp_buf (fd, buf, len)
     int fd, len;
     int fd, len;
     unsigned char *buf;
     unsigned char *buf;
{
{
  int cc;
  int cc;
 
 
  cc = send (fd, buf, len, 0);
  cc = send (fd, buf, len, 0);
 
 
  if (cc == len)
  if (cc == len)
    return;
    return;
 
 
  if (cc < 0)
  if (cc < 0)
    perror_with_name ("Got an error from send: ");
    perror_with_name ("Got an error from send: ");
 
 
  error ("Short count in send: tried %d, sent %d\n", len, cc);
  error ("Short count in send: tried %d, sent %d\n", len, cc);
}
}
#endif /* HAVE_SOCKETS */
#endif /* HAVE_SOCKETS */
 
 
static void
static void
sparclite_open (name, from_tty)
sparclite_open (name, from_tty)
     char *name;
     char *name;
     int from_tty;
     int from_tty;
{
{
  struct cleanup *old_chain;
  struct cleanup *old_chain;
  int c;
  int c;
  char *p;
  char *p;
 
 
  if (!name)
  if (!name)
    error ("You need to specify what device or hostname is associated with the SparcLite board.");
    error ("You need to specify what device or hostname is associated with the SparcLite board.");
 
 
  target_preopen (from_tty);
  target_preopen (from_tty);
 
 
  unpush_target (&sparclite_ops);
  unpush_target (&sparclite_ops);
 
 
  if (remote_target_name)
  if (remote_target_name)
    free (remote_target_name);
    free (remote_target_name);
 
 
  remote_target_name = strsave (name);
  remote_target_name = strsave (name);
 
 
  /* We need a 'serial' or 'udp' keyword to disambiguate host:port, which can
  /* We need a 'serial' or 'udp' keyword to disambiguate host:port, which can
     mean either a serial port on a terminal server, or the IP address of a
     mean either a serial port on a terminal server, or the IP address of a
     SPARClite demo board.  If there's no colon, then it pretty much has to be
     SPARClite demo board.  If there's no colon, then it pretty much has to be
     a local device (except for DOS... grrmble) */
     a local device (except for DOS... grrmble) */
 
 
  p = strchr (name, ' ');
  p = strchr (name, ' ');
 
 
  if (p)
  if (p)
    {
    {
      *p++ = '\000';
      *p++ = '\000';
      while ((*p != '\000') && isspace (*p))
      while ((*p != '\000') && isspace (*p))
        p++;
        p++;
 
 
      if (strncmp (name, "serial", strlen (name)) == 0)
      if (strncmp (name, "serial", strlen (name)) == 0)
        serial_flag = 1;
        serial_flag = 1;
      else if (strncmp (name, "udp", strlen (name)) == 0)
      else if (strncmp (name, "udp", strlen (name)) == 0)
        serial_flag = 0;
        serial_flag = 0;
      else
      else
        error ("Must specify either `serial' or `udp'.");
        error ("Must specify either `serial' or `udp'.");
    }
    }
  else
  else
    {
    {
      p = name;
      p = name;
 
 
      if (!strchr (name, ':'))
      if (!strchr (name, ':'))
        serial_flag = 1;        /* No colon is unambiguous (local device) */
        serial_flag = 1;        /* No colon is unambiguous (local device) */
      else
      else
        error ("Usage: target sparclite serial /dev/ttyb\n\
        error ("Usage: target sparclite serial /dev/ttyb\n\
or: target sparclite udp host");
or: target sparclite udp host");
    }
    }
 
 
  if (serial_flag)
  if (serial_flag)
    {
    {
      remote_desc = open_tty (p);
      remote_desc = open_tty (p);
 
 
      old_chain = make_cleanup ((make_cleanup_func) close_tty, 0);
      old_chain = make_cleanup ((make_cleanup_func) close_tty, 0);
 
 
      c = send_resp (remote_desc, 0x00);
      c = send_resp (remote_desc, 0x00);
 
 
      if (c != 0xaa)
      if (c != 0xaa)
        error ("Unknown response (0x%x) from SparcLite.  Try resetting the board.",
        error ("Unknown response (0x%x) from SparcLite.  Try resetting the board.",
               c);
               c);
 
 
      c = send_resp (remote_desc, 0x55);
      c = send_resp (remote_desc, 0x55);
 
 
      if (c != 0x55)
      if (c != 0x55)
        error ("Sparclite appears to be ill.");
        error ("Sparclite appears to be ill.");
    }
    }
  else
  else
    {
    {
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
      struct hostent *he;
      struct hostent *he;
      struct sockaddr_in sockaddr;
      struct sockaddr_in sockaddr;
      unsigned char buffer[100];
      unsigned char buffer[100];
      int cc;
      int cc;
 
 
      /* Setup the socket.  Must be raw UDP. */
      /* Setup the socket.  Must be raw UDP. */
 
 
      he = gethostbyname (p);
      he = gethostbyname (p);
 
 
      if (!he)
      if (!he)
        error ("No such host %s.", p);
        error ("No such host %s.", p);
 
 
      udp_fd = socket (PF_INET, SOCK_DGRAM, 0);
      udp_fd = socket (PF_INET, SOCK_DGRAM, 0);
 
 
      old_chain = make_cleanup (close, udp_fd);
      old_chain = make_cleanup (close, udp_fd);
 
 
      sockaddr.sin_family = PF_INET;
      sockaddr.sin_family = PF_INET;
      sockaddr.sin_port = htons (7000);
      sockaddr.sin_port = htons (7000);
      memcpy (&sockaddr.sin_addr.s_addr, he->h_addr, sizeof (struct in_addr));
      memcpy (&sockaddr.sin_addr.s_addr, he->h_addr, sizeof (struct in_addr));
 
 
      if (connect (udp_fd, &sockaddr, sizeof (sockaddr)))
      if (connect (udp_fd, &sockaddr, sizeof (sockaddr)))
        perror_with_name ("Connect failed");
        perror_with_name ("Connect failed");
 
 
      buffer[0] = 0x5;
      buffer[0] = 0x5;
      buffer[1] = 0;
      buffer[1] = 0;
 
 
      send_udp_buf (udp_fd, buffer, 2);         /* Request version */
      send_udp_buf (udp_fd, buffer, 2);         /* Request version */
      cc = recv_udp_buf (udp_fd, buffer, sizeof (buffer), 5);   /* Get response */
      cc = recv_udp_buf (udp_fd, buffer, sizeof (buffer), 5);   /* Get response */
      if (cc == 0)
      if (cc == 0)
        error ("SPARClite isn't responding.");
        error ("SPARClite isn't responding.");
 
 
      if (cc < 3)
      if (cc < 3)
        error ("SPARClite appears to be ill.");
        error ("SPARClite appears to be ill.");
#else
#else
      error ("UDP downloading is not supported for DOS hosts.");
      error ("UDP downloading is not supported for DOS hosts.");
#endif /* HAVE_SOCKETS */
#endif /* HAVE_SOCKETS */
    }
    }
 
 
  printf_unfiltered ("[SPARClite appears to be alive]\n");
  printf_unfiltered ("[SPARClite appears to be alive]\n");
 
 
  push_target (&sparclite_ops);
  push_target (&sparclite_ops);
 
 
  discard_cleanups (old_chain);
  discard_cleanups (old_chain);
 
 
  return;
  return;
}
}
 
 
static void
static void
sparclite_close (quitting)
sparclite_close (quitting)
     int quitting;
     int quitting;
{
{
  if (serial_flag)
  if (serial_flag)
    close_tty (0);
    close_tty (0);
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
  else if (udp_fd != -1)
  else if (udp_fd != -1)
    close (udp_fd);
    close (udp_fd);
#endif
#endif
}
}
 
 
#define LOAD_ADDRESS 0x40000000
#define LOAD_ADDRESS 0x40000000
 
 
static void
static void
download (target_name, args, from_tty, write_routine, start_routine)
download (target_name, args, from_tty, write_routine, start_routine)
     char *target_name;
     char *target_name;
     char *args;
     char *args;
     int from_tty;
     int from_tty;
     void (*write_routine) PARAMS ((bfd * from_bfd, asection * from_sec,
     void (*write_routine) PARAMS ((bfd * from_bfd, asection * from_sec,
                             file_ptr from_addr, bfd_vma to_addr, int len));
                             file_ptr from_addr, bfd_vma to_addr, int len));
     void (*start_routine) PARAMS ((bfd_vma entry));
     void (*start_routine) PARAMS ((bfd_vma entry));
{
{
  struct cleanup *old_chain;
  struct cleanup *old_chain;
  asection *section;
  asection *section;
  bfd *pbfd;
  bfd *pbfd;
  bfd_vma entry;
  bfd_vma entry;
  int i;
  int i;
#define WRITESIZE 1024
#define WRITESIZE 1024
  char *filename;
  char *filename;
  int quiet;
  int quiet;
  int nostart;
  int nostart;
 
 
  quiet = 0;
  quiet = 0;
  nostart = 0;
  nostart = 0;
  filename = NULL;
  filename = NULL;
 
 
  while (*args != '\000')
  while (*args != '\000')
    {
    {
      char *arg;
      char *arg;
 
 
      while (isspace (*args))
      while (isspace (*args))
        args++;
        args++;
 
 
      arg = args;
      arg = args;
 
 
      while ((*args != '\000') && !isspace (*args))
      while ((*args != '\000') && !isspace (*args))
        args++;
        args++;
 
 
      if (*args != '\000')
      if (*args != '\000')
        *args++ = '\000';
        *args++ = '\000';
 
 
      if (*arg != '-')
      if (*arg != '-')
        filename = arg;
        filename = arg;
      else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
      else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
        quiet = 1;
        quiet = 1;
      else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
      else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
        nostart = 1;
        nostart = 1;
      else
      else
        error ("unknown option `%s'", arg);
        error ("unknown option `%s'", arg);
    }
    }
 
 
  if (!filename)
  if (!filename)
    filename = get_exec_file (1);
    filename = get_exec_file (1);
 
 
  pbfd = bfd_openr (filename, gnutarget);
  pbfd = bfd_openr (filename, gnutarget);
  if (pbfd == NULL)
  if (pbfd == NULL)
    {
    {
      perror_with_name (filename);
      perror_with_name (filename);
      return;
      return;
    }
    }
  old_chain = make_cleanup ((make_cleanup_func) bfd_close, pbfd);
  old_chain = make_cleanup ((make_cleanup_func) bfd_close, pbfd);
 
 
  if (!bfd_check_format (pbfd, bfd_object))
  if (!bfd_check_format (pbfd, bfd_object))
    error ("\"%s\" is not an object file: %s", filename,
    error ("\"%s\" is not an object file: %s", filename,
           bfd_errmsg (bfd_get_error ()));
           bfd_errmsg (bfd_get_error ()));
 
 
  for (section = pbfd->sections; section; section = section->next)
  for (section = pbfd->sections; section; section = section->next)
    {
    {
      if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
      if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
        {
        {
          bfd_vma section_address;
          bfd_vma section_address;
          bfd_size_type section_size;
          bfd_size_type section_size;
          file_ptr fptr;
          file_ptr fptr;
          const char *section_name;
          const char *section_name;
 
 
          section_name = bfd_get_section_name (pbfd, section);
          section_name = bfd_get_section_name (pbfd, section);
 
 
          section_address = bfd_get_section_vma (pbfd, section);
          section_address = bfd_get_section_vma (pbfd, section);
 
 
          /* Adjust sections from a.out files, since they don't
          /* Adjust sections from a.out files, since they don't
             carry their addresses with.  */
             carry their addresses with.  */
          if (bfd_get_flavour (pbfd) == bfd_target_aout_flavour)
          if (bfd_get_flavour (pbfd) == bfd_target_aout_flavour)
            {
            {
              if (strcmp (section_name, ".text") == 0)
              if (strcmp (section_name, ".text") == 0)
                section_address = bfd_get_start_address (pbfd);
                section_address = bfd_get_start_address (pbfd);
              else if (strcmp (section_name, ".data") == 0)
              else if (strcmp (section_name, ".data") == 0)
                {
                {
                  /* Read the first 8 bytes of the data section.
                  /* Read the first 8 bytes of the data section.
                     There should be the string 'DaTa' followed by
                     There should be the string 'DaTa' followed by
                     a word containing the actual section address. */
                     a word containing the actual section address. */
                  struct data_marker
                  struct data_marker
                    {
                    {
                      char signature[4];        /* 'DaTa' */
                      char signature[4];        /* 'DaTa' */
                      unsigned char sdata[4];   /* &sdata */
                      unsigned char sdata[4];   /* &sdata */
                    }
                    }
                  marker;
                  marker;
                  bfd_get_section_contents (pbfd, section, &marker, 0,
                  bfd_get_section_contents (pbfd, section, &marker, 0,
                                            sizeof (marker));
                                            sizeof (marker));
                  if (strncmp (marker.signature, "DaTa", 4) == 0)
                  if (strncmp (marker.signature, "DaTa", 4) == 0)
                    {
                    {
                      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
                      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
                        section_address = bfd_getb32 (marker.sdata);
                        section_address = bfd_getb32 (marker.sdata);
                      else
                      else
                        section_address = bfd_getl32 (marker.sdata);
                        section_address = bfd_getl32 (marker.sdata);
                    }
                    }
                }
                }
            }
            }
 
 
          section_size = bfd_get_section_size_before_reloc (section);
          section_size = bfd_get_section_size_before_reloc (section);
 
 
          if (!quiet)
          if (!quiet)
            printf_filtered ("[Loading section %s at 0x%x (%d bytes)]\n",
            printf_filtered ("[Loading section %s at 0x%x (%d bytes)]\n",
                             bfd_get_section_name (pbfd, section),
                             bfd_get_section_name (pbfd, section),
                             section_address,
                             section_address,
                             section_size);
                             section_size);
 
 
          fptr = 0;
          fptr = 0;
          while (section_size > 0)
          while (section_size > 0)
            {
            {
              int count;
              int count;
              static char inds[] = "|/-\\";
              static char inds[] = "|/-\\";
              static int k = 0;
              static int k = 0;
 
 
              QUIT;
              QUIT;
 
 
              count = min (section_size, WRITESIZE);
              count = min (section_size, WRITESIZE);
 
 
              write_routine (pbfd, section, fptr, section_address, count);
              write_routine (pbfd, section, fptr, section_address, count);
 
 
              if (!quiet)
              if (!quiet)
                {
                {
                  printf_unfiltered ("\r%c", inds[k++ % 4]);
                  printf_unfiltered ("\r%c", inds[k++ % 4]);
                  gdb_flush (gdb_stdout);
                  gdb_flush (gdb_stdout);
                }
                }
 
 
              section_address += count;
              section_address += count;
              fptr += count;
              fptr += count;
              section_size -= count;
              section_size -= count;
            }
            }
        }
        }
    }
    }
 
 
  if (!nostart)
  if (!nostart)
    {
    {
      entry = bfd_get_start_address (pbfd);
      entry = bfd_get_start_address (pbfd);
 
 
      if (!quiet)
      if (!quiet)
        printf_unfiltered ("[Starting %s at 0x%x]\n", filename, entry);
        printf_unfiltered ("[Starting %s at 0x%x]\n", filename, entry);
 
 
      start_routine (entry);
      start_routine (entry);
    }
    }
 
 
  do_cleanups (old_chain);
  do_cleanups (old_chain);
}
}
 
 
static void
static void
sparclite_serial_start (entry)
sparclite_serial_start (entry)
     bfd_vma entry;
     bfd_vma entry;
{
{
  char buffer[5];
  char buffer[5];
  int i;
  int i;
 
 
  buffer[0] = 0x03;
  buffer[0] = 0x03;
  store_unsigned_integer (buffer + 1, 4, entry);
  store_unsigned_integer (buffer + 1, 4, entry);
 
 
  debug_serial_write (remote_desc, buffer, 1 + 4);
  debug_serial_write (remote_desc, buffer, 1 + 4);
  i = readchar (remote_desc, remote_timeout);
  i = readchar (remote_desc, remote_timeout);
  if (i != 0x55)
  if (i != 0x55)
    error ("Can't start SparcLite.  Error code %d\n", i);
    error ("Can't start SparcLite.  Error code %d\n", i);
}
}
 
 
static void
static void
sparclite_serial_write (from_bfd, from_sec, from_addr, to_addr, len)
sparclite_serial_write (from_bfd, from_sec, from_addr, to_addr, len)
     bfd *from_bfd;
     bfd *from_bfd;
     asection *from_sec;
     asection *from_sec;
     file_ptr from_addr;
     file_ptr from_addr;
     bfd_vma to_addr;
     bfd_vma to_addr;
     int len;
     int len;
{
{
  char buffer[4 + 4 + WRITESIZE];       /* addr + len + data */
  char buffer[4 + 4 + WRITESIZE];       /* addr + len + data */
  unsigned char checksum;
  unsigned char checksum;
  int i;
  int i;
 
 
  store_unsigned_integer (buffer, 4, to_addr);  /* Address */
  store_unsigned_integer (buffer, 4, to_addr);  /* Address */
  store_unsigned_integer (buffer + 4, 4, len);  /* Length */
  store_unsigned_integer (buffer + 4, 4, len);  /* Length */
 
 
  bfd_get_section_contents (from_bfd, from_sec, buffer + 8, from_addr, len);
  bfd_get_section_contents (from_bfd, from_sec, buffer + 8, from_addr, len);
 
 
  checksum = 0;
  checksum = 0;
  for (i = 0; i < len; i++)
  for (i = 0; i < len; i++)
    checksum += buffer[8 + i];
    checksum += buffer[8 + i];
 
 
  i = send_resp (remote_desc, 0x01);
  i = send_resp (remote_desc, 0x01);
 
 
  if (i != 0x5a)
  if (i != 0x5a)
    error ("Bad response from load command (0x%x)", i);
    error ("Bad response from load command (0x%x)", i);
 
 
  debug_serial_write (remote_desc, buffer, 4 + 4 + len);
  debug_serial_write (remote_desc, buffer, 4 + 4 + len);
  i = readchar (remote_desc, remote_timeout);
  i = readchar (remote_desc, remote_timeout);
 
 
  if (i != checksum)
  if (i != checksum)
    error ("Bad checksum from load command (0x%x)", i);
    error ("Bad checksum from load command (0x%x)", i);
}
}
 
 
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
 
 
static unsigned short
static unsigned short
calc_checksum (buffer, count)
calc_checksum (buffer, count)
     unsigned char *buffer;
     unsigned char *buffer;
     int count;
     int count;
{
{
  unsigned short checksum;
  unsigned short checksum;
 
 
  checksum = 0;
  checksum = 0;
  for (; count > 0; count -= 2, buffer += 2)
  for (; count > 0; count -= 2, buffer += 2)
    checksum += (*buffer << 8) | *(buffer + 1);
    checksum += (*buffer << 8) | *(buffer + 1);
 
 
  if (count != 0)
  if (count != 0)
    checksum += *buffer << 8;
    checksum += *buffer << 8;
 
 
  return checksum;
  return checksum;
}
}
 
 
static void
static void
sparclite_udp_start (entry)
sparclite_udp_start (entry)
     bfd_vma entry;
     bfd_vma entry;
{
{
  unsigned char buffer[6];
  unsigned char buffer[6];
  int i;
  int i;
 
 
  buffer[0] = 0x3;
  buffer[0] = 0x3;
  buffer[1] = 0;
  buffer[1] = 0;
  buffer[2] = entry >> 24;
  buffer[2] = entry >> 24;
  buffer[3] = entry >> 16;
  buffer[3] = entry >> 16;
  buffer[4] = entry >> 8;
  buffer[4] = entry >> 8;
  buffer[5] = entry;
  buffer[5] = entry;
 
 
  send_udp_buf (udp_fd, buffer, 6);     /* Send start addr */
  send_udp_buf (udp_fd, buffer, 6);     /* Send start addr */
  i = recv_udp_buf (udp_fd, buffer, sizeof (buffer), -1);       /* Get response */
  i = recv_udp_buf (udp_fd, buffer, sizeof (buffer), -1);       /* Get response */
 
 
  if (i < 1 || buffer[0] != 0x55)
  if (i < 1 || buffer[0] != 0x55)
    error ("Failed to take start address.");
    error ("Failed to take start address.");
}
}
 
 
static void
static void
sparclite_udp_write (from_bfd, from_sec, from_addr, to_addr, len)
sparclite_udp_write (from_bfd, from_sec, from_addr, to_addr, len)
     bfd *from_bfd;
     bfd *from_bfd;
     asection *from_sec;
     asection *from_sec;
     file_ptr from_addr;
     file_ptr from_addr;
     bfd_vma to_addr;
     bfd_vma to_addr;
     int len;
     int len;
{
{
  unsigned char buffer[2000];
  unsigned char buffer[2000];
  unsigned short checksum;
  unsigned short checksum;
  static int pkt_num = 0;
  static int pkt_num = 0;
  static unsigned long old_addr = -1;
  static unsigned long old_addr = -1;
  int i;
  int i;
 
 
  while (1)
  while (1)
    {
    {
      if (to_addr != old_addr)
      if (to_addr != old_addr)
        {
        {
          buffer[0] = 0x1;       /* Load command */
          buffer[0] = 0x1;       /* Load command */
          buffer[1] = 0x1;      /* Loading address */
          buffer[1] = 0x1;      /* Loading address */
          buffer[2] = to_addr >> 24;
          buffer[2] = to_addr >> 24;
          buffer[3] = to_addr >> 16;
          buffer[3] = to_addr >> 16;
          buffer[4] = to_addr >> 8;
          buffer[4] = to_addr >> 8;
          buffer[5] = to_addr;
          buffer[5] = to_addr;
 
 
          checksum = 0;
          checksum = 0;
          for (i = 0; i < 6; i++)
          for (i = 0; i < 6; i++)
            checksum += buffer[i];
            checksum += buffer[i];
          checksum &= 0xff;
          checksum &= 0xff;
 
 
          send_udp_buf (udp_fd, buffer, 6);
          send_udp_buf (udp_fd, buffer, 6);
          i = recv_udp_buf (udp_fd, buffer, sizeof buffer, -1);
          i = recv_udp_buf (udp_fd, buffer, sizeof buffer, -1);
 
 
          if (i < 1)
          if (i < 1)
            error ("Got back short checksum for load addr.");
            error ("Got back short checksum for load addr.");
 
 
          if (checksum != buffer[0])
          if (checksum != buffer[0])
            error ("Got back bad checksum for load addr.");
            error ("Got back bad checksum for load addr.");
 
 
          pkt_num = 0;           /* Load addr resets packet seq # */
          pkt_num = 0;           /* Load addr resets packet seq # */
          old_addr = to_addr;
          old_addr = to_addr;
        }
        }
 
 
      bfd_get_section_contents (from_bfd, from_sec, buffer + 6, from_addr,
      bfd_get_section_contents (from_bfd, from_sec, buffer + 6, from_addr,
                                len);
                                len);
 
 
      checksum = calc_checksum (buffer + 6, len);
      checksum = calc_checksum (buffer + 6, len);
 
 
      buffer[0] = 0x1;           /* Load command */
      buffer[0] = 0x1;           /* Load command */
      buffer[1] = 0x2;          /* Loading data */
      buffer[1] = 0x2;          /* Loading data */
      buffer[2] = pkt_num >> 8;
      buffer[2] = pkt_num >> 8;
      buffer[3] = pkt_num;
      buffer[3] = pkt_num;
      buffer[4] = checksum >> 8;
      buffer[4] = checksum >> 8;
      buffer[5] = checksum;
      buffer[5] = checksum;
 
 
      send_udp_buf (udp_fd, buffer, len + 6);
      send_udp_buf (udp_fd, buffer, len + 6);
      i = recv_udp_buf (udp_fd, buffer, sizeof buffer, 3);
      i = recv_udp_buf (udp_fd, buffer, sizeof buffer, 3);
 
 
      if (i == 0)
      if (i == 0)
        {
        {
          fprintf_unfiltered (gdb_stderr, "send_data: timeout sending %d bytes to address 0x%x retrying\n", len, to_addr);
          fprintf_unfiltered (gdb_stderr, "send_data: timeout sending %d bytes to address 0x%x retrying\n", len, to_addr);
          continue;
          continue;
        }
        }
 
 
      if (buffer[0] != 0xff)
      if (buffer[0] != 0xff)
        error ("Got back bad response for load data.");
        error ("Got back bad response for load data.");
 
 
      old_addr += len;
      old_addr += len;
      pkt_num++;
      pkt_num++;
 
 
      return;
      return;
    }
    }
}
}
 
 
#endif /* HAVE_SOCKETS */
#endif /* HAVE_SOCKETS */
 
 
static void
static void
sparclite_download (filename, from_tty)
sparclite_download (filename, from_tty)
     char *filename;
     char *filename;
     int from_tty;
     int from_tty;
{
{
  if (!serial_flag)
  if (!serial_flag)
#ifdef HAVE_SOCKETS
#ifdef HAVE_SOCKETS
    download (remote_target_name, filename, from_tty, sparclite_udp_write,
    download (remote_target_name, filename, from_tty, sparclite_udp_write,
              sparclite_udp_start);
              sparclite_udp_start);
#else
#else
    abort ();                   /* sparclite_open should prevent this! */
    abort ();                   /* sparclite_open should prevent this! */
#endif
#endif
  else
  else
    download (remote_target_name, filename, from_tty, sparclite_serial_write,
    download (remote_target_name, filename, from_tty, sparclite_serial_write,
              sparclite_serial_start);
              sparclite_serial_start);
}
}


/* Set up the sparclite target vector.  */
/* Set up the sparclite target vector.  */
 
 
static void
static void
init_sparclite_ops (void)
init_sparclite_ops (void)
{
{
  sparclite_ops.to_shortname = "sparclite";
  sparclite_ops.to_shortname = "sparclite";
  sparclite_ops.to_longname = "SPARClite download target";
  sparclite_ops.to_longname = "SPARClite download target";
  sparclite_ops.to_doc = "Download to a remote SPARClite target board via serial of UDP.\n\
  sparclite_ops.to_doc = "Download to a remote SPARClite target board via serial of UDP.\n\
Specify the device it is connected to (e.g. /dev/ttya).";
Specify the device it is connected to (e.g. /dev/ttya).";
  sparclite_ops.to_open = sparclite_open;
  sparclite_ops.to_open = sparclite_open;
  sparclite_ops.to_close = sparclite_close;
  sparclite_ops.to_close = sparclite_close;
  sparclite_ops.to_load = sparclite_download;
  sparclite_ops.to_load = sparclite_download;
  sparclite_ops.to_stratum = download_stratum;
  sparclite_ops.to_stratum = download_stratum;
  sparclite_ops.to_magic = OPS_MAGIC;
  sparclite_ops.to_magic = OPS_MAGIC;
}
}
 
 
void
void
_initialize_sparcl_tdep ()
_initialize_sparcl_tdep ()
{
{
  init_sparclite_ops ();
  init_sparclite_ops ();
  add_target (&sparclite_ops);
  add_target (&sparclite_ops);
}
}
 
 

powered by: WebSVN 2.1.0

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