home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / gdb-4.14-src.lha / gdb-4.14 / gdb / sparcl-tdep.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-31  |  19.1 KB  |  847 lines

  1. /* Target dependent code for the Fujitsu SPARClite for GDB, the GNU debugger.
  2.    Copyright 1994, 1995  Free Software Foundation, Inc.
  3.  
  4. This file is part of GDB.
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "defs.h"
  21. #include "gdbcore.h"
  22. #include "breakpoint.h"
  23. #include "target.h"
  24. #include "serial.h"
  25. #include <sys/types.h>
  26. #include <sys/time.h>
  27. #include <sys/socket.h>
  28. #include <netinet/in.h>
  29. #include <netdb.h>
  30. #include <unistd.h>
  31.  
  32. extern struct target_ops sparclite_ops;    /* Forward decl */
  33. extern struct target_ops remote_ops;
  34.  
  35. static char *remote_target_name = NULL;
  36. static serial_t remote_desc = NULL;
  37. static int udp_fd = -1;
  38. static int serial_flag;
  39.  
  40. static serial_t open_tty PARAMS ((char *name));
  41. static int send_resp PARAMS ((serial_t desc, char c));
  42. static void close_tty PARAMS ((int ignore));
  43. static int recv_udp_buf PARAMS ((int fd, unsigned char *buf, int len, int timeout));
  44. static int send_udp_buf PARAMS ((int fd, unsigned char *buf, int len));
  45. static void sparclite_open PARAMS ((char *name, int from_tty));
  46. static void sparclite_close PARAMS ((int quitting));
  47. static void download PARAMS ((char *target_name, char *args, int from_tty,
  48.                   void (*write_routine) (bfd *from_bfd,
  49.                              asection *from_sec,
  50.                              file_ptr from_addr,
  51.                              bfd_vma to_addr, int len),
  52.                   void (*start_routine) (bfd_vma entry)));
  53. static void sparclite_serial_start PARAMS ((bfd_vma entry));
  54. static void sparclite_serial_write PARAMS ((bfd *from_bfd, asection *from_sec,
  55.                         file_ptr from_addr,
  56.                         bfd_vma to_addr, int len));
  57. static unsigned short calc_checksum PARAMS ((unsigned char *buffer,
  58.                          int count));
  59. static void sparclite_udp_start PARAMS ((bfd_vma entry));
  60. static void sparclite_udp_write PARAMS ((bfd *from_bfd, asection *from_sec,
  61.                      file_ptr from_addr, bfd_vma to_addr,
  62.                      int len));
  63. static void sparclite_download PARAMS ((char *filename, int from_tty));
  64.  
  65. #define DDA2_SUP_ASI        0xb000000
  66. #define DDA1_SUP_ASI        0xb0000
  67.  
  68. #define DDA2_ASI_MASK         0xff000000
  69. #define DDA1_ASI_MASK         0xff0000 
  70. #define DIA2_SUP_MODE         0x8000
  71. #define DIA1_SUP_MODE         0x4000
  72. #define DDA2_ENABLE         0x100
  73. #define DDA1_ENABLE         0x80
  74. #define DIA2_ENABLE         0x40
  75. #define DIA1_ENABLE         0x20
  76. #define DSINGLE_STEP         0x10
  77. #define DDV_TYPE_MASK         0xc
  78. #define DDV_TYPE_LOAD         0x0
  79. #define DDV_TYPE_STORE         0x4
  80. #define DDV_TYPE_ACCESS     0x8
  81. #define DDV_TYPE_ALWAYS        0xc
  82. #define DDV_COND        0x2
  83. #define DDV_MASK        0x1
  84.  
  85. int
  86. sparclite_insert_watchpoint (addr, len, type)
  87.      CORE_ADDR addr;
  88.      int len;
  89.      int type;
  90. {
  91.   CORE_ADDR dcr;
  92.  
  93.   dcr = read_register (DCR_REGNUM);
  94.  
  95.   if (!(dcr & DDA1_ENABLE))
  96.     {
  97.       write_register (DDA1_REGNUM, addr);
  98.       dcr &= ~(DDA1_ASI_MASK | DDV_TYPE_MASK);
  99.       dcr |= (DDA1_SUP_ASI | DDA1_ENABLE);
  100.       if (type == 1)
  101.     {
  102.       write_register (DDV1_REGNUM, 0);
  103.       write_register (DDV2_REGNUM, 0xffffffff);
  104.       dcr |= (DDV_TYPE_LOAD & (~DDV_COND & ~DDV_MASK));
  105.     }   
  106.       else if (type == 0)
  107.     {
  108.       write_register (DDV1_REGNUM, 0);
  109.       write_register (DDV2_REGNUM, 0xffffffff);
  110.       dcr |= (DDV_TYPE_STORE & (~DDV_COND & ~DDV_MASK));
  111.     }
  112.       else
  113.     {
  114.       write_register (DDV1_REGNUM, 0);
  115.       write_register (DDV2_REGNUM, 0xffffffff);
  116.       dcr |= (DDV_TYPE_ACCESS);
  117.     }
  118.       write_register (DCR_REGNUM, dcr);
  119.     }
  120.   else if (!(dcr & DDA2_ENABLE))
  121.     {
  122.       write_register (DDA2_REGNUM, addr);
  123.       dcr &= ~(DDA2_ASI_MASK & DDV_TYPE_MASK);
  124.       dcr |= (DDA2_SUP_ASI | DDA2_ENABLE);
  125.       if (type == 1)
  126.     {
  127.       write_register (DDV1_REGNUM, 0);
  128.       write_register (DDV2_REGNUM, 0xffffffff);
  129.       dcr |= (DDV_TYPE_LOAD & ~DDV_COND & ~DDV_MASK);
  130.     }
  131.       else if (type == 0)
  132.     {
  133.       write_register (DDV1_REGNUM, 0);
  134.       write_register (DDV2_REGNUM, 0xffffffff);
  135.       dcr |= (DDV_TYPE_STORE & ~DDV_COND & ~DDV_MASK);
  136.     }
  137.       else
  138.     {
  139.       write_register (DDV1_REGNUM, 0);
  140.       write_register (DDV2_REGNUM, 0xffffffff);
  141.       dcr |= (DDV_TYPE_ACCESS);
  142.     }
  143.       write_register (DCR_REGNUM, dcr);
  144.     }
  145.   else
  146.     return -1;
  147.  
  148.   return 0;
  149.  
  150. int
  151. sparclite_remove_watchpoint (addr, len, type)
  152.      CORE_ADDR addr;
  153.      int len;
  154.      int type;
  155. {
  156.   CORE_ADDR dcr, dda1, dda2;
  157.  
  158.   dcr = read_register (DCR_REGNUM);
  159.   dda1 = read_register (DDA1_REGNUM);
  160.   dda2 = read_register (DDA2_REGNUM);
  161.  
  162.   if ((dcr & DDA1_ENABLE) && addr == dda1)
  163.     write_register (DCR_REGNUM, (dcr & ~DDA1_ENABLE));
  164.   else if ((dcr & DDA2_ENABLE) && addr == dda2)
  165.     write_register (DCR_REGNUM, (dcr & ~DDA2_ENABLE));
  166.   else
  167.     return -1;
  168.  
  169.   return 0;
  170. }
  171.  
  172. int
  173. sparclite_insert_hw_breakpoint (addr, len)
  174.      CORE_ADDR addr;
  175.      int len;
  176. {
  177.   CORE_ADDR dcr;
  178.  
  179.   dcr = read_register (DCR_REGNUM);
  180.   
  181.   if (!(dcr & DIA1_ENABLE))
  182.     {
  183.       write_register (DIA1_REGNUM, addr);
  184.       write_register (DCR_REGNUM, (dcr | DIA1_ENABLE | DIA1_SUP_MODE));
  185.     }
  186.   else if (!(dcr & DIA2_ENABLE))
  187.     {
  188.       write_register (DIA2_REGNUM, addr);
  189.       write_register (DCR_REGNUM, (dcr | DIA2_ENABLE | DIA2_SUP_MODE));
  190.     }
  191.   else
  192.     return -1;
  193.  
  194.   return 0;
  195. }
  196.  
  197. int
  198. sparclite_remove_hw_breakpoint (addr, shadow)
  199.      CORE_ADDR addr;
  200.      int shadow;
  201. {
  202.   CORE_ADDR dcr, dia1, dia2;
  203.  
  204.   dcr = read_register (DCR_REGNUM);
  205.   dia1 = read_register (DIA1_REGNUM);
  206.   dia2 = read_register (DIA2_REGNUM);
  207.   
  208.   if ((dcr & DIA1_ENABLE) && addr == dia1)
  209.     write_register (DCR_REGNUM, (dcr & ~DIA1_ENABLE));
  210.   else if ((dcr & DIA2_ENABLE) && addr == dia2)
  211.     write_register (DCR_REGNUM, (dcr & ~DIA2_ENABLE));
  212.   else
  213.     return -1;
  214.  
  215.   return 0;
  216. }
  217.  
  218. int
  219. sparclite_check_watch_resources (type, cnt, ot)
  220.      int type;
  221.      int cnt;
  222.      int ot;
  223. {
  224.   if (type == bp_hardware_breakpoint)
  225.     if (TARGET_HW_BREAK_LIMIT == 0)
  226.       return 0;
  227.     else if (cnt <= TARGET_HW_BREAK_LIMIT)
  228.       return 1;
  229.   else
  230.     if (TARGET_HW_WATCH_LIMIT == 0)
  231.       return 0;
  232.     else if (ot)
  233.       return -1;
  234.     else if (cnt <= TARGET_HW_WATCH_LIMIT)
  235.       return 1;
  236.   return -1;
  237. }
  238.  
  239. CORE_ADDR
  240. sparclite_stopped_data_address ()
  241. {
  242.   CORE_ADDR dsr, dda1, dda2;
  243.  
  244.   dsr = read_register (DSR_REGNUM);
  245.   dda1 = read_register (DDA1_REGNUM);
  246.   dda2 = read_register (DDA2_REGNUM);
  247.  
  248.   if (dsr & 0x10)
  249.     return dda1;
  250.   else if (dsr & 0x20)
  251.     return dda2;
  252.   else
  253.     return 0;
  254. }
  255.  
  256. static serial_t
  257. open_tty (name)
  258.      char *name;
  259. {
  260.   serial_t desc;
  261.  
  262.   desc = SERIAL_OPEN (name);
  263.   if (!desc)
  264.     perror_with_name (name);
  265.  
  266.   if (baud_rate != -1)
  267.     {
  268.       if (SERIAL_SETBAUDRATE (desc, baud_rate))
  269.     {
  270.       SERIAL_CLOSE (desc);
  271.       perror_with_name (name);
  272.     }
  273.     }
  274.  
  275.   SERIAL_RAW (desc);
  276.  
  277.   SERIAL_FLUSH_INPUT (desc);
  278.  
  279.   return desc;
  280. }
  281.  
  282. static int
  283. send_resp (desc, c)
  284.      serial_t desc;
  285.      char c;
  286. {
  287.   int i;
  288.  
  289.   SERIAL_WRITE (desc, &c, 1);
  290.   i = SERIAL_READCHAR (desc, 2);
  291.  
  292.   if (i >= 0)
  293.     return i;
  294.  
  295.   switch (i)
  296.     {
  297.     case SERIAL_ERROR:
  298.       perror_with_name ("Remote communication error");
  299.     case SERIAL_TIMEOUT:
  300.       error ("Remote timeout");
  301.     case SERIAL_EOF:
  302.       error ("Remote connection closed");
  303.     }
  304. }
  305.  
  306. static void
  307. close_tty (ignore)
  308.      int ignore;
  309. {
  310.   if (!remote_desc)
  311.     return;
  312.  
  313.   SERIAL_CLOSE (remote_desc);
  314.  
  315.   remote_desc = NULL;
  316. }
  317.  
  318. static int
  319. recv_udp_buf (fd, buf, len, timeout)
  320.      int fd, len;
  321.      unsigned char *buf;
  322.      int timeout;
  323. {
  324.   int cc;
  325.   fd_set readfds;
  326.  
  327.   FD_ZERO (&readfds);
  328.   FD_SET (fd, &readfds);
  329.  
  330.   if (timeout >= 0)
  331.     {
  332.       struct timeval timebuf;
  333.  
  334.       timebuf.tv_sec = timeout;
  335.       timebuf.tv_usec = 0;
  336.       cc = select (fd + 1, &readfds, 0, 0, &timebuf);
  337.     }
  338.   else
  339.     cc = select (fd + 1, &readfds, 0, 0, 0);
  340.  
  341.   if (cc == 0)
  342.     return 0;
  343.  
  344.   if (cc != 1)
  345.     perror_with_name ("recv_udp_buf: Bad return value from select:");
  346.  
  347.   cc = recv (fd, buf, len, 0);
  348.  
  349.   if (cc < 0)
  350.     perror_with_name ("Got an error from recv: ");
  351. }
  352.  
  353. static int
  354. send_udp_buf (fd, buf, len)
  355.      int fd, len;
  356.      unsigned char *buf;
  357. {
  358.   int cc;
  359.  
  360.   cc = send (fd, buf, len, 0);
  361.  
  362.   if (cc == len)
  363.     return;
  364.  
  365.   if (cc < 0)
  366.     perror_with_name ("Got an error from send: ");
  367.  
  368.   error ("Short count in send: tried %d, sent %d\n", len, cc);
  369. }
  370.  
  371. static void
  372. sparclite_open (name, from_tty)
  373.      char *name;
  374.      int from_tty;
  375. {
  376.   struct cleanup *old_chain;
  377.   int c;
  378.   char *p;
  379.  
  380.   if (!name)
  381.     error ("You need to specify what device or hostname is associated with the SparcLite board.");
  382.  
  383.   target_preopen (from_tty);
  384.  
  385.   unpush_target (&sparclite_ops);
  386.  
  387.   if (remote_target_name)
  388.     free (remote_target_name);
  389.  
  390.   remote_target_name = strsave (name);
  391.  
  392.   /* We need a 'serial' or 'udp' keyword to disambiguate host:port, which can
  393.      mean either a serial port on a terminal server, or the IP address of a
  394.      SPARClite demo board.  If there's no colon, then it pretty much has to be
  395.      a local device (except for DOS... grrmble) */
  396.  
  397.   p = strchr (name, ' ');
  398.  
  399.   if (p)
  400.     {
  401.       *p++ = '\000';
  402.       while ((*p != '\000') && isspace (*p)) p++;
  403.  
  404.       if (strncmp (name, "serial", strlen (name)) == 0)
  405.     serial_flag = 1;
  406.       else if (strncmp (name, "udp", strlen (name)) == 0)
  407.     serial_flag = 0;
  408.       else
  409.     error ("Must specify either `serial' or `udp'.");
  410.     }
  411.   else
  412.     {
  413.       p = name;
  414.  
  415.       if (!strchr (name, ':'))
  416.     serial_flag = 1;    /* No colon is unambiguous (local device) */
  417.       else
  418.     error ("Usage: target sparclite serial /dev/ttyb\n\
  419. or: target sparclite udp host");
  420.     }
  421.  
  422.   if (serial_flag)
  423.     {
  424.       remote_desc = open_tty (p);
  425.  
  426.       old_chain = make_cleanup (close_tty, 0);
  427.  
  428.       c = send_resp (remote_desc, 0x00);
  429.  
  430.       if (c != 0xaa)
  431.     error ("Unknown response (0x%x) from SparcLite.  Try resetting the board.",
  432.            c);
  433.  
  434.       c = send_resp (remote_desc, 0x55);
  435.  
  436.       if (c != 0x55)
  437.     error ("Sparclite appears to be ill.");
  438.     }
  439.   else
  440.     {
  441.       struct hostent *he;
  442.       struct sockaddr_in sockaddr;
  443.       unsigned char buffer[100];
  444.       int cc;
  445.  
  446.       /* Setup the socket.  Must be raw UDP. */
  447.  
  448.       he = gethostbyname (p);
  449.  
  450.       if (!he)
  451.     error ("No such host %s.", p);
  452.  
  453.       udp_fd = socket (PF_INET, SOCK_DGRAM, 0);
  454.  
  455.       old_chain = make_cleanup (close, udp_fd);
  456.  
  457.       sockaddr.sin_family = PF_INET;
  458.       sockaddr.sin_port = htons(7000);
  459.       memcpy (&sockaddr.sin_addr.s_addr, he->h_addr, sizeof (struct in_addr));
  460.  
  461.       if (connect (udp_fd, &sockaddr, sizeof(sockaddr)))
  462.     perror_with_name ("Connect failed");
  463.  
  464.       buffer[0] = 0x5;
  465.       buffer[1] = 0;
  466.  
  467.       send_udp_buf (udp_fd, buffer, 2);    /* Request version */
  468.       cc = recv_udp_buf (udp_fd, buffer, sizeof(buffer), 5); /* Get response */
  469.       if (cc == 0)
  470.     error ("SPARClite isn't responding.");
  471.  
  472.       if (cc < 3)
  473.     error ("SPARClite appears to be ill.");
  474.     }
  475.  
  476.   printf_unfiltered ("[SPARClite appears to be alive]\n");
  477.  
  478.   push_target (&sparclite_ops);
  479.  
  480.   discard_cleanups (old_chain);
  481.  
  482.   return;
  483. }
  484.  
  485. static void
  486. sparclite_close (quitting)
  487.      int quitting;
  488. {
  489.   if (serial_flag)
  490.     close_tty (0);
  491.   else
  492.     if (udp_fd != -1)
  493.       close (udp_fd);
  494. }
  495.  
  496. #define LOAD_ADDRESS 0x40000000
  497.  
  498. static void
  499. download (target_name, args, from_tty, write_routine, start_routine)
  500.      char *target_name;
  501.      char *args;
  502.      int from_tty;
  503.      void (*write_routine)();
  504.      void (*start_routine)();
  505. {
  506.   struct cleanup *old_chain;
  507.   asection *section;
  508.   bfd *pbfd;
  509.   bfd_vma entry;
  510.   int i;
  511. #define WRITESIZE 1024
  512.   char *filename;
  513.   int quiet;
  514.   int nostart;
  515.  
  516.   quiet = 0;
  517.   nostart = 0;
  518.   filename = NULL;
  519.  
  520.   while (*args != '\000')
  521.     {
  522.       char *arg;
  523.  
  524.       while (isspace (*args)) args++;
  525.  
  526.       arg = args;
  527.  
  528.       while ((*args != '\000') && !isspace (*args)) args++;
  529.  
  530.       if (*args != '\000')
  531.     *args++ = '\000';
  532.  
  533.       if (*arg != '-')
  534.     filename = arg;
  535.       else if (strncmp (arg, "-quiet", strlen (arg)) == 0)
  536.     quiet = 1;
  537.       else if (strncmp (arg, "-nostart", strlen (arg)) == 0)
  538.     nostart = 1;
  539.       else
  540.     error ("unknown option `%s'", arg);
  541.     }
  542.  
  543.   if (!filename)
  544.     filename = get_exec_file (1);
  545.  
  546.   pbfd = bfd_openr (filename, gnutarget);
  547.   if (pbfd == NULL)
  548.     {
  549.       perror_with_name (filename);
  550.       return;
  551.     }
  552.   old_chain = make_cleanup (bfd_close, pbfd);
  553.  
  554.   if (!bfd_check_format (pbfd, bfd_object)) 
  555.     error ("\"%s\" is not an object file: %s", filename,
  556.        bfd_errmsg (bfd_get_error ()));
  557.  
  558.   for (section = pbfd->sections; section; section = section->next) 
  559.     {
  560.       if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)
  561.     {
  562.       bfd_vma section_address;
  563.       bfd_size_type section_size;
  564.       file_ptr fptr;
  565.  
  566.       section_address = bfd_get_section_vma (pbfd, section);
  567.       /* Adjust sections from a.out files, since they don't
  568.          carry their addresses with.  */
  569.       if (bfd_get_flavour (pbfd) == bfd_target_aout_flavour)
  570.         section_address += LOAD_ADDRESS;
  571.  
  572.       section_size = bfd_get_section_size_before_reloc (section);
  573.  
  574.       if (!quiet)
  575.         printf_filtered ("[Loading section %s at 0x%x (%d bytes)]\n",
  576.                  bfd_get_section_name (pbfd, section),
  577.                  section_address,
  578.                  section_size);
  579.  
  580.       fptr = 0;
  581.       while (section_size > 0)
  582.         {
  583.           int count;
  584.           static char inds[] = "|/-\\";
  585.           static int k = 0;
  586.  
  587.           QUIT;
  588.  
  589.           count = min (section_size, WRITESIZE);
  590.  
  591.           write_routine (pbfd, section, fptr, section_address, count);
  592.  
  593.           if (!quiet)
  594.         {
  595.           printf_unfiltered ("\r%c", inds[k++ % 4]);
  596.           gdb_flush (gdb_stdout);
  597.         }
  598.  
  599.           section_address += count;
  600.           fptr += count;
  601.           section_size -= count;
  602.         }
  603.     }
  604.     }
  605.  
  606.   if (!nostart)
  607.     {
  608.       entry = bfd_get_start_address (pbfd);
  609.  
  610.       if (!quiet)
  611.     printf_unfiltered ("[Starting %s at 0x%x]\n", filename, entry);
  612.  
  613.       start_routine (entry);
  614.     }
  615.  
  616.   do_cleanups (old_chain);
  617. }
  618.  
  619. static void
  620. sparclite_serial_start (entry)
  621.      bfd_vma entry;
  622. {
  623.   char buffer[5];
  624.   int i;
  625.  
  626.   buffer[0] = 0x03;
  627.   store_unsigned_integer (buffer + 1, 4, entry);
  628.  
  629.   SERIAL_WRITE (remote_desc, buffer, 1 + 4);
  630.   i = SERIAL_READCHAR (remote_desc, 2);
  631.   if (i != 0x55)
  632.     error ("Can't start SparcLite.  Error code %d\n", i);
  633. }
  634.  
  635. static void
  636. sparclite_serial_write (from_bfd, from_sec, from_addr, to_addr, len)
  637.      bfd *from_bfd;
  638.      asection *from_sec;
  639.      file_ptr from_addr;
  640.      bfd_vma to_addr;
  641.      int len;
  642. {
  643.   char buffer[4 + 4 + WRITESIZE]; /* addr + len + data */
  644.   unsigned char checksum;
  645.   int i;
  646.  
  647.   store_unsigned_integer (buffer, 4, to_addr); /* Address */
  648.   store_unsigned_integer (buffer + 4, 4, len); /* Length */
  649.  
  650.   bfd_get_section_contents (from_bfd, from_sec, buffer + 8, from_addr, len);
  651.  
  652.   checksum = 0;
  653.   for (i = 0; i < len; i++)
  654.     checksum += buffer[8 + i];
  655.  
  656.   i = send_resp (remote_desc, 0x01);
  657.  
  658.   if (i != 0x5a)
  659.     error ("Bad response from load command (0x%x)", i);
  660.  
  661.   SERIAL_WRITE (remote_desc, buffer, 4 + 4 + len);
  662.   i = SERIAL_READCHAR (remote_desc, 2);
  663.   if (i < 0)
  664.     error ("I/O error in serial code.  Return code %d\n", i);
  665.  
  666.   if (i != checksum)
  667.     error ("Bad checksum from load command (0x%x)", i);
  668. }
  669.  
  670. static unsigned short
  671. calc_checksum (buffer, count)
  672.      unsigned char *buffer;
  673.      int count;
  674. {
  675.   unsigned short checksum;
  676.  
  677.   checksum = 0;
  678.   for (; count > 0; count -= 2, buffer += 2)
  679.     checksum += (*buffer << 8) | *(buffer + 1);
  680.  
  681.   if (count != 0)
  682.     checksum += *buffer << 8;
  683.  
  684.   return checksum;
  685. }
  686.  
  687. static void
  688. sparclite_udp_start (entry)
  689.      bfd_vma entry;
  690. {
  691.   unsigned char buffer[6];
  692.   int i;
  693.  
  694.   buffer[0] = 0x3;
  695.   buffer[1] = 0;
  696.   buffer[2] = entry >> 24;
  697.   buffer[3] = entry >> 16;
  698.   buffer[4] = entry >> 8;
  699.   buffer[5] = entry;
  700.  
  701.   send_udp_buf (udp_fd, buffer, 6); /* Send start addr */
  702.   i = recv_udp_buf (udp_fd, buffer, sizeof(buffer), -1); /* Get response */
  703.  
  704.   if (i < 1 || buffer[0] != 0x55)
  705.     error ("Failed to take start address.");
  706. }
  707.  
  708. static void
  709. sparclite_udp_write (from_bfd, from_sec, from_addr, to_addr, len)
  710.      bfd *from_bfd;
  711.      asection *from_sec;
  712.      file_ptr from_addr;
  713.      bfd_vma to_addr;
  714.      int len;
  715. {
  716.   unsigned char buffer[2000];
  717.   unsigned short checksum;
  718.   static int pkt_num = 0;
  719.   static unsigned long old_addr = -1;
  720.   int i;
  721.  
  722.   while (1)
  723.     {
  724.       if (to_addr != old_addr)
  725.     {
  726.       buffer[0] = 0x1;    /* Load command */
  727.       buffer[1] = 0x1;    /* Loading address */
  728.       buffer[2] = to_addr >> 24;
  729.       buffer[3] = to_addr >> 16;
  730.       buffer[4] = to_addr >> 8;
  731.       buffer[5] = to_addr;
  732.  
  733.       checksum = 0;
  734.       for (i = 0; i < 6; i++)
  735.         checksum += buffer[i];
  736.       checksum &= 0xff;
  737.  
  738.       send_udp_buf (udp_fd, buffer, 6);
  739.       i = recv_udp_buf (udp_fd, buffer, sizeof buffer, -1);
  740.  
  741.       if (i < 1)
  742.         error ("Got back short checksum for load addr.");
  743.  
  744.       if (checksum != buffer[0])
  745.         error ("Got back bad checksum for load addr.");
  746.  
  747.       pkt_num = 0;        /* Load addr resets packet seq # */
  748.       old_addr = to_addr;
  749.     }
  750.  
  751.       bfd_get_section_contents (from_bfd, from_sec, buffer + 6, from_addr,
  752.                 len);
  753.  
  754.       checksum = calc_checksum (buffer + 6, len);
  755.  
  756.       buffer[0] = 0x1;        /* Load command */
  757.       buffer[1] = 0x2;        /* Loading data */
  758.       buffer[2] = pkt_num >> 8;
  759.       buffer[3] = pkt_num;
  760.       buffer[4] = checksum >> 8;
  761.       buffer[5] = checksum;
  762.  
  763.       send_udp_buf (udp_fd, buffer, len + 6);
  764.       i = recv_udp_buf (udp_fd, buffer, sizeof buffer, 3);
  765.  
  766.       if (i == 0)
  767.     {
  768.       fprintf_unfiltered (gdb_stderr, "send_data: timeout sending %d bytes to address 0x%x retrying\n", len, to_addr);
  769.       continue;
  770.     }
  771.  
  772.       if (buffer[0] != 0xff)
  773.     error ("Got back bad response for load data.");
  774.  
  775.       old_addr += len;
  776.       pkt_num++;
  777.  
  778.       return;
  779.     }
  780. }
  781.  
  782. static void
  783. sparclite_download (filename, from_tty)
  784.      char *filename;
  785.      int from_tty;
  786. {
  787.   if (!serial_flag)
  788.     download (remote_target_name, filename, from_tty, sparclite_udp_write,
  789.           sparclite_udp_start);
  790.   else
  791.     download (remote_target_name, filename, from_tty, sparclite_serial_write,
  792.           sparclite_serial_start);
  793. }
  794.  
  795. /* Define the target subroutine names */
  796.  
  797. static struct target_ops sparclite_ops =
  798. {
  799.   "sparclite",            /* to_shortname */
  800.   "SPARClite remote target",    /* to_longname */
  801.   "Use a remote SPARClite target board via a serial line, using a gdb-specific protocol.\n\
  802. Specify the serial device it is connected to (e.g. /dev/ttya).",  /* to_doc */
  803.   sparclite_open,        /* to_open */
  804.   sparclite_close,        /* to_close */
  805.   0,                /* to_attach */
  806.   0,                /* to_detach */
  807.   0,                /* to_resume */
  808.   0,                /* to_wait */
  809.   0,                /* to_fetch_registers */
  810.   0,                /* to_store_registers */
  811.   0,                /* to_prepare_to_store */
  812.   0,                /* to_xfer_memory */
  813.   0,                /* to_files_info */
  814.   0,                /* to_insert_breakpoint */
  815.   0,                /* to_remove_breakpoint */
  816.   0,                /* to_terminal_init */
  817.   0,                /* to_terminal_inferior */
  818.   0,                /* to_terminal_ours_for_output */
  819.   0,                /* to_terminal_ours */
  820.   0,                /* to_terminal_info */
  821.   0,                /* to_kill */
  822.   sparclite_download,        /* to_load */
  823.   0,                /* to_lookup_symbol */
  824.   0,                /* to_create_inferior */
  825.   0,                /* to_mourn_inferior */
  826.   0,                /* to_can_run */
  827.   0,                /* to_notice_signals */
  828.   0,                /* to_stop */
  829.   process_stratum,        /* to_stratum */
  830.   0,                /* to_next */
  831.   0,                /* to_has_all_memory */
  832.   0,                /* to_has_memory */
  833.   0,                /* to_has_stack */
  834.   0,                /* to_has_registers */
  835.   0,                /* to_has_execution */
  836.   0,                /* sections */
  837.   0,                /* sections_end */
  838.   OPS_MAGIC            /* to_magic */
  839.   };
  840.  
  841. void
  842. _initialize_sparcl_tdep ()
  843. {
  844.   add_target (&sparclite_ops);
  845. }
  846.