OSDN Git Service

2002-04-09 Daniel Jacobowitz <drow@mvista.com>
authordrow <drow>
Tue, 9 Apr 2002 21:17:45 +0000 (21:17 +0000)
committerdrow <drow>
Tue, 9 Apr 2002 21:17:45 +0000 (21:17 +0000)
        * gdbserver/inferiors.c: New file.
        * gdbserver/target.c: New file.
        * gdbserver/target.h: New file.
        * gdbserver/Makefile.in:  Add target.o and inferiors.o.  Update
        dependencies.
        * gdbserver/linux-low.c (inferior_pid): New static variable,
        moved from server.c.
        (linux_create_inferior): Renamed from create_inferior.
        Call add_inferior.  Return 0 on success instead of a PID.
        (linux_attach): Renamed from myattach.
        (linux_kill): Renamed from kill_inferior.  Call clear_inferiors ().
        (linux_thread_alive): Renamed from mythread_alive.
        (linux_wait): Renamed from mywait.  Call clear_inferiors () if the
        child dies.
        (linux_resume): Renamed from myresume.  Add missing ``return 0''.
        (regsets_store_inferior_registers): Correct error message.
        Add missing ``return 0''.
        (linux_fetch_registers): Renamed from fetch_inferior_registers.
        (linux_store_registers): Renamed from store_inferior_registers.
        (linux_read_memory): Renamed from read_inferior_memory.
        (linux_write_memory): Renamed from write_inferior_memory.
        (linux_target_ops): New structure.
        (initialize_low): Call set_target_ops ().
        * gdbserver/remote-utils.c (unhexify): New function.
        (hexify): New function.
        (input_interrupt): Send signals to ``signal_pid''.
        * gdbserver/server.c (inferior_pid): Remove.
        (start_inferior): Update create_inferior call.
        (attach_inferior): Call add_inferior.
        (handle_query): New function.
        (main): Call handle_query for `q' packets.
        * gdbserver/server.h: Include "target.h".  Remove obsolete prototypes.
        Add prototypes for "inferiors.c", "target.c", hexify, and unhexify.

gdb/gdbserver/inferiors.c [new file with mode: 0644]
gdb/gdbserver/target.c [new file with mode: 0644]
gdb/gdbserver/target.h [new file with mode: 0644]

diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
new file mode 100644 (file)
index 0000000..1daa3c5
--- /dev/null
@@ -0,0 +1,71 @@
+/* Inferior process information for the remote server for GDB.
+   Copyright 2002
+   Free Software Foundation, Inc.
+
+   Contributed by MontaVista Software.
+
+   This file is part of GDB.
+
+   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 Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <stdlib.h>
+
+#include "server.h"
+
+struct inferior_info
+{
+  int pid;
+  struct inferior_info *next;
+};
+
+static struct inferior_info *inferiors;
+struct inferior_info *current_inferior;
+int signal_pid;
+
+void
+add_inferior (int pid)
+{
+  struct inferior_info *new_inferior
+    = (struct inferior_info *) malloc (sizeof (*new_inferior));
+
+  memset (new_inferior, 0, sizeof (*new_inferior));
+
+  new_inferior->pid = pid;
+
+  new_inferior->next = inferiors;
+  inferiors = new_inferior;
+
+  if (current_inferior == NULL)
+    current_inferior = inferiors;
+
+  if (signal_pid == 0)
+    signal_pid = pid;
+}
+
+void
+clear_inferiors (void)
+{
+  struct inferior_info *inf = inferiors, *next_inf;
+
+  while (inf)
+    {
+      next_inf = inf->next;
+      free (inf);
+      inf = next_inf;
+    }
+
+  inferiors = NULL;
+}
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
new file mode 100644 (file)
index 0000000..3bd87d3
--- /dev/null
@@ -0,0 +1,33 @@
+/* Target operations for the remote server for GDB.
+   Copyright 2002
+   Free Software Foundation, Inc.
+
+   Contributed by MontaVista Software.
+
+   This file is part of GDB.
+
+   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 Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "server.h"
+
+struct target_ops *the_target;
+
+void
+set_target_ops (struct target_ops *target)
+{
+  the_target = (struct target_ops *) malloc (sizeof (*the_target));
+  memcpy (the_target, target, sizeof (*the_target));
+}
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
new file mode 100644 (file)
index 0000000..094f4ce
--- /dev/null
@@ -0,0 +1,133 @@
+/* Target operations for the remote server for GDB.
+   Copyright 2002
+   Free Software Foundation, Inc.
+
+   Contributed by MontaVista Software.
+
+   This file is part of GDB.
+
+   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 Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef TARGET_H
+#define TARGET_H
+
+struct target_ops
+{
+  /* Start a new process.
+
+     PROGRAM is a path to the program to execute.
+     ARGS is a standard NULL-terminated array of arguments,
+     to be passed to the inferior as ``argv''.
+
+     Returns 0 on success, -1 on failure.  Registers the new
+     process with the process list.  */
+
+  int (*create_inferior) (char *program, char **args);
+
+  /* Attach to a running process.
+
+     PID is the process ID to attach to, specified by the user
+     or a higher layer.  */
+
+  int (*attach) (int pid);
+
+  /* Kill all inferiors.  */
+
+  void (*kill) (void);
+
+  /* Return 1 iff the thread with process ID PID is alive.  */
+
+  int (*thread_alive) (int pid);
+
+  /* Resume the inferior process.
+
+     If STEP is non-zero, we want to single-step.
+
+     If SIGNAL is nonzero, send the process that signal as we resume it.
+   */
+
+  void (*resume) (int step, int signo);
+
+  /* Wait for the inferior process to change state.
+
+     STATUSP will be filled in with a response code to send to GDB.
+
+     Returns the signal which caused the process to stop.  */
+
+  unsigned char (*wait) (char *status);
+
+  /* Fetch registers from the inferior process.
+
+     If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
+
+  void (*fetch_registers) (int regno);
+  
+  /* Store registers to the inferior process.
+
+     If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
+
+  void (*store_registers) (int regno);
+
+  /* Read memory from the inferior process.
+
+     Read LEN bytes at MEMADDR into a buffer at MYADDR.  */
+
+  void (*read_memory) (CORE_ADDR memaddr, char *myaddr, int len);
+
+  /* Write memory to the inferior process.
+
+     Write LEN bytes from the buffer at MYADDR to MEMADDR.
+
+     Returns 0 on success and errno on failure.  */
+
+  int (*write_memory) (CORE_ADDR memaddr, char *myaddr, int len);
+};
+
+extern struct target_ops *the_target;
+
+void set_target_ops (struct target_ops *);
+
+#define create_inferior(program, args) \
+  (*the_target->create_inferior) (program, args)
+
+#define myattach(pid) \
+  (*the_target->attach) (pid)
+
+#define kill_inferior() \
+  (*the_target->kill) ()
+
+#define mythread_alive(pid) \
+  (*the_target->thread_alive) (pid)
+
+#define myresume(step,signo) \
+  (*the_target->resume) (step, signo)
+
+#define mywait(statusp) \
+  (*the_target->wait) (statusp)
+
+#define fetch_inferior_registers(regno) \
+  (*the_target->fetch_registers) (regno)
+
+#define store_inferior_registers(regno) \
+  (*the_target->store_registers) (regno)
+
+#define read_inferior_memory(memaddr,myaddr,len) \
+  (*the_target->read_memory) (memaddr, myaddr, len)
+
+#define write_inferior_memory(memaddr,myaddr,len) \
+  (*the_target->write_memory) (memaddr, myaddr, len)
+
+#endif /* TARGET_H */