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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [gdbserver/] [server.c] - Diff between revs 107 and 1765

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

Rev 107 Rev 1765
/* Main code for remote server for GDB.
/* Main code for remote server for GDB.
   Copyright (C) 1989, 1993 Free Software Foundation, Inc.
   Copyright (C) 1989, 1993 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 "server.h"
#include "server.h"
 
 
int cont_thread;
int cont_thread;
int general_thread;
int general_thread;
int thread_from_wait;
int thread_from_wait;
int old_thread_from_wait;
int old_thread_from_wait;
int extended_protocol;
int extended_protocol;
jmp_buf toplevel;
jmp_buf toplevel;
int inferior_pid;
int inferior_pid;
 
 
static unsigned char
static unsigned char
start_inferior (argv, statusptr)
start_inferior (argv, statusptr)
     char *argv[];
     char *argv[];
     char *statusptr;
     char *statusptr;
{
{
  inferior_pid = create_inferior (argv[0], argv);
  inferior_pid = create_inferior (argv[0], argv);
  fprintf (stderr, "Process %s created; pid = %d\n", argv[0], inferior_pid);
  fprintf (stderr, "Process %s created; pid = %d\n", argv[0], inferior_pid);
 
 
  /* Wait till we are at 1st instruction in program, return signal number.  */
  /* Wait till we are at 1st instruction in program, return signal number.  */
  return mywait (statusptr);
  return mywait (statusptr);
}
}
 
 
extern int remote_debug;
extern int remote_debug;
 
 
int
int
main (argc, argv)
main (argc, argv)
     int argc;
     int argc;
     char *argv[];
     char *argv[];
{
{
  char ch, status, own_buf[PBUFSIZ], mem_buf[2000];
  char ch, status, own_buf[PBUFSIZ], mem_buf[2000];
  int i = 0;
  int i = 0;
  unsigned char signal;
  unsigned char signal;
  unsigned int len;
  unsigned int len;
  CORE_ADDR mem_addr;
  CORE_ADDR mem_addr;
 
 
  if (setjmp (toplevel))
  if (setjmp (toplevel))
    {
    {
      fprintf (stderr, "Exiting\n");
      fprintf (stderr, "Exiting\n");
      exit (1);
      exit (1);
    }
    }
 
 
  if (argc < 3)
  if (argc < 3)
    error ("Usage: gdbserver tty prog [args ...]");
    error ("Usage: gdbserver tty prog [args ...]");
 
 
  initialize_low ();
  initialize_low ();
 
 
  /* Wait till we are at first instruction in program.  */
  /* Wait till we are at first instruction in program.  */
  signal = start_inferior (&argv[2], &status);
  signal = start_inferior (&argv[2], &status);
 
 
  /* We are now stopped at the first instruction of the target process */
  /* We are now stopped at the first instruction of the target process */
 
 
  while (1)
  while (1)
    {
    {
      remote_open (argv[1]);
      remote_open (argv[1]);
 
 
    restart:
    restart:
      setjmp (toplevel);
      setjmp (toplevel);
      while (getpkt (own_buf) > 0)
      while (getpkt (own_buf) > 0)
        {
        {
          unsigned char sig;
          unsigned char sig;
          i = 0;
          i = 0;
          ch = own_buf[i++];
          ch = own_buf[i++];
          switch (ch)
          switch (ch)
            {
            {
            case 'd':
            case 'd':
              remote_debug = !remote_debug;
              remote_debug = !remote_debug;
              break;
              break;
            case '!':
            case '!':
              extended_protocol = 1;
              extended_protocol = 1;
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case '?':
            case '?':
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case 'H':
            case 'H':
              switch (own_buf[1])
              switch (own_buf[1])
                {
                {
                case 'g':
                case 'g':
                  general_thread = strtol (&own_buf[2], NULL, 16);
                  general_thread = strtol (&own_buf[2], NULL, 16);
                  write_ok (own_buf);
                  write_ok (own_buf);
                  fetch_inferior_registers (0);
                  fetch_inferior_registers (0);
                  break;
                  break;
                case 'c':
                case 'c':
                  cont_thread = strtol (&own_buf[2], NULL, 16);
                  cont_thread = strtol (&own_buf[2], NULL, 16);
                  write_ok (own_buf);
                  write_ok (own_buf);
                  break;
                  break;
                default:
                default:
                  /* Silently ignore it so that gdb can extend the protocol
                  /* Silently ignore it so that gdb can extend the protocol
                     without compatibility headaches.  */
                     without compatibility headaches.  */
                  own_buf[0] = '\0';
                  own_buf[0] = '\0';
                  break;
                  break;
                }
                }
              break;
              break;
            case 'g':
            case 'g':
              convert_int_to_ascii (registers, own_buf, REGISTER_BYTES);
              convert_int_to_ascii (registers, own_buf, REGISTER_BYTES);
              break;
              break;
            case 'G':
            case 'G':
              convert_ascii_to_int (&own_buf[1], registers, REGISTER_BYTES);
              convert_ascii_to_int (&own_buf[1], registers, REGISTER_BYTES);
              store_inferior_registers (-1);
              store_inferior_registers (-1);
              write_ok (own_buf);
              write_ok (own_buf);
              break;
              break;
            case 'm':
            case 'm':
              decode_m_packet (&own_buf[1], &mem_addr, &len);
              decode_m_packet (&own_buf[1], &mem_addr, &len);
              read_inferior_memory (mem_addr, mem_buf, len);
              read_inferior_memory (mem_addr, mem_buf, len);
              convert_int_to_ascii (mem_buf, own_buf, len);
              convert_int_to_ascii (mem_buf, own_buf, len);
              break;
              break;
            case 'M':
            case 'M':
              decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
              decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
              if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
              if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
                write_ok (own_buf);
                write_ok (own_buf);
              else
              else
                write_enn (own_buf);
                write_enn (own_buf);
              break;
              break;
            case 'C':
            case 'C':
              convert_ascii_to_int (own_buf + 1, &sig, 1);
              convert_ascii_to_int (own_buf + 1, &sig, 1);
              myresume (0, sig);
              myresume (0, sig);
              signal = mywait (&status);
              signal = mywait (&status);
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case 'S':
            case 'S':
              convert_ascii_to_int (own_buf + 1, &sig, 1);
              convert_ascii_to_int (own_buf + 1, &sig, 1);
              myresume (1, sig);
              myresume (1, sig);
              signal = mywait (&status);
              signal = mywait (&status);
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case 'c':
            case 'c':
              myresume (0, 0);
              myresume (0, 0);
              signal = mywait (&status);
              signal = mywait (&status);
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case 's':
            case 's':
              myresume (1, 0);
              myresume (1, 0);
              signal = mywait (&status);
              signal = mywait (&status);
              prepare_resume_reply (own_buf, status, signal);
              prepare_resume_reply (own_buf, status, signal);
              break;
              break;
            case 'k':
            case 'k':
              fprintf (stderr, "Killing inferior\n");
              fprintf (stderr, "Killing inferior\n");
              kill_inferior ();
              kill_inferior ();
              /* When using the extended protocol, we start up a new
              /* When using the extended protocol, we start up a new
                 debugging session.   The traditional protocol will
                 debugging session.   The traditional protocol will
                 exit instead.  */
                 exit instead.  */
              if (extended_protocol)
              if (extended_protocol)
                {
                {
                  write_ok (own_buf);
                  write_ok (own_buf);
                  fprintf (stderr, "GDBserver restarting\n");
                  fprintf (stderr, "GDBserver restarting\n");
 
 
                  /* Wait till we are at 1st instruction in prog.  */
                  /* Wait till we are at 1st instruction in prog.  */
                  signal = start_inferior (&argv[2], &status);
                  signal = start_inferior (&argv[2], &status);
                  goto restart;
                  goto restart;
                  break;
                  break;
                }
                }
              else
              else
                {
                {
                  exit (0);
                  exit (0);
                  break;
                  break;
                }
                }
            case 'T':
            case 'T':
              if (mythread_alive (strtol (&own_buf[1], NULL, 16)))
              if (mythread_alive (strtol (&own_buf[1], NULL, 16)))
                write_ok (own_buf);
                write_ok (own_buf);
              else
              else
                write_enn (own_buf);
                write_enn (own_buf);
              break;
              break;
            case 'R':
            case 'R':
              /* Restarting the inferior is only supported in the
              /* Restarting the inferior is only supported in the
                 extended protocol.  */
                 extended protocol.  */
              if (extended_protocol)
              if (extended_protocol)
                {
                {
                  kill_inferior ();
                  kill_inferior ();
                  write_ok (own_buf);
                  write_ok (own_buf);
                  fprintf (stderr, "GDBserver restarting\n");
                  fprintf (stderr, "GDBserver restarting\n");
 
 
                  /* Wait till we are at 1st instruction in prog.  */
                  /* Wait till we are at 1st instruction in prog.  */
                  signal = start_inferior (&argv[2], &status);
                  signal = start_inferior (&argv[2], &status);
                  goto restart;
                  goto restart;
                  break;
                  break;
                }
                }
              else
              else
                {
                {
                  /* It is a request we don't understand.  Respond with an
                  /* It is a request we don't understand.  Respond with an
                     empty packet so that gdb knows that we don't support this
                     empty packet so that gdb knows that we don't support this
                     request.  */
                     request.  */
                  own_buf[0] = '\0';
                  own_buf[0] = '\0';
                  break;
                  break;
                }
                }
            default:
            default:
              /* It is a request we don't understand.  Respond with an
              /* It is a request we don't understand.  Respond with an
                 empty packet so that gdb knows that we don't support this
                 empty packet so that gdb knows that we don't support this
                 request.  */
                 request.  */
              own_buf[0] = '\0';
              own_buf[0] = '\0';
              break;
              break;
            }
            }
 
 
          putpkt (own_buf);
          putpkt (own_buf);
 
 
          if (status == 'W')
          if (status == 'W')
            fprintf (stderr,
            fprintf (stderr,
                     "\nChild exited with status %d\n", sig);
                     "\nChild exited with status %d\n", sig);
          if (status == 'X')
          if (status == 'X')
            fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
            fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
          if (status == 'W' || status == 'X')
          if (status == 'W' || status == 'X')
            {
            {
              if (extended_protocol)
              if (extended_protocol)
                {
                {
                  fprintf (stderr, "Killing inferior\n");
                  fprintf (stderr, "Killing inferior\n");
                  kill_inferior ();
                  kill_inferior ();
                  write_ok (own_buf);
                  write_ok (own_buf);
                  fprintf (stderr, "GDBserver restarting\n");
                  fprintf (stderr, "GDBserver restarting\n");
 
 
                  /* Wait till we are at 1st instruction in prog.  */
                  /* Wait till we are at 1st instruction in prog.  */
                  signal = start_inferior (&argv[2], &status);
                  signal = start_inferior (&argv[2], &status);
                  goto restart;
                  goto restart;
                  break;
                  break;
                }
                }
              else
              else
                {
                {
                  fprintf (stderr, "GDBserver exiting\n");
                  fprintf (stderr, "GDBserver exiting\n");
                  exit (0);
                  exit (0);
                }
                }
            }
            }
        }
        }
 
 
      /* We come here when getpkt fails.
      /* We come here when getpkt fails.
 
 
         For the extended remote protocol we exit (and this is the only
         For the extended remote protocol we exit (and this is the only
         way we gracefully exit!).
         way we gracefully exit!).
 
 
         For the traditional remote protocol close the connection,
         For the traditional remote protocol close the connection,
         and re-open it at the top of the loop.  */
         and re-open it at the top of the loop.  */
      if (extended_protocol)
      if (extended_protocol)
        {
        {
          remote_close ();
          remote_close ();
          exit (0);
          exit (0);
        }
        }
      else
      else
        {
        {
          fprintf (stderr, "Remote side has terminated connection.  GDBserver will reopen the connection.\n");
          fprintf (stderr, "Remote side has terminated connection.  GDBserver will reopen the connection.\n");
 
 
          remote_close ();
          remote_close ();
        }
        }
    }
    }
}
}
 
 

powered by: WebSVN 2.1.0

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